From c021f2f2b3fecbe089825a3391b4ef1bc7e26f42 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Wed, 22 Jan 2025 13:06:48 +0100 Subject: [PATCH 01/15] modernize --- .eslintrc | 137 - README.md | 18 + docs/.vitepress/config.mts | 80 +- docs/.vitepress/meta.ts | 8 +- docs/.vitepress/theme/index.ts | 6 +- eslint.config.mjs | 51 + package-lock.json | 22011 ++++------------ package.json | 60 +- src/common/index.ts | 1 - src/common/pluck.ts | 24 - .../act-on-dispatch}/act-on-dispatch.test.ts | 3 +- .../{ => act-on-dispatch}/act-on-dispatch.ts | 6 +- src/hooks/alter-items/alter-data.test.ts | 96 + src/hooks/alter-items/alter-data.ts | 20 + .../hooks/alter-items}/alter-items.test.ts | 2 +- src/hooks/{ => alter-items}/alter-items.ts | 7 +- src/hooks/alter-items/alter-result.test.ts | 143 + src/hooks/alter-items/alter-result.ts | 26 + {test/hooks => src/hooks/cache}/cache.test.ts | 2 +- src/hooks/{ => cache}/cache.ts | 4 +- .../hooks/de-populate}/de-populate.test.ts | 7 +- src/hooks/{ => de-populate}/de-populate.ts | 3 +- {test/hooks => src/hooks/debug}/debug.test.ts | 2 +- src/hooks/{ => debug}/debug.ts | 2 - .../disable-pagination.test.ts | 2 +- .../disable-pagination.ts | 5 +- .../hooks/disallow}/disallow.test.ts | 9 +- src/hooks/{ => disallow}/disallow.ts | 2 +- src/hooks/discard-query.ts | 19 - .../hooks/fast-join}/fast-join-cache.test.ts | 19 +- .../hooks/fast-join}/fast-join.test.ts | 6 +- src/hooks/{ => fast-join}/fast-join.ts | 28 +- .../hooks/fast-join/test}/make-services.ts | 0 .../hooks/fgraphql}/fgraphql.test.ts | 15 +- src/hooks/{ => fgraphql}/fgraphql.ts | 5 +- .../hooks/iff/iff-else.test.ts | 9 +- src/hooks/{ => iff}/iff-else.ts | 6 +- {test/hooks => src/hooks/iff}/iff.test.ts | 10 +- src/hooks/{ => iff}/iff.ts | 2 +- src/hooks/index.ts | 62 + .../keep-in-array}/keep-in-array.test.ts | 2 +- .../{ => keep-in-array}/keep-in-array.ts | 2 +- .../keep-query-in-array.test.ts | 2 +- .../keep-query-in-array.ts | 2 +- src/hooks/keep-query.ts | 18 - src/hooks/lowercase/lowercase-data.test.ts | 96 + src/hooks/lowercase/lowercase-data.ts | 26 + src/hooks/lowercase/lowercase-result.test.ts | 54 + src/hooks/lowercase/lowercase-result.ts | 26 + .../hooks/lowercase}/lowercase.test.ts | 4 +- .../{lower-case.ts => lowercase/lowercase.ts} | 14 +- .../hooks/mongo-keys}/mongo-keys.test.ts | 2 +- src/hooks/{ => mongo-keys}/mongo-keys.ts | 2 +- .../hooks/omit-query/omit-query.test.ts | 20 +- src/hooks/omit-query/omit-query.ts | 20 + .../hooks/omit/omit-1.test.ts | 8 +- .../hooks/omit/omit-2.test.ts | 10 +- src/hooks/omit/omit-data-1.test.ts | 91 + src/hooks/omit/omit-data.test.ts | 94 + src/hooks/omit/omit-data.ts | 12 + src/hooks/omit/omit-result-1.test.ts | 86 + src/hooks/omit/omit-result-2.test.ts | 121 + src/hooks/omit/omit-result.test.ts | 109 + src/hooks/omit/omit-result.ts | 12 + .../hooks/omit/omit.test.ts | 32 +- src/hooks/{discard.ts => omit/omit.ts} | 14 +- .../params-from-client.test.ts | 2 +- .../params-from-client.ts | 0 .../hooks/pick-query/pick-query.test.ts | 22 +- src/hooks/pick-query/pick-query.ts | 21 + src/hooks/pick/pick-data.test.ts | 153 + src/hooks/pick/pick-data.ts | 17 + src/hooks/pick/pick-result.test.ts | 77 + src/hooks/pick/pick-result.ts | 17 + .../hooks/pick/pick.test.ts | 40 +- src/hooks/{keep.ts => pick/pick.ts} | 24 +- .../populate}/populate-1deep-1child.test.ts | 11 +- .../hooks/populate}/populate-basics.test.ts | 7 +- .../hooks/populate}/populate-misc.test.ts | 19 +- .../populate}/populate-relations.test.ts | 11 +- .../populate}/populate-scaffolding.test.ts | 2 +- src/hooks/{ => populate}/populate.ts | 3 +- .../hooks/populate/test}/config-app.ts | 20 +- .../hooks/populate/test}/get-init-db.ts | 0 src/hooks/prevent-changes.ts | 41 - .../prevent-changes}/prevent-changes.test.ts | 72 +- src/hooks/prevent-changes/prevent-changes.ts | 25 + .../hooks/required}/required.test.ts | 2 +- src/hooks/{ => required}/required.ts | 27 +- .../hooks/run-parallel}/run-parallel.test.ts | 2 +- src/hooks/{ => run-parallel}/run-parallel.ts | 2 +- .../sequelize-convert.test.ts | 2 +- .../sequelize-convert.ts | 3 +- .../hooks/serialize}/serialize.test.ts | 9 +- src/hooks/{ => serialize}/serialize.ts | 5 +- .../hooks/set-field}/set-field.test.ts | 4 +- src/hooks/{ => set-field}/set-field.ts | 2 +- src/hooks/set-now/set-now-data.test.ts | 136 + src/hooks/set-now/set-now-data.ts | 16 + src/hooks/set-now/set-now-result.test.ts | 69 + src/hooks/set-now/set-now-result.ts | 16 + .../hooks/set-now}/set-now.test.ts | 7 +- src/hooks/{ => set-now}/set-now.ts | 8 +- .../hooks/set-slug}/set-slug.test.ts | 2 +- src/hooks/{ => set-slug}/set-slug.ts | 5 - src/hooks/sifter.ts | 28 - .../hooks => src/hooks/sifter}/sifter.test.ts | 21 +- src/hooks/sifter/sifter.ts | 20 + .../hooks/soft-delete}/soft-delete.test.ts | 2 +- src/hooks/{ => soft-delete}/soft-delete.ts | 3 +- .../hooks/stash-before}/stash-before.test.ts | 13 +- src/hooks/{ => stash-before}/stash-before.ts | 2 +- .../hooks/traverse}/traverse.test.ts | 11 +- src/hooks/{ => traverse}/traverse.ts | 6 +- .../hooks => src/hooks/unless}/unless.test.ts | 10 +- src/hooks/{ => unless}/unless.ts | 2 +- .../validate-schema}/validate-schema.test.ts | 2 +- .../{ => validate-schema}/validate-schema.ts | 4 +- .../hooks/validate}/validate.test.ts | 9 +- src/hooks/{ => validate}/validate.ts | 6 +- src/index.ts | 51 +- src/types.ts | 12 +- .../calling-params}/calling-params-1.test.ts | 2 +- .../calling-params}/calling-params-2.test.ts | 2 +- .../{ => calling-params}/calling-params.ts | 0 src/utils/check-context-if.ts | 2 +- .../check-context}/check-context.test.ts | 2 +- .../{ => check-context}/check-context.ts | 4 +- .../utils/combine}/combine.test.ts | 13 +- src/utils/{ => combine}/combine.ts | 5 +- {test/utils => src/utils/every}/every.test.ts | 3 +- src/utils/{ => every}/every.ts | 2 +- .../get-data-is-array.test.ts | 31 + .../get-data-is-array/get-data-is-array.ts | 19 + src/utils/get-items/get-items.test.ts | 117 + src/utils/{ => get-items}/get-items.ts | 2 + .../get-result-is-array.test.ts | 59 + .../get-result-is-array.ts | 26 + src/utils/index.ts | 20 + .../utils => src/utils/is-not}/is-not.test.ts | 11 +- src/utils/{ => is-not}/is-not.ts | 4 +- .../utils/is-provider}/is-provider.test.ts | 11 +- src/utils/{ => is-provider}/is-provider.ts | 2 +- .../params-for-server.test.ts | 2 +- .../params-for-server.ts | 0 src/utils/replace-items/replace-data.ts | 43 + src/utils/replace-items/replace-items.test.ts | 132 + .../{ => replace-items}/replace-items.ts | 2 + src/utils/replace-items/replace-result.ts | 60 + .../utils/run-hook}/run-hook.test.ts | 3 +- src/utils/{ => run-hook}/run-hook.ts | 0 {test/utils => src/utils/some}/some.test.ts | 4 +- src/utils/{ => some}/some.ts | 0 test/hooks/get-replace-items.test.ts | 241 - test/hooks/iff-else.test.ts | 681 - test/hooks/when.test.ts | 403 - test/index.test.ts | 47 +- vite.config.ts | 12 +- 158 files changed, 7754 insertions(+), 19113 deletions(-) delete mode 100644 .eslintrc create mode 100644 eslint.config.mjs delete mode 100755 src/common/pluck.ts rename {test/hooks => src/hooks/act-on-dispatch}/act-on-dispatch.test.ts (95%) rename src/hooks/{ => act-on-dispatch}/act-on-dispatch.ts (88%) create mode 100755 src/hooks/alter-items/alter-data.test.ts create mode 100755 src/hooks/alter-items/alter-data.ts rename {test/hooks => src/hooks/alter-items}/alter-items.test.ts (99%) rename src/hooks/{ => alter-items}/alter-items.ts (88%) create mode 100755 src/hooks/alter-items/alter-result.test.ts create mode 100755 src/hooks/alter-items/alter-result.ts rename {test/hooks => src/hooks/cache}/cache.test.ts (99%) rename src/hooks/{ => cache}/cache.ts (95%) rename {test/hooks => src/hooks/de-populate}/de-populate.test.ts (98%) rename src/hooks/{ => de-populate}/de-populate.ts (89%) rename {test/hooks => src/hooks/debug}/debug.test.ts (93%) rename src/hooks/{ => debug}/debug.ts (96%) rename {test/hooks => src/hooks/disable-pagination}/disable-pagination.test.ts (94%) rename src/hooks/{ => disable-pagination}/disable-pagination.ts (80%) rename {test/hooks => src/hooks/disallow}/disallow.test.ts (96%) rename src/hooks/{ => disallow}/disallow.ts (94%) delete mode 100755 src/hooks/discard-query.ts rename {test/hooks => src/hooks/fast-join}/fast-join-cache.test.ts (96%) rename {test/hooks => src/hooks/fast-join}/fast-join.test.ts (99%) rename src/hooks/{ => fast-join}/fast-join.ts (88%) rename {test/helpers => src/hooks/fast-join/test}/make-services.ts (100%) rename {test/hooks => src/hooks/fgraphql}/fgraphql.test.ts (97%) rename src/hooks/{ => fgraphql}/fgraphql.ts (98%) rename test/hooks/iffelse.test.ts => src/hooks/iff/iff-else.test.ts (97%) rename src/hooks/{ => iff}/iff-else.ts (90%) rename {test/hooks => src/hooks/iff}/iff.test.ts (98%) rename src/hooks/{ => iff}/iff.ts (93%) create mode 100644 src/hooks/index.ts rename {test/hooks => src/hooks/keep-in-array}/keep-in-array.test.ts (99%) rename src/hooks/{ => keep-in-array}/keep-in-array.ts (96%) rename {test/hooks => src/hooks/keep-query-in-array}/keep-query-in-array.test.ts (98%) rename src/hooks/{ => keep-query-in-array}/keep-query-in-array.ts (96%) delete mode 100755 src/hooks/keep-query.ts create mode 100755 src/hooks/lowercase/lowercase-data.test.ts create mode 100755 src/hooks/lowercase/lowercase-data.ts create mode 100755 src/hooks/lowercase/lowercase-result.test.ts create mode 100755 src/hooks/lowercase/lowercase-result.ts rename {test/hooks => src/hooks/lowercase}/lowercase.test.ts (98%) rename src/hooks/{lower-case.ts => lowercase/lowercase.ts} (72%) rename {test/hooks => src/hooks/mongo-keys}/mongo-keys.test.ts (98%) rename src/hooks/{ => mongo-keys}/mongo-keys.ts (97%) rename test/hooks/discard-query.test.ts => src/hooks/omit-query/omit-query.test.ts (81%) create mode 100755 src/hooks/omit-query/omit-query.ts rename test/hooks/discard-1.test.ts => src/hooks/omit/omit-1.test.ts (96%) rename test/hooks/discard-2.test.ts => src/hooks/omit/omit-2.test.ts (94%) create mode 100755 src/hooks/omit/omit-data-1.test.ts create mode 100755 src/hooks/omit/omit-data.test.ts create mode 100755 src/hooks/omit/omit-data.ts create mode 100755 src/hooks/omit/omit-result-1.test.ts create mode 100755 src/hooks/omit/omit-result-2.test.ts create mode 100755 src/hooks/omit/omit-result.test.ts create mode 100755 src/hooks/omit/omit-result.ts rename test/hooks/discard.test.ts => src/hooks/omit/omit.test.ts (86%) rename src/hooks/{discard.ts => omit/omit.ts} (56%) rename {test/hooks => src/hooks/params-from-client}/params-from-client.test.ts (98%) rename src/hooks/{ => params-from-client}/params-from-client.ts (100%) rename test/hooks/keep-query.test.ts => src/hooks/pick-query/pick-query.test.ts (81%) create mode 100755 src/hooks/pick-query/pick-query.ts create mode 100755 src/hooks/pick/pick-data.test.ts create mode 100755 src/hooks/pick/pick-data.ts create mode 100755 src/hooks/pick/pick-result.test.ts create mode 100755 src/hooks/pick/pick-result.ts rename test/hooks/keep.test.ts => src/hooks/pick/pick.test.ts (88%) rename src/hooks/{keep.ts => pick/pick.ts} (57%) rename {test/hooks => src/hooks/populate}/populate-1deep-1child.test.ts (98%) rename {test/hooks => src/hooks/populate}/populate-basics.test.ts (96%) rename {test/hooks => src/hooks/populate}/populate-misc.test.ts (96%) rename {test/hooks => src/hooks/populate}/populate-relations.test.ts (98%) rename {test/hooks => src/hooks/populate}/populate-scaffolding.test.ts (94%) rename src/hooks/{ => populate}/populate.ts (99%) rename {test/helpers => src/hooks/populate/test}/config-app.ts (51%) rename {test/helpers => src/hooks/populate/test}/get-init-db.ts (100%) delete mode 100755 src/hooks/prevent-changes.ts rename {test/hooks => src/hooks/prevent-changes}/prevent-changes.test.ts (58%) create mode 100755 src/hooks/prevent-changes/prevent-changes.ts rename {test/hooks => src/hooks/required}/required.test.ts (95%) rename src/hooks/{ => required}/required.ts (57%) rename {test/hooks => src/hooks/run-parallel}/run-parallel.test.ts (97%) rename src/hooks/{ => run-parallel}/run-parallel.ts (93%) rename {test/hooks => src/hooks/sequelize-convert}/sequelize-convert.test.ts (99%) rename src/hooks/{ => sequelize-convert}/sequelize-convert.ts (95%) rename {test/hooks => src/hooks/serialize}/serialize.test.ts (97%) rename src/hooks/{ => serialize}/serialize.ts (94%) rename {test/hooks => src/hooks/set-field}/set-field.test.ts (98%) rename src/hooks/{ => set-field}/set-field.ts (96%) create mode 100755 src/hooks/set-now/set-now-data.test.ts create mode 100755 src/hooks/set-now/set-now-data.ts create mode 100755 src/hooks/set-now/set-now-result.test.ts create mode 100755 src/hooks/set-now/set-now-result.ts rename {test/hooks => src/hooks/set-now}/set-now.test.ts (98%) rename src/hooks/{ => set-now}/set-now.ts (68%) rename {test/hooks => src/hooks/set-slug}/set-slug.test.ts (97%) rename src/hooks/{ => set-slug}/set-slug.ts (79%) delete mode 100755 src/hooks/sifter.ts rename {test/hooks => src/hooks/sifter}/sifter.test.ts (74%) create mode 100755 src/hooks/sifter/sifter.ts rename {test/hooks => src/hooks/soft-delete}/soft-delete.test.ts (99%) rename src/hooks/{ => soft-delete}/soft-delete.ts (95%) rename {test/hooks => src/hooks/stash-before}/stash-before.test.ts (92%) rename src/hooks/{ => stash-before}/stash-before.ts (96%) rename {test/common => src/hooks/traverse}/traverse.test.ts (94%) rename src/hooks/{ => traverse}/traverse.ts (81%) rename {test/hooks => src/hooks/unless}/unless.test.ts (98%) rename src/hooks/{ => unless}/unless.ts (87%) rename {test/hooks => src/hooks/validate-schema}/validate-schema.test.ts (99%) rename src/hooks/{ => validate-schema}/validate-schema.ts (95%) rename {test/hooks => src/hooks/validate}/validate.test.ts (95%) rename src/hooks/{ => validate}/validate.ts (91%) rename {test/utils => src/utils/calling-params}/calling-params-1.test.ts (98%) rename {test/utils => src/utils/calling-params}/calling-params-2.test.ts (97%) rename src/utils/{ => calling-params}/calling-params.ts (100%) rename {test/utils => src/utils/check-context}/check-context.test.ts (98%) rename src/utils/{ => check-context}/check-context.ts (91%) rename {test/utils => src/utils/combine}/combine.test.ts (94%) rename src/utils/{ => combine}/combine.ts (89%) rename {test/utils => src/utils/every}/every.test.ts (97%) rename src/utils/{ => every}/every.ts (89%) create mode 100644 src/utils/get-data-is-array/get-data-is-array.test.ts create mode 100644 src/utils/get-data-is-array/get-data-is-array.ts create mode 100644 src/utils/get-items/get-items.test.ts rename src/utils/{ => get-items}/get-items.ts (89%) create mode 100644 src/utils/get-result-is-array/get-result-is-array.test.ts create mode 100644 src/utils/get-result-is-array/get-result-is-array.ts create mode 100644 src/utils/index.ts rename {test/utils => src/utils/is-not}/is-not.test.ts (94%) rename src/utils/{ => is-not}/is-not.ts (88%) rename {test/hooks => src/utils/is-provider}/is-provider.test.ts (94%) rename src/utils/{ => is-provider}/is-provider.ts (93%) rename {test/utils => src/utils/params-for-server}/params-for-server.test.ts (95%) rename src/utils/{ => params-for-server}/params-for-server.ts (100%) create mode 100644 src/utils/replace-items/replace-data.ts create mode 100644 src/utils/replace-items/replace-items.test.ts rename src/utils/{ => replace-items}/replace-items.ts (93%) create mode 100644 src/utils/replace-items/replace-result.ts rename {test/utils => src/utils/run-hook}/run-hook.test.ts (97%) rename src/utils/{ => run-hook}/run-hook.ts (100%) rename {test/utils => src/utils/some}/some.test.ts (96%) rename src/utils/{ => some}/some.ts (100%) delete mode 100755 test/hooks/get-replace-items.test.ts delete mode 100755 test/hooks/iff-else.test.ts delete mode 100755 test/hooks/when.test.ts diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index e7ab5c05..00000000 --- a/.eslintrc +++ /dev/null @@ -1,137 +0,0 @@ -{ - "root": true, - "env": { - "node": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": ["./tsconfig.json"] - }, - "plugins": [ - "eslint-plugin-import", - "eslint-plugin-prefer-arrow", - "@typescript-eslint", - "prettier" - ], - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:prettier/recommended" - ], - "rules": { - // "indent": ["warn", 2], - "prefer-rest-params": "off", - "prefer-spread": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-floating-promises": "off", - "@typescript-eslint/restrict-template-expressions": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/require-await": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/unbound-method": "off", - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/prefer-regexp-exec": "off", - "@typescript-eslint/no-misused-promises": "off", - "@typescript-eslint/restrict-plus-operands": "off", - // ---- - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": [ - "error", - { - "default": "array" - } - ], - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/explicit-member-accessibility": [ - "error", - { - "accessibility": "no-public" - } - ], - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-parameter-properties": "off", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/triple-slash-reference": [ - "error", - { - "path": "always", - "types": "prefer-import", - "lib": "always" - } - ], - "@typescript-eslint/unified-signatures": "error", - "@typescript-eslint/consistent-type-imports": ["warn", { "prefer": "type-imports" }], - "arrow-parens": ["off", "always"], - "complexity": "off", - "constructor-super": "error", - "eqeqeq": ["error", "smart"], - "guard-for-in": "error", - "id-blacklist": "off", - "id-match": "off", - "import/order": "off", - "max-classes-per-file": "off", - "max-len": "off", - "no-bitwise": "error", - "no-caller": "error", - "no-cond-assign": "error", - "no-console": "error", - "no-debugger": "error", - "no-empty": "off", - "no-eval": "error", - "no-fallthrough": "off", - "no-invalid-this": "off", - "no-new-wrappers": "error", - "no-shadow": [ - "off", - { - "hoist": "all" - } - ], - "no-throw-literal": "error", - "no-undef-init": "error", - "no-underscore-dangle": "off", - "no-unsafe-finally": "error", - "no-unused-labels": "error", - "no-var": "error", - "object-shorthand": "error", - "one-var": ["error", "never"], - "prefer-arrow/prefer-arrow-functions": "off", - "prefer-const": "error", - "radix": "error", - "spaced-comment": [ - "error", - "always", - { - "markers": ["/"] - } - ], - "use-isnan": "error", - "valid-typeof": "off" - }, - "overrides": [ - { - "files": ["test/**/*.ts"], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-unused-vars": "off", - "no-console": "off" - } - } - ] -} diff --git a/README.md b/README.md index b97998b9..7c0505c2 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,23 @@ ## feathers-hooks-common +### WIP Changes: + +- added alterData, alterResult, deprecated alterItems +- added discardData, discardResult, deprecated discard + - moved to omitData, omitResult, deprecated omit +- added keepData, keepResult, deprecated keep + - moved to pickData, pickResult, deprecated pick +- added lowercaseData, lowercaseResult, deprecated lowercase +- added setNowData, setNowResult, deprecated setNow + +- added getDataIsArray, getResultIsArray, deprecated getItems +- added replaceData, replaceResult, deprecated replaceItems + +- removed several checks that are handled by typescript +- removed check for `preventChanges(true, ...fieldNames)` + +- renamed 'keepQuery' to 'pickQuery', added alias +

diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 19c3cb4a..616d2571 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,54 +1,54 @@ -import { defineConfig } from "vitepress"; -import { name, description, ogUrl, ogImage } from "./meta"; -import { version } from '../../package.json' +import { defineConfig } from 'vitepress'; +import { name, description, ogUrl, ogImage } from './meta'; +import { version } from '../../package.json'; export default defineConfig({ - title: "feathers-hooks-common", + title: 'feathers-hooks-common', lastUpdated: true, - description: "", + description: '', head: [ - ["meta", { name: "theme-color", content: "#ae0bb1" }], - ["link", { rel: "icon", href: "/feathers-hooks-common-logo.png" }], - ["meta", { property: "og:title", content: name }], - ["meta", { property: "og:description", content: description }], - ["meta", { property: "og:url", content: ogUrl }], - ["meta", { property: "og:image", content: ogImage }], - ["meta", { name: "twitter:title", content: name }], - ["meta", { name: "twitter:description", content: description }], - ["meta", { name: "twitter:image", content: ogImage }], - ["meta", { name: "twitter:card", content: "summary_large_image" }], + ['meta', { name: 'theme-color', content: '#ae0bb1' }], + ['link', { rel: 'icon', href: '/feathers-hooks-common-logo.png' }], + ['meta', { property: 'og:title', content: name }], + ['meta', { property: 'og:description', content: description }], + ['meta', { property: 'og:url', content: ogUrl }], + ['meta', { property: 'og:image', content: ogImage }], + ['meta', { name: 'twitter:title', content: name }], + ['meta', { name: 'twitter:description', content: description }], + ['meta', { name: 'twitter:image', content: ogImage }], + ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ], themeConfig: { - siteTitle: "feathers-hooks-common", + siteTitle: 'feathers-hooks-common', editLink: { pattern: - "https://github.com/feathersjs-ecosystem/feathers-hooks-common/edit/master/docs/:path", + 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/edit/master/docs/:path', }, - lastUpdatedText: "Last Updated", + lastUpdatedText: 'Last Updated', socialLinks: [ { - icon: "twitter", - link: "https://twitter.com/feathersjs", + icon: 'twitter', + link: 'https://twitter.com/feathersjs', }, { - icon: "discord", - link: "https://discord.gg/qa8kez8QBx", + icon: 'discord', + link: 'https://discord.gg/qa8kez8QBx', }, { - icon: "github", - link: "https://github.com/feathersjs-ecosystem/feathers-hooks-common", + icon: 'github', + link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common', }, ], - logo: "/feathers-hooks-common-logo.png", + logo: '/feathers-hooks-common-logo.png', sidebar: [ { - text: "Guide", + text: 'Guide', items: [ - { text: "Overview", link: "/overview" }, - { text: "Hooks", link: "/hooks" }, - { text: "Utilities", link: "/utilities" }, - { text: "Migrating", link: "/migrating" }, - { text: "Guides", link: "/guides" }, + { text: 'Overview', link: '/overview' }, + { text: 'Hooks', link: '/hooks' }, + { text: 'Utilities', link: '/utilities' }, + { text: 'Migrating', link: '/migrating' }, + { text: 'Guides', link: '/guides' }, ], }, ], @@ -58,23 +58,23 @@ export default defineConfig({ items: [ { text: 'Changelog', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/CHANGELOG.md' + link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/CHANGELOG.md', }, { text: 'Contributing', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/.github/contributing.md' - } - ] - } + link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/.github/contributing.md', + }, + ], + }, ], footer: { - message: "Released under the MIT License.", - copyright: "Copyright © 2016-present Feathers contributors", + message: 'Released under the MIT License.', + copyright: 'Copyright © 2016-present Feathers contributors', }, algolia: { appId: '4GNLWKU0RF', apiKey: '8114a3bec3c82b65c26a4ed113659bce', - indexName: 'feathers-hooks' - } + indexName: 'feathers-hooks', + }, }, }); diff --git a/docs/.vitepress/meta.ts b/docs/.vitepress/meta.ts index c7b4ba02..fede0649 100644 --- a/docs/.vitepress/meta.ts +++ b/docs/.vitepress/meta.ts @@ -1,5 +1,5 @@ -export const name = "feathers-hooks-common"; -export const description = "Common hooks and utils for FeathersJS apps"; +export const name = 'feathers-hooks-common'; +export const description = 'Common hooks and utils for FeathersJS apps'; -export const ogUrl = "https://hooks-common.feathersjs.com/"; -export const ogImage = "https://hooks-common.feathersjs.com/feathers-hooks-common-logo.png"; +export const ogUrl = 'https://hooks-common.feathersjs.com/'; +export const ogImage = 'https://hooks-common.feathersjs.com/feathers-hooks-common-logo.png'; diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 5b9ffcab..e4a88672 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,6 +1,6 @@ -import Theme from 'vitepress/theme' -import '../style/main.css' +import Theme from 'vitepress/theme'; +import '../style/main.css'; export default { ...Theme, -} +}; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..a89133cf --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,51 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import eslintPluginImportX from 'eslint-plugin-import-x'; +import tsParser from '@typescript-eslint/parser'; + +export default tseslint.config( + { + ignores: [ + '**/node_modules', + '**/dist', + '**/coverage', + 'docs/.vitepress/cache', + 'docs/.vitepress/dist', + ], + }, + eslint.configs.recommended, + // eslint-disable-next-line import-x/no-named-as-default-member + tseslint.configs.recommended, + { + rules: { + // unset js rules + 'no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, + }, + eslintPluginImportX.flatConfigs.recommended, + eslintPluginImportX.flatConfigs.typescript, + { + files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], + ignores: ['eslint.config.js'], + languageOptions: { + parser: tsParser, + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'import-x/no-dynamic-require': 'warn', + 'import-x/no-nodejs-modules': 'off', + }, + }, + { + files: ['**/*.test.ts'], + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-unused-vars': 'off', + }, + }, + eslintPluginPrettierRecommended, +); diff --git a/package-lock.json b/package-lock.json index 7c6eda80..21a70e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "feathers-hooks-common", "version": "8.2.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,47 +9,45 @@ "version": "8.2.1", "license": "MIT", "dependencies": { - "@feathersjs/errors": "^5.0.29", + "@feathersjs/errors": "^5.0.31", "ajv": "^6.12.6", - "debug": "^4.3.5", - "graphql": "^16.9.0", + "graphql": "^16.10.0", "lodash": "^4.17.21", - "neotraverse": "^0.6.14" + "neotraverse": "^0.6.18" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@feathers-plus/batch-loader": "^0.3.6", "@feathers-plus/cache": "^1.4.0", "@feathers-plus/graphql": "^1.10.0", - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/authentication-local": "^5.0.29", - "@feathersjs/client": "^5.0.29", - "@feathersjs/express": "^5.0.29", - "@feathersjs/memory": "^5.0.29", - "@feathersjs/socketio": "^5.0.29", - "@feathersjs/socketio-client": "^5.0.29", + "@feathersjs/authentication": "^5.0.31", + "@feathersjs/authentication-local": "^5.0.31", + "@feathersjs/client": "^5.0.31", + "@feathersjs/express": "^5.0.31", + "@feathersjs/memory": "^5.0.31", + "@feathersjs/socketio": "^5.0.31", + "@feathersjs/socketio-client": "^5.0.31", "@types/debug": "^4.1.12", - "@types/lodash": "^4.17.7", - "@types/node": "^20.14.11", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "@vitest/coverage-v8": "^1.6.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-prettier": "^5.2.1", + "@types/lodash": "^4.17.14", + "@types/node": "^22.10.7", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", + "@vitest/coverage-v8": "^3.0.3", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import-x": "^4.6.1", + "eslint-plugin-prettier": "^5.2.3", "mongodb": "^5.9.2", - "npm-check-updates": "^16.14.20", - "prettier": "^3.3.3", + "npm-check-updates": "^17.1.14", + "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsup": "^8.1.2", - "typescript": "^5.5.3", - "vitepress": "^1.3.1", - "vitest": "^1.6.0" - }, - "engines": { - "node": ">= 18" + "tsup": "^8.3.5", + "typescript": "^5.7.3", + "typescript-eslint": "^8.21.0", + "vitepress": "^1.6.2", + "vitest": "^3.0.3" }, "peerDependencies": { "@feathersjs/feathers": "^5.0.0" @@ -57,45 +55,44 @@ }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -103,9 +100,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -113,206 +110,242 @@ "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "node_modules/@algolia/client-abtesting": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.19.0.tgz", + "integrity": "sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "node_modules/@algolia/client-analytics": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.19.0.tgz", + "integrity": "sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "node_modules/@algolia/client-common": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.19.0.tgz", + "integrity": "sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==", "dev": true, "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "node_modules/@algolia/client-insights": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.19.0.tgz", + "integrity": "sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "node_modules/@algolia/client-personalization": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.19.0.tgz", + "integrity": "sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "node_modules/@algolia/client-query-suggestions": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.19.0.tgz", + "integrity": "sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.19.0.tgz", + "integrity": "sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "node_modules/@algolia/ingestion": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.19.0.tgz", + "integrity": "sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" + } }, - "node_modules/@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "node_modules/@algolia/monitoring": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.19.0.tgz", + "integrity": "sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/logger-common": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.19.0.tgz", + "integrity": "sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" + "@algolia/client-common": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.19.0.tgz", + "integrity": "sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "node_modules/@algolia/requester-fetch": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.19.0.tgz", + "integrity": "sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "node_modules/@algolia/requester-node-http": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.19.0.tgz", + "integrity": "sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" + "@algolia/client-common": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "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.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.5" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -321,9 +354,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dev": true, "license": "MIT", "dependencies": { @@ -334,64 +367,58 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "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==", + "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, - "optional": true, + "license": "MIT", "engines": { - "node": ">=0.1.90" + "node": ">=18" } }, "node_modules/@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.3.tgz", + "integrity": "sha512-1nELpMV40JDLJ6rpVVFX48R1jsBFIQ6RnEQDsLFGmzOjPWTOMlZqUcXcvRx8VmYV/TqnS1l784Ofz+ZEb+wEOQ==", "dev": true, "license": "MIT" }, "node_modules/@docsearch/js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.1.tgz", - "integrity": "sha512-erI3RRZurDr1xES5hvYJ3Imp7jtrXj6f1xYIzDzxiS7nNBufYWPbJwrmMqWC5g9y165PmxEmN9pklGCdLi0Iqg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.3.tgz", + "integrity": "sha512-CQsX1zeoPJIWxN3IGoDSWOqzRc0JsOE9Bclegf9llwjYN2rzzJF93zagGcT3uI3tF31oCqTuUOVGW/mVFb7arw==", "dev": true, "license": "MIT", "dependencies": { - "@docsearch/react": "3.6.1", + "@docsearch/react": "3.8.3", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.3.tgz", + "integrity": "sha512-6UNrg88K7lJWmuS6zFPL/xgL+n326qXqZ7Ybyy4E8P/6Rcblk3GE8RXxeol4Pd5pFpKMhOhBhzABKKwHtbJCIg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.8.3", + "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", @@ -415,9 +442,9 @@ } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -428,13 +455,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -445,13 +472,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -462,13 +489,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -479,13 +506,11 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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" ], @@ -500,9 +525,9 @@ } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -513,13 +538,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -530,13 +555,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -547,13 +572,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -564,13 +589,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -581,13 +606,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -598,13 +623,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -615,13 +640,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -632,13 +657,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -649,13 +674,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -666,13 +691,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -683,13 +708,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -700,13 +725,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -717,13 +759,13 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -738,9 +780,9 @@ } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -751,13 +793,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -768,13 +810,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -785,13 +827,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -802,13 +844,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -819,14 +861,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -838,24 +879,54 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "version": "4.12.1", + "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/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -863,36 +934,58 @@ "strip-json-comments": "^3.1.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/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@feathers-plus/batch-loader": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.6.tgz", - "integrity": "sha512-r+n31iZ/B5Rl1mLkC9/S20UI445MdkZvE3VBmjupep2t8OuyTYHPkFEgR25HY6khH+RothK1VL3B5eumk9N2QQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/@feathers-plus/cache": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/cache/-/cache-1.4.0.tgz", - "integrity": "sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==", "dev": true, + "license": "MIT", "dependencies": { "lru-cache": "4.1.1" }, @@ -902,9 +995,8 @@ }, "node_modules/@feathers-plus/common": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/common/-/common-0.1.0.tgz", - "integrity": "sha512-rK4zNVObmw8UKP7nwTwsCVn0g2Zl92r2rpXMfVdFo8FmYfYY4HECAcGB4Aq38EI6NZnvla51CdDjtY9WxW1OHQ==", "dev": true, + "license": "MIT", "dependencies": { "short-hash": "1.0.0", "sort-keys": "2.0.0" @@ -915,10 +1007,8 @@ }, "node_modules/@feathers-plus/graphql": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/graphql/-/graphql-1.10.0.tgz", - "integrity": "sha512-ausYkHTRRxIQbNKVvQ7dHj/bkNsghsjGGKw9PO+w9XOCs6OJouO/cj1nj6RjfUDxUbZtFcc4y5QluYzDulEmEQ==", - "deprecated": "This module is no longer maintained", "dev": true, + "license": "MIT", "dependencies": { "@feathers-plus/batch-loader": "0.3.0", "@feathers-plus/cache": "1.3.1", @@ -942,18 +1032,16 @@ }, "node_modules/@feathers-plus/graphql/node_modules/@feathers-plus/batch-loader": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.0.tgz", - "integrity": "sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/@feathers-plus/graphql/node_modules/@feathers-plus/cache": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@feathers-plus/cache/-/cache-1.3.1.tgz", - "integrity": "sha512-zFpwVutKiOcPW6Gnm73uit4EwnaawYZEt6pIKP+GkYQz/wVkfNMMwZ28THCNhZvFcR1Cn3WwyUBXcASoApHpvA==", "dev": true, + "license": "MIT", "dependencies": { "lru-cache": "4.1.1" }, @@ -963,9 +1051,8 @@ }, "node_modules/@feathers-plus/graphql/node_modules/@feathersjs/errors": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.2.0.tgz", - "integrity": "sha512-4xsE7OyzxGvs2hyG19nf2qb4rV2nWoWbQ6/FnDIYrNHi7M9kOy+deLwNhKnXa4r/hg3xf+AVpC8kBjUQjWYWHA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.1.0" }, @@ -975,37 +1062,32 @@ }, "node_modules/@feathers-plus/graphql/node_modules/debug": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/@feathers-plus/graphql/node_modules/graphql": { "version": "0.11.7", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", "dev": true, + "license": "MIT", "dependencies": { "iterall": "1.1.3" } }, "node_modules/@feathers-plus/graphql/node_modules/graphql-relay": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.5.5.tgz", - "integrity": "sha512-CTsapMI0MZc0antZp+9ZcVcNiVoaXncc2xALCxe2Md25quAUxTjH2135xPRNb6BMOoTiY54HtglfxxUCDTUEbA==", "dev": true, + "license": "MIT", "peerDependencies": { "graphql": "^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0" } }, "node_modules/@feathers-plus/graphql/node_modules/graphql-tools": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-2.0.0.tgz", - "integrity": "sha512-5cUflK/kECqge0feZxTG/cF05EHlGMvdK47I+xQtDm67KrW8rlfmLTUWHYcyFTOXT+Yl4Sb/6WTJZwnKX+Ofmg==", - "deprecated": "This package has been deprecated and now it only exports makeExecutableSchema.\\nAnd it will no longer receive updates.\\nWe recommend you to migrate to scoped packages such as @graphql-tools/schema, @graphql-tools/utils and etc.\\nCheck out https://www.graphql-tools.com to learn what package you should use instead", "dev": true, + "license": "MIT", "dependencies": { "deprecated-decorator": "^0.1.6", "uuid": "^3.1.0" @@ -1019,9 +1101,8 @@ }, "node_modules/@feathers-plus/graphql/node_modules/join-monster": { "version": "2.0.15", - "resolved": "https://registry.npmjs.org/join-monster/-/join-monster-2.0.15.tgz", - "integrity": "sha512-4ZZd0grGtamGsevMP4iCF+dZ5jyeuvbvEgF5LgPp9Gz1VNUTaL79/ZNfc0Hs/uSNJAVj1vbaUGK/wsnopyYLkA==", "dev": true, + "license": "MIT", "dependencies": { "@stem/nesthydrationjs": "0.4.0", "debug": "^3.0.1", @@ -1039,9 +1120,8 @@ }, "node_modules/@feathers-plus/graphql/node_modules/join-monster-graphql-tools-adapter": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/join-monster-graphql-tools-adapter/-/join-monster-graphql-tools-adapter-0.0.2.tgz", - "integrity": "sha512-Q2DaeL/L6yY7Rh30YvkysB48QdPwbMBElo72gXelDOczymw0DzP1jmrvLuClyxeL5FJs5tt28CHKIKEgYwFAbA==", "dev": true, + "license": "MIT", "peerDependencies": { "graphql-tools": "^0.4.0", "join-monster": "*" @@ -1049,36 +1129,32 @@ }, "node_modules/@feathers-plus/graphql/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@feathers-plus/graphql/node_modules/traverse": { "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@feathers-plus/graphql/node_modules/uuid": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, + "license": "MIT", "bin": { "uuid": "bin/uuid" } }, "node_modules/@feathersjs/adapter-commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.29.tgz", - "integrity": "sha512-9D0He+VqkUoYaSbfav4Rg0DMCVXtGmPNNxRO5QDJqbJ7U4deozCru3+qWMIVAYRXc5jiX0x2iFbSVOoMoFf78Q==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.31.tgz", + "integrity": "sha512-x+RfY1H25ZGOmv/1p6Ob81AO/2KC+N2iJCVUFLItsHaGuMRn+s692GNYAl4Vk/kL3HzoPmfunSrCUxCXZ6MV5Q==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29" + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31" }, "engines": { "node": ">= 12" @@ -1089,23 +1165,23 @@ } }, "node_modules/@feathersjs/authentication": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.29.tgz", - "integrity": "sha512-kYC1x1etmZ9Q9EZXd6bbMlk1myaHS5TsW3kOty0m6amG9BDcFdEyh9ij/JgVuL0EJ+7KOHweOypdJ3bIpiinqQ==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.31.tgz", + "integrity": "sha512-mIu9v5UnQl6KnMUyrS+NNwBc5F8aM0DfsuIBn6/tYRi+r0KOFx08zwqo6Ai7/0b+uaMrUB8YM54295GLxM4o9A==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", - "@types/jsonwebtoken": "^9.0.6", + "@feathersjs/schema": "^5.0.31", + "@feathersjs/transport-commons": "^5.0.31", + "@types/jsonwebtoken": "^9.0.7", "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "long-timeout": "^0.1.1", - "uuid": "^10.0.0" + "uuid": "^11.0.2" }, "engines": { "node": ">= 12" @@ -1116,16 +1192,16 @@ } }, "node_modules/@feathersjs/authentication-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.29.tgz", - "integrity": "sha512-F0aIJPYLSvDJOnPBqhXOT1UUD/IAxJ2u8xdKGDY+sWGpqCIDMl32PDqImilqC8+G+/BmKJ8Rjhe81oXEbbhOBw==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.31.tgz", + "integrity": "sha512-SzAtQ8QK49HbYIokzLUEnv7MfvKAobZoCi5tVkssgfVP0L9fiYcR6fXdtfJ7UkaoR55IbLGUctkPpz0zExCr6Q==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29" + "@feathersjs/authentication": "^5.0.31", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31" }, "engines": { "node": ">= 12" @@ -1136,16 +1212,16 @@ } }, "node_modules/@feathersjs/authentication-local": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-5.0.29.tgz", - "integrity": "sha512-Xkv1oCxn4eZGFWM61Wgo0ghabJIHg0xhkr5zy3glTDZFzqmS8xsoRyQufBnzEd8zMQlw09AK/YbFRNWUc8lNIQ==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-5.0.31.tgz", + "integrity": "sha512-2pChJJnP4UW2TnhsOaj4spTWrCsjy5dXlG9bE9jSaJlGUXuex8iKiofInsu8GxWdd8vNhP1ArPLvrZOw6knIPA==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", + "@feathersjs/authentication": "^5.0.31", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", "bcryptjs": "^2.4.3", "lodash": "^4.17.21" }, @@ -1158,17 +1234,17 @@ } }, "node_modules/@feathersjs/client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-5.0.29.tgz", - "integrity": "sha512-JzzmuBwHR//NhFBGZsadelpMPz0U3UX/FbOrveUiFrACYdk2MkkUwaIJFlWhFIU8gQJrSDDbGIgnMjEwV9XrXA==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-5.0.31.tgz", + "integrity": "sha512-d7516ANfv3HUmBFoPY17kTh7pU++Jim9i/PwjbUBJzUWCp2Ilup+txaVrT9wna0NKdgMB/IB4Fr4e2zOmTkGuw==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication-client": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/rest-client": "^5.0.29", - "@feathersjs/socketio-client": "^5.0.29" + "@feathersjs/authentication-client": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", + "@feathersjs/rest-client": "^5.0.31", + "@feathersjs/socketio-client": "^5.0.31" }, "engines": { "node": ">= 12" @@ -1179,9 +1255,9 @@ } }, "node_modules/@feathersjs/commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.29.tgz", - "integrity": "sha512-Gr2c0XxBTQ/+SoH8bAxJO1rUzBrFExQmK7Wdasp9g/xwS0InCNLPHhrrNc2KwTVSx8kbsN+GZRBkzytmxgWM0w==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.31.tgz", + "integrity": "sha512-Kp8euV0ARSxQMCSH+em0opQBK2QkuWf+gPs+pnWK16H8kDciQ0tOz1st11X/5CYMbhy5Ccp2LSclpMQ7xNcrdA==", "license": "MIT", "engines": { "node": ">= 12" @@ -1192,33 +1268,33 @@ } }, "node_modules/@feathersjs/errors": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-5.0.29.tgz", - "integrity": "sha512-SLpvC36V84XKxucAtDC70GXkqmsvTE5SO4uSZXuTpK68VqeefbmSY+KSid2DY9dM0upZN7orwVBB5YciUMCIIg==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-5.0.31.tgz", + "integrity": "sha512-+ar4aq8Ka1EtTGH1+BBIDW12nfNJKnnzGdevoCmSmfHVAdb66se5fWv3I4rShvnguYyeUg8rkICJYf7AEcrPiw==", "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/@feathersjs/express": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.29.tgz", - "integrity": "sha512-PvbzAuolHZEL2VBQRyuMVhsa9LVM7HuN6nXyGFv7IqSr7t61i3v5BuWbn4SQ6EO88NVHDnb7DZT7ojDVhU6YFw==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.31.tgz", + "integrity": "sha512-LL9BiI9EDrFt31/3vn1Z0qgeBjM/JXFeZNKqNqxxbCiIZS/d09m/bdrC8b1pBcPRT4Q4KUrLbnxAUNmOShYm/w==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", + "@feathersjs/authentication": "^5.0.31", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", + "@feathersjs/transport-commons": "^5.0.31", "@types/compression": "^1.7.5", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.19.5", "compression": "^1.7.4", "cors": "^2.8.5", - "express": "^4.19.2" + "express": "^4.21.1" }, "engines": { "node": ">= 12" @@ -1229,12 +1305,12 @@ } }, "node_modules/@feathersjs/feathers": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.29.tgz", - "integrity": "sha512-ERY0W0FfZUysIksdwbBhXZot1F1EuLtlhJA27o9VN9EWIh6IHlT30McyqQqdqTiqVhsOS+KJPLTeGPH60REg+Q==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.31.tgz", + "integrity": "sha512-QCGyemcRGnKMLMJ0XssAwaaGwydhE4KG8QwUVgMQdrJ1yOjx4NvXbOgsWeJ0kJ971KkxzNt1AKN1WJc398qyhw==", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", + "@feathersjs/commons": "^5.0.31", "@feathersjs/hooks": "^0.9.0", "events": "^3.3.0" }, @@ -1248,23 +1324,21 @@ }, "node_modules/@feathersjs/hooks": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@feathersjs/hooks/-/hooks-0.9.0.tgz", - "integrity": "sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@feathersjs/memory": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.29.tgz", - "integrity": "sha512-szi/4WcvwxX8OEi3A/7qUozUzx1ZVIPHX3IEOU9bDnNsDMGWfVlHGOOW3HdSMAOVZWhGR56oMsvXvrAcgdCVRw==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.31.tgz", + "integrity": "sha512-fyju2ktjeuIpLLW0pJNuJranVt+bfmiUkQXZj3W5RfMPw1p3lF7vJ+mQUjp4i5qyNS8qUQ/2OsW9zp5m96LAQQ==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", + "@feathersjs/adapter-commons": "^5.0.31", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", "sift": "^17.1.3" }, "engines": { @@ -1272,17 +1346,17 @@ } }, "node_modules/@feathersjs/rest-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-5.0.29.tgz", - "integrity": "sha512-fqqZOb4yEZe2Gyrd1/+OyZQkYEwNiwYe4OXd2bVkT60bRBa8zpDUKZrMSTKARvPXzxPKttdrMuOeTmCogHq0KA==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-5.0.31.tgz", + "integrity": "sha512-djnj+AzwikQa2PjWgrsP3YdxouZpRJFOLbuw/5dnieKnrvGkvQi2kacJ5nHO0KYHQJUDioC64NwV+CDx4NjGuA==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@types/superagent": "^8.1.7", - "qs": "^6.12.3" + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", + "@types/superagent": "^8.1.9", + "qs": "^6.13.0" }, "engines": { "node": ">= 12" @@ -1293,21 +1367,21 @@ } }, "node_modules/@feathersjs/schema": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.29.tgz", - "integrity": "sha512-Eq1wSYyfczJlD7/4mcD5AtNTq3HdjjS191NCJWEurNIKm6MlIssvZXIjMOjnna2A1Vw/80vPIapat65uebEKPg==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.31.tgz", + "integrity": "sha512-F09M6+SwoKw0L7iqCU31eCzZOPgXWW0g66C1AjNOvchT06JDVYhzx0RaCxRLtI1xaXwd5MnlvVb4RB6uVc4wmw==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", + "@feathersjs/adapter-commons": "^5.0.31", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", "@feathersjs/hooks": "^0.9.0", "@types/json-schema": "^7.0.15", - "ajv": "^8.16.0", + "ajv": "^8.17.1", "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.0" + "json-schema-to-ts": "^3.1.1" }, "engines": { "node": ">= 12" @@ -1317,7 +1391,7 @@ "url": "https://github.com/sponsors/daffl" }, "peerDependencies": { - "typescript": ">=5.5" + "typescript": ">=5.6" } }, "node_modules/@feathersjs/schema/node_modules/ajv": { @@ -1345,16 +1419,16 @@ "license": "MIT" }, "node_modules/@feathersjs/socketio": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.29.tgz", - "integrity": "sha512-xtHtWAoEgOEgTYmiEKyqEC10DLbZ51U3mMluQPknsGgH1W2+GgI7WwCAVyM3ZPcVFlUwmVa62/GsIznOs33Hjg==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.31.tgz", + "integrity": "sha512-ZTucvK9dWJenVjULH4xIDgXo4mPnIr/xxBviXbd/ILCqFtx/oGMsl0gOY4MWEciTWUErsDjy6YGblSJX5/a5cA==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", - "socket.io": "^4.7.5" + "@feathersjs/commons": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", + "@feathersjs/transport-commons": "^5.0.31", + "socket.io": "^4.8.1" }, "engines": { "node": ">= 12" @@ -1365,14 +1439,14 @@ } }, "node_modules/@feathersjs/socketio-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.29.tgz", - "integrity": "sha512-6jw4YCTZ35dwBT1DEvI9CkB99lND02Wk8WfU6xf2Ss1ZBU1oNl1zqVZTECHiuvYp4akPRMS9HIZFm1DK8qLEOQ==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.31.tgz", + "integrity": "sha512-Ig1ZyBDUbbLRG8d4jV6bvIlgRspvDXNtAyc5hKc57UyU1uGAV8dFTk2xH0micz+rzky+PIds4ZqGMb/n+b0D6w==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29" + "@feathersjs/feathers": "^5.0.31", + "@feathersjs/transport-commons": "^5.0.31" }, "engines": { "node": ">= 12" @@ -1383,15 +1457,15 @@ } }, "node_modules/@feathersjs/transport-commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-5.0.29.tgz", - "integrity": "sha512-Xy7J9h/t9vLqjPnyn3RnNtcS9wBDp/VfdVYulC0hnpEBFKwDtyjx055rUgrNn8r1B4w0y8CyX02MNSupABgOiQ==", + "version": "5.0.31", + "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-5.0.31.tgz", + "integrity": "sha512-md3dhUm47vh6aqPwb0T0Kj+LZI2JkRwMRTSx/X6w0n2evOB1x3/wspI4QY4JeUnPN0ab+IHlZVEF10FL0UQPQw==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", + "@feathersjs/commons": "^5.0.31", + "@feathersjs/errors": "^5.0.31", + "@feathersjs/feathers": "^5.0.31", "encodeurl": "^2.0.0", "lodash": "^4.17.21" }, @@ -1403,44 +1477,91 @@ "url": "https://github.com/sponsors/daffl" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=12.22" + "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.21.tgz", + "integrity": "sha512-aqbIuVshMZ2fNEhm25//9DoKudboXF3CpoEQJJlHl9gVSVNOTr4cgaCIZvgSEYmys2HHEfmhcpoZIhoEFZS8SQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { "version": "8.0.2", - "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", @@ -1455,9 +1576,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1467,15 +1587,13 @@ }, "node_modules/@isaacs/cliui/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 + "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", @@ -1490,9 +1608,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1508,32 +1625,21 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "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" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1541,32 +1647,31 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "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, "license": "MIT", "dependencies": { @@ -1576,9 +1681,8 @@ }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -1589,6 +1693,7 @@ "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" @@ -1602,6 +1707,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" } @@ -1611,6 +1717,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" @@ -1619,149 +1726,20 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12.4.0" } }, "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, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -1769,8 +1747,6 @@ }, "node_modules/@pkgr/core": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, "license": "MIT", "engines": { @@ -1780,35 +1756,10 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", - "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "dependencies": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz", + "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==", "cpu": [ "arm" ], @@ -1820,9 +1771,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz", + "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==", "cpu": [ "arm64" ], @@ -1834,9 +1785,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz", + "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==", "cpu": [ "arm64" ], @@ -1848,9 +1799,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz", + "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==", "cpu": [ "x64" ], @@ -1861,10 +1812,38 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz", + "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz", + "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz", + "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==", "cpu": [ "arm" ], @@ -1876,9 +1855,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz", + "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==", "cpu": [ "arm" ], @@ -1890,9 +1869,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz", + "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==", "cpu": [ "arm64" ], @@ -1904,9 +1883,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz", + "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==", "cpu": [ "arm64" ], @@ -1917,10 +1896,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz", + "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz", + "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==", "cpu": [ "ppc64" ], @@ -1932,9 +1925,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz", + "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==", "cpu": [ "riscv64" ], @@ -1946,9 +1939,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz", + "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==", "cpu": [ "s390x" ], @@ -1960,9 +1953,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz", + "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==", "cpu": [ "x64" ], @@ -1974,9 +1967,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz", + "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==", "cpu": [ "x64" ], @@ -1988,9 +1981,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz", + "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==", "cpu": [ "arm64" ], @@ -2002,9 +1995,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz", + "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==", "cpu": [ "ia32" ], @@ -2016,9 +2009,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz", + "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==", "cpu": [ "x64" ], @@ -2030,91 +2023,91 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.1.0.tgz", + "integrity": "sha512-v795KDmvs+4oV0XD05YLzfDMe9ISBgNjtFxP4PAEv5DqyeghO1/TwDqs9ca5/E6fuO95IcAcWqR6cCX9TnqLZA==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.4" + "@shikijs/engine-javascript": "2.1.0", + "@shikijs/engine-oniguruma": "2.1.0", + "@shikijs/types": "2.1.0", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" } }, - "node_modules/@shikijs/transformers": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.3.tgz", - "integrity": "sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==", + "node_modules/@shikijs/engine-javascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.1.0.tgz", + "integrity": "sha512-cgIUdAliOsoaa0rJz/z+jvhrpRd+fVAoixVFEVxUq5FA+tHgBZAIfVJSgJNVRj2hs/wZ1+4hMe82eKAThVh0nQ==", "dev": true, "license": "MIT", "dependencies": { - "shiki": "1.10.3" + "@shikijs/types": "2.1.0", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.3.0" } }, - "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/@shikijs/engine-oniguruma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.1.0.tgz", + "integrity": "sha512-Ujik33wEDqgqY2WpjRDUBECGcKPv3eGGkoXPujIXvokLaRmGky8NisSk8lHUGeSFxo/Cz5sgFej9sJmA9yeepg==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@shikijs/types": "2.1.0", + "@shikijs/vscode-textmate": "^10.0.1" } }, - "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/@shikijs/langs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.1.0.tgz", + "integrity": "sha512-Jn0gS4rPgerMDPj1ydjgFzZr5fAIoMYz4k7ZT3LJxWWBWA6lokK0pumUwVtb+MzXtlpjxOaQejLprmLbvMZyww==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.1.0" } }, - "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/@shikijs/themes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.1.0.tgz", + "integrity": "sha512-oS2mU6+bz+8TKutsjBxBA7Z3vrQk21RCmADLpnu8cy3tZD6Rw0FKqDyXNtwX52BuIDKHxZNmRlTdG3vtcYv3NQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@shikijs/types": "2.1.0" } }, - "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/@shikijs/transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha512-3sfvh6OKUVkT5wZFU1xxiq1qqNIuCwUY3yOb9ZGm19y80UZ/eoroLE2orGNzfivyTxR93GfXXZC/ghPR0/SBow==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@shikijs/core": "2.1.0", + "@shikijs/types": "2.1.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@shikijs/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.1.0.tgz", + "integrity": "sha512-OFOdHA6VEVbiQvepJ8yqicC6VmBrKxFFhM2EsHHrZESqLVAXOSeRDiuSYV185lIgp15TVic5vYBYNhTsk1xHLg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "license": "MIT" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", @@ -2125,118 +2118,46 @@ }, "node_modules/@stem/nesthydrationjs": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@stem/nesthydrationjs/-/nesthydrationjs-0.4.0.tgz", - "integrity": "sha512-hnoLv6W7CmhWXCEp6MBiZv4CdqI48aYmxM+Lo5T3qogP+x+MBR0DOyt7XdppI/X8McqHisCbSNvAOC4fgPhUiw==", "dev": true, + "license": "ISC", "dependencies": { "lodash": "4.13.1" } }, "node_modules/@stem/nesthydrationjs/node_modules/lodash": { "version": "4.13.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "integrity": "sha512-j/GRONYpkXt1aB1bQHzkq0Th7zhv/syoDVrzCDA3FDMntIin0b7TjXi62q9juDC+QfhRs9COr0LFW38vQSH9Tg==", - "dev": true - }, - "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/@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" - } + "license": "MIT" }, - "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/@types/body-parser": { + "version": "1.19.5", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "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/@types/compression": { + "version": "1.7.5", "dev": true, + "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "@types/express": "*" } }, - "node_modules/@tufjs/models/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==", + "node_modules/@types/connect": { + "version": "3.4.38", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@types/node": "*" } }, - "node_modules/@tufjs/models/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, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true, "license": "MIT" }, @@ -2249,33 +2170,38 @@ }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2285,8 +2211,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "license": "MIT", "dependencies": { @@ -2298,9 +2222,8 @@ }, "node_modules/@types/graphql": { "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.11.8.tgz", - "integrity": "sha512-xGWx4kx9JKlqxDrZA12gw5qi2lvxPNLxnQQcoTXVX83MuGcXcpb7TADatGyGW51GaaXQOQTbjw3x4HuL3ULBaA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/hast": { @@ -2315,9 +2238,8 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -2326,16 +2248,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "dev": true, "license": "MIT", "dependencies": { @@ -2350,16 +2266,16 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==", "dev": true, "license": "MIT" }, "node_modules/@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "version": "14.1.2", + "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": { @@ -2367,6 +2283,16 @@ "@types/mdurl": "^2" } }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", @@ -2383,57 +2309,38 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/qs": { "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/@types/range-parser": { + "version": "1.2.7", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -2441,9 +2348,8 @@ }, "node_modules/@types/serve-static": { "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -2451,21 +2357,22 @@ } }, "node_modules/@types/superagent": { - "version": "8.1.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", - "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, "license": "MIT", "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", - "@types/node": "*" + "@types/node": "*", + "form-data": "^4.0.0" } }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, @@ -2478,97 +2385,85 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/webidl-conversions": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", + "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/type-utils": "8.21.0", + "@typescript-eslint/utils": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.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": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", + "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", + "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2576,41 +2471,37 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", + "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "8.21.0", + "@typescript-eslint/utils": "8.21.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", + "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", "dev": true, "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2618,32 +2509,30 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", + "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^16.0.0 || >=18.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 <5.8.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -2657,9 +2546,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "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": { @@ -2673,209 +2562,236 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", + "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.21.0", + "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/typescript-estree": "8.21.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", + "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.21.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0", + "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "node_modules/@vitest/coverage-v8": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", - "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.3.tgz", + "integrity": "sha512-uVbJ/xhImdNtzPnLyxCZJMTeTIYdgcC2nWtBBBpR1H6z0w8m7D+9/zrDIx2nNxgMg9r+X8+RY2qVpUDeW2b3nw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.4", + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "debug": "^4.4.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "test-exclude": "^6.0.0" + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.6.0" + "@vitest/browser": "3.0.3", + "vitest": "3.0.3" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.3.tgz", + "integrity": "sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" + "@vitest/spy": "3.0.3", + "@vitest/utils": "3.0.3", + "chai": "^5.1.2", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "node_modules/@vitest/mocker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.3.tgz", + "integrity": "sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/spy": "3.0.3", + "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" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/@vitest/pretty-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.3.tgz", + "integrity": "sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" + "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "node_modules/@vitest/runner": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.3.tgz", + "integrity": "sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.20" + "dependencies": { + "@vitest/utils": "3.0.3", + "pathe": "^2.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.3.tgz", + "integrity": "sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "3.0.3", + "magic-string": "^0.30.17", + "pathe": "^2.0.1" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.3.tgz", + "integrity": "sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.3.tgz", + "integrity": "sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==", "dev": true, "license": "MIT", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "3.0.3", + "loupe": "^3.1.2", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vue/compiler-core": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.32.tgz", - "integrity": "sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.32", + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" @@ -2889,31 +2805,31 @@ "license": "MIT" }, "node_modules/@vue/compiler-dom": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.32.tgz", - "integrity": "sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.4.32", - "@vue/shared": "3.4.32" + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.32.tgz", - "integrity": "sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.32", - "@vue/compiler-dom": "3.4.32", - "@vue/compiler-ssr": "3.4.32", - "@vue/shared": "3.4.32", + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.39", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, @@ -2925,35 +2841,35 @@ "license": "MIT" }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.32.tgz", - "integrity": "sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.4.32", - "@vue/shared": "3.4.32" + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/devtools-api": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.6.tgz", - "integrity": "sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.0.tgz", + "integrity": "sha512-bHEv6kT85BHtyGgDhE07bAUMAy7zpv6nnR004nSTd0wWMrAOtcrYoXO5iyr20Hkf5jR8obQOfS3byW+I3l2CCA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.3.6" + "@vue/devtools-kit": "^7.7.0" } }, "node_modules/@vue/devtools-kit": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.6.tgz", - "integrity": "sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.0.tgz", + "integrity": "sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.3.6", - "birpc": "^0.2.17", + "@vue/devtools-shared": "^7.7.0", + "birpc": "^0.2.19", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", @@ -2962,9 +2878,9 @@ } }, "node_modules/@vue/devtools-shared": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.6.tgz", - "integrity": "sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.0.tgz", + "integrity": "sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2972,113 +2888,86 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.32.tgz", - "integrity": "sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.4.32" + "@vue/shared": "3.5.13" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.32.tgz", - "integrity": "sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.32", - "@vue/shared": "3.4.32" + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.32.tgz", - "integrity": "sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.4.32", - "@vue/runtime-core": "3.4.32", - "@vue/shared": "3.4.32", + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.32.tgz", - "integrity": "sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.4.32", - "@vue/shared": "3.4.32" + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" }, "peerDependencies": { - "vue": "3.4.32" + "vue": "3.5.13" } }, "node_modules/@vue/shared": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.32.tgz", - "integrity": "sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", - "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.4.0.tgz", + "integrity": "sha512-XnjQYcJwCsyXyIafyA6SvyN/OBtfPnjvJmbxNxQjCcyWD198urwm5TYvIUUyAxEAN0K7HJggOgT15cOlWFyLeA==", "dev": true, "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" + "@vueuse/metadata": "12.4.0", + "@vueuse/shared": "12.4.0", + "vue": "^3.5.13" }, "funding": { "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } } }, "node_modules/@vueuse/integrations": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.0.tgz", - "integrity": "sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.4.0.tgz", + "integrity": "sha512-EZm+TLoZMeEwDnccnEqB54CvvcVKbVnJubOF380HqdyZAxWfQ8egnFCESdlXWEIbxFgjfhcGfZUvQx5Nqw9Ofw==", "dev": true, "license": "MIT", "dependencies": { - "@vueuse/core": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" + "@vueuse/core": "12.4.0", + "@vueuse/shared": "12.4.0", + "vue": "^3.5.13" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -3086,16 +2975,16 @@ "peerDependencies": { "async-validator": "^4", "axios": "^1", - "change-case": "^4", - "drauu": "^0.3", + "change-case": "^5", + "drauu": "^0.4", "focus-trap": "^7", - "fuse.js": "^6", + "fuse.js": "^7", "idb-keyval": "^6", - "jwt-decode": "^3", + "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", - "universal-cookie": "^6" + "universal-cookie": "^7" }, "peerDependenciesMeta": { "async-validator": { @@ -3136,37 +3025,10 @@ } } }, - "node_modules/@vueuse/integrations/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, "node_modules/@vueuse/metadata": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", - "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.4.0.tgz", + "integrity": "sha512-AhPuHs/qtYrKHUlEoNO6zCXufu8OgbR8S/n2oMw1OQuBQJ3+HOLQ+EpvXs+feOlZMa0p8QVvDWNlmcJJY8rW2g==", "dev": true, "license": "MIT", "funding": { @@ -3174,56 +3036,22 @@ } }, "node_modules/@vueuse/shared": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", - "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.4.0.tgz", + "integrity": "sha512-9yLgbHVIF12OSCojnjTIoZL1+UA10+O4E1aD6Hpfo/DKVm5o3SZIwz6CupqGy3+IcKI8d6Jnl26EQj/YucnW0Q==", "dev": true, "license": "MIT", "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" + "vue": "^3.5.13" }, "funding": { "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } } }, - "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/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" @@ -3233,10 +3061,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3249,60 +3078,14 @@ "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.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "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, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3357,52 +3140,42 @@ "license": "MIT" }, "node_modules/algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.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==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.19.0.tgz", + "integrity": "sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.1.0" - } + "@algolia/client-abtesting": "5.19.0", + "@algolia/client-analytics": "5.19.0", + "@algolia/client-common": "5.19.0", + "@algolia/client-insights": "5.19.0", + "@algolia/client-personalization": "5.19.0", + "@algolia/client-query-suggestions": "5.19.0", + "@algolia/client-search": "5.19.0", + "@algolia/ingestion": "1.19.0", + "@algolia/monitoring": "1.19.0", + "@algolia/recommend": "5.19.0", + "@algolia/requester-browser-xhr": "5.19.0", + "@algolia/requester-fetch": "5.19.0", + "@algolia/requester-node-http": "5.19.0" + }, + "engines": { + "node": ">= 14.0.0" + } }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "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": { "color-convert": "^2.0.1" }, @@ -3415,62 +3188,15 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, - "node_modules/anymatch": { - "version": "3.1.3", - "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" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "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 - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "Python-2.0" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -3479,137 +3205,27 @@ "dev": true, "license": "MIT" }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "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": "*" + "node": ">=12" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64id": { "version": "2.0.0", @@ -3623,27 +3239,13 @@ }, "node_modules/bcryptjs": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/birpc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", - "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", "dev": true, "license": "MIT", "funding": { @@ -3651,9 +3253,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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": { @@ -3665,7 +3267,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -3703,13 +3305,13 @@ "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "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.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -3718,119 +3320,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "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==", - "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/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "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/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, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3838,38 +3344,19 @@ }, "node_modules/bson": { "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=14.20.1" } }, "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==", - "dev": true - }, - "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/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "dependencies": { - "semver": "^7.0.0" - } + "license": "BSD-3-Clause" }, "node_modules/bundle-require": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", - "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", "dev": true, "license": "MIT", "dependencies": { @@ -3884,318 +3371,156 @@ }, "node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "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==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, + "license": "MIT", "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" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">= 0.4" } }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacache/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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/cacache/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/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/cacheable-request": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.1.2.tgz", - "integrity": "sha512-N7F4os5ZI+8mWHSbeJmxn+qimf5uK3WU53FD1b298XLGtOLPpSA/1xAchfP4NJlDwqgaviZ0SQfxTQD0K6lr9w==", + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, + "license": "MIT", "dependencies": { - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.0", - "keyv": "^4.5.0", - "mimic-response": "^4.0.0", - "normalize-url": "^7.1.0", - "responselike": "^3.0.0" + "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": ">=14.16" + "node": ">=12" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, - "engines": { - "node": ">=14.16" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "node_modules/character-entities-legacy": { + "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==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "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" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "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", - "dependencies": { - "get-func-name": "^2.0.2" - }, "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "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" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "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-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" } }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -4203,9 +3528,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4215,33 +3539,37 @@ }, "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==", - "dev": true + "dev": true, + "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==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "bin": { - "color-support": "bin.js" + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, - "engines": { - "node": ">=14" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "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" }, @@ -4251,9 +3579,8 @@ }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -4269,89 +3596,35 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compression/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 + "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 - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true, "license": "MIT" }, - "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/config-chain/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 - }, - "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/consola": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", "dev": true, "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-control-strings": { - "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 - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4376,9 +3649,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", "engines": { @@ -4410,9 +3683,8 @@ }, "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" @@ -4422,10 +3694,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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", @@ -4435,33 +3708,6 @@ "node": ">= 8" } }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -4470,12 +3716,13 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4486,111 +3733,38 @@ } } }, - "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==", + "node_modules/debug/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==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "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", - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { "node": ">=6" } }, - "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==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "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 - }, - "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" - } + "license": "MIT" }, - "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==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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==", - "dev": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4603,15 +3777,23 @@ }, "node_modules/deprecate": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.1.1.tgz", - "integrity": "sha512-ZGDXefq1xknT292LnorMY5s8UVU08/WKdzDZCUT6t9JzsiMSP4uzUhgpqugffNVcT5WC6wMBiSQ+LFjlv3v7iQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deprecated-decorator": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha512-MHidOOnCHGlZDKsI21+mbIIhf4Fff+hhCTB7gtVg4uoIqjcrTZc5v6M+GS2zVI0sV7PqK415rb8XaOSQsQkHOw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/destroy": { "version": "1.2.0", @@ -4624,26 +3806,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "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==", "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" + "dequal": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/doctrine": { @@ -4651,6 +3825,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4658,32 +3833,30 @@ "node": ">=6.0.0" } }, - "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==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, "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 + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4697,11 +3870,17 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/encodeurl": { + "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, + "license": "MIT" + }, + "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", @@ -4711,33 +3890,10 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/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, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "license": "MIT", "dependencies": { @@ -4746,7 +3902,7 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -4767,163 +3923,107 @@ } }, "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "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==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/engine.io/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==", "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, "engines": { - "node": ">=6" + "node": ">=10.13.0" } }, - "node_modules/err-code": { - "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 - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } + "license": "MIT" }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "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, "license": "MIT", @@ -4959,15733 +4059,4798 @@ "@esbuild/win32-x64": "0.21.5" } }, - "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==", + "node_modules/esbuild/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, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "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==", - "dev": true, - "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==", + "node_modules/esbuild/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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "node_modules/esbuild/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", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "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", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "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==", + "node_modules/esbuild/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, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/esbuild/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": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esbuild/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": { - "ms": "^2.1.1" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/esbuild/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": { - "debug": "^3.2.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=12" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/esbuild/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": { - "ms": "^2.1.1" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/esbuild/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": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node": ">=12" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/esbuild/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, - "dependencies": { - "esutils": "^2.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" + "node": ">=12" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "node_modules/esbuild/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", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "node": ">=12" } }, - "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==", + "node_modules/esbuild/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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/esbuild/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, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint/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/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/esbuild/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, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "node_modules/esbuild/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, - "dependencies": { - "estraverse": "^5.1.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/esbuild/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": { - "estraverse": "^5.2.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.0" + "node": ">=12" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/esbuild/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.0" + "node": ">=12" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/esbuild/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, "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/esbuild/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": ">=0.10.0" + "node": ">=12" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/esbuild/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": ">= 0.6" + "node": ">=12" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "node_modules/esbuild/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", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">=12" } }, - "node_modules/express/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/esbuild/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, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "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==", + "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==", "dev": true, "license": "MIT" }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, + "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-glob/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==", + "node_modules/eslint": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "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==" - }, - "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-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/feathers-hooks-common": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/feathers-hooks-common/-/feathers-hooks-common-4.5.6.tgz", - "integrity": "sha512-z0KZP/igmHvEJX46x0f6UC/pSYFXUt/2OfgMwumElGqxwFYU4JrAnK8FbGwCo8MYowMDfpMk72ju+axbq9MV1Q==", - "dev": true, - "dependencies": { - "@feathers-plus/batch-loader": "0.3.0", - "@feathersjs/commons": "^1.2.0", - "@feathersjs/errors": "^3.0.0", - "ajv": "^5.2.0", - "debug": "^3.0.0", - "process": "0.11.10", - "traverse": "^0.6.6" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathers-plus/batch-loader": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.0.tgz", - "integrity": "sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/commons": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.4.4.tgz", - "integrity": "sha512-ZPpzyZA3CPfoa9AuFv3BJUI/ubzaaXixp8T/pqeMFPT6DOaU/6oF7lz1RxwimzfJNna4gy/HByt0EoLSI3BKWg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.3.6.tgz", - "integrity": "sha512-VCohY/AQU13xYyZGl6rfdUgE+2bjaI76a4aEb6reIphHKgb4mnjYlg2PzS1/hcU1qUNi515kY9yQa5HsE7J1dQ==", - "dev": true, - "dependencies": { - "debug": "^4.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors/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" + "funding": { + "url": "https://eslint.org/donate" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "jiti": "*" }, "peerDependenciesMeta": { - "supports-color": { + "jiti": { "optional": true } } }, - "node_modules/feathers-hooks-common/node_modules/ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "node_modules/feathers-hooks-common/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/feathers-hooks-common/node_modules/fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", - "dev": true - }, - "node_modules/feathers-hooks-common/node_modules/json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/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/finalhandler/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/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, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "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, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "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, - "engines": { - "node": ">=10" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "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==", - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/generatorics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/generatorics/-/generatorics-1.1.0.tgz", - "integrity": "sha512-LuYDCS1DbKQsvChP1xHmAzHnGdd0z0K1XMebmbNbFzGZI62KODnV2CXA7zOqebiDzlK2sxXrPGfwlDzSm9aP4g==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.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/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.0.tgz", - "integrity": "sha512-/Bneo/L6bLN1wDyJCeRZ3CLoixvwb9v3rE3IHulFSfTHwP85xSr4QatA8K0c6GlL5+mc4IZ57BzluNZJiXvHIg==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^10.1.2", - "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/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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-resolvers-ast": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphql-resolvers-ast/-/graphql-resolvers-ast-1.4.0.tgz", - "integrity": "sha512-L4BeMFgPV7rwyISIvJ+QOsnMfc5+STMsaF097cLzJ9t/kizekDB5dMWNC+jq2pUWq0WoqYZypWYKwFL5vH4dUQ==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/graphql-type-json": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.1.4.tgz", - "integrity": "sha512-B1zeWRF50alRvW94s/hpkGbVqvRLTtJD0yEyMs6KAvDSlNyBzJCu/d51fLZalqrVntuJAVgXYh13GbUEqe9MrQ==", - "dev": true, - "peerDependencies": { - "graphql": ">=0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "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-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hash-string/-/hash-string-1.0.0.tgz", - "integrity": "sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==", - "dev": true - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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, - "license": "MIT" - }, - "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" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "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 - }, - "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", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/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/ignore-walk/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, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "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/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "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" - } - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/ipaddr.js": { - "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" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.0.tgz", - "integrity": "sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "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.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterall": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "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/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "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, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "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 - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "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-to-ts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.0.tgz", - "integrity": "sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "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==" - }, - "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 - }, - "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, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=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", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dev": true, - "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/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dev": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "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==", - "dev": true, - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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/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/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "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/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "node_modules/lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "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 - }, - "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 - }, - "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==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "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==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/magicast": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", - "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "source-map-js": "^1.0.2" - } - }, - "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, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/mark.js": { - "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 - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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==", - "dev": true, - "optional": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge-stream": { - "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 - }, - "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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "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" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "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/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/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/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/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "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-flush/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/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/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/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "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-pipeline/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/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "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-sized/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/minisearch": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.0.1.tgz", - "integrity": "sha512-xLeX/AwTJLzgBF2/bdUI7MEePwXtzaLExkRwu8YFGfLDwSe06KYkplqPodLANsqvfc5Ks/r5ItFUSjIp7+9xtw==", - "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, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "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/minizlib/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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "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, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" - } - }, - "node_modules/mongo-sql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mongo-sql/-/mongo-sql-4.0.2.tgz", - "integrity": "sha512-/S2uYugCpOx73dwvWRZWlTBIE0U2e6jhIWi9bcfUrM9QkKR4U1yYjP6wXiYt+kdWqhV1lICgTLMoaKR1VMdd6A==", - "dev": true - }, - "node_modules/mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", - "dev": true, - "dependencies": { - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "@mongodb-js/saslprep": "^1.1.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.0.0", - "kerberos": "^1.0.0 || ^2.0.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "dev": true, - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "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==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "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 - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neotraverse": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.14.tgz", - "integrity": "sha512-co+mqQYo1wf3CRWRHWOT1ZgG7gsdNZSrrQkWxVnGAlD/UA/IZuPlE9UNkGZRwTLeml+dT5BytRW4ANqzPQeNLg==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "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": "^11.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" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "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==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "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": "7.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.1.0.tgz", - "integrity": "sha512-JgkdydFdLe1E5Q7DpLvKVyBZOOwXYGhIbMbOMm3lJ06XKzaiit+qo1HciO3z3IFklStfarzJHVQf9ZcNPTvZlw==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "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" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm-check-updates/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/npm-check-updates/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates/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, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "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" - } - }, - "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, - "dependencies": { - "path-key": "^3.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==", - "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/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.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/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, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.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", - "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", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "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==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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/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": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/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, - "license": "ISC" - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "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, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" - } - }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "dev": true, - "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.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/preact": { - "version": "10.22.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", - "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "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, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?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==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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": { - "@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/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "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" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "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/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": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "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" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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" - } - ] - }, - "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/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": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "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" - } - }, - "node_modules/rc/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 - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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==", - "dev": true, - "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" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/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/read-package-json/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/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, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.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==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^1.0.4" - }, - "engines": { - "node": ">=14" - } - }, - "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==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/remote-git-tags": { - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", - "fsevents": "~2.3.2" - } - }, - "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": [ - { - "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" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "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/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/search-insights": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.15.0.tgz", - "integrity": "sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/semver/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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/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/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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": { - "ms": "2.0.0" - } - }, - "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/send/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/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/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==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "1.10.3", - "@types/hast": "^3.0.4" - } - }, - "node_modules/short-hash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/short-hash/-/short-hash-1.0.0.tgz", - "integrity": "sha512-qbUCD2Pkl4IXRyVqneEjGnUr0NGDGLzZnBUVGJngIQZf/FrhOL0yJhH+JQzak0t8xMmScIKpoX1SxOsPHdwa4w==", - "dev": true, - "dependencies": { - "hash-string": "^1.0.0" - } - }, - "node_modules/shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true - }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dev": true, - "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" - } - }, - "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/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "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, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.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/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dev": true, - "optional": true, - "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==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "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, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "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, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "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": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/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, - "engines": { - "node": ">=6" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/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", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/sucrase/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" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "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" - } - }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "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/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/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/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==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "is-number": "^7.0.0" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.1.2.tgz", - "integrity": "sha512-Gzw/PXSX/z0aYMNmkcI54bKKFVFJQbLne+EqTJZeQ3lNT3QpumjtMU4rl+ZwTTp8oRF3ahMbEAxT2sZPJLFSrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-require": "^5.0.0", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "consola": "^3.2.3", - "debug": "^4.3.5", - "esbuild": "^0.23.0", - "execa": "^5.0.0", - "globby": "^11.0.3", - "joycon": "^3.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.18.1", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/tsup/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "node_modules/tsup/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/tsup/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==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tsup/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/tsup/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/tsup/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, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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/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/update-notifier/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?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==", - "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==", - "dev": true - }, - "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, - "license": "MIT", - "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" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.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": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitepress": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.1.tgz", - "integrity": "sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docsearch/css": "^3.6.0", - "@docsearch/js": "^3.6.0", - "@shikijs/core": "^1.10.3", - "@shikijs/transformers": "^1.10.3", - "@types/markdown-it": "^14.1.1", - "@vitejs/plugin-vue": "^5.0.5", - "@vue/devtools-api": "^7.3.5", - "@vue/shared": "^3.4.31", - "@vueuse/core": "^10.11.0", - "@vueuse/integrations": "^10.11.0", - "focus-trap": "^7.5.4", - "mark.js": "8.11.1", - "minisearch": "^7.0.0", - "shiki": "^1.10.3", - "vite": "^5.3.3", - "vue": "^3.4.31" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/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/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vue": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.32.tgz", - "integrity": "sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.4.32", - "@vue/compiler-sfc": "3.4.32", - "@vue/runtime-dom": "3.4.32", - "@vue/server-renderer": "3.4.32", - "@vue/shared": "3.4.32" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "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.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "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.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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/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, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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 - }, - "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" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "dev": true, - "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "dev": true, - "requires": {} - }, - "@algolia/cache-browser-local-storage": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", - "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.24.0" - } - }, - "@algolia/cache-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", - "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", - "dev": true - }, - "@algolia/cache-in-memory": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", - "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.24.0" - } - }, - "@algolia/client-account": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", - "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", - "dev": true, - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-analytics": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", - "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", - "dev": true, - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", - "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-personalization": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", - "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", - "dev": true, - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/client-search": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", - "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", - "dev": true, - "requires": { - "@algolia/client-common": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/logger-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", - "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", - "dev": true - }, - "@algolia/logger-console": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", - "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", - "dev": true, - "requires": { - "@algolia/logger-common": "4.24.0" - } - }, - "@algolia/recommend": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", - "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", - "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.24.0" - } - }, - "@algolia/requester-common": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", - "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", - "dev": true - }, - "@algolia/requester-node-http": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", - "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.24.0" - } - }, - "@algolia/transporter": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", - "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/requester-common": "4.24.0" - } - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", - "dev": true - }, - "@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@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 - }, - "@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 - }, - "@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", - "dev": true - }, - "@docsearch/js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.1.tgz", - "integrity": "sha512-erI3RRZurDr1xES5hvYJ3Imp7jtrXj6f1xYIzDzxiS7nNBufYWPbJwrmMqWC5g9y165PmxEmN9pklGCdLi0Iqg==", - "dev": true, - "requires": { - "@docsearch/react": "3.6.1", - "preact": "^10.0.0" - } - }, - "@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", - "dev": true, - "requires": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" - } - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "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/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "@feathers-plus/batch-loader": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.6.tgz", - "integrity": "sha512-r+n31iZ/B5Rl1mLkC9/S20UI445MdkZvE3VBmjupep2t8OuyTYHPkFEgR25HY6khH+RothK1VL3B5eumk9N2QQ==", - "dev": true - }, - "@feathers-plus/cache": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/cache/-/cache-1.4.0.tgz", - "integrity": "sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.1" - } - }, - "@feathers-plus/common": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/common/-/common-0.1.0.tgz", - "integrity": "sha512-rK4zNVObmw8UKP7nwTwsCVn0g2Zl92r2rpXMfVdFo8FmYfYY4HECAcGB4Aq38EI6NZnvla51CdDjtY9WxW1OHQ==", - "dev": true, - "requires": { - "short-hash": "1.0.0", - "sort-keys": "2.0.0" - } - }, - "@feathers-plus/graphql": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/graphql/-/graphql-1.10.0.tgz", - "integrity": "sha512-ausYkHTRRxIQbNKVvQ7dHj/bkNsghsjGGKw9PO+w9XOCs6OJouO/cj1nj6RjfUDxUbZtFcc4y5QluYzDulEmEQ==", - "dev": true, - "requires": { - "@feathers-plus/batch-loader": "0.3.0", - "@feathers-plus/cache": "1.3.1", - "@feathers-plus/common": "0.1.0", - "@feathersjs/errors": "3.2.0", - "debug": "3.1.0", - "feathers-hooks-common": "4.5.6", - "graphql": "0.11.7", - "graphql-resolvers-ast": "1.4.0", - "graphql-tools": "2.0.0", - "graphql-type-json": "0.1.4", - "join-monster": "2.0.15", - "join-monster-graphql-tools-adapter": "0.0.2", - "lodash.merge": "4.6.1", - "mongo-sql": "4.0.2", - "traverse": "0.6.6" - }, - "dependencies": { - "@feathers-plus/batch-loader": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.0.tgz", - "integrity": "sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==", - "dev": true - }, - "@feathers-plus/cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@feathers-plus/cache/-/cache-1.3.1.tgz", - "integrity": "sha512-zFpwVutKiOcPW6Gnm73uit4EwnaawYZEt6pIKP+GkYQz/wVkfNMMwZ28THCNhZvFcR1Cn3WwyUBXcASoApHpvA==", - "dev": true, - "requires": { - "lru-cache": "4.1.1" - } - }, - "@feathersjs/errors": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.2.0.tgz", - "integrity": "sha512-4xsE7OyzxGvs2hyG19nf2qb4rV2nWoWbQ6/FnDIYrNHi7M9kOy+deLwNhKnXa4r/hg3xf+AVpC8kBjUQjWYWHA==", - "dev": true, - "requires": { - "debug": "^3.1.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "graphql": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", - "dev": true, - "requires": { - "iterall": "1.1.3" - } - }, - "graphql-relay": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.5.5.tgz", - "integrity": "sha512-CTsapMI0MZc0antZp+9ZcVcNiVoaXncc2xALCxe2Md25quAUxTjH2135xPRNb6BMOoTiY54HtglfxxUCDTUEbA==", - "dev": true, - "requires": {} - }, - "graphql-tools": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-2.0.0.tgz", - "integrity": "sha512-5cUflK/kECqge0feZxTG/cF05EHlGMvdK47I+xQtDm67KrW8rlfmLTUWHYcyFTOXT+Yl4Sb/6WTJZwnKX+Ofmg==", - "dev": true, - "requires": { - "@types/graphql": "^0.11.4", - "deprecated-decorator": "^0.1.6", - "uuid": "^3.1.0" - } - }, - "join-monster": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/join-monster/-/join-monster-2.0.15.tgz", - "integrity": "sha512-4ZZd0grGtamGsevMP4iCF+dZ5jyeuvbvEgF5LgPp9Gz1VNUTaL79/ZNfc0Hs/uSNJAVj1vbaUGK/wsnopyYLkA==", - "dev": true, - "requires": { - "@stem/nesthydrationjs": "0.4.0", - "debug": "^3.0.1", - "deprecate": "^1.0.0", - "generatorics": "^1.0.8", - "graphql-relay": "^0.5.0", - "lodash": "^4.13.1" - } - }, - "join-monster-graphql-tools-adapter": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/join-monster-graphql-tools-adapter/-/join-monster-graphql-tools-adapter-0.0.2.tgz", - "integrity": "sha512-Q2DaeL/L6yY7Rh30YvkysB48QdPwbMBElo72gXelDOczymw0DzP1jmrvLuClyxeL5FJs5tt28CHKIKEgYwFAbA==", - "dev": true, - "requires": {} - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "@feathersjs/adapter-commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.29.tgz", - "integrity": "sha512-9D0He+VqkUoYaSbfav4Rg0DMCVXtGmPNNxRO5QDJqbJ7U4deozCru3+qWMIVAYRXc5jiX0x2iFbSVOoMoFf78Q==", - "dev": true, - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29" - } - }, - "@feathersjs/authentication": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.29.tgz", - "integrity": "sha512-kYC1x1etmZ9Q9EZXd6bbMlk1myaHS5TsW3kOty0m6amG9BDcFdEyh9ij/JgVuL0EJ+7KOHweOypdJ3bIpiinqQ==", - "dev": true, - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", - "@types/jsonwebtoken": "^9.0.6", - "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "long-timeout": "^0.1.1", - "uuid": "^10.0.0" - } - }, - "@feathersjs/authentication-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.29.tgz", - "integrity": "sha512-F0aIJPYLSvDJOnPBqhXOT1UUD/IAxJ2u8xdKGDY+sWGpqCIDMl32PDqImilqC8+G+/BmKJ8Rjhe81oXEbbhOBw==", - "dev": true, - "requires": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29" - } - }, - "@feathersjs/authentication-local": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-5.0.29.tgz", - "integrity": "sha512-Xkv1oCxn4eZGFWM61Wgo0ghabJIHg0xhkr5zy3glTDZFzqmS8xsoRyQufBnzEd8zMQlw09AK/YbFRNWUc8lNIQ==", - "dev": true, - "requires": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "bcryptjs": "^2.4.3", - "lodash": "^4.17.21" - } - }, - "@feathersjs/client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-5.0.29.tgz", - "integrity": "sha512-JzzmuBwHR//NhFBGZsadelpMPz0U3UX/FbOrveUiFrACYdk2MkkUwaIJFlWhFIU8gQJrSDDbGIgnMjEwV9XrXA==", - "dev": true, - "requires": { - "@feathersjs/authentication-client": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/rest-client": "^5.0.29", - "@feathersjs/socketio-client": "^5.0.29" - } - }, - "@feathersjs/commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.29.tgz", - "integrity": "sha512-Gr2c0XxBTQ/+SoH8bAxJO1rUzBrFExQmK7Wdasp9g/xwS0InCNLPHhrrNc2KwTVSx8kbsN+GZRBkzytmxgWM0w==" - }, - "@feathersjs/errors": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-5.0.29.tgz", - "integrity": "sha512-SLpvC36V84XKxucAtDC70GXkqmsvTE5SO4uSZXuTpK68VqeefbmSY+KSid2DY9dM0upZN7orwVBB5YciUMCIIg==" - }, - "@feathersjs/express": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.29.tgz", - "integrity": "sha512-PvbzAuolHZEL2VBQRyuMVhsa9LVM7HuN6nXyGFv7IqSr7t61i3v5BuWbn4SQ6EO88NVHDnb7DZT7ojDVhU6YFw==", - "dev": true, - "requires": { - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", - "@types/compression": "^1.7.5", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.19.5", - "compression": "^1.7.4", - "cors": "^2.8.5", - "express": "^4.19.2" - } - }, - "@feathersjs/feathers": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.29.tgz", - "integrity": "sha512-ERY0W0FfZUysIksdwbBhXZot1F1EuLtlhJA27o9VN9EWIh6IHlT30McyqQqdqTiqVhsOS+KJPLTeGPH60REg+Q==", - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" - } - }, - "@feathersjs/hooks": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@feathersjs/hooks/-/hooks-0.9.0.tgz", - "integrity": "sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==" - }, - "@feathersjs/memory": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.29.tgz", - "integrity": "sha512-szi/4WcvwxX8OEi3A/7qUozUzx1ZVIPHX3IEOU9bDnNsDMGWfVlHGOOW3HdSMAOVZWhGR56oMsvXvrAcgdCVRw==", - "dev": true, - "requires": { - "@feathersjs/adapter-commons": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "sift": "^17.1.3" - } - }, - "@feathersjs/rest-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-5.0.29.tgz", - "integrity": "sha512-fqqZOb4yEZe2Gyrd1/+OyZQkYEwNiwYe4OXd2bVkT60bRBa8zpDUKZrMSTKARvPXzxPKttdrMuOeTmCogHq0KA==", - "dev": true, - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@types/superagent": "^8.1.7", - "qs": "^6.12.3" - } - }, - "@feathersjs/schema": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.29.tgz", - "integrity": "sha512-Eq1wSYyfczJlD7/4mcD5AtNTq3HdjjS191NCJWEurNIKm6MlIssvZXIjMOjnna2A1Vw/80vPIapat65uebEKPg==", - "dev": true, - "requires": { - "@feathersjs/adapter-commons": "^5.0.29", - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/hooks": "^0.9.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.16.0", - "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.0" - }, - "dependencies": { - "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, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "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 - } - } - }, - "@feathersjs/socketio": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.29.tgz", - "integrity": "sha512-xtHtWAoEgOEgTYmiEKyqEC10DLbZ51U3mMluQPknsGgH1W2+GgI7WwCAVyM3ZPcVFlUwmVa62/GsIznOs33Hjg==", - "dev": true, - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29", - "socket.io": "^4.7.5" - } - }, - "@feathersjs/socketio-client": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.29.tgz", - "integrity": "sha512-6jw4YCTZ35dwBT1DEvI9CkB99lND02Wk8WfU6xf2Ss1ZBU1oNl1zqVZTECHiuvYp4akPRMS9HIZFm1DK8qLEOQ==", - "dev": true, - "requires": { - "@feathersjs/feathers": "^5.0.29", - "@feathersjs/transport-commons": "^5.0.29" - } - }, - "@feathersjs/transport-commons": { - "version": "5.0.29", - "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-5.0.29.tgz", - "integrity": "sha512-Xy7J9h/t9vLqjPnyn3RnNtcS9wBDp/VfdVYulC0hnpEBFKwDtyjx055rUgrNn8r1B4w0y8CyX02MNSupABgOiQ==", - "dev": true, - "requires": { - "@feathersjs/commons": "^5.0.29", - "@feathersjs/errors": "^5.0.29", - "@feathersjs/feathers": "^5.0.29", - "encodeurl": "^2.0.0", - "lodash": "^4.17.21" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "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, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@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 - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@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, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", - "dev": true, - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "@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, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@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==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "which": "^3.0.0" - }, - "dependencies": { - "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@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==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@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 - }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true - }, - "@pnpm/network.ca-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", - "integrity": "sha512-gkINruT2KUhZLTaiHxwCOh1O4NVnFT0wLjWFBHmTz9vpKag/C/noIMJXBxFe4F0mYpUVX2puLwAieLYFg2NvoA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - } - }, - "@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "requires": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", - "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", - "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", - "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", - "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", - "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", - "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", - "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", - "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", - "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", - "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", - "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", - "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", - "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", - "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", - "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", - "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", - "dev": true, - "optional": true - }, - "@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", - "dev": true, - "requires": { - "@types/hast": "^3.0.4" - } - }, - "@shikijs/transformers": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.3.tgz", - "integrity": "sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==", - "dev": true, - "requires": { - "shiki": "1.10.3" - } - }, - "@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.2.0" - } - }, - "@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==", - "dev": true - }, - "@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dev": true, - "requires": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - } - }, - "@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "requires": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - } - }, - "@sinclair/typebox": { - "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 - }, - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@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==", - "dev": true - }, - "@stem/nesthydrationjs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@stem/nesthydrationjs/-/nesthydrationjs-0.4.0.tgz", - "integrity": "sha512-hnoLv6W7CmhWXCEp6MBiZv4CdqI48aYmxM+Lo5T3qogP+x+MBR0DOyt7XdppI/X8McqHisCbSNvAOC4fgPhUiw==", - "dev": true, - "requires": { - "lodash": "4.13.1" - }, - "dependencies": { - "lodash": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", - "integrity": "sha512-j/GRONYpkXt1aB1bQHzkq0Th7zhv/syoDVrzCDA3FDMntIin0b7TjXi62q9juDC+QfhRs9COr0LFW38vQSH9Tg==", - "dev": true - } - } - }, - "@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, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@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 - }, - "@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==", - "dev": true - }, - "@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@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==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/graphql": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.11.8.tgz", - "integrity": "sha512-xGWx4kx9JKlqxDrZA12gw5qi2lvxPNLxnQQcoTXVX83MuGcXcpb7TADatGyGW51GaaXQOQTbjw3x4HuL3ULBaA==", - "dev": true, - "optional": true - }, - "@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==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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 - }, - "@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", - "dev": true - }, - "@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", - "dev": true, - "requires": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, - "@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true - }, - "@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 - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "@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 - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/superagent": { - "version": "8.1.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.7.tgz", - "integrity": "sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==", - "dev": true, - "requires": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*" - } - }, - "@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true - }, - "@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@vitejs/plugin-vue": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", - "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", - "dev": true, - "requires": {} - }, - "@vitest/coverage-v8": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", - "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "test-exclude": "^6.0.0" - } - }, - "@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dev": true, - "requires": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - } - }, - "@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dev": true, - "requires": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "dependencies": { - "p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true - } - } - }, - "@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "node_modules/eslint-config-prettier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", + "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", "dev": true, - "requires": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "license": "MIT", + "bin": { + "eslint-config-prettier": "build/bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", "dev": true, - "requires": { - "tinyspy": "^2.2.0" + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", "dev": true, - "requires": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "@vue/compiler-core": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.32.tgz", - "integrity": "sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", "dev": true, - "requires": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.32", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - }, + "license": "ISC", "dependencies": { - "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==", - "dev": true + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true } } }, - "@vue/compiler-dom": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.32.tgz", - "integrity": "sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==", + "node_modules/eslint-plugin-import-x": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.6.1.tgz", + "integrity": "sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==", "dev": true, - "requires": { - "@vue/compiler-core": "3.4.32", - "@vue/shared": "3.4.32" + "license": "MIT", + "dependencies": { + "@types/doctrine": "^0.0.9", + "@typescript-eslint/scope-manager": "^8.1.0", + "@typescript-eslint/utils": "^8.1.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "enhanced-resolve": "^5.17.1", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.7.3", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3", + "semver": "^7.6.3", + "stable-hash": "^0.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" } }, - "@vue/compiler-sfc": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.32.tgz", - "integrity": "sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==", + "node_modules/eslint-plugin-import-x/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, - "requires": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.32", - "@vue/compiler-dom": "3.4.32", - "@vue/compiler-ssr": "3.4.32", - "@vue/shared": "3.4.32", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.39", - "source-map-js": "^1.2.0" - }, + "license": "MIT", "dependencies": { - "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==", - "dev": true - } + "balanced-match": "^1.0.0" } }, - "@vue/compiler-ssr": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.32.tgz", - "integrity": "sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==", + "node_modules/eslint-plugin-import-x/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, - "requires": { - "@vue/compiler-dom": "3.4.32", - "@vue/shared": "3.4.32" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "@vue/devtools-api": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.6.tgz", - "integrity": "sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, - "requires": { - "@vue/devtools-kit": "^7.3.6" + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "@vue/devtools-kit": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.6.tgz", - "integrity": "sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==", + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, - "requires": { - "@vue/devtools-shared": "^7.3.6", - "birpc": "^0.2.17", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@vue/devtools-shared": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.6.tgz", - "integrity": "sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", "dev": true, - "requires": { - "rfdc": "^1.4.1" + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@vue/reactivity": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.32.tgz", - "integrity": "sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "requires": { - "@vue/shared": "3.4.32" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@vue/runtime-core": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.32.tgz", - "integrity": "sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==", + "node_modules/eslint/node_modules/lodash.merge": { + "version": "4.6.2", "dev": true, - "requires": { - "@vue/reactivity": "3.4.32", - "@vue/shared": "3.4.32" - } + "license": "MIT" }, - "@vue/runtime-dom": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.32.tgz", - "integrity": "sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "requires": { - "@vue/reactivity": "3.4.32", - "@vue/runtime-core": "3.4.32", - "@vue/shared": "3.4.32", - "csstype": "^3.1.3" + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@vue/server-renderer": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.32.tgz", - "integrity": "sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "requires": { - "@vue/compiler-ssr": "3.4.32", - "@vue/shared": "3.4.32" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "@vue/shared": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.32.tgz", - "integrity": "sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==", - "dev": true - }, - "@vueuse/core": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", - "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "requires": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" - }, + "license": "BSD-3-Clause", "dependencies": { - "vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "requires": {} - } + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "@vueuse/integrations": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.0.tgz", - "integrity": "sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { - "@vueuse/core": "10.11.0", - "@vueuse/shared": "10.11.0", - "vue-demi": ">=0.14.8" - }, + "license": "BSD-2-Clause", "dependencies": { - "vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "requires": {} - } + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "@vueuse/metadata": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", - "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", - "dev": true - }, - "@vueuse/shared": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", - "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "requires": { - "vue-demi": ">=0.14.8" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", - "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", - "dev": true, - "requires": {} - } + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "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 - }, - "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==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" } }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/esutils": { + "version": "2.0.3", "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "requires": { - "debug": "4" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { - "ajv": "^8.0.0" - }, + "license": "MIT", "dependencies": { - "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, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "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 - } + "ms": "2.0.0" } }, - "algoliasearch": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", - "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.24.0", - "@algolia/cache-common": "4.24.0", - "@algolia/cache-in-memory": "4.24.0", - "@algolia/client-account": "4.24.0", - "@algolia/client-analytics": "4.24.0", - "@algolia/client-common": "4.24.0", - "@algolia/client-personalization": "4.24.0", - "@algolia/client-search": "4.24.0", - "@algolia/logger-common": "4.24.0", - "@algolia/logger-console": "4.24.0", - "@algolia/recommend": "4.24.0", - "@algolia/requester-browser-xhr": "4.24.0", - "@algolia/requester-common": "4.24.0", - "@algolia/requester-node-http": "4.24.0", - "@algolia/transporter": "4.24.0" - } - }, - "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==", + "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==", "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "license": "MIT" }, - "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/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, - "requires": { - "color-convert": "^2.0.1" + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "anymatch": { + "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "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 + "license": "MIT" }, - "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==", + "node_modules/fast-diff": { + "version": "1.2.0", "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "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 + "license": "Apache-2.0" }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "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, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" } }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "node_modules/fast-glob/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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "array-union": { + "node_modules/fast-json-stable-stringify": { "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" }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } + "license": "MIT" }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "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==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "node_modules/feathers-hooks-common": { + "version": "4.5.6", "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true - }, - "birpc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", - "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", - "dev": true - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "license": "Modified MIT", "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" + "@feathers-plus/batch-loader": "0.3.0", + "@feathersjs/commons": "^1.2.0", + "@feathersjs/errors": "^3.0.0", + "ajv": "^5.2.0", + "debug": "^3.0.0", + "process": "0.11.10", + "traverse": "^0.6.6" }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "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": ">= 6" } }, - "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/feathers-hooks-common/node_modules/@feathers-plus/batch-loader": { + "version": "0.3.0", "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">= 6.0.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/feathers-hooks-common/node_modules/@feathersjs/commons": { + "version": "1.4.4", "dev": true, - "requires": { - "fill-range": "^7.0.1" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "bson": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", - "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors": { + "version": "3.3.6", "dev": true, - "requires": { - "semver": "^7.0.0" + "license": "MIT", + "dependencies": { + "debug": "^4.0.0" + }, + "engines": { + "node": ">= 6" } }, - "bundle-require": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", - "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", + "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors/node_modules/debug": { + "version": "4.3.4", "dev": true, - "requires": { - "load-tsconfig": "^0.2.3" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, - "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, - "requires": { - "@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" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.1.2.tgz", - "integrity": "sha512-N7F4os5ZI+8mWHSbeJmxn+qimf5uK3WU53FD1b298XLGtOLPpSA/1xAchfP4NJlDwqgaviZ0SQfxTQD0K6lr9w==", + "node_modules/feathers-hooks-common/node_modules/ajv": { + "version": "5.5.2", "dev": true, - "requires": { - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.0", - "keyv": "^4.5.0", - "mimic-response": "^4.0.0", - "normalize-url": "^7.1.0", - "responselike": "^3.0.0" + "license": "MIT", + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/feathers-hooks-common/node_modules/debug": { + "version": "3.2.7", "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "node_modules/feathers-hooks-common/node_modules/fast-deep-equal": { + "version": "1.1.0", + "dev": true, + "license": "MIT" }, - "camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", - "dev": true + "node_modules/feathers-hooks-common/node_modules/json-schema-traverse": { + "version": "0.3.1", + "dev": true, + "license": "MIT" }, - "chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "node_modules/file-entry-cache": { + "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": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "chownr": { + "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "ci-info": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.4.0.tgz", - "integrity": "sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "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 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "node_modules/find-up": { + "version": "5.0.0", "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "requires": { - "color-name": "~1.1.4" + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "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==", - "dev": true - }, - "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 - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "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==", "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" + "license": "MIT", + "dependencies": { + "tabbable": "^6.2.0" } }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/foreground-child": { + "version": "3.1.1", "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, + "license": "ISC", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - } + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true - }, - "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, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, - "requires": { - "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" + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true - }, - "console-control-strings": { - "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 - }, - "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==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "requires": { - "safe-buffer": "5.2.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "requires": { - "is-what": "^4.1.8" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/fs.realpath": { + "version": "1.0.0", "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } + "license": "ISC" }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/fsevents": { + "version": "2.3.3", "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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==", + "node_modules/function-bind": { + "version": "1.1.2", "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "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==", - "dev": true - } + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "requires": { - "ms": "2.1.2" + "node_modules/generatorics": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "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==", + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, + "license": "MIT", "dependencies": { - "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 - } + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "requires": { - "type-detect": "^4.0.0" + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", - "dev": true - }, - "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 - }, - "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 - }, - "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==", + "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==", "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/glob": { + "version": "7.2.0", "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "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 - }, - "deprecate": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.1.1.tgz", - "integrity": "sha512-ZGDXefq1xknT292LnorMY5s8UVU08/WKdzDZCUT6t9JzsiMSP4uzUhgpqugffNVcT5WC6wMBiSQ+LFjlv3v7iQ==", - "dev": true - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha512-MHidOOnCHGlZDKsI21+mbIIhf4Fff+hhCTB7gtVg4uoIqjcrTZc5v6M+GS2zVI0sV7PqK415rb8XaOSQsQkHOw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "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": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "requires": { - "path-type": "^4.0.0" + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "requires": { - "esutils": "^2.0.2" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "requires": { - "is-obj": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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, + "license": "ISC" }, - "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==", + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } + "license": "MIT" }, - "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==", - "dev": true + "node_modules/graphql": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } }, - "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==", - "dev": true + "node_modules/graphql-resolvers-ast": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true + "node_modules/graphql-type-json": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "graphql": ">=0.4.0" + } }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "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, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } + "license": "MIT", + "engines": { + "node": ">=8" } }, - "engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, - "dependencies": { - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "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 - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - } - }, - "es-define-property": { + "node_modules/hash-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "license": "ISC" }, - "es-set-tostringtag": { + "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/hast-util-to-html": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", "dev": true, - "requires": { - "hasown": "^2.0.0" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/hast-util-whitespace": { + "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==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "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, - "requires": { - "@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" - } - }, - "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 - }, - "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==", - "dev": true + "license": "MIT" }, - "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 + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "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==", "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "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", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "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" - }, - "dependencies": { - "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 - } + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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==", + "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, - "requires": {} + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "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, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "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, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "license": "MIT", + "engines": { + "node": ">=0.8.19" } }, - "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==", + "node_modules/inflight": { + "version": "1.0.6", "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "eslint-visitor-keys": { - "version": "3.4.3", - "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 - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/inherits": { + "version": "2.0.4", "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } + "license": "ISC" }, - "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "node_modules/interpret": { + "version": "1.4.0", "dev": true, - "requires": { - "estraverse": "^5.1.0" + "license": "MIT", + "engines": { + "node": ">= 0.10" } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/ip": { + "version": "2.0.0", "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "license": "MIT" }, - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/ipaddr.js": { + "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, - "requires": { - "@types/estree": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.10" } }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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 - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } + "semver": "^7.6.3" } }, - "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==" - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "node_modules/is-core-module": { + "version": "2.13.1", "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "license": "MIT", "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.1" - } - } + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "fast-json-stable-stringify": { - "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==" - }, - "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 - }, - "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 - }, - "fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, - "requires": { - "reusify": "^1.0.4" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "feathers-hooks-common": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/feathers-hooks-common/-/feathers-hooks-common-4.5.6.tgz", - "integrity": "sha512-z0KZP/igmHvEJX46x0f6UC/pSYFXUt/2OfgMwumElGqxwFYU4JrAnK8FbGwCo8MYowMDfpMk72ju+axbq9MV1Q==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, - "requires": { - "@feathers-plus/batch-loader": "0.3.0", - "@feathersjs/commons": "^1.2.0", - "@feathersjs/errors": "^3.0.0", - "ajv": "^5.2.0", - "debug": "^3.0.0", - "process": "0.11.10", - "traverse": "^0.6.6" - }, - "dependencies": { - "@feathers-plus/batch-loader": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@feathers-plus/batch-loader/-/batch-loader-0.3.0.tgz", - "integrity": "sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==", - "dev": true - }, - "@feathersjs/commons": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.4.4.tgz", - "integrity": "sha512-ZPpzyZA3CPfoa9AuFv3BJUI/ubzaaXixp8T/pqeMFPT6DOaU/6oF7lz1RxwimzfJNna4gy/HByt0EoLSI3BKWg==", - "dev": true - }, - "@feathersjs/errors": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.3.6.tgz", - "integrity": "sha512-VCohY/AQU13xYyZGl6rfdUgE+2bjaI76a4aEb6reIphHKgb4mnjYlg2PzS1/hcU1qUNi515kY9yQa5HsE7J1dQ==", - "dev": true, - "requires": { - "debug": "^4.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, - "requires": { - "flat-cache": "^3.0.4" + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "requires": { - "to-regex-range": "^5.0.1" + "license": "MIT", + "engines": { + "node": ">=0.12.0" } }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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 - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "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==", + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/isexe": { + "version": "2.0.0", "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "license": "ISC" }, - "focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", "dev": true, - "requires": { - "tabbable": "^6.2.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "requires": { - "is-callable": "^1.1.3" + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, + "license": "BSD-3-Clause", "dependencies": { - "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 - } + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "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 - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "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==", "dev": true, - "requires": { - "minipass": "^7.0.3" - }, + "license": "BSD-3-Clause", "dependencies": { - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true - } + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/iterall": { + "version": "1.1.3", "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "license": "MIT" }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "node_modules/joycon": { + "version": "3.1.1", "dev": true, - "requires": { - "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": ">=10" } }, - "generatorics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/generatorics/-/generatorics-1.1.0.tgz", - "integrity": "sha512-LuYDCS1DbKQsvChP1xHmAzHnGdd0z0K1XMebmbNbFzGZI62KODnV2CXA7zOqebiDzlK2sxXrPGfwlDzSm9aP4g==", - "dev": true + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true + "node_modules/json-buffer": { + "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, + "license": "MIT" }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "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==", "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" } }, - "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 - }, - "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 + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } + "license": "MIT" }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/jsonwebtoken": { + "version": "9.0.2", "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "license": "MIT", + "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" } }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/jwa": { + "version": "1.4.1", "dev": true, - "requires": { - "is-glob": "^4.0.3" + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "node_modules/jws": { + "version": "3.2.2", "dev": true, - "requires": { - "ini": "2.0.0" + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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, - "requires": { - "type-fest": "^0.20.2" + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" } }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/levn": { + "version": "0.4.1", "dev": true, - "requires": { - "define-properties": "^1.1.3" + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/lilconfig": { + "version": "3.1.2", "dev": true, - "requires": { - "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" + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.0.tgz", - "integrity": "sha512-/Bneo/L6bLN1wDyJCeRZ3CLoixvwb9v3rE3IHulFSfTHwP85xSr4QatA8K0c6GlL5+mc4IZ57BzluNZJiXvHIg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^10.1.2", - "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" - } - }, - "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 - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==" - }, - "graphql-resolvers-ast": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphql-resolvers-ast/-/graphql-resolvers-ast-1.4.0.tgz", - "integrity": "sha512-L4BeMFgPV7rwyISIvJ+QOsnMfc5+STMsaF097cLzJ9t/kizekDB5dMWNC+jq2pUWq0WoqYZypWYKwFL5vH4dUQ==", - "dev": true - }, - "graphql-type-json": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.1.4.tgz", - "integrity": "sha512-B1zeWRF50alRvW94s/hpkGbVqvRLTtJD0yEyMs6KAvDSlNyBzJCu/d51fLZalqrVntuJAVgXYh13GbUEqe9MrQ==", + "node_modules/lines-and-columns": { + "version": "1.2.4", "dev": true, - "requires": {} - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "license": "MIT" }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/load-tsconfig": { + "version": "0.2.5", "dev": true, - "requires": { - "es-define-property": "^1.0.0" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "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 - }, - "hash-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hash-string/-/hash-string-1.0.0.tgz", - "integrity": "sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==", - "dev": true + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "node_modules/lodash.includes": { + "version": "4.3.0", "dev": true, - "requires": { - "function-bind": "^1.1.2" - } + "license": "MIT" }, - "hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/lodash.isinteger": { + "version": "4.0.4", "dev": true, - "requires": { - "lru-cache": "^7.5.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true - } - } + "license": "MIT" }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "dev": true, + "license": "MIT" }, - "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 + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/lodash.isstring": { + "version": "4.0.1", "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } + "license": "MIT" }, - "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/lodash.merge": { + "version": "4.6.1", "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } + "license": "MIT" }, - "http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", + "node_modules/lodash.once": { + "version": "4.1.1", "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } + "license": "MIT" }, - "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/lodash.sortby": { + "version": "4.7.0", "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } + "license": "MIT" }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "node_modules/long-timeout": { + "version": "0.1.1", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", "dev": true, - "requires": { - "ms": "^2.0.0" - } + "license": "MIT" }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/lru-cache": { + "version": "4.1.1", "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "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==", "dev": true, - "requires": { - "minimatch": "^9.0.0" - }, + "license": "MIT", "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" } }, - "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 - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { + "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "node_modules/mark.js": { + "version": "8.11.1", "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "ipaddr.js": { - "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" }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/mdast-util-to-hast": { + "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==", "dev": true, - "requires": { - "has-bigints": "^1.0.1" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "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, - "requires": { - "binary-extensions": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/memory-pager": { + "version": "1.5.0", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true + "license": "MIT", + "optional": true }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "requires": { - "ci-info": "^3.2.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "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, - "requires": { - "hasown": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "is-extglob": { + "node_modules/micromark-util-character": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "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==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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==", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "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==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "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 - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, - "requires": { - "call-bind": "^1.0.2" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "is-stream": { + "node_modules/micromark-util-types": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "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, - "requires": { - "has-symbols": "^1.0.2" + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "requires": { - "which-typed-array": "^1.1.11" + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/mime-db": { + "version": "1.52.0", "dev": true, - "requires": { - "call-bind": "^1.0.2" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true - }, - "is-yarn-global": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.0.tgz", - "integrity": "sha512-HneQBCrXGBy15QnaDfcn6OLoU8AQPAa0Qn0IeJR/QCo4E8dNZaGGwxpCwWyEBQC5QvFonP8d6t60iGpAHVAfNA==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/mime-types": { + "version": "2.1.35", "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "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==", + "node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "node_modules/minimist": { + "version": "1.2.6", "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterall": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", - "dev": true + "license": "MIT" }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true - }, - "js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/minisearch": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz", + "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==", "dev": true, - "requires": { - "argparse": "^2.0.1" - } + "license": "MIT" }, - "json-buffer": { + "node_modules/mitt": { "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 - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true - }, - "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==", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, - "requires": { - "jju": "^1.1.0" - } + "license": "MIT" }, - "json-schema-to-ts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.0.tgz", - "integrity": "sha512-UeVN/ery4/JeXI8h4rM8yZPxsH+KqPi/84qFxHfTGHZnWnK9D0UU9ZGYO+6XAaJLqCWMiks+ARuFOKAiSxJCHA==", + "node_modules/mongo-sql": { + "version": "4.0.2", "dev": true, - "requires": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - } - }, - "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==" - }, - "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "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 + "license": "BSD" }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "node_modules/mongodb": { + "version": "5.9.2", "dev": true, - "requires": { - "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" + "license": "Apache-2.0", + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } } }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" } }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "node_modules/ms": { + "version": "2.1.2", "dev": true, - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } + "license": "MIT" }, - "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "node_modules/mz": { + "version": "2.7.0", "dev": true, - "requires": { - "json-buffer": "3.0.1" + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "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 - }, - "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==", + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, - "requires": { - "package-json": "^8.1.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true - }, - "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 - }, - "load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true + "license": "MIT" }, - "local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "node_modules/negotiator": { + "version": "0.6.3", "dev": true, - "requires": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "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==", - "dev": true - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "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 - }, - "long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", - "dev": true - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "node_modules/npm-check-updates": { + "version": "17.1.14", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.14.tgz", + "integrity": "sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==", "dev": true, - "requires": { - "get-func-name": "^2.0.1" + "license": "Apache-2.0", + "bin": { + "ncu": "build/cli.js", + "npm-check-updates": "build/cli.js" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0", + "npm": ">=8.12.1" } }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru-cache": { + "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "magicast": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", - "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "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, - "requires": { - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "source-map-js": "^1.0.2" + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "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==", + "node_modules/on-headers": { + "version": "1.0.2", "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "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==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "mark.js": { - "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 - }, - "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 - }, - "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==", + "node_modules/once": { + "version": "1.4.0", "dev": true, - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/optionator": { + "version": "0.9.3", "dev": true, - "requires": { - "mime-db": "1.52.0" + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minipass": { + "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "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==", "dev": true, - "requires": { - "minipass": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "node_modules/package-json-from-dist": { + "version": "1.0.0", "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, + "license": "BlueOak-1.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==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true - } + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "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, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "license": "MIT", + "engines": { + "node": ">=8" } }, - "minisearch": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.0.1.tgz", - "integrity": "sha512-xLeX/AwTJLzgBF2/bdUI7MEePwXtzaLExkRwu8YFGfLDwSe06KYkplqPodLANsqvfc5Ks/r5ItFUSjIp7+9xtw==", - "dev": true + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" }, - "mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "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, - "requires": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" - } + "license": "MIT" }, - "mongo-sql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mongo-sql/-/mongo-sql-4.0.2.tgz", - "integrity": "sha512-/S2uYugCpOx73dwvWRZWlTBIE0U2e6jhIWi9bcfUrM9QkKR4U1yYjP6wXiYt+kdWqhV1lICgTLMoaKR1VMdd6A==", - "dev": true + "node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "dev": true, + "license": "MIT" }, - "mongodb": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", - "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, - "requires": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" + "license": "MIT", + "engines": { + "node": ">= 14.16" } }, - "mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "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, - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } + "license": "MIT" }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neotraverse": { - "version": "0.6.14", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.14.tgz", - "integrity": "sha512-co+mqQYo1wf3CRWRHWOT1ZgG7gsdNZSrrQkWxVnGAlD/UA/IZuPlE9UNkGZRwTLeml+dT5BytRW4ANqzPQeNLg==" - }, - "node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.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" - } - }, - "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/pirates": { + "version": "4.0.6", "dev": true, - "requires": { - "abbrev": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "dependencies": { - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.1.0.tgz", - "integrity": "sha512-JgkdydFdLe1E5Q7DpLvKVyBZOOwXYGhIbMbOMm3lJ06XKzaiit+qo1HciO3z3IFklStfarzJHVQf9ZcNPTvZlw==", - "dev": true - }, - "npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true - }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true + "node_modules/postcss-load-config": { + "version": "6.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true }, - "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "requires": { - "glob": "^10.3.7" - } + "postcss": { + "optional": true }, - "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, - "requires": { - "ansi-regex": "^6.0.1" - } + "tsx": { + "optional": true }, - "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==", - "dev": true + "yaml": { + "optional": true } } }, - "npm-install-checks": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", - "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", + "node_modules/preact": { + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", "dev": true, - "requires": { - "semver": "^7.1.1" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "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 - }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, - "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/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, - "requires": { - "ignore-walk": "^6.0.0" + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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/prettier-linter-helpers": { + "version": "1.0.0", "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "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/process": { + "version": "0.11.10", "dev": true, - "requires": { - "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" + "license": "MIT", + "engines": { + "node": ">= 0.6.0" } }, - "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/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "dev": true, - "requires": { - "path-key": "^3.0.0" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "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, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "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 - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "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 - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/pseudomap": { + "version": "1.0.2", "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } + "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" }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "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==", + "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, - "requires": { - "ee-first": "1.1.1" + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "requires": { - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, - "requires": { - "mimic-fn": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "node_modules/rechoir": { + "version": "0.6.2", "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "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/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } + "license": "MIT" }, - "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/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", "dev": true, - "requires": { - "p-limit": "^3.0.2" + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" } }, - "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/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", "dev": true, - "requires": { - "aggregate-error": "^3.0.0" + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" } }, - "package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "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==", "dev": true, - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - } + "license": "MIT" }, - "package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", - "dev": true, - "requires": { - "@npmcli/git": "^4.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", - "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", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "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/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, - "requires": { - "callsites": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "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 - }, - "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/resolve": { + "version": "1.22.8", "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "license": "MIT", "dependencies": { - "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 - }, - "minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true - } + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { + "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "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 - }, - "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-types": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "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==", "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "dependencies": { - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - } + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "requires": { - "lilconfig": "^3.1.1" + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "preact": { - "version": "10.22.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", - "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", - "dev": true - }, - "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 - }, - "prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" }, - "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/rollup": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz", + "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==", "dev": true, - "requires": { - "fast-diff": "^1.1.2" + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.31.0", + "@rollup/rollup-android-arm64": "4.31.0", + "@rollup/rollup-darwin-arm64": "4.31.0", + "@rollup/rollup-darwin-x64": "4.31.0", + "@rollup/rollup-freebsd-arm64": "4.31.0", + "@rollup/rollup-freebsd-x64": "4.31.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.31.0", + "@rollup/rollup-linux-arm-musleabihf": "4.31.0", + "@rollup/rollup-linux-arm64-gnu": "4.31.0", + "@rollup/rollup-linux-arm64-musl": "4.31.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.31.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0", + "@rollup/rollup-linux-riscv64-gnu": "4.31.0", + "@rollup/rollup-linux-s390x-gnu": "4.31.0", + "@rollup/rollup-linux-x64-gnu": "4.31.0", + "@rollup/rollup-linux-x64-musl": "4.31.0", + "@rollup/rollup-win32-arm64-msvc": "4.31.0", + "@rollup/rollup-win32-ia32-msvc": "4.31.0", + "@rollup/rollup-win32-x64-msvc": "4.31.0", + "fsevents": "~2.3.2" } }, - "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==", + "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, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "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", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "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 - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true + "node_modules/safe-buffer": { + "version": "5.2.1", + "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" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" }, - "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/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true }, - "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/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", + "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, - "requires": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "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 - }, - "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==", + "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, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - }, - "pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "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, - "requires": { - "escape-goat": "^4.0.0" - } + "license": "MIT" }, - "qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", + "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, - "requires": { - "side-channel": "^1.0.6" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "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 - }, - "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 - }, - "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 + "node_modules/send/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==", + "dev": true, + "license": "MIT" }, - "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/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, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, + "license": "MIT", "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "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==", - "dev": true - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, - "requires": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "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 - }, - "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==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "node_modules/shelljs": { + "version": "0.8.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "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/shiki": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.1.0.tgz", + "integrity": "sha512-yvKPdNGLXZv7WC4bl7JBbU3CEcUxnBanvMez8MG3gZXKpClGL4bHqFyLhTx+2zUvbjClUANs/S22HXb7aeOgmA==", "dev": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.1.0", + "@shikijs/engine-javascript": "2.1.0", + "@shikijs/engine-oniguruma": "2.1.0", + "@shikijs/langs": "2.1.0", + "@shikijs/themes": "2.1.0", + "@shikijs/types": "2.1.0", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" } }, - "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/short-hash": { + "version": "1.0.0", "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "license": "MIT", + "dependencies": { + "hash-string": "^1.0.0" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/shx": { + "version": "0.3.4", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "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/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==", "dev": true, - "requires": { - "resolve": "^1.1.6" + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "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==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "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==", "dev": true, - "requires": { - "@pnpm/npm-conf": "^1.0.4" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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==", "dev": true, - "requires": { - "rc": "1.2.8" + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "remote-git-tags": { - "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==", - "dev": true - }, - "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 - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/sift": { + "version": "17.1.3", "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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 - }, - "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" }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "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, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", - "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.18.1", - "@rollup/rollup-android-arm64": "4.18.1", - "@rollup/rollup-darwin-arm64": "4.18.1", - "@rollup/rollup-darwin-x64": "4.18.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", - "@rollup/rollup-linux-arm-musleabihf": "4.18.1", - "@rollup/rollup-linux-arm64-gnu": "4.18.1", - "@rollup/rollup-linux-arm64-musl": "4.18.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", - "@rollup/rollup-linux-riscv64-gnu": "4.18.1", - "@rollup/rollup-linux-s390x-gnu": "4.18.1", - "@rollup/rollup-linux-x64-gnu": "4.18.1", - "@rollup/rollup-linux-x64-musl": "4.18.1", - "@rollup/rollup-win32-arm64-msvc": "4.18.1", - "@rollup/rollup-win32-ia32-msvc": "4.18.1", - "@rollup/rollup-win32-x64-msvc": "4.18.1", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } + "license": "ISC" }, - "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/smart-buffer": { + "version": "4.2.0", "dev": true, - "requires": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "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==", "dev": true, - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "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" + }, + "engines": { + "node": ">=10.2.0" } }, - "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==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "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==", "dev": true, - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "search-insights": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.15.0.tgz", - "integrity": "sha512-ch2sPCUDD4sbPQdknVl9ALSi9H7VyoeVbsxznYz6QV55jJ8CI3EtwpO1i84keN4+hF5IeHWIeGvc08530JkVXQ==", - "dev": true, - "peer": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "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==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, + "license": "MIT", "dependencies": { - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "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/socket.io-adapter/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==", "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "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 + "license": "MIT" }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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==", "dev": true, - "requires": { - "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" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "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 - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" } }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "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==", "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, + "license": "MIT", "dependencies": { - "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 + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "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 - }, - "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/socket.io-parser/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==", "dev": true, - "requires": { - "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" - } + "license": "MIT" }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "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==", "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "node_modules/socket.io/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==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/socks": { + "version": "2.7.1", "dev": true, - "requires": { - "shebang-regex": "^3.0.0" + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/sort-keys": { + "version": "2.0.0", "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", + "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==", "dev": true, - "requires": { - "@shikijs/core": "1.10.3", - "@types/hast": "^3.0.4" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "short-hash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/short-hash/-/short-hash-1.0.0.tgz", - "integrity": "sha512-qbUCD2Pkl4IXRyVqneEjGnUr0NGDGLzZnBUVGJngIQZf/FrhOL0yJhH+JQzak0t8xMmScIKpoX1SxOsPHdwa4w==", + "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==", "dev": true, - "requires": { - "hash-string": "^1.0.0" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "node_modules/sparse-bitfield": { + "version": "3.0.3", "dev": true, - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" + "license": "MIT", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" } }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "dev": true - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" }, - "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/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" }, - "sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "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, - "requires": { - "@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" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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 + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" }, - "socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "node_modules/string-width": { + "version": "4.2.3", "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "dev": true, - "requires": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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/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==", "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "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/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "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, - "requires": { - "is-plain-obj": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 - }, - "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true - }, - "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==", + "node_modules/sucrase": { + "version": "3.35.0", "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, - "optional": true, - "requires": { - "memory-pager": "^1.0.2" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "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/sucrase/node_modules/commander": { + "version": "4.1.1", "dev": true, - "requires": { - "cross-spawn": "^7.0.3" + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "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/sucrase/node_modules/glob": { + "version": "10.4.5", "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "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/sucrase/node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true - }, - "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "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, - "requires": { - "minipass": "^7.0.3" - }, + "license": "MIT", "dependencies": { - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true - } + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" } }, - "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 - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "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==", + "node_modules/supports-color": { + "version": "7.2.0", "dev": true, - "requires": { - "safe-buffer": "~5.2.0" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "string-width-cjs": { - "version": "npm:string-width@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/synckit": { + "version": "0.9.1", "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } + "license": "MIT" }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" } }, - "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/test-exclude/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, - "requires": { - "ansi-regex": "^5.0.1" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/test-exclude/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, - "requires": { - "ansi-regex": "^5.0.1" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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 - }, - "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 - }, - "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 - }, - "strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "node_modules/test-exclude/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, - "requires": { - "js-tokens": "^9.0.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "node_modules/thenify": { + "version": "3.3.1", "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, + "license": "MIT", "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "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, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - } + "any-promise": "^1.0.0" } }, - "superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "node_modules/thenify-all": { + "version": "1.6.0", "dev": true, - "requires": { - "copy-anything": "^3.0.2" + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" } }, - "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==", + "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, - "requires": { - "has-flag": "^4.0.0" - } + "license": "MIT" }, - "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==", - "dev": true + "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, + "license": "MIT" }, - "synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" } }, - "tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "dev": true - }, - "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "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/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } } }, - "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/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==", "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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 - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, - "requires": { - "any-promise": "^1.0.0" + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" } }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "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, - "requires": { - "thenify": ">= 3.1.0 < 4" + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true - }, - "tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true - }, - "tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, - "to-regex-range": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { + "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==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, - "tr46": { + "node_modules/tr46": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" } }, - "traverse": { + "node_modules/traverse": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "tree-kill": { + "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "ts-algebra": { + "node_modules/ts-algebra": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "dev": true + "dev": true, + "license": "MIT" }, - "ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", "dev": true, - "requires": {} + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } }, - "ts-interface-checker": { + "node_modules/ts-interface-checker": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } + "dev": true, + "license": "Apache-2.0" }, - "tslib": { + "node_modules/tslib": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true + "dev": true, + "license": "0BSD" }, - "tsup": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.1.2.tgz", - "integrity": "sha512-Gzw/PXSX/z0aYMNmkcI54bKKFVFJQbLne+EqTJZeQ3lNT3QpumjtMU4rl+ZwTTp8oRF3ahMbEAxT2sZPJLFSrg==", + "node_modules/tsup": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", + "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "bundle-require": "^5.0.0", "cac": "^6.7.14", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "consola": "^3.2.3", - "debug": "^4.3.5", - "esbuild": "^0.23.0", - "execa": "^5.0.0", - "globby": "^11.0.3", + "debug": "^4.3.7", + "esbuild": "^0.24.0", "joycon": "^3.1.1", + "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", - "rollup": "^4.18.1", + "rollup": "^4.24.0", "source-map": "0.8.0-beta.0", "sucrase": "^3.35.0", + "tinyexec": "^0.3.1", + "tinyglobby": "^0.2.9", "tree-kill": "^1.2.2" }, - "dependencies": { - "@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "dev": true, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { "optional": true }, - "@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "dev": true, + "@swc/core": { "optional": true }, - "@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "dev": true, + "postcss": { "optional": true }, - "@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "dev": true, + "typescript": { "optional": true - }, - "esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "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 - }, - "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, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, - "tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tsup/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, - "requires": { - "prelude-ls": "^1.2.1" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "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==", - "dev": true + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" } }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" } }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/tsup/node_modules/whatwg-url": { + "version": "7.1.0", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "node_modules/type-check": { + "version": "0.4.0", "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "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, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "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==", + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", - "dev": true + "node_modules/typescript-eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", + "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.21.0", + "@typescript-eslint/parser": "8.21.0", + "@typescript-eslint/utils": "8.21.0" + }, + "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 <5.8.0" + } }, - "ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "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==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "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==", + "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==", "dev": true, - "requires": { - "unique-slug": "^4.0.0" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unique-slug": { + "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "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==", "dev": true, - "requires": { - "imurmurhash": "^0.1.4" + "license": "MIT", + "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" } }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "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==", "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unpipe": { + "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 - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - } + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { + "license": "BSD-2-Clause", + "dependencies": { "punycode": "^2.1.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true + "node_modules/uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } }, - "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==", + "node_modules/vary": { + "version": "1.1.2", "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "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==", "dev": true, - "requires": { - "builtins": "^5.0.0" + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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 + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "esbuild": "^0.21.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "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 + } } }, - "vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "node_modules/vite-node": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.3.tgz", + "integrity": "sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.1", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "vitepress": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.1.tgz", - "integrity": "sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==", - "dev": true, - "requires": { - "@docsearch/css": "^3.6.0", - "@docsearch/js": "^3.6.0", - "@shikijs/core": "^1.10.3", - "@shikijs/transformers": "^1.10.3", - "@types/markdown-it": "^14.1.1", - "@vitejs/plugin-vue": "^5.0.5", - "@vue/devtools-api": "^7.3.5", - "@vue/shared": "^3.4.31", - "@vueuse/core": "^10.11.0", - "@vueuse/integrations": "^10.11.0", - "focus-trap": "^7.5.4", + "node_modules/vitepress": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.2.tgz", + "integrity": "sha512-pKAgner8wqetwyL6VyjhJnrw/Kwc8hNlwaS/efUlEBhQsRiCvjIsKqjWyjyUMa6u39ktMle16nYAUOcZ6MhV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "^3.8.3", + "@docsearch/js": "^3.8.3", + "@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.0.0", - "shiki": "^1.10.3", - "vite": "^5.3.3", - "vue": "^3.4.31" + "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 + } } }, - "vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dev": true, - "requires": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "dependencies": { - "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true - }, - "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true + "node_modules/vitest": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.3.tgz", + "integrity": "sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.3", + "@vitest/mocker": "3.0.3", + "@vitest/pretty-format": "^3.0.3", + "@vitest/runner": "3.0.3", + "@vitest/snapshot": "3.0.3", + "@vitest/spy": "3.0.3", + "@vitest/utils": "3.0.3", + "chai": "^5.1.2", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.1", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.3", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.3", + "@vitest/ui": "3.0.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true }, - "npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } + "@types/node": { + "optional": true }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } + "@vitest/browser": { + "optional": true }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true + "@vitest/ui": { + "optional": true }, - "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 + "happy-dom": { + "optional": true }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true + "jsdom": { + "optional": true } } }, - "vue": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.32.tgz", - "integrity": "sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==", + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", "dev": true, - "requires": { - "@vue/compiler-dom": "3.4.32", - "@vue/compiler-sfc": "3.4.32", - "@vue/runtime-dom": "3.4.32", - "@vue/server-renderer": "3.4.32", - "@vue/shared": "3.4.32" + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "webidl-conversions": { + "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==", - "dev": true + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "which": { + "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, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "why-is-node-running": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" - } - }, - "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, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "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, - "requires": { - "string-width": "^5.0.1" }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "wrap-ansi": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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 + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.1.1", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "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/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "ws": { + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, - "requires": {} - }, - "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 + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "yallist": { + "node_modules/yallist": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "dev": true, + "license": "ISC" }, - "yocto-queue": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index f9a56062..8a5766a3 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "release:minor": "npm version minor && npm publish", "release:major": "npm version major && npm publish", "changelog": "github_changelog_generator --max-issues 200 -u feathersjs-ecosystem -p feathers-hooks-common && git add CHANGELOG.md && git commit -am \"Updating changelog\"", - "lint": "eslint src/**/*.ts test/**/*.ts --fix", + "lint": "eslint .", "update-dependencies": "ncu -u -x ajv", "test:unit": "vitest run", "coverage": "vitest run --coverage", @@ -62,49 +62,47 @@ "dist/**" ], "dependencies": { - "@feathersjs/errors": "^5.0.29", + "@feathersjs/errors": "^5.0.31", "ajv": "^6.12.6", - "debug": "^4.3.5", - "graphql": "^16.9.0", + "graphql": "^16.10.0", "lodash": "^4.17.21", - "neotraverse": "^0.6.14" + "neotraverse": "^0.6.18" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@feathers-plus/batch-loader": "^0.3.6", "@feathers-plus/cache": "^1.4.0", "@feathers-plus/graphql": "^1.10.0", - "@feathersjs/authentication": "^5.0.29", - "@feathersjs/authentication-local": "^5.0.29", - "@feathersjs/client": "^5.0.29", - "@feathersjs/express": "^5.0.29", - "@feathersjs/memory": "^5.0.29", - "@feathersjs/socketio": "^5.0.29", - "@feathersjs/socketio-client": "^5.0.29", + "@feathersjs/authentication": "^5.0.31", + "@feathersjs/authentication-local": "^5.0.31", + "@feathersjs/client": "^5.0.31", + "@feathersjs/express": "^5.0.31", + "@feathersjs/memory": "^5.0.31", + "@feathersjs/socketio": "^5.0.31", + "@feathersjs/socketio-client": "^5.0.31", "@types/debug": "^4.1.12", - "@types/lodash": "^4.17.7", - "@types/node": "^20.14.11", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", - "@vitest/coverage-v8": "^1.6.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-prettier": "^5.2.1", + "@types/lodash": "^4.17.14", + "@types/node": "^22.10.7", + "@typescript-eslint/eslint-plugin": "^8.21.0", + "@typescript-eslint/parser": "^8.21.0", + "@vitest/coverage-v8": "^3.0.3", + "eslint": "^9.18.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-import-x": "^4.6.1", + "eslint-plugin-prettier": "^5.2.3", "mongodb": "^5.9.2", - "npm-check-updates": "^16.14.20", - "prettier": "^3.3.3", + "npm-check-updates": "^17.1.14", + "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsup": "^8.1.2", - "typescript": "^5.5.3", - "vitepress": "^1.3.1", - "vitest": "^1.6.0" + "tsup": "^8.3.5", + "typescript": "^5.7.3", + "typescript-eslint": "^8.21.0", + "vitepress": "^1.6.2", + "vitest": "^3.0.3" }, "peerDependencies": { "@feathersjs/feathers": "^5.0.0" - }, - "engines": { - "node": ">= 18" } } diff --git a/src/common/index.ts b/src/common/index.ts index d1efe961..dc71d900 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -2,7 +2,6 @@ export function isPromise(p: any): p is Promise { return !!p && (typeof p === 'object' || typeof p === 'function') && typeof p.then === 'function'; } -export { pluck } from './pluck'; export { setFields } from './set-fields'; export { transformItems } from './transform-items'; export { traverse } from './traverse'; diff --git a/src/common/pluck.ts b/src/common/pluck.ts deleted file mode 100755 index ecd91d9f..00000000 --- a/src/common/pluck.ts +++ /dev/null @@ -1,24 +0,0 @@ -import _pick from 'lodash/pick.js'; - -export function pluck>( - items: T, - fieldNames: string[], -): Record; -export function pluck>( - items: T[], - fieldNames: string[], -): Record[]; -export function pluck>( - items: T | T[], - fieldNames: string[], -): Record | Record[] { - if (!Array.isArray(items)) { - return _pick(items, fieldNames); - } - - const pluckedItems = (Array.isArray(items) ? items : [items]).map(item => - _pick(item, fieldNames), - ); - - return pluckedItems; -} diff --git a/test/hooks/act-on-dispatch.test.ts b/src/hooks/act-on-dispatch/act-on-dispatch.test.ts similarity index 95% rename from test/hooks/act-on-dispatch.test.ts rename to src/hooks/act-on-dispatch/act-on-dispatch.test.ts index 60373faa..7ef45a36 100755 --- a/test/hooks/act-on-dispatch.test.ts +++ b/src/hooks/act-on-dispatch/act-on-dispatch.test.ts @@ -1,6 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; import { assert } from 'vitest'; -import { actOnDefault, actOnDispatch, combine, getItems, replaceItems } from '../../src'; +import { actOnDefault, actOnDispatch } from './act-on-dispatch'; +import { combine, getItems, replaceItems } from '../../utils'; let hookBefore: any; diff --git a/src/hooks/act-on-dispatch.ts b/src/hooks/act-on-dispatch/act-on-dispatch.ts similarity index 88% rename from src/hooks/act-on-dispatch.ts rename to src/hooks/act-on-dispatch/act-on-dispatch.ts index 893ffe07..5954eaf7 100755 --- a/src/hooks/act-on-dispatch.ts +++ b/src/hooks/act-on-dispatch/act-on-dispatch.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../types'; -import { combine } from '../utils/combine'; +import type { HookFunction } from '../../types'; +import { combine } from '../../utils'; /** * Runs a series of hooks which mutate context.data or context.result (the Feathers default). @@ -18,9 +18,7 @@ export const actOnDispatch = (...hooks: Hoo function actOn(what: any, ...hooks: HookFunction[]) { return async (context: H) => { - // @ts-ignore const currActOn = context.params._actOn; - // @ts-ignore context.params._actOn = what; const newContext = await combine(...hooks)(context); diff --git a/src/hooks/alter-items/alter-data.test.ts b/src/hooks/alter-items/alter-data.test.ts new file mode 100755 index 00000000..758eb39b --- /dev/null +++ b/src/hooks/alter-items/alter-data.test.ts @@ -0,0 +1,96 @@ +import { assert } from 'vitest'; +import { alterData } from './alter-data'; + +let hookBefore: any; +let hookCreateMulti: any; + +describe('alterData', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + }; + hookCreateMulti = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('context is 2nd param', () => { + let contextParam; + alterData((_rec: any, context: any) => { + contextParam = context; + })(hookBefore); + assert.deepEqual(contextParam, hookBefore); + }); + + it('updates hook before::create', () => { + alterData((rec: any) => { + rec.state = 'UT'; + })(hookBefore); + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); + }); + + it('updates hook before::create::multi', () => { + alterData((rec: any) => { + rec.state = 'UT'; + })(hookCreateMulti); + assert.deepEqual(hookCreateMulti.data, [ + { first: 'John', last: 'Doe', state: 'UT' }, + { first: 'Jane', last: 'Doe', state: 'UT' }, + ]); + }); + + it('updates hook before::create with new item returned', () => { + alterData((rec: any) => Object.assign({}, rec, { state: 'UT' }))(hookBefore); + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); + }); + + it('returns a promise that contains context', async () => { + const promise = alterData((rec: any) => { + rec.state = 'UT'; + return Promise.resolve(); + })(hookBefore); + + assert.ok(promise instanceof Promise); + + const result = await promise; + + assert.deepEqual(result, hookBefore); + }); + + it('updates hook before::create with new item returned', () => { + // @ts-ignore + return alterData((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( + hookBefore, + ).then(() => { + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); + }); + }); + + it('updates hook before::create async', () => { + const alterFunc = (rec: any) => { + rec.state = 'UT'; + return Promise.resolve(); + }; + // @ts-ignore + return alterData(alterFunc)(hookBefore).then(() => { + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); + }); + }); + + it('updates hook before::create async with new item returned', () => { + const alterFunc = (rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })); + // @ts-ignore + return alterData(alterFunc)(hookBefore).then(() => { + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); + }); + }); +}); diff --git a/src/hooks/alter-items/alter-data.ts b/src/hooks/alter-items/alter-data.ts new file mode 100755 index 00000000..95b76082 --- /dev/null +++ b/src/hooks/alter-items/alter-data.ts @@ -0,0 +1,20 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { replaceData } from '../../utils/replace-items/replace-data'; +import { isPromise } from 'util/types'; + +/** + * Make changes to data items. Very flexible. + * @see https://hooks-common.feathersjs.com/hooks.html#alteritems + */ +export const alterData = + (cb: (record: T, context: H) => any) => + (context: H) => + replaceData(context, (item: any) => { + const result = cb(item, context); + + if (isPromise(result)) { + return result.then((res: any) => res ?? item); + } else { + return result ?? item; + } + }); diff --git a/test/hooks/alter-items.test.ts b/src/hooks/alter-items/alter-items.test.ts similarity index 99% rename from test/hooks/alter-items.test.ts rename to src/hooks/alter-items/alter-items.test.ts index 95f9d30c..cd500f80 100755 --- a/test/hooks/alter-items.test.ts +++ b/src/hooks/alter-items/alter-items.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { alterItems } from '../../src'; +import { alterItems } from './alter-items'; let hookBefore: any; let hookAfter: any; diff --git a/src/hooks/alter-items.ts b/src/hooks/alter-items/alter-items.ts similarity index 88% rename from src/hooks/alter-items.ts rename to src/hooks/alter-items/alter-items.ts index 4e6863dc..06b29cc2 100755 --- a/src/hooks/alter-items.ts +++ b/src/hooks/alter-items/alter-items.ts @@ -1,13 +1,14 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../common'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { isPromise } from '../../common'; +import { getItems, replaceItems } from '../../utils'; /** * Make changes to data or result items. Very flexible. * @see https://hooks-common.feathersjs.com/hooks.html#alteritems + * + * @deprecated Use the explicit 'alterData' or 'alterResult' hooks instead. */ export function alterItems( cb: (record: T, context: H) => any, diff --git a/src/hooks/alter-items/alter-result.test.ts b/src/hooks/alter-items/alter-result.test.ts new file mode 100755 index 00000000..c185b675 --- /dev/null +++ b/src/hooks/alter-items/alter-result.test.ts @@ -0,0 +1,143 @@ +import { assert } from 'vitest'; +import { alterResult } from './alter-result'; + +let hookAfter: any; +let hookFindPaginate: any; +let hookFind: any; + +describe('alterResult', () => { + beforeEach(() => { + hookAfter = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + }; + hookFindPaginate = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: { + total: 2, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }; + hookFind = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('updates hook after::find with pagination', () => { + alterResult((rec: any) => { + delete rec.last; + })(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after::find with no pagination', () => { + alterResult((rec: any) => { + rec.new = rec.first; + })(hookFind); + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); + }); + + it('updates hook after', () => { + alterResult((rec: any) => { + rec.new = rec.first; + })(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); + }); + + it('updates hook after::find with pagination with new item returned', () => { + alterResult((rec: any) => Object.assign({}, { first: rec.first }))(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after::find with pagination with new item returned', () => { + alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookFind); + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); + }); + + it('updates hook after with new item returned', () => { + alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); + }); + + it('updates hook after::create', () => { + return alterResult((rec: any) => { + rec.new = rec.first; + return Promise.resolve(); + // @ts-ignore + })(hookAfter).then(() => { + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); + }); + }); + + it('updates hook after::create with new item returned', () => { + // @ts-ignore + return alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( + hookAfter, + ).then(() => { + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); + }); + }); + + it('updates hook after::find with pagination', () => { + return alterResult((rec: any) => { + delete rec.last; + return Promise.resolve(); + // @ts-ignore + })(hookFindPaginate).then(() => { + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + }); + + it('updates hook after::find with no pagination', () => { + return alterResult((rec: any) => { + rec.new = rec.first; + return Promise.resolve(); + // @ts-ignore + })(hookFind).then(() => { + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); + }); + }); + + it('updates hook after::find with pagination with new item returned', () => { + // @ts-ignore + return alterResult((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( + hookFindPaginate, + ).then(() => { + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + }); + + it('updates hook after::find with no pagination with new item returned', () => { + // @ts-ignore + return alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( + hookFind, + ).then(() => { + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); + }); + }); +}); diff --git a/src/hooks/alter-items/alter-result.ts b/src/hooks/alter-items/alter-result.ts new file mode 100755 index 00000000..3baf16e6 --- /dev/null +++ b/src/hooks/alter-items/alter-result.ts @@ -0,0 +1,26 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import { isPromise } from '../../common'; +import { replaceResult } from '../../utils/replace-items/replace-result'; + +/** + * Make changes to result items. Very flexible. + * @see https://hooks-common.feathersjs.com/hooks.html#alteritems + */ +export const alterResult = + (cb: (record: T, context: H) => any) => + (context: H, next?: NextFunction) => + replaceResult( + context, + (item: any) => { + const result = cb(item, context); + + if (isPromise(result)) { + return result.then((res: any) => res ?? item); + } else { + return result ?? item; + } + }, + { + next, + }, + ); diff --git a/test/hooks/cache.test.ts b/src/hooks/cache/cache.test.ts similarity index 99% rename from test/hooks/cache.test.ts rename to src/hooks/cache/cache.test.ts index 141cc5a4..9e05c523 100755 --- a/test/hooks/cache.test.ts +++ b/src/hooks/cache/cache.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { cache } from '../../src'; +import { cache } from './cache'; // @ts-ignore import CacheMap from '@feathers-plus/cache'; diff --git a/src/hooks/cache.ts b/src/hooks/cache/cache.ts similarity index 95% rename from src/hooks/cache.ts rename to src/hooks/cache/cache.ts index fe9c94d2..c9b56055 100755 --- a/src/hooks/cache.ts +++ b/src/hooks/cache/cache.ts @@ -1,6 +1,6 @@ import type { HookContext, Id } from '@feathersjs/feathers'; -import { getItems } from '../utils/get-items'; -import { clone as defaultClone } from '../common/clone'; +import { getItems } from '../../utils'; +import { clone as defaultClone } from '../../common'; export type CacheMap = Map; diff --git a/test/hooks/de-populate.test.ts b/src/hooks/de-populate/de-populate.test.ts similarity index 98% rename from test/hooks/de-populate.test.ts rename to src/hooks/de-populate/de-populate.test.ts index 8f7ffde0..77223f41 100755 --- a/test/hooks/de-populate.test.ts +++ b/src/hooks/de-populate/de-populate.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; -import { dePopulate } from '../../src'; +import { dePopulate } from './de-populate'; +import { clone } from '../../common'; describe('services dePopulate - not dot notation', () => { let hookAfter: any; @@ -282,7 +283,3 @@ describe('services dePopulate - dot notation', () => { ]); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/de-populate.ts b/src/hooks/de-populate/de-populate.ts similarity index 89% rename from src/hooks/de-populate.ts rename to src/hooks/de-populate/de-populate.ts index 2a57d308..2eac0305 100755 --- a/src/hooks/de-populate.ts +++ b/src/hooks/de-populate/de-populate.ts @@ -1,7 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import _omit from 'lodash/omit.js'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { getItems, replaceItems } from '../../utils'; /** * Remove records and properties created by the populate hook. diff --git a/test/hooks/debug.test.ts b/src/hooks/debug/debug.test.ts similarity index 93% rename from test/hooks/debug.test.ts rename to src/hooks/debug/debug.test.ts index d4ec03f1..bf4287be 100755 --- a/test/hooks/debug.test.ts +++ b/src/hooks/debug/debug.test.ts @@ -1,4 +1,4 @@ -import { debug } from '../../src'; +import { debug } from './debug'; describe('services debug', () => { it('does not crash', () => { diff --git a/src/hooks/debug.ts b/src/hooks/debug/debug.ts similarity index 96% rename from src/hooks/debug.ts rename to src/hooks/debug/debug.ts index 6d54e0d9..6ed34bf4 100755 --- a/src/hooks/debug.ts +++ b/src/hooks/debug/debug.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import type { HookContext } from '@feathersjs/feathers'; /** @@ -44,7 +43,6 @@ export function debug(msg: string, ...field console.log('params props:', Object.keys(params).sort()); fieldNames.forEach(name => { - // @ts-ignore console.log(`params.${name}:`, params[name]); }); diff --git a/test/hooks/disable-pagination.test.ts b/src/hooks/disable-pagination/disable-pagination.test.ts similarity index 94% rename from test/hooks/disable-pagination.test.ts rename to src/hooks/disable-pagination/disable-pagination.test.ts index 9ff8fe9c..279ff520 100755 --- a/test/hooks/disable-pagination.test.ts +++ b/src/hooks/disable-pagination/disable-pagination.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { disablePagination } from '../../src'; +import { disablePagination } from './disable-pagination'; let hookBefore: any; diff --git a/src/hooks/disable-pagination.ts b/src/hooks/disable-pagination/disable-pagination.ts similarity index 80% rename from src/hooks/disable-pagination.ts rename to src/hooks/disable-pagination/disable-pagination.ts index 83d5d23c..cf2e09dc 100755 --- a/src/hooks/disable-pagination.ts +++ b/src/hooks/disable-pagination/disable-pagination.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; /** * Disables pagination when query.$limit is -1 or '-1'. @@ -8,10 +8,9 @@ import { checkContext } from '../utils/check-context'; export function disablePagination() { return (context: H) => { checkContext(context, 'before', ['find'], 'disablePagination'); - const $limit = (context.params.query || {}).$limit; + const $limit = context.params?.query?.$limit; if ($limit === '-1' || $limit === -1) { - // @ts-ignore context.params.paginate = false; delete context.params.query.$limit; } diff --git a/test/hooks/disallow.test.ts b/src/hooks/disallow/disallow.test.ts similarity index 96% rename from test/hooks/disallow.test.ts rename to src/hooks/disallow/disallow.test.ts index 861221c6..80b74bd0 100755 --- a/test/hooks/disallow.test.ts +++ b/src/hooks/disallow/disallow.test.ts @@ -1,6 +1,7 @@ import { assert } from 'vitest'; -import { disallow } from '../../src'; +import { disallow } from './disallow'; +import { clone } from '../../common'; describe('services disallow', () => { describe('disallow is compatible with .disable (without predicate)', () => { @@ -150,9 +151,3 @@ describe('services disallow', () => { }); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/disallow.ts b/src/hooks/disallow/disallow.ts similarity index 94% rename from src/hooks/disallow.ts rename to src/hooks/disallow/disallow.ts index c46d6e2e..a6dec104 100755 --- a/src/hooks/disallow.ts +++ b/src/hooks/disallow/disallow.ts @@ -1,6 +1,6 @@ import { MethodNotAllowed } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import type { TransportName } from '../types'; +import type { TransportName } from '../../types'; /** * Prevents access to a service method completely or for specific transports. diff --git a/src/hooks/discard-query.ts b/src/hooks/discard-query.ts deleted file mode 100755 index e298680d..00000000 --- a/src/hooks/discard-query.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import _omit from 'lodash/omit.js'; -import { checkContext } from '../utils/check-context'; - -/** - * Delete certain fields from the query object. - * @see https://hooks-common.feathersjs.com/hooks.html#discardquery - */ -export function discardQuery(...fieldNames: string[]) { - return (context: H) => { - checkContext(context, 'before', null, 'discardQuery'); - - const query = context.params.query || {}; - - context.params.query = _omit(query, fieldNames); - - return context; - }; -} diff --git a/test/hooks/fast-join-cache.test.ts b/src/hooks/fast-join/fast-join-cache.test.ts similarity index 96% rename from test/hooks/fast-join-cache.test.ts rename to src/hooks/fast-join/fast-join-cache.test.ts index 242ed7e6..d7acb693 100755 --- a/test/hooks/fast-join-cache.test.ts +++ b/src/hooks/fast-join/fast-join-cache.test.ts @@ -4,7 +4,11 @@ import BatchLoader from '@feathers-plus/batch-loader'; // @ts-ignore import CacheMap from '@feathers-plus/cache'; import { MemoryService } from '@feathersjs/memory'; -import { cache, fastJoin, iff, makeCallingParams } from '../../src'; +import { fastJoin } from './fast-join'; +import { cache } from '../cache/cache'; +import { iff } from '../iff/iff'; +import { makeCallingParams } from '../../utils'; +import { clone } from '../../common'; const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -44,14 +48,12 @@ const userBatchLoader = new BatchLoader( { context: {}, cacheMap: cacheMapUsers }, ); -function services(this: any) { - const app = this; +function services(app: any) { app.configure(usersService); app.configure(postsService); } -function postsService(this: any) { - const app = this; +function postsService(app: any) { const store = clone(postsStoreInit); class PostsService extends MemoryService { @@ -77,8 +79,7 @@ function postsService(this: any) { }); } -function usersService(this: any) { - const app = this; +function usersService(app: any) { const store = clone(usersStoreInit); class UsersService extends MemoryService { @@ -372,7 +373,3 @@ async function ex8b() { return fastJoin(postResolvers)(context); } - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/fast-join.test.ts b/src/hooks/fast-join/fast-join.test.ts similarity index 99% rename from test/hooks/fast-join.test.ts rename to src/hooks/fast-join/fast-join.test.ts index 85c50a2d..308878b5 100755 --- a/test/hooks/fast-join.test.ts +++ b/src/hooks/fast-join/fast-join.test.ts @@ -1,8 +1,8 @@ import { assert } from 'vitest'; import BatchLoader from '@feathers-plus/batch-loader'; -import { fastJoin, makeCallingParams } from '../../src'; - -import { posts, users, comments } from '../helpers/make-services'; +import { fastJoin } from './fast-join'; +import { makeCallingParams } from '../../utils'; +import { posts, users, comments } from './test/make-services'; const { getResultsByKey, getUniqueKeys, loaderFactory } = BatchLoader; diff --git a/src/hooks/fast-join.ts b/src/hooks/fast-join/fast-join.ts similarity index 88% rename from src/hooks/fast-join.ts rename to src/hooks/fast-join/fast-join.ts index 3dd46c50..b12e989f 100755 --- a/src/hooks/fast-join.ts +++ b/src/hooks/fast-join/fast-join.ts @@ -1,5 +1,5 @@ import type { Application, HookContext, Query, Service } from '@feathersjs/feathers'; -import type { SyncContextFunction } from '../types'; +import type { SyncContextFunction } from '../../types'; export interface ResolverContext extends HookContext { @@ -46,7 +46,7 @@ export function fastJoin( return (context: H) => { const { method, data, result, params } = context; - // @ts-ignore + // @ts-expect-error _populate is not part of the Feathers context if (params._populate || params._graphql) return context; // our service called within another populate const q = typeof query === 'function' ? query(context) : query; @@ -59,20 +59,16 @@ export function fastJoin( const prevLoaders = context._loaders; context._loaders = {}; - return ( - Promise.resolve() - // @ts-ignore - .then(() => before && before(context)) - .then( - () => joins && results && recursive(joinsForQuery(joins2, q, context), results, context), - ) - // @ts-ignore - .then(() => after && after(context)) - .then(() => { - context._loaders = prevLoaders; - return context; - }) - ); + return Promise.resolve() + .then(() => before && before(context)) + .then( + () => joins && results && recursive(joinsForQuery(joins2, q, context), results, context), + ) + .then(() => after && after(context)) + .then(() => { + context._loaders = prevLoaders; + return context; + }); }; } diff --git a/test/helpers/make-services.ts b/src/hooks/fast-join/test/make-services.ts similarity index 100% rename from test/helpers/make-services.ts rename to src/hooks/fast-join/test/make-services.ts diff --git a/test/hooks/fgraphql.test.ts b/src/hooks/fgraphql/fgraphql.test.ts similarity index 97% rename from test/hooks/fgraphql.test.ts rename to src/hooks/fgraphql/fgraphql.test.ts index 27817ebe..0bc08d29 100755 --- a/test/hooks/fgraphql.test.ts +++ b/src/hooks/fgraphql/fgraphql.test.ts @@ -3,7 +3,7 @@ import runTime from '@feathers-plus/graphql/lib/run-time'; import BatchLoader from '@feathers-plus/batch-loader'; import { assert } from 'vitest'; import { parse } from 'graphql'; -import { fgraphql } from '../../src'; +import { fgraphql } from './fgraphql'; const { getResultsByKey } = BatchLoader; @@ -97,7 +97,6 @@ describe('services fgraphql', () => { if (isObject(result)) { assert.fail(`unexpected fail: ${err.message}`); - return; } assert.strictEqual(err.code, result, `unexpected error: ${err.message}`); @@ -391,7 +390,6 @@ type User { // resolvers function r(typ: any) { return function resolvers(_app: any, _options: any) { - // eslint-disable-line no-unused-vars // const { convertArgsToFeathers, extractAllItems, extractFirstItem } = options; // eslint-disable-line no-unused-vars // const convertArgs = convertArgsToFeathers([]); // eslint-disable-line no-unused-vars // let comments = app.service('/comments'); @@ -402,7 +400,7 @@ function r(typ: any) { User: { // fullName: String! fullName: (parent: any, _args: any, _content: any, _ast: any) => - `${parent.first} ${parent.last}`, // eslint-disable-line no-unused-vars + `${parent.first} ${parent.last}`, }, }; case 'parent': @@ -410,7 +408,6 @@ function r(typ: any) { User: { // fullName: String! fullName: (parent: any, _args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars const returns = `${parent.first} ${parent.last}`; parent.first = 'foo'; return returns; @@ -422,7 +419,7 @@ function r(typ: any) { User: { // fullName: String! fullName: (parent: any, _args: any, _content: any, _ast: any) => - `${parent.first} ${parent.last}`, // eslint-disable-line no-unused-vars + `${parent.first} ${parent.last}`, params: (_parent: any, args: any, _content: any, ast: any) => ({ args, ast, @@ -456,7 +453,6 @@ function r(typ: any) { User: { // posts: [Post] posts: (_parent: any, args: any, content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return [ { _id: '1001', body: 'foo body' }, { _id: (args.params || content.foo || {})._id || '1002', body: 'bar body' }, @@ -464,7 +460,6 @@ function r(typ: any) { }, // comments: [Comment] comments: (_parent: any, _args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return [ { _id: '2001', comment: 'foo comment' }, { _id: '2002', comment: 'bar comment' }, @@ -479,7 +474,6 @@ function r(typ: any) { User: { // posts: [Post] posts: (_parent: any, args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return [ { _id: '1001', body: 'foo body' }, { _id: (args.params || {})._id || '1002', body: 'bar body' }, @@ -487,7 +481,6 @@ function r(typ: any) { }, // comments: [Comment] comments: (_parent: any, _args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return [ { _id: '2001', comment: 'foo comment' }, { _id: '2002', comment: 'bar comment' }, @@ -497,14 +490,12 @@ function r(typ: any) { Post: { // author: User author: (_parent: any, _args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return { _id: '3001', first: 'Jane', last: 'Doe' }; }, }, Comment: { // author: User author: (_parent: any, _args: any, _content: any, _ast: any) => { - // eslint-disable-line no-unused-vars return { _id: '4001', first: 'Jane', last: 'Doe' }; }, }, diff --git a/src/hooks/fgraphql.ts b/src/hooks/fgraphql/fgraphql.ts similarity index 98% rename from src/hooks/fgraphql.ts rename to src/hooks/fgraphql/fgraphql.ts index c68d8135..3fec32cb 100755 --- a/src/hooks/fgraphql.ts +++ b/src/hooks/fgraphql/fgraphql.ts @@ -1,9 +1,8 @@ import type { Application, HookContext, Query } from '@feathersjs/feathers'; import makeDebug from 'debug'; import type { parse, GraphQLFieldResolver } from 'graphql'; -import type { SyncContextFunction } from '../types'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import type { SyncContextFunction } from '../../types'; +import { getItems, replaceItems } from '../../utils'; export type FGraphQLResolverMapFactory = (app: Application, runtime: any) => FGraphQLResolverMap; diff --git a/test/hooks/iffelse.test.ts b/src/hooks/iff/iff-else.test.ts similarity index 97% rename from test/hooks/iffelse.test.ts rename to src/hooks/iff/iff-else.test.ts index 2a46dabb..65b7e88e 100755 --- a/test/hooks/iffelse.test.ts +++ b/src/hooks/iff/iff-else.test.ts @@ -1,6 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; import { assert } from 'vitest'; -import { iffElse, some, every } from '../../src'; +import { iffElse, some, every } from '../..'; +import { clone } from '../../common'; let hook: any; let hookBefore: any; @@ -227,9 +228,3 @@ describe('services iffElse', () => { }); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/iff-else.ts b/src/hooks/iff/iff-else.ts similarity index 90% rename from src/hooks/iff-else.ts rename to src/hooks/iff/iff-else.ts index 7e35fe07..7f3ee8ca 100755 --- a/src/hooks/iff-else.ts +++ b/src/hooks/iff/iff-else.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../common'; -import { combine } from '../utils/combine'; -import type { HookFunction, PredicateFn } from '../types'; +import { isPromise } from '../../common'; +import { combine } from '../../utils/combine/combine'; +import type { HookFunction, PredicateFn } from '../../types'; /** * Execute one array of hooks or another based on a sync or async predicate. diff --git a/test/hooks/iff.test.ts b/src/hooks/iff/iff.test.ts similarity index 98% rename from test/hooks/iff.test.ts rename to src/hooks/iff/iff.test.ts index 3cd132ca..0d3c4414 100755 --- a/test/hooks/iff.test.ts +++ b/src/hooks/iff/iff.test.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; import { assert } from 'vitest'; -import { iff } from '../../src'; -import { isPromise } from '../../src/common'; +import { iff } from './iff'; +import { clone, isPromise } from '../../common'; let hook: any; let hookBefore: any; @@ -399,9 +399,3 @@ describe('services iff - runs multiple hooks', () => { }); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/iff.ts b/src/hooks/iff/iff.ts similarity index 93% rename from src/hooks/iff.ts rename to src/hooks/iff/iff.ts index 8012d633..f755aef8 100755 --- a/src/hooks/iff.ts +++ b/src/hooks/iff/iff.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import { iffElse } from './iff-else'; -import type { HookFunction, PredicateFn } from '../types'; +import type { HookFunction, PredicateFn } from '../../types'; export interface IffHook extends HookFunction { else(...hooks: HookFunction[]): HookFunction; diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 00000000..93697bf6 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,62 @@ +export * from './act-on-dispatch/act-on-dispatch'; + +// alter +export * from './alter-items/alter-items'; +export * from './alter-items/alter-data'; +export * from './alter-items/alter-result'; + +export * from './cache/cache'; +export * from './debug/debug'; +export * from './de-populate/de-populate'; +export * from './disable-pagination/disable-pagination'; +export * from './disallow/disallow'; + +// omit +export * from './omit/omit'; +export * from './omit/omit-data'; +export * from './omit/omit-result'; +export * from './omit-query/omit-query'; + +export * from './fast-join/fast-join'; +export * from './fgraphql/fgraphql'; + +// iff +export * from './iff/iff'; +export * from './iff/iff-else'; + +// pick +export * from './pick/pick'; +export * from './pick/pick-data'; +export * from './pick/pick-result'; +export * from './pick-query/pick-query'; + +export * from './keep-in-array/keep-in-array'; + +export * from './keep-query-in-array/keep-query-in-array'; + +export * from './lowercase/lowercase'; +export * from './lowercase/lowercase-data'; +export * from './lowercase/lowercase-result'; + +export * from './mongo-keys/mongo-keys'; +export * from './params-from-client/params-from-client'; +export * from './populate/populate'; +export * from './prevent-changes/prevent-changes'; +export * from './required/required'; +export * from './run-parallel/run-parallel'; +export * from './sequelize-convert/sequelize-convert'; +export * from './serialize/serialize'; +export * from './set-field/set-field'; + +export * from './set-now/set-now'; +export * from './set-now/set-now-data'; +export * from './set-now/set-now-result'; + +export * from './set-slug/set-slug'; +export * from './sifter/sifter'; +export * from './soft-delete/soft-delete'; +export * from './stash-before/stash-before'; +export * from './traverse/traverse'; +export * from './unless/unless'; +export * from './validate/validate'; +export * from './validate-schema/validate-schema'; diff --git a/test/hooks/keep-in-array.test.ts b/src/hooks/keep-in-array/keep-in-array.test.ts similarity index 99% rename from test/hooks/keep-in-array.test.ts rename to src/hooks/keep-in-array/keep-in-array.test.ts index 32aba0a0..9af7f563 100755 --- a/test/hooks/keep-in-array.test.ts +++ b/src/hooks/keep-in-array/keep-in-array.test.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; -import { keepInArray } from '../../src'; +import { keepInArray } from './keep-in-array'; let hookBefore: any; let hookAfter: any; diff --git a/src/hooks/keep-in-array.ts b/src/hooks/keep-in-array/keep-in-array.ts similarity index 96% rename from src/hooks/keep-in-array.ts rename to src/hooks/keep-in-array/keep-in-array.ts index 51833bba..b2ce3179 100755 --- a/src/hooks/keep-in-array.ts +++ b/src/hooks/keep-in-array/keep-in-array.ts @@ -2,7 +2,7 @@ import { BadRequest } from '@feathersjs/errors'; import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; import _has from 'lodash/has.js'; -import { getItems } from '../utils/get-items'; +import { getItems } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; /** diff --git a/test/hooks/keep-query-in-array.test.ts b/src/hooks/keep-query-in-array/keep-query-in-array.test.ts similarity index 98% rename from test/hooks/keep-query-in-array.test.ts rename to src/hooks/keep-query-in-array/keep-query-in-array.test.ts index 58c12bf5..0d690693 100755 --- a/test/hooks/keep-query-in-array.test.ts +++ b/src/hooks/keep-query-in-array/keep-query-in-array.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { keepQueryInArray } from '../../src'; +import { keepQueryInArray } from './keep-query-in-array'; let hookBefore: any; let hookFindNested: any; diff --git a/src/hooks/keep-query-in-array.ts b/src/hooks/keep-query-in-array/keep-query-in-array.ts similarity index 96% rename from src/hooks/keep-query-in-array.ts rename to src/hooks/keep-query-in-array/keep-query-in-array.ts index 7b32ab5d..704cae39 100644 --- a/src/hooks/keep-query-in-array.ts +++ b/src/hooks/keep-query-in-array/keep-query-in-array.ts @@ -1,4 +1,4 @@ -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; import { BadRequest } from '@feathersjs/errors'; import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; diff --git a/src/hooks/keep-query.ts b/src/hooks/keep-query.ts deleted file mode 100755 index aac6d2e0..00000000 --- a/src/hooks/keep-query.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { pluck } from '../common'; -import { checkContext } from '../utils/check-context'; - -/** - * Keep certain fields in the query object, deleting the rest. - * @see https://hooks-common.feathersjs.com/hooks.html#keepquery - */ -export function keepQuery(...fieldNames: string[]) { - return (context: H) => { - checkContext(context, 'before', null, 'keepQuery'); - - const query = context.params.query || {}; - context.params.query = pluck(query, fieldNames); - - return context; - }; -} diff --git a/src/hooks/lowercase/lowercase-data.test.ts b/src/hooks/lowercase/lowercase-data.test.ts new file mode 100755 index 00000000..88cefd8d --- /dev/null +++ b/src/hooks/lowercase/lowercase-data.test.ts @@ -0,0 +1,96 @@ +import { assert } from 'vitest'; +import { lowercaseData } from './lowercase-data'; + +let hookBefore: any; + +describe('lowercaseData', () => { + describe('updates data', () => { + beforeEach(() => { + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; + }); + + it('updates hook before::create', () => { + lowercaseData('first', 'last')(hookBefore); + assert.deepEqual(hookBefore.data, { first: 'john', last: 'doe' }); + }); + + it('does not throw if field is missing', () => { + const hook: any = { type: 'before', method: 'create', data: { last: 'Doe' } }; + lowercaseData('first', 'last')(hook); + assert.deepEqual(hook.data, { last: 'doe' }); + }); + + it('does not throw if field is undefined', () => { + const hook: any = { + type: 'before', + method: 'create', + data: { first: undefined, last: 'Doe' }, + }; + lowercaseData('first', 'last')(hook); + assert.deepEqual(hook.data, { first: undefined, last: 'doe' }); + }); + + it('does not throw if field is null', () => { + const hook: any = { type: 'before', method: 'create', data: { first: null, last: 'Doe' } }; + lowercaseData('first', 'last')(hook); + assert.deepEqual(hook.data, { first: null, last: 'doe' }); + }); + + it('throws if field is not a string', () => { + const hook: any = { type: 'before', method: 'create', data: { first: 1, last: 'Doe' } }; + assert.throws(() => { + lowercaseData('first', 'last')(hook); + }); + }); + }); + + describe('handles dot notation', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + }; + }); + + it('prop with no dots', () => { + lowercaseData('dept')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'acct', + }); + }); + + it('prop with 1 dot', () => { + lowercaseData('empl.status')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'aa' }, + dept: 'Acct', + }); + }); + + it('prop with 2 dots', () => { + lowercaseData('empl.name.first')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'john', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('ignores bad or missing paths', () => { + lowercaseData('empl.xx.first')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('ignores bad or missing no dot path', () => { + lowercaseData('xx')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + }); +}); diff --git a/src/hooks/lowercase/lowercase-data.ts b/src/hooks/lowercase/lowercase-data.ts new file mode 100755 index 00000000..cd75d0a3 --- /dev/null +++ b/src/hooks/lowercase/lowercase-data.ts @@ -0,0 +1,26 @@ +import _get from 'lodash/get.js'; +import _set from 'lodash/set.js'; +import { BadRequest } from '@feathersjs/errors'; +import { alterData } from '../alter-items/alter-data'; + +/** + * Convert certain field values to lower case. + * @see https://hooks-common.feathersjs.com/hooks.html#lowercase + */ +export const lowercaseData = (...fieldNames: string[]) => + alterData(item => { + for (let i = 0; i < fieldNames.length; i++) { + const fieldName = fieldNames[i]; + const value = _get(item, fieldName); + + if (value == null) { + continue; + } + + if (typeof value !== 'string') { + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); + } + + _set(item, fieldName, value.toLowerCase()); + } + }); diff --git a/src/hooks/lowercase/lowercase-result.test.ts b/src/hooks/lowercase/lowercase-result.test.ts new file mode 100755 index 00000000..276bf015 --- /dev/null +++ b/src/hooks/lowercase/lowercase-result.test.ts @@ -0,0 +1,54 @@ +import { assert } from 'vitest'; +import { lowercaseResult } from './lowercase-result'; + +let hookAfter: any; +let hookFindPaginate: any; +let hookFind: any; + +describe('lowercaseResult', () => { + describe('updates data', () => { + beforeEach(() => { + hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; + hookFindPaginate = { + type: 'after', + method: 'find', + result: { + total: 2, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }; + hookFind = { + type: 'after', + method: 'find', + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('updates hook after::find with pagination', () => { + lowercaseResult('first', 'last')(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [ + { first: 'john', last: 'doe' }, + { first: 'jane', last: 'doe' }, + ]); + }); + + it('updates hook after::find with no pagination', () => { + lowercaseResult('first', 'last')(hookFind); + assert.deepEqual(hookFind.result, [ + { first: 'john', last: 'doe' }, + { first: 'jane', last: 'doe' }, + ]); + }); + + it('updates hook after', () => { + lowercaseResult('first', 'last')(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'jane', last: 'doe' }); + }); + }); +}); diff --git a/src/hooks/lowercase/lowercase-result.ts b/src/hooks/lowercase/lowercase-result.ts new file mode 100755 index 00000000..d305e982 --- /dev/null +++ b/src/hooks/lowercase/lowercase-result.ts @@ -0,0 +1,26 @@ +import _get from 'lodash/get.js'; +import _set from 'lodash/set.js'; +import { BadRequest } from '@feathersjs/errors'; +import { alterResult } from '../alter-items/alter-result'; + +/** + * Convert certain field values to lower case. + * @see https://hooks-common.feathersjs.com/hooks.html#lowercase + */ +export const lowercaseResult = (...fieldNames: string[]) => + alterResult(item => { + for (let i = 0; i < fieldNames.length; i++) { + const fieldName = fieldNames[i]; + const value = _get(item, fieldName); + + if (value == null) { + continue; + } + + if (typeof value !== 'string') { + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); + } + + _set(item, fieldName, value.toLowerCase()); + } + }); diff --git a/test/hooks/lowercase.test.ts b/src/hooks/lowercase/lowercase.test.ts similarity index 98% rename from test/hooks/lowercase.test.ts rename to src/hooks/lowercase/lowercase.test.ts index c2f72bdc..692b269d 100755 --- a/test/hooks/lowercase.test.ts +++ b/src/hooks/lowercase/lowercase.test.ts @@ -1,12 +1,12 @@ import { assert } from 'vitest'; -import { lowerCase } from '../../src'; +import { lowerCase } from './lowercase'; let hookBefore: any; let hookAfter: any; let hookFindPaginate: any; let hookFind: any; -describe('services lowercase', () => { +describe('lowercase', () => { describe('updates data', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; diff --git a/src/hooks/lower-case.ts b/src/hooks/lowercase/lowercase.ts similarity index 72% rename from src/hooks/lower-case.ts rename to src/hooks/lowercase/lowercase.ts index f71cb1ae..8b37bba9 100755 --- a/src/hooks/lower-case.ts +++ b/src/hooks/lowercase/lowercase.ts @@ -1,16 +1,17 @@ import _set from 'lodash/set.js'; import { BadRequest } from '@feathersjs/errors'; -import { transformItems } from '../common'; -import { checkContextIf } from '../utils/check-context-if'; -import { getItems } from '../utils/get-items'; +import { transformItems } from '../../common'; +import { checkContextIf, getItems } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; /** * Convert certain field values to lower case. * @see https://hooks-common.feathersjs.com/hooks.html#lowercase + * + * @deprecated Use `lowercaseData` or `lowercaseResult` instead. */ -export function lowerCase(...fieldNames: string[]) { +export function lowercase(...fieldNames: string[]) { return (context: H) => { checkContextIf(context, 'before', ['create', 'update', 'patch'], 'lowercase'); @@ -27,3 +28,8 @@ export function lowerCase(...fieldNames: st return context; }; } + +export { + // backwards compatible + lowercase as lowerCase, +}; diff --git a/test/hooks/mongo-keys.test.ts b/src/hooks/mongo-keys/mongo-keys.test.ts similarity index 98% rename from test/hooks/mongo-keys.test.ts rename to src/hooks/mongo-keys/mongo-keys.test.ts index a60f8525..b288b1fa 100755 --- a/test/hooks/mongo-keys.test.ts +++ b/src/hooks/mongo-keys/mongo-keys.test.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; import { ObjectId } from 'mongodb'; -import { mongoKeys } from '../../src'; +import { mongoKeys } from './mongo-keys'; const s0 = '000000000000'; const s1 = '111111111111'; diff --git a/src/hooks/mongo-keys.ts b/src/hooks/mongo-keys/mongo-keys.ts similarity index 97% rename from src/hooks/mongo-keys.ts rename to src/hooks/mongo-keys/mongo-keys.ts index 07f7c71c..30eba299 100755 --- a/src/hooks/mongo-keys.ts +++ b/src/hooks/mongo-keys/mongo-keys.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import traverse from 'neotraverse/legacy'; -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; /** * Wrap MongoDB foreign keys in ObjectId. diff --git a/test/hooks/discard-query.test.ts b/src/hooks/omit-query/omit-query.test.ts similarity index 81% rename from test/hooks/discard-query.test.ts rename to src/hooks/omit-query/omit-query.test.ts index e46b96c7..249571f1 100755 --- a/test/hooks/discard-query.test.ts +++ b/src/hooks/omit-query/omit-query.test.ts @@ -1,10 +1,10 @@ import { assert } from 'vitest'; -import { discardQuery } from '../../src'; +import { omitQuery } from './omit-query'; let hookBefore: any; let hookAfter: any; -describe('services discardQuery', () => { +describe('omitQuery', () => { describe('updates query', () => { beforeEach(() => { hookBefore = { @@ -16,18 +16,18 @@ describe('services discardQuery', () => { }); it('updates hook before::create', () => { - discardQuery('last')(hookBefore); + omitQuery('last')(hookBefore); assert.deepEqual(hookBefore.params, { query: { first: 'John' } }); }); it('throws on hook after', () => { assert.throws(() => { - discardQuery('last')(hookAfter); + omitQuery('last')(hookAfter); }); }); it('does not throw if field is missing', () => { - discardQuery('x', 'first')(hookBefore); + omitQuery('x', 'first')(hookBefore); assert.deepEqual(hookBefore.params.query, { last: 'Doe' }); }); }); @@ -44,14 +44,14 @@ describe('services discardQuery', () => { }); it('prop with no dots', () => { - discardQuery('dept')(hookBefore); + omitQuery('dept')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, }); }); it('prop with 1 dot', () => { - discardQuery('empl.status')(hookBefore); + omitQuery('empl.status')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', @@ -59,7 +59,7 @@ describe('services discardQuery', () => { }); it('prop with 2 dots', () => { - discardQuery('empl.name.first')(hookBefore); + omitQuery('empl.name.first')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -67,7 +67,7 @@ describe('services discardQuery', () => { }); it('ignores bad or missing paths', () => { - discardQuery('empl.xx.first')(hookBefore); + omitQuery('empl.xx.first')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -75,7 +75,7 @@ describe('services discardQuery', () => { }); it('ignores bad or missing no dot path', () => { - discardQuery('xx')(hookBefore); + omitQuery('xx')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', diff --git a/src/hooks/omit-query/omit-query.ts b/src/hooks/omit-query/omit-query.ts new file mode 100755 index 00000000..8b2b7ed7 --- /dev/null +++ b/src/hooks/omit-query/omit-query.ts @@ -0,0 +1,20 @@ +import type { HookContext } from '@feathersjs/feathers'; +import _omit from 'lodash/omit.js'; + +/** + * Delete certain fields from the query object. + * @see https://hooks-common.feathersjs.com/hooks.html#discardquery + */ +export function omitQuery(...fieldNames: string[]) { + return (context: H) => { + if (!context.params.query) { + return context; + } + + context.params.query = _omit(context.params.query, fieldNames); + + return context; + }; +} + +export { omitQuery as discardQuery }; diff --git a/test/hooks/discard-1.test.ts b/src/hooks/omit/omit-1.test.ts similarity index 96% rename from test/hooks/discard-1.test.ts rename to src/hooks/omit/omit-1.test.ts index 00c2b946..afe2cb75 100755 --- a/test/hooks/discard-1.test.ts +++ b/src/hooks/omit/omit-1.test.ts @@ -1,7 +1,7 @@ import { assert } from 'vitest'; -import { discard } from '../../src'; +import { omit } from './omit'; -describe('common hook discard', () => { +describe('omit', () => { describe('removes fields', () => { const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }); @@ -59,7 +59,7 @@ describe('common hook discard', () => { context.params.provider = provider; } - discard(...args)(context); + omit(...args)(context); assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, @@ -123,7 +123,7 @@ describe('common hook discard', () => { decisionTable.forEach(([desc, context, args, result]) => { it(desc, () => { - discard(...args)(context); + omit(...args)(context); assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, diff --git a/test/hooks/discard-2.test.ts b/src/hooks/omit/omit-2.test.ts similarity index 94% rename from test/hooks/discard-2.test.ts rename to src/hooks/omit/omit-2.test.ts index 45eb0480..db1d9285 100755 --- a/test/hooks/discard-2.test.ts +++ b/src/hooks/omit/omit-2.test.ts @@ -1,11 +1,9 @@ import { assert } from 'vitest'; -import { discard } from '../../src'; +import { omit } from './omit'; -describe('common hook discard', () => { +describe('omit', () => { describe('removes fields', () => { const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - // const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }); const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }); const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); const afterBoth = (): any => ({ @@ -114,7 +112,7 @@ describe('common hook discard', () => { context.params.provider = provider; } - discard(...args)(context); + omit(...args)(context); assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, @@ -178,7 +176,7 @@ describe('common hook discard', () => { decisionTable.forEach(([desc, context, args, result]) => { it(desc, () => { - discard(...args)(context); + omit(...args)(context); assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, diff --git a/src/hooks/omit/omit-data-1.test.ts b/src/hooks/omit/omit-data-1.test.ts new file mode 100755 index 00000000..ea5c35f4 --- /dev/null +++ b/src/hooks/omit/omit-data-1.test.ts @@ -0,0 +1,91 @@ +import { assert } from 'vitest'; +import { omitData } from './omit-data'; + +describe('omitData', () => { + describe('removes fields', () => { + const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); + const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }); + const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }); + + const decisionTable = [ + ['before::create', beforeJohn(), 'create', null, ['first'], { last: 'Doe' }], + ['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' }], + ['not throw field undefined', beforeUndef(), 'create', 'rest', ['first'], { last: 'Doe' }], + ['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' }], + ]; + + decisionTable.forEach(([desc, context, method, provider, args, result]) => { + it(desc, () => { + context.method = method; + if (provider !== null) { + context.params = context.params || {}; + context.params.provider = provider; + } + + omitData(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); + + describe('handles dot notation', () => { + const ctx = (): any => ({ + type: 'before', + method: 'create', + data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + }); + + const decisionTable = [ + // desc, context, args, result + [ + 'handles dots', + ctx(), + ['dept'], + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, + ], + [ + 'handle 1 dot', + ctx(), + ['empl.status'], + { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' }, + ], + [ + 'handle 2 dot', + ctx(), + ['empl.name.first'], + { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + ], + [ + 'missing path', + ctx(), + ['empl.xx.first'], + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + ], + [ + 'missing no dot', + ctx(), + ['xx'], + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + ], + [ + '2 fields', + ctx(), + ['empl.status', 'dept'], + { empl: { name: { first: 'John', last: 'Doe' } } }, + ], + ]; + + decisionTable.forEach(([desc, context, args, result]) => { + it(desc, () => { + omitData(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); +}); diff --git a/src/hooks/omit/omit-data.test.ts b/src/hooks/omit/omit-data.test.ts new file mode 100755 index 00000000..fa9fdd5e --- /dev/null +++ b/src/hooks/omit/omit-data.test.ts @@ -0,0 +1,94 @@ +import { assert } from 'vitest'; +import { omitData } from './omit-data'; + +let hookBefore: any; + +describe('omitData', () => { + describe('removes fields', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + }; + }); + + it('updates hook before::create', () => { + omitData('first')(hookBefore); + assert.deepEqual(hookBefore.data, { last: 'Doe' }); + }); + + it('does not throw if field is missing', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + }; + omitData('first', 'xx')(hook); + assert.deepEqual(hook.data, { last: 'Doe' }); + }); + + it('does not throw if field is null', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: null, last: 'Doe' }, + }; + omitData('first')(hook); + assert.deepEqual(hook.data, { last: 'Doe' }); + }); + }); + + describe('handles dot notation', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + }; + }); + + it('prop with no dots', () => { + omitData('dept')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + }); + }); + + it('prop with 1 dot', () => { + omitData('empl.status')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' } }, + dept: 'Acct', + }); + }); + + it('prop with 2 dots', () => { + omitData('empl.name.first')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('ignores bad or missing paths', () => { + omitData('empl.xx.first')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('ignores bad or missing no dot path', () => { + omitData('xx')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + }); +}); diff --git a/src/hooks/omit/omit-data.ts b/src/hooks/omit/omit-data.ts new file mode 100755 index 00000000..ab21790b --- /dev/null +++ b/src/hooks/omit/omit-data.ts @@ -0,0 +1,12 @@ +import _omit from 'lodash/omit.js'; +import { alterData } from '../alter-items/alter-data'; + +/** + * Delete certain fields from the record(s). + * @see https://hooks-common.feathersjs.com/hooks.html#discard + */ +export const omitData = (...fieldNames: string[]) => + alterData((item: any) => _omit(item, fieldNames)); + +// alias +export { omitData as discardData }; diff --git a/src/hooks/omit/omit-result-1.test.ts b/src/hooks/omit/omit-result-1.test.ts new file mode 100755 index 00000000..ae101955 --- /dev/null +++ b/src/hooks/omit/omit-result-1.test.ts @@ -0,0 +1,86 @@ +import { assert } from 'vitest'; +import { omitResult } from './omit-result'; + +describe('omitResult', () => { + describe('removes fields', () => { + const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); + const afterBoth = (): any => ({ + type: 'after', + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }); + const afterPage = (): any => ({ + type: 'after', + result: { + total: 2, + skip: 0, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }); + + const decisionTable = [ + [ + 'after::find with paginate', + afterPage(), + 'find', + null, + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find no paginate', + afterBoth(), + 'find', + null, + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + ['after', afterJane(), 'create', null, ['last'], { first: 'Jane' }], + ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], + ]; + + decisionTable.forEach(([desc, context, method, provider, args, result]) => { + it(desc, () => { + context.method = method; + if (provider !== null) { + context.params = context.params || {}; + context.params.provider = provider; + } + + omitResult(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); + + describe('handles dot notation', () => { + const ctx2 = (): any => ({ + type: 'after', + method: 'get', + result: { property: null, foo: 'bar' }, + }); + + const decisionTable = [ + // desc, context, args, result + ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], + ]; + + decisionTable.forEach(([desc, context, args, result]) => { + it(desc, () => { + omitResult(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); +}); diff --git a/src/hooks/omit/omit-result-2.test.ts b/src/hooks/omit/omit-result-2.test.ts new file mode 100755 index 00000000..8363da65 --- /dev/null +++ b/src/hooks/omit/omit-result-2.test.ts @@ -0,0 +1,121 @@ +import { assert } from 'vitest'; +import { omitResult } from './omit-result'; + +describe('omitResult', () => { + describe('removes fields', () => { + const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); + const afterBoth = (): any => ({ + type: 'after', + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }); + const afterPage = (): any => ({ + type: 'after', + result: { + total: 2, + skip: 0, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }); + + const decisionTable = [ + // desc, context, method, provider, args, result + [ + 'after::find with paginate', + afterPage(), + 'find', + undefined, + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find with paginate', + afterPage(), + 'find', + 'rest', + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find with paginate', + afterPage(), + 'find', + 'socketio', + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find no paginate', + afterBoth(), + 'find', + undefined, + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find no paginate', + afterBoth(), + 'find', + 'rest', + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + [ + 'after::find no paginate', + afterBoth(), + 'find', + 'socketio', + ['last'], + [{ first: 'John' }, { first: 'Jane' }], + ], + ['after', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], + ['after', afterJane(), 'create', 'rest', ['last'], { first: 'Jane' }], + ['after', afterJane(), 'create', 'socketio', ['last'], { first: 'Jane' }], + ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], + ]; + + decisionTable.forEach(([desc, context, method, provider, args, result]) => { + it(desc, () => { + context.method = method; + if (provider !== null) { + context.params = context.params || {}; + context.params.provider = provider; + } + + omitResult(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); + + describe('handles dot notation', () => { + const ctx2 = (): any => ({ + type: 'after', + method: 'get', + result: { property: null, foo: 'bar' }, + }); + + const decisionTable = [ + // desc, context, args, result + ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], + ]; + + decisionTable.forEach(([desc, context, args, result]) => { + it(desc, () => { + omitResult(...args)(context); + assert.deepEqual( + context.data ? context.data : context.result.data || context.result, + result, + ); + }); + }); + }); +}); diff --git a/src/hooks/omit/omit-result.test.ts b/src/hooks/omit/omit-result.test.ts new file mode 100755 index 00000000..979fdd38 --- /dev/null +++ b/src/hooks/omit/omit-result.test.ts @@ -0,0 +1,109 @@ +import { assert } from 'vitest'; +import { omitResult } from './omit-result'; + +let hookAfter: any; +let hookFindPaginate: any; +let hookFind: any; + +describe('omitResult', () => { + describe('removes fields', () => { + beforeEach(() => { + hookAfter = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + }; + hookFindPaginate = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: { + total: 2, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }; + hookFind = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('updates hook after::find with pagination', () => { + omitResult('last')(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after::find with no pagination', () => { + omitResult('last')(hookFind); + assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after', () => { + omitResult('last')(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane' }); + }); + + it('updates when called internally on server', () => { + hookAfter.params.provider = ''; + omitResult('last')(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane' }); + }); + }); + + describe('handles dot notation', () => { + it('discards multiple fields', () => { + const hook: any = { + type: 'after', + method: 'get', + result: { + roles: ['super'], + _id: 'a', + email: 'foo', + password: 'bar', + name: 'Rafael', + id: 'b', + }, + query: {}, + }; + + omitResult('email', 'password')(hook); + + assert.deepEqual(hook.result, { + roles: ['super'], + _id: 'a', + // email: 'foo', + // password: 'bar', + name: 'Rafael', + id: 'b', + } as any); + }); + + it('null prop', () => { + const hook: any = { + type: 'after', + method: 'get', + result: { + property: null, + other: 'bar', + }, + query: {}, + }; + + omitResult('property.secret')(hook); + + assert.deepEqual(hook.result, { + property: null, + other: 'bar', + }); + }); + }); +}); diff --git a/src/hooks/omit/omit-result.ts b/src/hooks/omit/omit-result.ts new file mode 100755 index 00000000..f243967a --- /dev/null +++ b/src/hooks/omit/omit-result.ts @@ -0,0 +1,12 @@ +import _omit from 'lodash/omit.js'; +import { alterResult } from '../alter-items/alter-result'; + +/** + * Delete certain fields from the record(s). + * @see https://hooks-common.feathersjs.com/hooks.html#discard + */ +export const omitResult = (...fieldNames: string[]) => + alterResult((item: any) => _omit(item, fieldNames)); + +// alias +export { omitResult as discardResult }; diff --git a/test/hooks/discard.test.ts b/src/hooks/omit/omit.test.ts similarity index 86% rename from test/hooks/discard.test.ts rename to src/hooks/omit/omit.test.ts index 668572e0..e134ca54 100755 --- a/test/hooks/discard.test.ts +++ b/src/hooks/omit/omit.test.ts @@ -1,12 +1,12 @@ import { assert } from 'vitest'; -import * as hooks from '../../src'; +import { omit } from './omit'; let hookBefore: any; let hookAfter: any; let hookFindPaginate: any; let hookFind: any; -describe('services discard', () => { +describe('omit', () => { describe('removes fields', () => { beforeEach(() => { hookBefore = { @@ -45,28 +45,28 @@ describe('services discard', () => { }); it('updates hook before::create', () => { - hooks.discard('first')(hookBefore); + omit('first')(hookBefore); assert.deepEqual(hookBefore.data, { last: 'Doe' }); }); it('updates hook after::find with pagination', () => { - hooks.discard('last')(hookFindPaginate); + omit('last')(hookFindPaginate); assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); it('updates hook after::find with no pagination', () => { - hooks.discard('last')(hookFind); + omit('last')(hookFind); assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); }); it('updates hook after', () => { - hooks.discard('last')(hookAfter); + omit('last')(hookAfter); assert.deepEqual(hookAfter.result, { first: 'Jane' }); }); it('updates when called internally on server', () => { hookAfter.params.provider = ''; - hooks.discard('last')(hookAfter); + omit('last')(hookAfter); assert.deepEqual(hookAfter.result, { first: 'Jane' }); }); @@ -77,7 +77,7 @@ describe('services discard', () => { params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, }; - hooks.discard('first', 'xx')(hook); + omit('first', 'xx')(hook); assert.deepEqual(hook.data, { last: 'Doe' }); }); @@ -88,7 +88,7 @@ describe('services discard', () => { params: { provider: 'rest' }, data: { first: null, last: 'Doe' }, }; - hooks.discard('first')(hook); + omit('first')(hook); assert.deepEqual(hook.data, { last: 'Doe' }); }); }); @@ -104,14 +104,14 @@ describe('services discard', () => { }); it('prop with no dots', () => { - hooks.discard('dept')(hookBefore); + omit('dept')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, }); }); it('prop with 1 dot', () => { - hooks.discard('empl.status')(hookBefore); + omit('empl.status')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', @@ -119,7 +119,7 @@ describe('services discard', () => { }); it('prop with 2 dots', () => { - hooks.discard('empl.name.first')(hookBefore); + omit('empl.name.first')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -127,7 +127,7 @@ describe('services discard', () => { }); it('ignores bad or missing paths', () => { - hooks.discard('empl.xx.first')(hookBefore); + omit('empl.xx.first')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -135,7 +135,7 @@ describe('services discard', () => { }); it('ignores bad or missing no dot path', () => { - hooks.discard('xx')(hookBefore); + omit('xx')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -157,7 +157,7 @@ describe('services discard', () => { query: {}, }; - hooks.discard('email', 'password')(hook); + omit('email', 'password')(hook); assert.deepEqual(hook.result, { roles: ['super'], @@ -180,7 +180,7 @@ describe('services discard', () => { query: {}, }; - hooks.discard('property.secret')(hook); + omit('property.secret')(hook); assert.deepEqual(hook.result, { property: null, diff --git a/src/hooks/discard.ts b/src/hooks/omit/omit.ts similarity index 56% rename from src/hooks/discard.ts rename to src/hooks/omit/omit.ts index 5ad1c888..33d1e59f 100755 --- a/src/hooks/discard.ts +++ b/src/hooks/omit/omit.ts @@ -1,14 +1,15 @@ import _omit from 'lodash/omit.js'; -import { checkContextIf } from '../utils/check-context-if'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { getItems, replaceItems, checkContextIf } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; +import { replaceData } from '../../utils/replace-items/replace-data'; /** * Delete certain fields from the record(s). * @see https://hooks-common.feathersjs.com/hooks.html#discard + * + * @deprecated Use the explicit 'omitData' or 'omitResult' hooks instead. */ -export function discard(...fieldNames: string[]) { +export function omit(...fieldNames: string[]) { return (context: H) => { checkContextIf(context, 'before', ['create', 'update', 'patch'], 'discard'); @@ -18,6 +19,9 @@ export function discard(...fieldNames: stri replaceItems(context, converted); - return context; + return replaceData(context, (item: any) => _omit(item, fieldNames)); }; } + +// alias +export { omit as discard }; diff --git a/test/hooks/params-from-client.test.ts b/src/hooks/params-from-client/params-from-client.test.ts similarity index 98% rename from test/hooks/params-from-client.test.ts rename to src/hooks/params-from-client/params-from-client.test.ts index 40be1c3a..b0272903 100755 --- a/test/hooks/params-from-client.test.ts +++ b/src/hooks/params-from-client/params-from-client.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { paramsFromClient } from '../../src'; +import { paramsFromClient } from './params-from-client'; describe('services params-from-client', () => { describe('basics', () => { diff --git a/src/hooks/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts similarity index 100% rename from src/hooks/params-from-client.ts rename to src/hooks/params-from-client/params-from-client.ts diff --git a/test/hooks/keep-query.test.ts b/src/hooks/pick-query/pick-query.test.ts similarity index 81% rename from test/hooks/keep-query.test.ts rename to src/hooks/pick-query/pick-query.test.ts index 70f3c3aa..9b2c20c8 100755 --- a/test/hooks/keep-query.test.ts +++ b/src/hooks/pick-query/pick-query.test.ts @@ -1,10 +1,10 @@ import { assert } from 'vitest'; -import { keepQuery } from '../../src'; +import { pickQuery } from './pick-query'; let hookBefore: any; let hookAfter: any; -describe('services keepQuery', () => { +describe('pickQuery', () => { describe('updates query', () => { beforeEach(() => { hookBefore = { @@ -16,23 +16,23 @@ describe('services keepQuery', () => { }); it('updates hook before::create', () => { - keepQuery('first', 'last')(hookBefore); + pickQuery('first', 'last')(hookBefore); assert.deepEqual(hookBefore.params, { query: { first: 'John', last: 'Doe' } }); }); it('updates hook before::create', () => { - keepQuery('first')(hookBefore); + pickQuery('first')(hookBefore); assert.deepEqual(hookBefore.params, { query: { first: 'John' } }); }); it('throws on hook after', () => { assert.throws(() => { - keepQuery('last')(hookAfter); + pickQuery('last')(hookAfter); }); }); it('does not throw if field is missing', () => { - keepQuery('x', 'last')(hookBefore); + pickQuery('x', 'last')(hookBefore); assert.deepEqual(hookBefore.params.query, { last: 'Doe' }); }); }); @@ -54,14 +54,14 @@ describe('services keepQuery', () => { }); it('prop with no dots', () => { - keepQuery('empl')(hookBefore); + pickQuery('empl')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, }); }); it('prop with 1 dot', () => { - keepQuery('empl.name', 'dept', 'owner.id', 'owner.admin')(hookBefore); + pickQuery('empl.name', 'dept', 'owner.id', 'owner.admin')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', @@ -71,7 +71,7 @@ describe('services keepQuery', () => { }); it('prop with 2 dots', () => { - keepQuery('empl.name.last', 'empl.status', 'dept')(hookBefore); + pickQuery('empl.name.last', 'empl.status', 'dept')(hookBefore); assert.deepEqual(hookBefore.params.query, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -79,12 +79,12 @@ describe('services keepQuery', () => { }); it('ignores bad or missing paths', () => { - keepQuery('empl.xx.first')(hookBefore); + pickQuery('empl.xx.first')(hookBefore); assert.deepEqual(hookBefore.params.query, {}); }); it('ignores bad or missing no dot path', () => { - keepQuery('xx')(hookBefore); + pickQuery('xx')(hookBefore); assert.deepEqual(hookBefore.params.query, {}); }); }); diff --git a/src/hooks/pick-query/pick-query.ts b/src/hooks/pick-query/pick-query.ts new file mode 100755 index 00000000..fc844f28 --- /dev/null +++ b/src/hooks/pick-query/pick-query.ts @@ -0,0 +1,21 @@ +import type { HookContext } from '@feathersjs/feathers'; +import _pick from 'lodash/pick'; + +/** + * Keep certain fields in the query object, deleting the rest. + * @see https://hooks-common.feathersjs.com/hooks.html#keepquery + */ +export function pickQuery(...fieldNames: string[]) { + return (context: H) => { + if (!context.params.query) { + return context; + } + + context.params.query = _pick(context.params.query, fieldNames); + + return context; + }; +} + +// alias +export { pickQuery as keepQuery }; diff --git a/src/hooks/pick/pick-data.test.ts b/src/hooks/pick/pick-data.test.ts new file mode 100755 index 00000000..5a73908a --- /dev/null +++ b/src/hooks/pick/pick-data.test.ts @@ -0,0 +1,153 @@ +import { assert } from 'vitest'; +import { pickData } from './pick-data'; + +let hookBefore: any; + +describe('pickData', () => { + describe('removes fields', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + }; + }); + + it('does not throw if field is missing', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + }; + pickData('last', 'xx')(hook); + assert.deepEqual(hook.data, { last: 'Doe' }); + }); + + it('keeps undefined values', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: undefined, last: 'Doe' }, + }; + pickData('first')(hook); + assert.deepEqual(hook.data, { first: undefined }); + }); + + it('keeps null values', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: null, last: 'Doe' }, + }; + pickData('first')(hook); + assert.deepEqual(hook.data, { first: null }); + }); + + it('keeps false values', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: false, last: 'Doe' }, + }; + pickData('first')(hook); + assert.deepEqual(hook.data, { first: false }); + }); + + it('keeps 0 values', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 0, last: 'Doe' }, + }; + pickData('first')(hook); + assert.deepEqual(hook.data, { first: 0 }); + }); + + it('keeps empty string values', () => { + const hook: any = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: '', last: 'Doe' }, + }; + pickData('first')(hook); + assert.deepEqual(hook.data, { first: '' }); + }); + }); + + describe('handles dot notation', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + }; + }); + + it('prop with no dots', () => { + pickData('empl')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + }); + }); + + it('prop with 1 dot', () => { + pickData('empl.name', 'dept')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' } }, + dept: 'Acct', + }); + }); + + it('prop with 2 dots', () => { + pickData('empl.name.last', 'empl.status', 'dept')(hookBefore); + assert.deepEqual(hookBefore.data, { + empl: { name: { last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('ignores bad or missing paths', () => { + pickData('empl.name.first', 'empl.name.surname')(hookBefore); + assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John' } } }); + }); + + it('ignores bad or missing no dot path', () => { + pickData('xx')(hookBefore); + assert.deepEqual(hookBefore.data, {}); + }); + }); + + describe('ignore non-object records', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: [ + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + null, + undefined, + Infinity, + ], + }; + }); + + it('before', () => { + pickData('empl')(hookBefore); + assert.deepEqual(hookBefore.data, [ + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, + null, + undefined, + Infinity, + ]); + }); + }); +}); diff --git a/src/hooks/pick/pick-data.ts b/src/hooks/pick/pick-data.ts new file mode 100755 index 00000000..6870e740 --- /dev/null +++ b/src/hooks/pick/pick-data.ts @@ -0,0 +1,17 @@ +import _pick from 'lodash/pick.js'; + +import { alterData } from '../alter-items/alter-data'; + +/** + * Keep certain fields in the record(s), deleting the rest. + * @see https://hooks-common.feathersjs.com/hooks.html#keep + */ +export const pickData = (...fieldNames: string[]) => + alterData((item: any) => { + if (typeof item !== 'object' || item === null) return item; + + return _pick(item, fieldNames); + }); + +// alias +export { pickData as keepData }; diff --git a/src/hooks/pick/pick-result.test.ts b/src/hooks/pick/pick-result.test.ts new file mode 100755 index 00000000..5ca098e2 --- /dev/null +++ b/src/hooks/pick/pick-result.test.ts @@ -0,0 +1,77 @@ +import { assert } from 'vitest'; +import { pickResult } from './pick-result'; + +let hookAfter: any; +let hookFindPaginate: any; +let hookFind: any; + +describe('pickResult', () => { + describe('removes fields', () => { + beforeEach(() => { + hookAfter = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + }; + hookFindPaginate = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: { + total: 2, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }; + hookFind = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('updates hook after::find with pagination', () => { + pickResult('first')(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after::find with no pagination', () => { + pickResult('first')(hookFind); + assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); + }); + + it('updates hook after', () => { + pickResult('first')(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane' }); + }); + + it('updates when called internally on server', () => { + hookAfter.params.provider = ''; + pickResult('first')(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane' }); + }); + }); + + describe('ignore non-object records', () => { + beforeEach(() => { + hookAfter = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: [{ first: 'Jane', last: 'Doe' }, null, undefined, Infinity], + }; + }); + + it('after', () => { + pickResult('first')(hookAfter); + assert.deepEqual(hookAfter.result, [{ first: 'Jane' }, null, undefined, Infinity]); + }); + }); +}); diff --git a/src/hooks/pick/pick-result.ts b/src/hooks/pick/pick-result.ts new file mode 100755 index 00000000..8a3703f4 --- /dev/null +++ b/src/hooks/pick/pick-result.ts @@ -0,0 +1,17 @@ +import _pick from 'lodash/pick.js'; + +import { alterResult } from '../alter-items/alter-result'; + +/** + * Keep certain fields in the record(s), deleting the rest. + * @see https://hooks-common.feathersjs.com/hooks.html#keep + */ +export const pickResult = (...fieldNames: string[]) => + alterResult((item: any) => { + if (typeof item !== 'object' || item === null) return item; + + return _pick(item, fieldNames); + }); + +// alias +export { pickResult as keepResult }; diff --git a/test/hooks/keep.test.ts b/src/hooks/pick/pick.test.ts similarity index 88% rename from test/hooks/keep.test.ts rename to src/hooks/pick/pick.test.ts index e132873d..7939776f 100755 --- a/test/hooks/keep.test.ts +++ b/src/hooks/pick/pick.test.ts @@ -1,12 +1,12 @@ import { assert } from 'vitest'; -import { keep } from '../../src'; +import { pick } from './pick'; let hookBefore: any; let hookAfter: any; let hookFindPaginate: any; let hookFind: any; -describe('services keep', () => { +describe('pick', () => { describe('removes fields', () => { beforeEach(() => { hookBefore = { @@ -45,28 +45,28 @@ describe('services keep', () => { }); it('updates hook before::create', () => { - keep('last')(hookBefore); + pick('last')(hookBefore); assert.deepEqual(hookBefore.data, { last: 'Doe' }); }); it('updates hook after::find with pagination', () => { - keep('first')(hookFindPaginate); + pick('first')(hookFindPaginate); assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); it('updates hook after::find with no pagination', () => { - keep('first')(hookFind); + pick('first')(hookFind); assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); }); it('updates hook after', () => { - keep('first')(hookAfter); + pick('first')(hookAfter); assert.deepEqual(hookAfter.result, { first: 'Jane' }); }); it('updates when called internally on server', () => { hookAfter.params.provider = ''; - keep('first')(hookAfter); + pick('first')(hookAfter); assert.deepEqual(hookAfter.result, { first: 'Jane' }); }); @@ -77,7 +77,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, }; - keep('last', 'xx')(hook); + pick('last', 'xx')(hook); assert.deepEqual(hook.data, { last: 'Doe' }); }); @@ -88,7 +88,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: undefined, last: 'Doe' }, }; - keep('first')(hook); + pick('first')(hook); assert.deepEqual(hook.data, { first: undefined }); }); @@ -99,7 +99,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: null, last: 'Doe' }, }; - keep('first')(hook); + pick('first')(hook); assert.deepEqual(hook.data, { first: null }); }); @@ -110,7 +110,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: false, last: 'Doe' }, }; - keep('first')(hook); + pick('first')(hook); assert.deepEqual(hook.data, { first: false }); }); @@ -121,7 +121,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: 0, last: 'Doe' }, }; - keep('first')(hook); + pick('first')(hook); assert.deepEqual(hook.data, { first: 0 }); }); @@ -132,7 +132,7 @@ describe('services keep', () => { params: { provider: 'rest' }, data: { first: '', last: 'Doe' }, }; - keep('first')(hook); + pick('first')(hook); assert.deepEqual(hook.data, { first: '' }); }); }); @@ -148,14 +148,14 @@ describe('services keep', () => { }); it('prop with no dots', () => { - keep('empl')(hookBefore); + pick('empl')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, }); }); it('prop with 1 dot', () => { - keep('empl.name', 'dept')(hookBefore); + pick('empl.name', 'dept')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', @@ -163,7 +163,7 @@ describe('services keep', () => { }); it('prop with 2 dots', () => { - keep('empl.name.last', 'empl.status', 'dept')(hookBefore); + pick('empl.name.last', 'empl.status', 'dept')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', @@ -171,12 +171,12 @@ describe('services keep', () => { }); it('ignores bad or missing paths', () => { - keep('empl.name.first', 'empl.name.surname')(hookBefore); + pick('empl.name.first', 'empl.name.surname')(hookBefore); assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John' } } }); }); it('ignores bad or missing no dot path', () => { - keep('xx')(hookBefore); + pick('xx')(hookBefore); assert.deepEqual(hookBefore.data, {}); }); }); @@ -203,7 +203,7 @@ describe('services keep', () => { }); it('before', () => { - keep('empl')(hookBefore); + pick('empl')(hookBefore); assert.deepEqual(hookBefore.data, [ { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, null, @@ -213,7 +213,7 @@ describe('services keep', () => { }); it('after', () => { - keep('first')(hookAfter); + pick('first')(hookAfter); assert.deepEqual(hookAfter.result, [{ first: 'Jane' }, null, undefined, Infinity]); }); }); diff --git a/src/hooks/keep.ts b/src/hooks/pick/pick.ts similarity index 57% rename from src/hooks/keep.ts rename to src/hooks/pick/pick.ts index 48df0eef..96da648b 100755 --- a/src/hooks/keep.ts +++ b/src/hooks/pick/pick.ts @@ -1,17 +1,15 @@ -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import _has from 'lodash/has.js'; +import _pick from 'lodash/pick.js'; -import { checkContextIf } from '../utils/check-context-if'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { checkContextIf, getItems, replaceItems } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; /** * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep + * + * @deprecated Use `pickData` or `pickResult` instead. */ -export function keep(...fieldNames: string[]) { +export function pick(...fieldNames: string[]) { return (context: H) => { checkContextIf(context, 'before', ['create', 'update', 'patch'], 'keep'); const items = getItems(context); @@ -29,16 +27,10 @@ export function keep(...fieldNames: string[ }; } +export { pick as keep }; + function replaceItem(item: any, fields: any) { if (typeof item !== 'object' || item === null) return item; - const newItem = {}; - fields.forEach((field: any) => { - if (!_has(item, field)) return; - - const value = _get(item, field); - _set(newItem, field, value); - }); - item = newItem; - return item; + return _pick(item, fields); } diff --git a/test/hooks/populate-1deep-1child.test.ts b/src/hooks/populate/populate-1deep-1child.test.ts similarity index 98% rename from test/hooks/populate-1deep-1child.test.ts rename to src/hooks/populate/populate-1deep-1child.test.ts index 7436bc2a..37d9a03c 100755 --- a/test/hooks/populate-1deep-1child.test.ts +++ b/src/hooks/populate/populate-1deep-1child.test.ts @@ -1,9 +1,10 @@ import { assert } from 'vitest'; import _set from 'lodash/set.js'; -import configApp from '../helpers/config-app'; -import getInitDb from '../helpers/get-init-db'; -import { populate } from '../../src'; +import configApp from './test/config-app'; +import getInitDb from './test/get-init-db'; +import { populate } from './populate'; +import { clone } from '../../common'; let provider: any; @@ -662,7 +663,3 @@ function recommendationPosts(nameAs: any, asArray?: any, recommendation?: any, p return expected; } - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/populate-basics.test.ts b/src/hooks/populate/populate-basics.test.ts similarity index 96% rename from test/hooks/populate-basics.test.ts rename to src/hooks/populate/populate-basics.test.ts index 2245402a..4b794a84 100755 --- a/test/hooks/populate-basics.test.ts +++ b/src/hooks/populate/populate-basics.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; -import { populate } from '../../src'; +import { populate } from './populate'; +import { clone } from '../../common'; describe('services populate - finds items in hook', () => { let hookAfter: any; @@ -125,7 +126,3 @@ describe('services populate - throws on bad params', () => { ); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/populate-misc.test.ts b/src/hooks/populate/populate-misc.test.ts similarity index 96% rename from test/hooks/populate-misc.test.ts rename to src/hooks/populate/populate-misc.test.ts index de6bbf42..9006849e 100755 --- a/test/hooks/populate-misc.test.ts +++ b/src/hooks/populate/populate-misc.test.ts @@ -1,7 +1,9 @@ import { assert } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { iff, populate } from '../../src'; +import { populate } from './populate'; +import { iff } from '../'; +import { clone } from '../../common'; const userId = 6; const userInit = { @@ -136,15 +138,12 @@ function schemaFcn(_hook: any, options: any) { return schemaDefault; } -function services(this: any) { - const app = this; +function services(app: any) { app.configure(user); app.configure(team); } -function user(this: any) { - const app = this; - +function user(app: any) { app.use( '/users', new MemoryService({ @@ -168,9 +167,7 @@ function user(this: any) { }); } -function team(this: any) { - const app = this; - +function team(app: any) { app.use( '/teams', new MemoryService({ @@ -295,7 +292,3 @@ describe('services populate - schema may be a function', () => { }); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/populate-relations.test.ts b/src/hooks/populate/populate-relations.test.ts similarity index 98% rename from test/hooks/populate-relations.test.ts rename to src/hooks/populate/populate-relations.test.ts index a90e9a6e..f3ba5e1d 100755 --- a/test/hooks/populate-relations.test.ts +++ b/src/hooks/populate/populate-relations.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; -import configApp from '../helpers/config-app'; -import getInitDb from '../helpers/get-init-db'; -import { populate } from '../../src'; +import configApp from './test/config-app'; +import getInitDb from './test/get-init-db'; +import { populate } from './populate'; +import { clone } from '../../common'; ['array', 'obj'].forEach(type => { describe(`services populate - 1:1 & 1:m & m:1 - ${type}`, () => { @@ -323,7 +324,3 @@ import { populate } from '../../src'; function makeInclude(type: any, obj: any) { return type === 'obj' ? obj : [obj]; } - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/populate-scaffolding.test.ts b/src/hooks/populate/populate-scaffolding.test.ts similarity index 94% rename from test/hooks/populate-scaffolding.test.ts rename to src/hooks/populate/populate-scaffolding.test.ts index 07318e56..36ae0bc5 100755 --- a/test/hooks/populate-scaffolding.test.ts +++ b/src/hooks/populate/populate-scaffolding.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import configApp from '../helpers/config-app'; +import configApp from './test/config-app'; describe('services populate - test scaffolding', () => { it('can reinitialize database', async () => { diff --git a/src/hooks/populate.ts b/src/hooks/populate/populate.ts similarity index 99% rename from src/hooks/populate.ts rename to src/hooks/populate/populate.ts index 65f46350..cc50951c 100755 --- a/src/hooks/populate.ts +++ b/src/hooks/populate/populate.ts @@ -2,8 +2,7 @@ import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; import { BadRequest } from '@feathersjs/errors'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { getItems, replaceItems } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; export interface PopulateOptions { diff --git a/test/helpers/config-app.ts b/src/hooks/populate/test/config-app.ts similarity index 51% rename from test/helpers/config-app.ts rename to src/hooks/populate/test/config-app.ts index b820b03a..679bbae6 100755 --- a/test/helpers/config-app.ts +++ b/src/hooks/populate/test/config-app.ts @@ -13,26 +13,26 @@ export default function (dbNames: any) { return feathers().configure(services); - function services(this: any) { + function services(app: any) { dbNames.forEach((name: any) => { // console.log(`configure service ${name}`); - this.configure(serviceConfigs[name]); + app.configure(serviceConfigs[name]); }); } - function users(this: any) { - this.use('users', new MemoryService(getInitDb('users'))); + function users(app: any) { + app.use('users', new MemoryService(getInitDb('users'))); } - function comments(this: any) { - this.use('comments', new MemoryService(getInitDb('comments'))); + function comments(app: any) { + app.use('comments', new MemoryService(getInitDb('comments'))); } - function posts(this: any) { - this.use('posts', new MemoryService(getInitDb('posts'))); + function posts(app: any) { + app.use('posts', new MemoryService(getInitDb('posts'))); } - function recommendation(this: any) { - this.use('recommendation', new MemoryService(getInitDb('recommendation'))); + function recommendation(app: any) { + app.use('recommendation', new MemoryService(getInitDb('recommendation'))); } } diff --git a/test/helpers/get-init-db.ts b/src/hooks/populate/test/get-init-db.ts similarity index 100% rename from test/helpers/get-init-db.ts rename to src/hooks/populate/test/get-init-db.ts diff --git a/src/hooks/prevent-changes.ts b/src/hooks/prevent-changes.ts deleted file mode 100755 index d921a54c..00000000 --- a/src/hooks/prevent-changes.ts +++ /dev/null @@ -1,41 +0,0 @@ -import _has from 'lodash/has.js'; -import _omit from 'lodash/omit.js'; - -import { checkContext } from '../utils/check-context'; -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; - -/** - * Prevent patch service calls from changing certain fields. - * @see https://hooks-common.feathersjs.com/hooks.html#preventchanges - */ -export function preventChanges( - ifThrow: boolean, - ...fieldNames: string[] -) { - if (typeof ifThrow === 'string') { - // eslint-disable-next-line no-console - console.warn('**Deprecated** Use the preventChanges(true, ...fieldNames) syntax instead.'); - fieldNames = [ifThrow, ...fieldNames]; - } - - return (context: H) => { - checkContext(context, 'before', ['patch'], 'preventChanges'); - let data = { ...context.data }; - - fieldNames.forEach(name => { - if (_has(data, name)) { - if (ifThrow) { - throw new BadRequest(`Field ${name} may not be patched. (preventChanges)`); - } - // Delete data.contactPerson.name - // @ts-ignore - data = _omit(data, name); - } - }); - - context.data = data; - - return context; - }; -} diff --git a/test/hooks/prevent-changes.test.ts b/src/hooks/prevent-changes/prevent-changes.test.ts similarity index 58% rename from test/hooks/prevent-changes.test.ts rename to src/hooks/prevent-changes/prevent-changes.test.ts index 2b67ebd6..bd7a2256 100755 --- a/test/hooks/prevent-changes.test.ts +++ b/src/hooks/prevent-changes/prevent-changes.test.ts @@ -1,72 +1,10 @@ import { assert } from 'vitest'; -import { preventChanges } from '../../src'; +import { preventChanges } from './prevent-changes'; +import { clone } from '../../common'; let hookBefore: any; -describe('services preventChanges', () => { - describe('allowed for before patch', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'patch', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - }); - - it('does not throw on before patch', () => { - preventChanges(true)(hookBefore); - }); - - ['before', 'after'].forEach(type => { - ['find', 'get', 'create', 'update', 'patch', 'remove'].forEach(method => { - if (type !== 'before' || method !== 'patch') { - it(`throws on ${type} ${method}`, () => { - hookBefore.type = type; - hookBefore.method = method; - assert.throws(() => preventChanges(true)(hookBefore)); - }); - } - }); - }); - }); - - describe('checks props', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'patch', - params: { provider: 'rest' }, - data: { - first: 'John', - last: 'Doe', - 'name.first': 'John', - a: { b: undefined, c: { d: { e: 1 } } }, - }, - }; - }); - - it('does not throw if props not found', () => { - preventChanges(true, 'address')(hookBefore); - preventChanges(true, 'x.y.z')(hookBefore); - }); - - it('throw if props found', () => { - // @ts-expect-error - assert.throw(() => preventChanges('name', 'first')(hookBefore)); - // @ts-expect-error - assert.throw(() => preventChanges('name', 'a')(hookBefore)); - // @ts-expect-error - assert.throw(() => preventChanges('name', 'a.b')(hookBefore)); - // @ts-expect-error - assert.throw(() => preventChanges('name', 'a.c')(hookBefore)); - // @ts-expect-error - assert.throw(() => preventChanges('name', 'a.c.d.e')(hookBefore)); - // @ts-expect-error - assert.throw(() => preventChanges('name.first')(hookBefore)); - }); - }); - +describe('preventChanges', () => { describe('throws if first param is "true"', () => { beforeEach(() => { hookBefore = { @@ -141,7 +79,3 @@ describe('services preventChanges', () => { }); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/prevent-changes/prevent-changes.ts b/src/hooks/prevent-changes/prevent-changes.ts new file mode 100755 index 00000000..b4741f56 --- /dev/null +++ b/src/hooks/prevent-changes/prevent-changes.ts @@ -0,0 +1,25 @@ +import _has from 'lodash/has.js'; +import _omit from 'lodash/omit.js'; +import { BadRequest } from '@feathersjs/errors'; +import { alterData } from '../alter-items/alter-data'; + +/** + * Prevent patch service calls from changing certain fields. + * @see https://hooks-common.feathersjs.com/hooks.html#preventchanges + */ +export const preventChanges = (ifThrow: boolean, ...fieldNames: string[]) => + alterData(item => { + for (let i = 0; i < fieldNames.length; i++) { + const name = fieldNames[i]; + + if (_has(item, name)) { + if (ifThrow) { + throw new BadRequest(`Field ${name} may not be patched. (preventChanges)`); + } + + item = _omit(item, name); + } + } + + return item; + }); diff --git a/test/hooks/required.test.ts b/src/hooks/required/required.test.ts similarity index 95% rename from test/hooks/required.test.ts rename to src/hooks/required/required.test.ts index 30f7a7c3..cb4c3338 100755 --- a/test/hooks/required.test.ts +++ b/src/hooks/required/required.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { required } from '../../src'; +import { required } from './required'; let hookBefore: any; diff --git a/src/hooks/required.ts b/src/hooks/required/required.ts similarity index 57% rename from src/hooks/required.ts rename to src/hooks/required/required.ts index 24db02c4..d5b41ba9 100755 --- a/src/hooks/required.ts +++ b/src/hooks/required/required.ts @@ -2,8 +2,7 @@ import _get from 'lodash/get.js'; import { BadRequest } from '@feathersjs/errors'; import _has from 'lodash/has.js'; -import { checkContext } from '../utils/check-context'; -import { getItems } from '../utils/get-items'; +import { checkContext, getDataIsArray } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; /** @@ -13,15 +12,25 @@ import type { HookContext } from '@feathersjs/feathers'; export function required(...fieldNames: string[]) { return (context: H) => { checkContext(context, 'before', ['create', 'update', 'patch'], 'required'); - const items = getItems(context); - (Array.isArray(items) ? items : [items]).forEach(item => { - fieldNames.forEach(name => { - if (!_has(item, name)) throw new BadRequest(`Field ${name} does not exist. (required)`); + const { data } = getDataIsArray(context); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + + for (let j = 0; j < fieldNames.length; j++) { + const name = fieldNames[j]; + + if (!_has(item, name)) { + throw new BadRequest(`Field ${name} does not exist. (required)`); + } + const value = _get(item, name); - if (!value && value !== 0 && value !== false) + + if (!value && value !== 0 && value !== false) { throw new BadRequest(`Field ${name} is null. (required)`); - }); - }); + } + } + } }; } diff --git a/test/hooks/run-parallel.test.ts b/src/hooks/run-parallel/run-parallel.test.ts similarity index 97% rename from test/hooks/run-parallel.test.ts rename to src/hooks/run-parallel/run-parallel.test.ts index 719a3fd1..5692855f 100755 --- a/test/hooks/run-parallel.test.ts +++ b/src/hooks/run-parallel/run-parallel.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { runParallel } from '../../src'; +import { runParallel } from './run-parallel'; let contextBefore: any; let that: any; diff --git a/src/hooks/run-parallel.ts b/src/hooks/run-parallel/run-parallel.ts similarity index 93% rename from src/hooks/run-parallel.ts rename to src/hooks/run-parallel/run-parallel.ts index fc837b8a..b31ec4e9 100755 --- a/src/hooks/run-parallel.ts +++ b/src/hooks/run-parallel/run-parallel.ts @@ -1,6 +1,6 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../types'; +import type { HookFunction } from '../../types'; /** * Run a hook in parallel to the other hooks and the service call. diff --git a/test/hooks/sequelize-convert.test.ts b/src/hooks/sequelize-convert/sequelize-convert.test.ts similarity index 99% rename from test/hooks/sequelize-convert.test.ts rename to src/hooks/sequelize-convert/sequelize-convert.test.ts index 4a0935e3..680777c0 100755 --- a/test/hooks/sequelize-convert.test.ts +++ b/src/hooks/sequelize-convert/sequelize-convert.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { sequelizeConvert } from '../../src'; +import { sequelizeConvert } from './sequelize-convert'; const converts: any = { isInvitation: 'boolean', diff --git a/src/hooks/sequelize-convert.ts b/src/hooks/sequelize-convert/sequelize-convert.ts similarity index 95% rename from src/hooks/sequelize-convert.ts rename to src/hooks/sequelize-convert/sequelize-convert.ts index 558eeb4c..336c2ba6 100755 --- a/src/hooks/sequelize-convert.ts +++ b/src/hooks/sequelize-convert/sequelize-convert.ts @@ -1,6 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { getItems, replaceItems } from '../../utils'; export interface SequelizeConversion { js: (sqlValue: any) => any; diff --git a/test/hooks/serialize.test.ts b/src/hooks/serialize/serialize.test.ts similarity index 97% rename from test/hooks/serialize.test.ts rename to src/hooks/serialize/serialize.test.ts index f095d3b0..d1a97ff4 100755 --- a/test/hooks/serialize.test.ts +++ b/src/hooks/serialize/serialize.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; -import { serialize } from '../../src'; +import { serialize } from './serialize'; +import { clone } from '../../common'; describe('services serialize', () => { let hookAfter: any; @@ -207,9 +208,3 @@ describe('services serialize', () => { assert.equal(typeof schema1, 'function'); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/serialize.ts b/src/hooks/serialize/serialize.ts similarity index 94% rename from src/hooks/serialize.ts rename to src/hooks/serialize/serialize.ts index e9ef09ab..66a2ceb2 100755 --- a/src/hooks/serialize.ts +++ b/src/hooks/serialize/serialize.ts @@ -2,9 +2,8 @@ import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; import _omit from 'lodash/omit.js'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; -import type { SyncContextFunction } from '../types'; +import { getItems, replaceItems } from '../../utils'; +import type { SyncContextFunction } from '../../types'; import type { HookContext } from '@feathersjs/feathers'; export interface SerializeSchema { diff --git a/test/hooks/set-field.test.ts b/src/hooks/set-field/set-field.test.ts similarity index 98% rename from test/hooks/set-field.test.ts rename to src/hooks/set-field/set-field.test.ts index 9c3c6b37..6e6fecb9 100644 --- a/test/hooks/set-field.test.ts +++ b/src/hooks/set-field/set-field.test.ts @@ -1,7 +1,7 @@ import { assert, expect } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { setField } from '../../src'; +import { setField } from './set-field'; import type { Application } from '@feathersjs/feathers'; @@ -87,7 +87,7 @@ describe('setField', () => { id: 1, text: 'Message 1', userId: 1, - }); + } as any); }); it('does nothing on internal calls if value does not exists', async () => { diff --git a/src/hooks/set-field.ts b/src/hooks/set-field/set-field.ts similarity index 96% rename from src/hooks/set-field.ts rename to src/hooks/set-field/set-field.ts index 80d59081..1dc17fcc 100644 --- a/src/hooks/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -2,7 +2,7 @@ import _get from 'lodash/get.js'; import _setWith from 'lodash/setWith.js'; import _clone from 'lodash/clone.js'; import _debug from 'debug'; -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; import { Forbidden } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; diff --git a/src/hooks/set-now/set-now-data.test.ts b/src/hooks/set-now/set-now-data.test.ts new file mode 100755 index 00000000..058d83d4 --- /dev/null +++ b/src/hooks/set-now/set-now-data.test.ts @@ -0,0 +1,136 @@ +import { assert } from 'vitest'; +import { setNowData } from './set-now-data'; +import { clone } from '../../common'; + +let hookBefore: any; +let hookBefore2: any; + +describe('setNowData', () => { + describe('updated fields', () => { + beforeEach(() => { + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; + }); + + it('updates hook before::create', () => { + setNowData('createdAt')(hookBefore); + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt'); + }); + + it('supports field name', () => { + setNowData('createdAt2')(hookBefore); + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt2'); + }); + + it('supports multiple field names', () => { + setNowData('createdAt1', 'createdAt2')(hookBefore); + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, ['createdAt1', 'createdAt2']); + }); + }); + + describe('handles dot notation', () => { + beforeEach(() => { + hookBefore = { + type: 'before', + method: 'create', + data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + }; + hookBefore2 = { + type: 'before', + method: 'create', + data: { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + created: { where: 'NYC' }, + }, + }; + }); + + it('prop with no dots', () => { + setNowData('madeAt')(hookBefore); + checkHook( + hookBefore.data, + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + 'madeAt', + ); + }); + + it('props with no dots', () => { + setNowData('madeAt', 'builtAt')(hookBefore); + checkHook( + hookBefore.data, + { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, + ['madeAt', 'builtAt'], + ); + }); + + it('prop with 1 dot', () => { + setNowData('created.at')(hookBefore); + assert.instanceOf(hookBefore.data.created.at, Date, 'not instance of Date'); + assert.equal(Object.keys(hookBefore.data.created).length, 1); + delete hookBefore.data.created; + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + + it('prop with 1 dot in existing obj', () => { + setNowData('created.at')(hookBefore2); + assert.instanceOf(hookBefore2.data.created.at, Date, 'not instance of Date'); + assert.equal(Object.keys(hookBefore2.data.created).length, 2); + delete hookBefore2.data.created.at; + assert.deepEqual(hookBefore2.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + created: { where: 'NYC' }, + }); + }); + + it('prop with 2 dots', () => { + setNowData('created.at.time')(hookBefore); + assert.instanceOf(hookBefore.data.created.at.time, Date, 'not instance of Date'); + assert.equal(Object.keys(hookBefore.data.created.at).length, 1); + assert.equal(Object.keys(hookBefore.data.created).length, 1); + delete hookBefore.data.created; + assert.deepEqual(hookBefore.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: 'Acct', + }); + }); + }); + + describe('time advances', () => { + beforeEach(() => { + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; + }); + + it('for 2 hooks', () => + new Promise(resolve => { + setNowData('createdAt')(hookBefore); + const firstTime = hookBefore.data.createdAt; + + setTimeout(() => { + setNowData('createdAt')(hookBefore); + assert.isAbove(hookBefore.data.createdAt.getTime(), firstTime.getTime()); + resolve(); + }, 50); + })); + }); +}); + +// Helpers + +function checkHook(item: any, template: any, dateFields: any) { + const item1 = clone(item); + if (typeof dateFields === 'string') { + dateFields = [dateFields]; + } + + dateFields.forEach((dateField: any) => { + assert.instanceOf(item[dateField], Date, 'not instance of Date'); + item1[dateField] = undefined; + delete item1[dateField]; + }); + + assert.deepEqual(item1, template, 'objects differ'); +} diff --git a/src/hooks/set-now/set-now-data.ts b/src/hooks/set-now/set-now-data.ts new file mode 100755 index 00000000..2a3db3db --- /dev/null +++ b/src/hooks/set-now/set-now-data.ts @@ -0,0 +1,16 @@ +import { alterData } from '../alter-items/alter-data'; +import _set from 'lodash/set.js'; + +/** + * Create/update certain fields to the current date-time. + * + * @see https://hooks-common.feathersjs.com/hooks.html#setnow + */ +export const setNowData = (...fieldNames: string[]) => + alterData(data => { + for (let i = 0; i < fieldNames.length; i++) { + const key = fieldNames[i]; + + _set(data, key, new Date()); + } + }); diff --git a/src/hooks/set-now/set-now-result.test.ts b/src/hooks/set-now/set-now-result.test.ts new file mode 100755 index 00000000..7f5938ea --- /dev/null +++ b/src/hooks/set-now/set-now-result.test.ts @@ -0,0 +1,69 @@ +import { assert } from 'vitest'; +import { setNowResult } from './set-now-result'; +import { clone } from '../../common'; + +let hookAfter: any; +let hookFindPaginate: any; +let hookFind: any; + +describe('setNowResult', () => { + describe('updated fields', () => { + beforeEach(() => { + hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; + hookFindPaginate = { + type: 'after', + method: 'find', + result: { + total: 2, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }, + }; + hookFind = { + type: 'after', + method: 'find', + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + }; + }); + + it('updates hook after::find with pagination', () => { + setNowResult('createdAt')(hookFindPaginate); + + checkHook(hookFindPaginate.result.data[0], { first: 'John', last: 'Doe' }, 'createdAt'); + checkHook(hookFindPaginate.result.data[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); + }); + + it('updates hook after::find with no pagination', () => { + setNowResult('createdAt')(hookFind); + checkHook(hookFind.result[0], { first: 'John', last: 'Doe' }, 'createdAt'); + checkHook(hookFind.result[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); + }); + + it('updates hook after', () => { + setNowResult('createdAt')(hookAfter); + checkHook(hookAfter.result, { first: 'Jane', last: 'Doe' }, 'createdAt'); + }); + }); +}); + +// Helpers + +function checkHook(item: any, template: any, dateFields: any) { + const item1 = clone(item); + if (typeof dateFields === 'string') { + dateFields = [dateFields]; + } + + dateFields.forEach((dateField: any) => { + assert.instanceOf(item[dateField], Date, 'not instance of Date'); + item1[dateField] = undefined; + delete item1[dateField]; + }); + + assert.deepEqual(item1, template, 'objects differ'); +} diff --git a/src/hooks/set-now/set-now-result.ts b/src/hooks/set-now/set-now-result.ts new file mode 100755 index 00000000..1dd24d85 --- /dev/null +++ b/src/hooks/set-now/set-now-result.ts @@ -0,0 +1,16 @@ +import _set from 'lodash/set.js'; +import { alterResult } from '../alter-items/alter-result'; + +/** + * Create/update certain fields to the current date-time. + * + * @see https://hooks-common.feathersjs.com/hooks.html#setnow + */ +export const setNowResult = (...fieldNames: string[]) => + alterResult(data => { + for (let i = 0; i < fieldNames.length; i++) { + const key = fieldNames[i]; + + _set(data, key, new Date()); + } + }); diff --git a/test/hooks/set-now.test.ts b/src/hooks/set-now/set-now.test.ts similarity index 98% rename from test/hooks/set-now.test.ts rename to src/hooks/set-now/set-now.test.ts index 5e6dbe3b..119329a7 100755 --- a/test/hooks/set-now.test.ts +++ b/src/hooks/set-now/set-now.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; -import { setNow } from '../../src'; +import { setNow } from './set-now'; +import { clone } from '../../common'; let hookBefore: any; let hookBefore2: any; @@ -180,7 +181,3 @@ function checkHook(item: any, template: any, dateFields: any) { assert.deepEqual(item1, template, 'objects differ'); } - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/set-now.ts b/src/hooks/set-now/set-now.ts similarity index 68% rename from src/hooks/set-now.ts rename to src/hooks/set-now/set-now.ts index 90552147..d67126dd 100755 --- a/src/hooks/set-now.ts +++ b/src/hooks/set-now/set-now.ts @@ -1,12 +1,14 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import { setFields as _setFields } from '../common'; -import { getItems } from '../utils/get-items'; +import { setFields } from '../../common'; +import { getItems } from '../../utils'; /** * Create/update certain fields to the current date-time. * * @see https://hooks-common.feathersjs.com/hooks.html#setnow + * + * @deprecated Use `setNowData` or `setNowResult` instead. */ export function setNow(...fieldNames: string[]) { if (!fieldNames.length) { @@ -14,7 +16,7 @@ export function setNow(...fieldNames: strin } return (context: H) => { - _setFields(getItems(context), () => new Date(), fieldNames, 'setNow'); + setFields(getItems(context), () => new Date(), fieldNames, 'setNow'); return context; }; } diff --git a/test/hooks/set-slug.test.ts b/src/hooks/set-slug/set-slug.test.ts similarity index 97% rename from test/hooks/set-slug.test.ts rename to src/hooks/set-slug/set-slug.test.ts index 41b1457c..e9255031 100755 --- a/test/hooks/set-slug.test.ts +++ b/src/hooks/set-slug/set-slug.test.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; -import { setSlug } from '../../src'; +import { setSlug } from './set-slug'; let hook: any; diff --git a/src/hooks/set-slug.ts b/src/hooks/set-slug/set-slug.ts similarity index 79% rename from src/hooks/set-slug.ts rename to src/hooks/set-slug/set-slug.ts index d945534c..c880088b 100755 --- a/src/hooks/set-slug.ts +++ b/src/hooks/set-slug/set-slug.ts @@ -1,5 +1,4 @@ import _set from 'lodash/set.js'; -import { GeneralError } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; /** @@ -13,10 +12,6 @@ export function setSlug(slug: string, field fieldName = `query.${slug}`; } - if (context.type === 'after') { - throw new GeneralError('Cannot set slug on after hook. (setSlug)'); - } - if (context.params && context.params.provider === 'rest') { const value = context.params.route[slug]; if (typeof value === 'string' && value[0] !== ':') { diff --git a/src/hooks/sifter.ts b/src/hooks/sifter.ts deleted file mode 100755 index ba4f481d..00000000 --- a/src/hooks/sifter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import type { SyncContextFunction } from '../types'; -import { checkContext } from '../utils/check-context'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; - -export function sifter( - siftFunc: SyncContextFunction<(item: any) => boolean, H>, -) { - return (context: H) => { - checkContext(context, 'after', 'find', 'sifter'); - - if (typeof siftFunc !== 'function') { - throw new BadRequest('The sifter param must be a function. (sifter)'); - } - - const sifter = siftFunc(context); - - if (typeof sifter !== 'function') { - throw new BadRequest('The result of calling the sifter param must be a function. (sifter)'); - } - - replaceItems(context, getItems(context).filter(sifter)); - - return context; - }; -} diff --git a/test/hooks/sifter.test.ts b/src/hooks/sifter/sifter.test.ts similarity index 74% rename from test/hooks/sifter.test.ts rename to src/hooks/sifter/sifter.test.ts index d83abc2a..eb3ae7a8 100755 --- a/test/hooks/sifter.test.ts +++ b/src/hooks/sifter/sifter.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; import sift from 'sift'; -import { sifter } from '../../src'; +import { sifter } from './sifter'; +import { clone } from '../../common'; const dataCanada = [ { name: 'john', address: { city: 'montreal', country: 'canada' } }, @@ -25,23 +26,23 @@ const getCountry = (country: any) => (_hook: any) => sift({ 'address.country': c let hook: any; let hookPaginated: any; -describe('services shifter', () => { +describe('sifter', () => { beforeEach(() => { hook = clone(origHook); hookPaginated = clone(origHookPaginated); }); - it('sifts non-paginated data', () => { - const hook1: any = sifter(getCountry('canada'))(hook); + it('sifts non-paginated data', async () => { + const hook1: any = await sifter(getCountry('canada'))(hook); assert.deepEqual(hook1.result, dataCanada); }); - it('sifts paginated data', () => { - const hook1: any = sifter(getCountry('canada'))(hookPaginated); + it('sifts paginated data', async () => { + const hook1: any = await sifter(getCountry('canada'))(hookPaginated); assert.deepEqual(hook1.result.data, dataCanada); }); - it('throws if getSifter not a function', () => { + it('throws if getSifter not a function', async () => { // @ts-expect-error throws if getSifter not a function assert.throws(() => sifter({})(hookPaginated)); }); @@ -51,9 +52,3 @@ describe('services shifter', () => { assert.throws(() => sifter((hook: any) => ({}))(hookPaginated)); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/sifter/sifter.ts b/src/hooks/sifter/sifter.ts new file mode 100755 index 00000000..4ad90b26 --- /dev/null +++ b/src/hooks/sifter/sifter.ts @@ -0,0 +1,20 @@ +import { BadRequest } from '@feathersjs/errors'; +import type { HookContext } from '@feathersjs/feathers'; +import type { SyncContextFunction } from '../../types'; +import { replaceResult } from '../../utils/replace-items/replace-result'; + +export function sifter( + siftFunc: SyncContextFunction<(item: any) => boolean, H>, +) { + return (context: H) => { + const sifter = siftFunc(context); + + if (typeof sifter !== 'function') { + throw new BadRequest('The result of calling the sifter param must be a function. (sifter)'); + } + + return replaceResult(context, item => item, { + transform: items => items.filter(sifter), + }); + }; +} diff --git a/test/hooks/soft-delete.test.ts b/src/hooks/soft-delete/soft-delete.test.ts similarity index 99% rename from test/hooks/soft-delete.test.ts rename to src/hooks/soft-delete/soft-delete.test.ts index 12ad0bfa..e9d20375 100755 --- a/test/hooks/soft-delete.test.ts +++ b/src/hooks/soft-delete/soft-delete.test.ts @@ -1,7 +1,7 @@ import { assert, expect } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { softDelete } from '../../src'; +import { softDelete } from './soft-delete'; const initialUsers = [ { name: 'Jane Doe', key: 'a' }, diff --git a/src/hooks/soft-delete.ts b/src/hooks/soft-delete/soft-delete.ts similarity index 95% rename from src/hooks/soft-delete.ts rename to src/hooks/soft-delete/soft-delete.ts index 04551eef..a983429e 100755 --- a/src/hooks/soft-delete.ts +++ b/src/hooks/soft-delete/soft-delete.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; export type SoftDeleteOptionFunction = ( context?: H, @@ -28,7 +28,6 @@ export function softDelete({ }: SoftDeleteOptions = {}) { return async (context: H) => { const { service, method, params } = context; - // @ts-ignore const { disableSoftDelete, query = {} } = params; checkContext(context, 'before', null, 'softDelete'); diff --git a/test/hooks/stash-before.test.ts b/src/hooks/stash-before/stash-before.test.ts similarity index 92% rename from test/hooks/stash-before.test.ts rename to src/hooks/stash-before/stash-before.test.ts index e1c44372..6c702b75 100755 --- a/test/hooks/stash-before.test.ts +++ b/src/hooks/stash-before/stash-before.test.ts @@ -1,7 +1,8 @@ import { assert, expect } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { stashBefore } from '../../src'; +import { stashBefore } from './stash-before'; +import { clone } from '../../common'; const startId = 6; const storeInit = { @@ -17,13 +18,11 @@ let store; let finalParams: any; let innerCallParams: any; -function services(this: any) { - const app = this; +function services(app: any) { app.configure(users); } -function users(this: any) { - const app = this; +function users(app: any) { store = clone(storeInit); app.use( @@ -108,7 +107,3 @@ describe('services stash-before', () => { }); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/stash-before.ts b/src/hooks/stash-before/stash-before.ts similarity index 96% rename from src/hooks/stash-before.ts rename to src/hooks/stash-before/stash-before.ts index c535c0d6..87b3ca45 100755 --- a/src/hooks/stash-before.ts +++ b/src/hooks/stash-before/stash-before.ts @@ -1,6 +1,6 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import { checkContext } from '../utils/check-context'; +import { checkContext } from '../../utils'; /** * Stash current value of record, usually before mutating it. Performs a get call. diff --git a/test/common/traverse.test.ts b/src/hooks/traverse/traverse.test.ts similarity index 94% rename from test/common/traverse.test.ts rename to src/hooks/traverse/traverse.test.ts index 3a498c2b..1221de21 100755 --- a/test/common/traverse.test.ts +++ b/src/hooks/traverse/traverse.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; -import { traverse } from '../../src'; +import { traverse } from './traverse'; +import { clone } from '../../common'; -describe('services traverse', () => { +describe('traverse', () => { let hookBefore: any; let hookBeforeArray: any; let trimmer: any; @@ -116,9 +117,3 @@ describe('services traverse', () => { assert.deepEqual(obj, result); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/traverse.ts b/src/hooks/traverse/traverse.ts similarity index 81% rename from src/hooks/traverse.ts rename to src/hooks/traverse/traverse.ts index 7666f25c..935a92da 100755 --- a/src/hooks/traverse.ts +++ b/src/hooks/traverse/traverse.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; -import { traverse as _traverse } from '../common'; -import type { SyncContextFunction } from '../types'; -import { getItems } from '../utils/get-items'; +import { traverse as _traverse } from '../../common'; +import type { SyncContextFunction } from '../../types'; +import { getItems } from '../../utils'; /** * Transform fields & objects in place in the record(s) using a recursive walk. Powerful. diff --git a/test/hooks/unless.test.ts b/src/hooks/unless/unless.test.ts similarity index 98% rename from test/hooks/unless.test.ts rename to src/hooks/unless/unless.test.ts index cc15ec8e..6c3c8f46 100755 --- a/test/hooks/unless.test.ts +++ b/src/hooks/unless/unless.test.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; import { assert } from 'vitest'; -import { unless } from '../../src'; -import { isPromise } from '../../src/common'; +import { unless } from './unless'; +import { clone, isPromise } from '../../common'; let hook: any; let hookBefore: any; @@ -390,9 +390,3 @@ describe('services unless - runs multiple hooks', () => { }); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/unless.ts b/src/hooks/unless/unless.ts similarity index 87% rename from src/hooks/unless.ts rename to src/hooks/unless/unless.ts index 29bdf8f5..5f4e864c 100755 --- a/src/hooks/unless.ts +++ b/src/hooks/unless/unless.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import { iffElse } from '..'; -import type { PredicateFn, HookFunction } from '../types'; +import type { PredicateFn, HookFunction } from '../../types'; /** * Execute a series of hooks if a sync or async predicate is falsey. diff --git a/test/hooks/validate-schema.test.ts b/src/hooks/validate-schema/validate-schema.test.ts similarity index 99% rename from test/hooks/validate-schema.test.ts rename to src/hooks/validate-schema/validate-schema.test.ts index ebb0300d..8471a2fa 100755 --- a/test/hooks/validate-schema.test.ts +++ b/src/hooks/validate-schema/validate-schema.test.ts @@ -1,6 +1,6 @@ import { assert, expect } from 'vitest'; -import { validateSchema } from '../../src/hooks/validate-schema'; +import { validateSchema } from './validate-schema'; import Ajv from 'ajv'; diff --git a/src/hooks/validate-schema.ts b/src/hooks/validate-schema/validate-schema.ts similarity index 95% rename from src/hooks/validate-schema.ts rename to src/hooks/validate-schema/validate-schema.ts index fb89e1c7..95f2e1f4 100755 --- a/src/hooks/validate-schema.ts +++ b/src/hooks/validate-schema/validate-schema.ts @@ -1,7 +1,7 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import type { AjvOrNewable, ValidateSchemaOptions } from './validate'; -import { getItems } from '../utils/get-items'; +import type { AjvOrNewable, ValidateSchemaOptions } from '../validate/validate'; +import { getItems } from '../../utils'; /** * Validate data using JSON-Schema. diff --git a/test/hooks/validate.test.ts b/src/hooks/validate/validate.test.ts similarity index 95% rename from test/hooks/validate.test.ts rename to src/hooks/validate/validate.test.ts index 196b392a..4b5e8557 100755 --- a/test/hooks/validate.test.ts +++ b/src/hooks/validate/validate.test.ts @@ -1,6 +1,7 @@ import { assert, expect } from 'vitest'; -import { validate } from '../../src'; +import { validate } from './validate'; import { BadRequest } from '@feathersjs/errors'; +import { clone } from '../../common'; let fcnSync: any; let fcnPromise: any; @@ -89,9 +90,3 @@ describe('services validate', () => { }); }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/validate.ts b/src/hooks/validate/validate.ts similarity index 91% rename from src/hooks/validate.ts rename to src/hooks/validate/validate.ts index 72b07fd3..4a0f2aa5 100755 --- a/src/hooks/validate.ts +++ b/src/hooks/validate/validate.ts @@ -1,10 +1,8 @@ import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; import type { Ajv, ErrorObject as ajvErrorObject, Options as AjvOptions } from 'ajv'; -import { isPromise } from '../common'; -import { checkContext } from '../utils/check-context'; -import { getItems } from '../utils/get-items'; -import { replaceItems } from '../utils/replace-items'; +import { isPromise } from '../../common'; +import { checkContext, getItems, replaceItems } from '../../utils'; export type SyncValidatorFn = ( values: any, diff --git a/src/index.ts b/src/index.ts index 4319455c..6071133f 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,51 +1,4 @@ -export * from './hooks/act-on-dispatch'; -export * from './hooks/alter-items'; -export * from './hooks/cache'; -export * from './utils/check-context-if'; -export * from './hooks/debug'; -export * from './hooks/de-populate'; -export * from './hooks/disable-pagination'; -export * from './hooks/disallow'; -export * from './hooks/discard'; -export * from './hooks/discard-query'; -export * from './hooks/fast-join'; -export * from './hooks/fgraphql'; -export * from './hooks/iff'; -export * from './hooks/iff-else'; -export * from './hooks/keep'; -export * from './hooks/keep-in-array'; -export * from './hooks/keep-query'; -export * from './hooks/keep-query-in-array'; -export * from './hooks/lower-case'; -export * from './hooks/mongo-keys'; -export * from './hooks/params-from-client'; -export * from './hooks/populate'; -export * from './hooks/prevent-changes'; -export * from './hooks/required'; -export * from './utils/run-hook'; -export * from './hooks/run-parallel'; -export * from './hooks/sequelize-convert'; -export * from './hooks/serialize'; -export * from './hooks/set-field'; -export * from './hooks/set-now'; -export * from './hooks/set-slug'; -export * from './hooks/sifter'; -export * from './hooks/soft-delete'; -export * from './hooks/stash-before'; -export * from './hooks/traverse'; -export * from './hooks/unless'; -export * from './hooks/validate'; -export * from './hooks/validate-schema'; - -export * from './utils/calling-params'; -export * from './utils/check-context'; -export * from './utils/combine'; -export * from './utils/every'; -export * from './utils/get-items'; -export * from './utils/is-not'; -export * from './utils/is-provider'; -export * from './utils/params-for-server'; -export * from './utils/replace-items'; -export * from './utils/some'; +export * from './hooks'; +export * from './utils'; export * from './types'; diff --git a/src/types.ts b/src/types.ts index ff328a60..53558c46 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,19 +1,19 @@ import type { HookContext } from '@feathersjs/feathers'; export const hookTypes = ['around', 'before', 'after', 'error'] as const; -export type HookType = typeof hookTypes[number]; +export type HookType = (typeof hookTypes)[number]; export const methodNames = ['find', 'get', 'create', 'update', 'patch', 'remove'] as const; -export type MethodName = typeof methodNames[number]; +export type MethodName = (typeof methodNames)[number]; export type TransportName = 'socketio' | 'rest' | 'external' | 'server'; export type SyncContextFunction = (context: H) => T; export type AsyncContextFunction = ( - context: H + context: H, ) => Promise; export type ContextFunction = ( - context: H + context: H, ) => T | Promise; export type SyncPredicateFn = SyncContextFunction; @@ -24,5 +24,7 @@ export type AsyncPredicateFn = AsyncContext export type PredicateFn = ContextFunction; export declare type HookFunction = ( - context: H + context: H, ) => Promise | H | void; + +export type Promisable = T | Promise; diff --git a/test/utils/calling-params-1.test.ts b/src/utils/calling-params/calling-params-1.test.ts similarity index 98% rename from test/utils/calling-params-1.test.ts rename to src/utils/calling-params/calling-params-1.test.ts index cd50d5db..c70879e8 100755 --- a/test/utils/calling-params-1.test.ts +++ b/src/utils/calling-params/calling-params-1.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { callingParamsDefaults, callingParams } from '../../src'; +import { callingParamsDefaults, callingParams } from './calling-params'; let context1: any; let context2: any; diff --git a/test/utils/calling-params-2.test.ts b/src/utils/calling-params/calling-params-2.test.ts similarity index 97% rename from test/utils/calling-params-2.test.ts rename to src/utils/calling-params/calling-params-2.test.ts index 9303e094..1b0b2e8a 100755 --- a/test/utils/calling-params-2.test.ts +++ b/src/utils/calling-params/calling-params-2.test.ts @@ -1,5 +1,5 @@ import { assert } from 'vitest'; -import { makeCallingParams } from '../../src'; +import { makeCallingParams } from './calling-params'; let context: any; diff --git a/src/utils/calling-params.ts b/src/utils/calling-params/calling-params.ts similarity index 100% rename from src/utils/calling-params.ts rename to src/utils/calling-params/calling-params.ts diff --git a/src/utils/check-context-if.ts b/src/utils/check-context-if.ts index 23b3f2ef..0a0e4672 100755 --- a/src/utils/check-context-if.ts +++ b/src/utils/check-context-if.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import type { MethodName, HookType } from '../types'; -import { checkContext } from './check-context'; +import { checkContext } from './check-context/check-context'; // TODO: Add checkContextIf to docs /** diff --git a/test/utils/check-context.test.ts b/src/utils/check-context/check-context.test.ts similarity index 98% rename from test/utils/check-context.test.ts rename to src/utils/check-context/check-context.test.ts index 7eac289c..aaa50cdc 100755 --- a/test/utils/check-context.test.ts +++ b/src/utils/check-context/check-context.test.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; -import { checkContext } from '../../src'; +import { checkContext } from './check-context'; describe('util checkContext', () => { var hook: any; // eslint-disable-line no-var diff --git a/src/utils/check-context.ts b/src/utils/check-context/check-context.ts similarity index 91% rename from src/utils/check-context.ts rename to src/utils/check-context/check-context.ts index 54fc9e45..26df7c5f 100755 --- a/src/utils/check-context.ts +++ b/src/utils/check-context/check-context.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; -import { methodNames } from '../types'; -import type { HookType, MethodName } from '../types'; +import { methodNames } from '../../types'; +import type { HookType, MethodName } from '../../types'; /** * Restrict a hook to run for certain methods and method types. (Utility function.) diff --git a/test/utils/combine.test.ts b/src/utils/combine/combine.test.ts similarity index 94% rename from test/utils/combine.test.ts rename to src/utils/combine/combine.test.ts index 32000b5d..ac7d1db5 100755 --- a/test/utils/combine.test.ts +++ b/src/utils/combine/combine.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { combine } from '../../src'; +import { combine } from './combine'; +import { clone } from '../../common'; const startId = 6; const storeInit = { @@ -14,13 +15,11 @@ const storeInit = { }; let store; -function services(this: any) { - const app = this; +function services(app: any) { app.configure(user); } -function user(this: any) { - const app = this; +function user(app: any) { let service: any; let hookId: any; let hookData: any; @@ -150,7 +149,3 @@ describe('util combine', () => { .catch(() => {}); }); }); - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/utils/combine.ts b/src/utils/combine/combine.ts similarity index 89% rename from src/utils/combine.ts rename to src/utils/combine/combine.ts index e1e44eca..66ec8a08 100755 --- a/src/utils/combine.ts +++ b/src/utils/combine/combine.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../types'; +import type { HookFunction } from '../../types'; /** * Sequentially execute multiple sync or async hooks. @@ -40,7 +40,7 @@ export function combine(...serviceHooks: Ho const hook = fn.bind(this); // Use the returned hook object or the old one - // eslint-disable-next-line @typescript-eslint/await-thenable + const currentHook = await current; const currentCtx = await hook(currentHook); // @ts-ignore @@ -48,7 +48,6 @@ export function combine(...serviceHooks: Ho }, Promise.resolve(ctx)); try { - // eslint-disable-next-line @typescript-eslint/await-thenable await promise; return ctx; } catch (error: any) { diff --git a/test/utils/every.test.ts b/src/utils/every/every.test.ts similarity index 97% rename from test/utils/every.test.ts rename to src/utils/every/every.test.ts index 13b5fbcb..4bb3c75e 100755 --- a/test/utils/every.test.ts +++ b/src/utils/every/every.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { iff, every, isNot } from '../../src'; +import { iff } from '../../hooks'; +import { every, isNot } from '../'; describe('util every', () => { let app: any; diff --git a/src/utils/every.ts b/src/utils/every/every.ts similarity index 89% rename from src/utils/every.ts rename to src/utils/every/every.ts index ad9d6055..3768c312 100755 --- a/src/utils/every.ts +++ b/src/utils/every/every.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import type { AsyncPredicateFn, PredicateFn } from '../types'; +import type { AsyncPredicateFn, PredicateFn } from '../../types'; /** * Return the and of a series of sync or async predicate functions. diff --git a/src/utils/get-data-is-array/get-data-is-array.test.ts b/src/utils/get-data-is-array/get-data-is-array.test.ts new file mode 100644 index 00000000..b91a42b6 --- /dev/null +++ b/src/utils/get-data-is-array/get-data-is-array.test.ts @@ -0,0 +1,31 @@ +import { getDataIsArray } from './get-data-is-array'; + +describe('getDataIsArray', () => { + it('falsy data', () => { + expect(getDataIsArray({ data: null } as any)).toEqual({ + isArray: false, + data: [], + }); + + expect(getDataIsArray({ data: undefined } as any)).toEqual({ + isArray: false, + data: [], + }); + }); + + it('array data', () => { + const data = [1, 2, 3]; + expect(getDataIsArray({ data } as any)).toEqual({ + isArray: true, + data, + }); + }); + + it('non-array data', () => { + const data = { a: 1, b: 2 }; + expect(getDataIsArray({ data } as any)).toEqual({ + isArray: false, + data: [data], + }); + }); +}); diff --git a/src/utils/get-data-is-array/get-data-is-array.ts b/src/utils/get-data-is-array/get-data-is-array.ts new file mode 100644 index 00000000..c7cf9221 --- /dev/null +++ b/src/utils/get-data-is-array/get-data-is-array.ts @@ -0,0 +1,19 @@ +import { HookContext } from '@feathersjs/feathers'; + +export function getDataIsArray( + context: H, +): { data: any[]; isArray: boolean } { + if (!context.data) { + return { + isArray: false, + data: [], + }; + } + + const isArray = Array.isArray(context.data); + + return { + isArray, + data: isArray ? context.data : [context.data], + }; +} diff --git a/src/utils/get-items/get-items.test.ts b/src/utils/get-items/get-items.test.ts new file mode 100644 index 00000000..f5308746 --- /dev/null +++ b/src/utils/get-items/get-items.test.ts @@ -0,0 +1,117 @@ +import { assert } from 'vitest'; +import { getItems } from './get-items'; + +describe('getItems', () => { + it('updates hook before::create item', () => { + assert.deepEqual( + getItems({ + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: { first: 'John', last: 'Doe' }, + } as any), + { first: 'John', last: 'Doe' }, + ); + }); + + it('updates hook before::create items', () => { + assert.deepEqual( + getItems({ + type: 'before', + method: 'create', + params: { provider: 'rest' }, + data: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + } as any), + [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + ); + }); + + it('updates hook after::create item', () => { + assert.deepEqual( + getItems({ + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane2', last: 'Doe2' }, + } as any), + { first: 'Jane2', last: 'Doe2' }, + ); + }); + + it('updates hook after::create items', () => { + assert.deepEqual( + getItems({ + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: [ + { first: 'John2', last: 'Doe2' }, + { first: 'Jane', last: 'Doe' }, + ], + } as any), + [ + { first: 'John2', last: 'Doe2' }, + { first: 'Jane', last: 'Doe' }, + ], + ); + }); + + it('updates hook after::find item', () => { + assert.deepEqual( + getItems({ + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: { + total: 2, + data: [ + { first: 'John3', last: 'Doe3' }, + { first: 'Jane3', last: 'Doe3' }, + ], + }, + } as any), + [ + { first: 'John3', last: 'Doe3' }, + { first: 'Jane3', last: 'Doe3' }, + ], + ); + }); + + it('updates hook after::find item paginated', () => { + assert.deepEqual( + getItems({ + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + } as any), + [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + ); + }); + + it('does not throw on before without data', () => { + assert.equal( + getItems({ type: 'before', method: 'create', params: { provider: 'rest' } } as any), + undefined, + ); + }); + + it('does not throw on after without data', () => { + assert.equal( + getItems({ type: 'after', method: 'find', params: { provider: 'rest' } } as any), + undefined, + ); + }); +}); diff --git a/src/utils/get-items.ts b/src/utils/get-items/get-items.ts similarity index 89% rename from src/utils/get-items.ts rename to src/utils/get-items/get-items.ts index de69848b..72750af4 100755 --- a/src/utils/get-items.ts +++ b/src/utils/get-items/get-items.ts @@ -4,6 +4,8 @@ import type { HookContext } from '@feathersjs/feathers'; * Get the records in context.data or context.result[.data]. (Utility function.) * * @see https://hooks-common.feathersjs.com/utilities.html#getitems + * + * @deprecated Use `getDataIsArray` or `getResultIsArray` instead. */ export function getItems(context: H): any { // @ts-ignore diff --git a/src/utils/get-result-is-array/get-result-is-array.test.ts b/src/utils/get-result-is-array/get-result-is-array.test.ts new file mode 100644 index 00000000..41f890c0 --- /dev/null +++ b/src/utils/get-result-is-array/get-result-is-array.test.ts @@ -0,0 +1,59 @@ +import { getResultIsArray } from './get-result-is-array'; + +describe('getResultIsArray', () => { + it('falsy result', () => { + expect(getResultIsArray({ result: null } as any)).toEqual({ + isArray: false, + result: [], + key: 'result', + }); + + expect(getResultIsArray({} as any)).toEqual({ + isArray: false, + result: [], + key: 'result', + }); + }); + + it('array result', () => { + const result = [1, 2, 3]; + expect(getResultIsArray({ result } as any)).toEqual({ + isArray: true, + result, + key: 'result', + }); + + expect(getResultIsArray({ method: 'find', result } as any)).toEqual({ + isArray: true, + result, + key: 'result', + }); + + expect(getResultIsArray({ method: 'find', result: { data: result } } as any)).toEqual({ + isArray: true, + result, + key: 'result', + }); + }); + + it('non-array result', () => { + const result = { a: 1, b: 2 }; + expect(getResultIsArray({ result } as any)).toEqual({ + isArray: false, + result: [result], + key: 'result', + }); + + expect(getResultIsArray({ method: 'find', result } as any)).toEqual({ + isArray: false, + result: [result], + key: 'result', + }); + + expect(getResultIsArray({ method: 'find', result: { data: result } } as any)).toEqual({ + isArray: false, + result: [result], + key: 'result', + }); + }); +}); diff --git a/src/utils/get-result-is-array/get-result-is-array.ts b/src/utils/get-result-is-array/get-result-is-array.ts new file mode 100644 index 00000000..dc44570e --- /dev/null +++ b/src/utils/get-result-is-array/get-result-is-array.ts @@ -0,0 +1,26 @@ +import { HookContext } from '@feathersjs/feathers'; + +export function getResultIsArray( + context: H, + dispatch?: boolean, +): { isArray: boolean; result: any[]; key: 'dispatch' | 'result' } { + const result = dispatch ? context.dispatch : context.result; + + if (!result) { + return { + isArray: false, + result: [], + key: dispatch ? 'dispatch' : 'result', + }; + } + + const items = context.method === 'find' ? result.data || result : result; + + const isArray = Array.isArray(items); + + return { + isArray, + result: isArray ? items : items ? [items] : [], + key: dispatch ? 'dispatch' : 'result', + }; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 00000000..8e5c39d8 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,20 @@ +export * from './calling-params/calling-params'; +export * from './check-context/check-context'; +export * from './check-context-if'; +export * from './combine/combine'; +export * from './every/every'; + +export * from './get-items/get-items'; +export * from './get-data-is-array/get-data-is-array'; +export * from './get-result-is-array/get-result-is-array'; + +export * from './is-not/is-not'; +export * from './is-provider/is-provider'; +export * from './params-for-server/params-for-server'; + +export * from './replace-items/replace-items'; +export * from './replace-items/replace-data'; +export * from './replace-items/replace-result'; + +export * from './some/some'; +export * from './run-hook/run-hook'; diff --git a/test/utils/is-not.test.ts b/src/utils/is-not/is-not.test.ts similarity index 94% rename from test/utils/is-not.test.ts rename to src/utils/is-not/is-not.test.ts index 6ed3d4e1..2194afe5 100755 --- a/test/utils/is-not.test.ts +++ b/src/utils/is-not/is-not.test.ts @@ -1,6 +1,7 @@ import { assert } from 'vitest'; -import { iff, isNot, isProvider } from '../../src'; -import { isPromise } from '../../src/common'; +import { iff } from '../../hooks'; +import { clone, isPromise } from '../../common'; +import { isProvider, isNot } from '../../utils'; let hookServer: any; let hook: any; @@ -129,9 +130,3 @@ describe('services isNot - works with iff and isProvider', () => { } }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/utils/is-not.ts b/src/utils/is-not/is-not.ts similarity index 88% rename from src/utils/is-not.ts rename to src/utils/is-not/is-not.ts index fa6b359d..7556adc5 100755 --- a/src/utils/is-not.ts +++ b/src/utils/is-not/is-not.ts @@ -1,7 +1,7 @@ import { MethodNotAllowed } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../common'; -import type { PredicateFn } from '../types'; +import { isPromise } from '../../common'; +import type { PredicateFn } from '../../types'; /** * Negate a sync or async predicate function. diff --git a/test/hooks/is-provider.test.ts b/src/utils/is-provider/is-provider.test.ts similarity index 94% rename from test/hooks/is-provider.test.ts rename to src/utils/is-provider/is-provider.test.ts index 0e7106b4..c0a5635c 100755 --- a/test/hooks/is-provider.test.ts +++ b/src/utils/is-provider/is-provider.test.ts @@ -1,6 +1,7 @@ import { assert } from 'vitest'; -import { iff, isProvider } from '../../src'; -import { isPromise } from '../../src/common'; +import { isProvider } from './is-provider'; +import { iff } from '../../hooks'; +import { clone, isPromise } from '../../common'; let hookServer: any; let hookSocketio: any; @@ -133,9 +134,3 @@ describe('services isProvider - works with iff', () => { } }); }); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/utils/is-provider.ts b/src/utils/is-provider/is-provider.ts similarity index 93% rename from src/utils/is-provider.ts rename to src/utils/is-provider/is-provider.ts index fe695042..03f29ced 100755 --- a/src/utils/is-provider.ts +++ b/src/utils/is-provider/is-provider.ts @@ -1,6 +1,6 @@ import { MethodNotAllowed } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; -import type { TransportName } from '../types'; +import type { TransportName } from '../../types'; /** * Check which transport provided the service call. diff --git a/test/utils/params-for-server.test.ts b/src/utils/params-for-server/params-for-server.test.ts similarity index 95% rename from test/utils/params-for-server.test.ts rename to src/utils/params-for-server/params-for-server.test.ts index bec8f3b4..a7d82359 100755 --- a/test/utils/params-for-server.test.ts +++ b/src/utils/params-for-server/params-for-server.test.ts @@ -1,6 +1,6 @@ import { assert } from 'vitest'; -import { paramsForServer } from '../../src'; +import { paramsForServer } from './params-for-server'; describe('util paramsToServer', () => { it('handles empty params', () => { diff --git a/src/utils/params-for-server.ts b/src/utils/params-for-server/params-for-server.ts similarity index 100% rename from src/utils/params-for-server.ts rename to src/utils/params-for-server/params-for-server.ts diff --git a/src/utils/replace-items/replace-data.ts b/src/utils/replace-items/replace-data.ts new file mode 100644 index 00000000..a6155de4 --- /dev/null +++ b/src/utils/replace-items/replace-data.ts @@ -0,0 +1,43 @@ +import { HookContext } from '@feathersjs/feathers'; +import { getDataIsArray } from '../get-data-is-array/get-data-is-array'; +import { isPromise } from '../../common'; +import { Promisable } from '../../types'; + +export function replaceData( + context: H, + cb: (item: any) => any, +): Promisable { + if (!context.data) { + return context; + } + + const { data, isArray } = getDataIsArray(context); + + if (!data.length) { + return context; + } + + let hasPromises = false; + + const results = data.map(item => { + const result = cb(item); + + if (!hasPromises && isPromise(result)) { + hasPromises = true; + } + + return result; + }); + + function replace(data: any) { + context.data = isArray ? data : data[0]; + + return context; + } + + if (hasPromises) { + return Promise.all(results).then(replace); + } else { + return replace(results); + } +} diff --git a/src/utils/replace-items/replace-items.test.ts b/src/utils/replace-items/replace-items.test.ts new file mode 100644 index 00000000..271850ef --- /dev/null +++ b/src/utils/replace-items/replace-items.test.ts @@ -0,0 +1,132 @@ +import { assert } from 'vitest'; +import { replaceItems } from './replace-items'; +import { actOnDispatch } from '../../hooks'; + +// Tests when context.params._actOn === 'dispatch' are in act-on.test.ts +describe('replaceItems', () => { + let hookBefore: any; + let hookAfter: any; + let hookFindPaginate: any; + let hookFind: any; + + beforeEach(() => { + hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; + hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; + hookFindPaginate = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + result: { + total: 200, + data: [], + }, + }; + hookFind = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + }; + }); + + it('updates hook before::create item', () => { + replaceItems(hookBefore, { a: 1 }); + assert.deepEqual(hookBefore.data, { a: 1 }); + }); + + it('updates hook before::create items', () => { + replaceItems(hookBefore, [{ a: 1 }, { b: 2 }]); + assert.deepEqual(hookBefore.data, [{ a: 1 }, { b: 2 }]); + }); + + it('updates hook after::create item', () => { + replaceItems(hookAfter, { a: 1 }); + assert.deepEqual(hookAfter.result, { a: 1 }); + }); + + it('updates hook after::create items', () => { + replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]); + assert.deepEqual(hookAfter.result, [{ a: 1 }, { b: 2 }]); + }); + + it('updates hook after::find item', () => { + replaceItems(hookFind, { a: 1 }); + assert.deepEqual(hookFind.result, { a: 1 }); + }); + + it('updates hook after::find items', () => { + replaceItems(hookFind, [{ a: 1 }, { b: 2 }]); + assert.deepEqual(hookFind.result, [{ a: 1 }, { b: 2 }]); + }); + + it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', () => { + replaceItems(hookFindPaginate, { a: 1 }); + assert.equal(hookFindPaginate.result.total, 200); + assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }]); + }); + + it('updates hook after::find items paginated', () => { + replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]); + assert.equal(hookFindPaginate.result.total, 200); + assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }, { b: 2 }]); + }); +}); + +describe('replaceItems actOnDispatch', () => { + let hookBefore: any; + let hookAfter: any; + let hookFindPaginate: any; + let hookFind: any; + + beforeEach(() => { + hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; + hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; + hookFindPaginate = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + dispatch: { + total: 200, + data: [], + }, + }; + hookFind = { + type: 'after', + method: 'find', + params: { provider: 'rest' }, + }; + }); + + it('updates hook after::create item', async () => { + await actOnDispatch(() => replaceItems(hookAfter, { a: 1 }))(hookAfter); + assert.deepEqual(hookAfter.dispatch, { a: 1 }); + }); + + it('updates hook after::create items', async () => { + await actOnDispatch(() => replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]))(hookAfter); + assert.deepEqual(hookAfter.dispatch, [{ a: 1 }, { b: 2 }]); + }); + + it('updates hook after::find item', async () => { + await actOnDispatch(() => replaceItems(hookFind, { a: 1 }))(hookFind); + assert.deepEqual(hookFind.dispatch, { a: 1 }); + }); + + it('updates hook after::find items', async () => { + await actOnDispatch(() => replaceItems(hookFind, [{ a: 1 }, { b: 2 }]))(hookFind); + assert.deepEqual(hookFind.dispatch, [{ a: 1 }, { b: 2 }]); + }); + + it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', async () => { + await actOnDispatch(() => replaceItems(hookFindPaginate, { a: 1 }))(hookFindPaginate); + assert.equal(hookFindPaginate.dispatch.total, 200); + assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }]); + }); + + it('updates hook after::find items paginated', async () => { + await actOnDispatch(() => replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]))( + hookFindPaginate, + ); + assert.equal(hookFindPaginate.dispatch.total, 200); + assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }, { b: 2 }]); + }); +}); diff --git a/src/utils/replace-items.ts b/src/utils/replace-items/replace-items.ts similarity index 93% rename from src/utils/replace-items.ts rename to src/utils/replace-items/replace-items.ts index de0e8e1e..660e4263 100755 --- a/src/utils/replace-items.ts +++ b/src/utils/replace-items/replace-items.ts @@ -3,6 +3,8 @@ import type { HookContext } from '@feathersjs/feathers'; /** * Replace the records in context.data or context.result[.data]. (Utility function.) * @see https://hooks-common.feathersjs.com/utilities.html#replaceitems + * + * @deprecated Use `replaceData` or `replaceResult` instead. */ export function replaceItems(context: H, items: any): void { // @ts-ignore diff --git a/src/utils/replace-items/replace-result.ts b/src/utils/replace-items/replace-result.ts new file mode 100644 index 00000000..43a8fa2c --- /dev/null +++ b/src/utils/replace-items/replace-result.ts @@ -0,0 +1,60 @@ +import { HookContext, NextFunction } from '@feathersjs/feathers'; +import { getResultIsArray } from '../get-result-is-array/get-result-is-array'; +import { isPromise } from '../../common'; + +export async function replaceResult( + context: H, + cb: (item: any) => any, + options?: { + next?: NextFunction; + transform?: (items: any[]) => any[]; + }, +): Promise { + if (options?.next) { + await options.next(); + } + + if (!context.result) { + return context; + } + + const { result, isArray, key } = getResultIsArray(context); + + if (!result.length) { + return context; + } + + let hasPromises = false; + + const results = result.map(item => { + const result = cb(item); + + if (!hasPromises && isPromise(result)) { + hasPromises = true; + } + + return result; + }); + + function replace(r: any) { + if (options?.transform) { + r = options.transform(r); + } + + if (!isArray) { + context[key] = r[0]; + } else if (isArray && !Array.isArray(context[key]) && context[key].data) { + context[key].data = r; + } else { + context[key] = r; + } + + return context; + } + + if (hasPromises) { + return await Promise.all(results).then(replace); + } else { + return replace(results); + } +} diff --git a/test/utils/run-hook.test.ts b/src/utils/run-hook/run-hook.test.ts similarity index 97% rename from test/utils/run-hook.test.ts rename to src/utils/run-hook/run-hook.test.ts index e92d9fe4..384d12b1 100755 --- a/test/utils/run-hook.test.ts +++ b/src/utils/run-hook/run-hook.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; -import { fastJoin, keep, runHook } from '../../src'; +import { fastJoin, keep } from '../../hooks'; +import { runHook } from './run-hook'; const app = { a: 'a' }; const params = { p: 'p' }; diff --git a/src/utils/run-hook.ts b/src/utils/run-hook/run-hook.ts similarity index 100% rename from src/utils/run-hook.ts rename to src/utils/run-hook/run-hook.ts diff --git a/test/utils/some.test.ts b/src/utils/some/some.test.ts similarity index 96% rename from test/utils/some.test.ts rename to src/utils/some/some.test.ts index 5958a048..2abfeb80 100755 --- a/test/utils/some.test.ts +++ b/src/utils/some/some.test.ts @@ -1,7 +1,9 @@ import { assert } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; -import { iff, some, isNot } from '../../src'; +import { some } from './some'; +import { iff } from '../../hooks/iff/iff'; +import { isNot } from '../is-not/is-not'; describe('util some', () => { let app: any; diff --git a/src/utils/some.ts b/src/utils/some/some.ts similarity index 100% rename from src/utils/some.ts rename to src/utils/some/some.ts diff --git a/test/hooks/get-replace-items.test.ts b/test/hooks/get-replace-items.test.ts deleted file mode 100755 index e1105962..00000000 --- a/test/hooks/get-replace-items.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { assert } from 'vitest'; -import { actOnDispatch, getItems, replaceItems } from '../../src'; - -// Tests when context.params._actOn === 'dispatch' are in act-on.test.ts - -describe('services getItems & replaceItems', () => { - let hookBefore: any; - let hookAfter: any; - let hookBeforeArray: any; - let hookAfterArray: any; - let hookFindPaginate: any; - let hookFind: any; - - describe('getItems', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - hookBeforeArray = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane2', last: 'Doe2' }, - }; - hookAfterArray = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: [ - { first: 'John2', last: 'Doe2' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { first: 'John3', last: 'Doe3' }, - { first: 'Jane3', last: 'Doe3' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('updates hook before::create item', () => { - const stuff = getItems(hookBefore); - assert.deepEqual(stuff, { first: 'John', last: 'Doe' }); - }); - - it('updates hook before::create items', () => { - const stuff = getItems(hookBeforeArray); - assert.deepEqual(stuff, [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ]); - }); - - it('updates hook after::create item', () => { - const stuff = getItems(hookAfter); - assert.deepEqual(stuff, { first: 'Jane2', last: 'Doe2' }); - }); - - it('updates hook after::create items', () => { - const stuff = getItems(hookAfterArray); - assert.deepEqual(stuff, [ - { first: 'John2', last: 'Doe2' }, - { first: 'Jane', last: 'Doe' }, - ]); - }); - - it('updates hook after::find item', () => { - const stuff = getItems(hookFindPaginate); - assert.deepEqual(stuff, [ - { first: 'John3', last: 'Doe3' }, - { first: 'Jane3', last: 'Doe3' }, - ]); - }); - - it('updates hook after::find item paginated', () => { - const stuff = getItems(hookFind); - assert.deepEqual(stuff, [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ]); - }); - - it('does not throw on before without data', () => { - const hookBad: any = { type: 'before', method: 'create', params: { provider: 'rest' } }; - const stuff = getItems(hookBad); - assert.equal(stuff, undefined); - }); - - it('does not throw on after without data', () => { - const hookBad: any = { type: 'after', method: 'find', params: { provider: 'rest' } }; - const stuff = getItems(hookBad); - assert.equal(stuff, undefined); - }); - }); - - describe('replaceItems', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; - hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 200, - data: [], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - }; - }); - - it('updates hook before::create item', () => { - replaceItems(hookBefore, { a: 1 }); - assert.deepEqual(hookBefore.data, { a: 1 }); - }); - - it('updates hook before::create items', () => { - replaceItems(hookBefore, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookBefore.data, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::create item', () => { - replaceItems(hookAfter, { a: 1 }); - assert.deepEqual(hookAfter.result, { a: 1 }); - }); - - it('updates hook after::create items', () => { - replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookAfter.result, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item', () => { - replaceItems(hookFind, { a: 1 }); - assert.deepEqual(hookFind.result, { a: 1 }); - }); - - it('updates hook after::find items', () => { - replaceItems(hookFind, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookFind.result, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', () => { - replaceItems(hookFindPaginate, { a: 1 }); - assert.equal(hookFindPaginate.result.total, 200); - assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }]); - }); - - it('updates hook after::find items paginated', () => { - replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]); - assert.equal(hookFindPaginate.result.total, 200); - assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }, { b: 2 }]); - }); - }); - - describe('replaceItems actOnDispatch', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; - hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - dispatch: { - total: 200, - data: [], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - }; - }); - - it('updates hook after::create item', async () => { - await actOnDispatch(() => replaceItems(hookAfter, { a: 1 }))(hookAfter); - assert.deepEqual(hookAfter.dispatch, { a: 1 }); - }); - - it('updates hook after::create items', async () => { - await actOnDispatch(() => replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]))(hookAfter); - assert.deepEqual(hookAfter.dispatch, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item', async () => { - await actOnDispatch(() => replaceItems(hookFind, { a: 1 }))(hookFind); - assert.deepEqual(hookFind.dispatch, { a: 1 }); - }); - - it('updates hook after::find items', async () => { - await actOnDispatch(() => replaceItems(hookFind, [{ a: 1 }, { b: 2 }]))(hookFind); - assert.deepEqual(hookFind.dispatch, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', async () => { - await actOnDispatch(() => replaceItems(hookFindPaginate, { a: 1 }))(hookFindPaginate); - assert.equal(hookFindPaginate.dispatch.total, 200); - assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }]); - }); - - it('updates hook after::find items paginated', async () => { - await actOnDispatch(() => replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]))( - hookFindPaginate, - ); - assert.equal(hookFindPaginate.dispatch.total, 200); - assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }, { b: 2 }]); - }); - }); -}); diff --git a/test/hooks/iff-else.test.ts b/test/hooks/iff-else.test.ts deleted file mode 100755 index b36757e4..00000000 --- a/test/hooks/iff-else.test.ts +++ /dev/null @@ -1,681 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { iff } from '../../src'; -import { isPromise } from '../../src/common'; - -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let hookFcnAsyncCalls: any; -let hookFcnCalls: any; -let predicateHook: any; -let predicateOptions: any; -let predicateValue: any; - -const predicateSync = (hook: any) => { - predicateHook = clone(hook); - return true; -}; - -const predicateSync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return true; -}; - -const predicateAsync = (hook: any) => { - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; - -const predicateAsync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; - -const predicateAsyncFunny = (hook: any) => { - predicateHook = clone(hook); - return new Promise(resolve => { - predicateValue = 'abc'; - return resolve(predicateValue); - }); -}; - -const hookFcnSync = (hook: HookContext): HookContext => { - hookFcnSyncCalls += 1; - - hook.data.first = hook.data.first.toLowerCase(); - - return hook; -}; - -const hookFcnAsync = (hook: HookContext) => - new Promise(resolve => { - hookFcnAsyncCalls += 1; - - hook.data.first = hook.data.first.toLowerCase(); - - resolve(hook); - }); - -const hookCb = (hook: any) => { - hookFcnCalls += 1; - - return hook; -}; - -describe('services iff - sync predicate, sync hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls sync hook function if truthy non-function', () => { - return ( - iff( - // @ts-ignore - 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('does not call sync hook function if falsey non-function', () => { - // @ts-ignore - const result: any = iff('', hookFcnSync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); - - it('calls sync hook function if sync predicate truthy', () => { - return ( - iff( - // @ts-ignore - () => 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('does not call sync hook function if sync predicate falsey', () => { - // @ts-ignore - const result = iff(() => '', hookFcnSync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); -}); - -describe('services iff - sync predicate, async hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls async hook function if sync predicate truthy', () => { - return ( - iff( - true, - hookFcnAsync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('does not call async hook function if sync predicate falsey', () => { - const result = iff(false, hookFcnAsync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); - - it('calls async hook function if sync predicate returns truthy', () => { - return ( - iff( - () => true, - hookFcnAsync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - async predicate, sync hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls sync hook function if aync predicate truthy', () => { - return ( - iff( - () => new Promise(resolve => resolve(true)), - hookFcnSync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }) - ); - }); - - it('does not call sync hook function if async predicate falsey', () => { - return ( - iff( - () => new Promise(resolve => resolve(false)), - hookFcnSync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }) - ); - }); -}); - -describe('services iff - async predicate, async hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls async hook function if aync predicate truthy', () => { - return ( - iff( - () => new Promise(resolve => resolve(true)), - hookFcnAsync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }) - ); - }); - - it('does not call async hook function if async predicate falsey', () => { - return ( - iff( - () => new Promise(resolve => resolve(false)), - hookFcnAsync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }) - ); - }); -}); - -describe('services iff - sync predicate', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - }); - - it('does not need to access hook', () => { - return ( - iff( - // @ts-ignore - () => 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('is passed hook as param', () => { - return ( - iff( - predicateSync, - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('a higher order predicate can pass more options', () => { - return ( - iff( - predicateSync2({ z: 'z' }), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateOptions, { z: 'z' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - async predicate', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - predicateValue = null; - }); - - it('is passed hook as param', () => { - return ( - iff( - predicateAsync, - hookFcnSync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }) - ); - }); - - it('is resolved', () => { - return ( - iff( - // @ts-ignore - predicateAsyncFunny, - hookFcnSync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - - assert.equal(predicateValue, 'abc'); - }) - ); - }); - - it('a higher order predicate can pass more options', () => { - return ( - iff( - predicateAsync2({ y: 'y' }), - hookFcnSync, - )(hook) - // @ts-ignore - .then((result1: any) => { - assert.deepEqual(predicateOptions, { y: 'y' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }) - ); - }); -}); - -describe('services iff - runs .else()', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - hookFcnCalls = 0; - }); - - it('using iff(true, ...)', () => { - return ( - iff( - true, - hookFcnSync, - hookFcnSync, - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 3); - assert.equal(hookFcnAsyncCalls, 0); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('using iff(true, ...).else(...)', () => { - return ( - iff(true, hookFcnSync, hookFcnSync, hookFcnSync) - .else(hookFcnSync)(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 3); - assert.equal(hookFcnAsyncCalls, 0); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('using if(false).else(...)', () => { - return ( - iff(false, hookFcnSync) - .else( - hookFcnSync, - hookFcnSync, - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 3); - assert.equal(hookFcnAsyncCalls, 0); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - runs iff(true, iff(true, ...)', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - hookFcnCalls = 0; - }); - - it('using iff(true, iff(true, hookFcnSync))', () => { - return ( - iff( - true, - hookFcnAsync, - iff(true, hookFcnSync), - hookCb, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('using iff(true, iff(true, hookFcnAsync))', () => { - return ( - iff( - true, - hookFcnSync, - iff(true, hookFcnAsync), - hookCb, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('runs iff(true, iff(true, hookFcnCb))', () => { - return ( - iff( - true, - hookFcnSync, - iff(true, hookCb), - hookFcnAsync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - runs iff(true, iff(false).else(...)', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - hookFcnCalls = 0; - }); - - it('using iff(true, iff(false).else(hookFcnSync))', () => { - return ( - iff( - true, - hookFcnAsync, - iff(false, hookCb).else(hookFcnSync), - hookFcnAsync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 2); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('using iff(true, iff(false).else(hookFcnAsync))', () => { - return ( - iff( - true, - hookFcnSync, - iff(false, hookFcnSync).else(hookFcnAsync), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 2); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - runs iff(false).else(iff(...).else(...))', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - hookFcnCalls = 0; - }); - - it('using iff(false).else(iff(true, ...))', () => { - return ( - iff(false, hookCb) - .else( - hookFcnSync, - iff(true, hookFcnAsync), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 2); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('runs iff(false).else(iff(false).else(...))', () => { - return ( - iff(false, hookCb) - .else( - hookFcnSync, - iff(false, hookFcnSync).else(hookFcnAsync), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 2); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 0); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -describe('services iff - multiple iff() sequentially', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - hookFcnCalls = 0; - }); - - it('runs in iff(true, ...)', () => { - return ( - iff( - true, - hookCb, - iff(true, hookFcnSync, hookFcnSync, hookFcnSync), - hookCb, - iff(true, hookFcnAsync, hookFcnAsync, hookFcnAsync, hookFcnAsync), - hookCb, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 3); - assert.equal(hookFcnAsyncCalls, 4); - assert.equal(hookFcnCalls, 3); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('runs in iff(false).else(...)', () => { - return ( - iff(false, hookCb) - .else( - hookFcnSync, - iff(true, hookFcnAsync), - iff(false, hookFcnSync).else(hookCb), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.equal(hookFcnSyncCalls, 2); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - - assert.deepEqual(hook, hookAfter); - }) - ); - }); -}); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/hooks/when.test.ts b/test/hooks/when.test.ts deleted file mode 100755 index 5cc51dd6..00000000 --- a/test/hooks/when.test.ts +++ /dev/null @@ -1,403 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { when } from '../../src'; -import { isPromise } from '../../src/common'; - -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let hookFcnAsyncCalls: any; -let hookFcnCalls: any; -let predicateHook: any; -let predicateOptions: any; -let predicateValue: any; - -const predicateSync = (hook: any) => { - predicateHook = clone(hook); - return true; -}; - -const predicateSync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return true; -}; - -const predicateAsync = (hook: HookContext) => { - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; - -const predicateAsync2 = (options: any) => (hook: HookContext) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; - -const predicateAsyncFunny = (hook: HookContext) => { - predicateHook = clone(hook); - return new Promise(resolve => { - predicateValue = 'abc'; - return resolve(predicateValue); - }); -}; - -const hookFcnSync = (hook: HookContext) => { - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); - - return hook; -}; - -const hookFcnAsync = (hook: HookContext) => - new Promise(resolve => { - hookFcnAsyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); - - resolve(hook); - }); - -const hookFcn = (hook: any) => { - hookFcnCalls = +1; - - return hook; -}; - -describe('services when - sync predicate, sync hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls sync hook function if truthy non-function', () => { - when( - // @ts-ignore - 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); - - it('does not call sync hook function if falsey non-function', () => { - // @ts-ignore - const result = when('', hookFcnSync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); - - it('calls sync hook function if sync predicate truthy', () => { - when( - // @ts-ignore - () => 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); - - it('does not call sync hook function if sync predicate falsey', () => { - // @ts-ignore - const result = when(() => '', hookFcnSync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); -}); - -describe('services when - sync predicate, async hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls async hook function if sync predicate truthy', async () => { - const result = when(true, hookFcnAsync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); - - it('does not call async hook function if sync predicate falsey', () => { - const result = when(false, hookFcnAsync)(hook); - - if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); - } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - } - }); - - it('calls async hook function if sync predicate returns truthy', async () => { - const result = when(() => true, hookFcnAsync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); - -describe('services when - async predicate, sync hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls sync hook function if async predicate truthy', async () => { - const result = when(() => new Promise(resolve => resolve(true)), hookFcnSync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); - - it('does not call sync hook function if async predicate falsey', async () => { - const result = when(() => new Promise(resolve => resolve(false)), hookFcnSync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); - -describe('services when - async predicate, async hook', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('calls async hook function if async predicate truthy', async () => { - const result = when(() => new Promise(resolve => resolve(true)), hookFcnAsync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); - - it('does not call async hook function if async predicate falsey', async () => { - const result = when(() => new Promise(resolve => resolve(false)), hookFcnAsync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); - -describe('services when - sync predicate', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - }); - - it('does not need to access hook', () => { - when( - // @ts-ignore - () => 'a', - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); - - it('is passed hook as param', () => { - when( - predicateSync, - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); - - it('a higher order predicate can pass more options', () => { - when( - predicateSync2({ z: 'z' }), - hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateOptions, { z: 'z' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); - -describe('services when - async predicate', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - predicateValue = null; - }); - - it('is passed hook as param', async () => { - // @ts-ignore - const result = when(predicateAsync, hookFcnSync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); - - it('is resolved', async () => { - const result = when(predicateAsyncFunny, hookFcnSync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - - assert.equal(predicateValue, 'abc'); - }); - }); - - it('a higher order predicate can pass more options', async () => { - const result = when(predicateAsync2({ y: 'y' }), hookFcnSync)(hook); - - if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); - } - - await result.then((result1: any) => { - assert.deepEqual(predicateOptions, { y: 'y' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); -}); - -describe('services when - runs multiple hooks', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); - - it('runs successfully', async () => { - await when( - true, - hookFcnSync, - hookFcnAsync, - hookFcn, - )(hook).then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); - -// Helpers - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/index.test.ts b/test/index.test.ts index c2908803..3338aac8 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -4,7 +4,12 @@ import * as allExported from '../src'; const members = [ 'actOnDefault', 'actOnDispatch', + + // alter 'alterItems', + 'alterData', + 'alterResult', + 'cache', 'callingParams', 'callingParamsDefaults', @@ -15,18 +20,45 @@ const members = [ 'dePopulate', 'disablePagination', 'disallow', + + // omit 'discard', + 'discardData', + 'discardResult', 'discardQuery', + 'omit', + 'omitData', + 'omitResult', + 'omitQuery', + 'fastJoin', 'fgraphql', 'getItems', + 'getDataIsArray', + 'getResultIsArray', 'hookTypes', 'isProvider', + + // pick 'keep', - 'keepInArray', + 'keepData', + 'keepResult', 'keepQuery', + 'pick', + 'pickData', + 'pickResult', + 'pickQuery', + + 'keepInArray', + 'keepQueryInArray', + + // lowercase 'lowerCase', + 'lowercase', + 'lowercaseData', + 'lowercaseResult', + 'makeCallingParams', 'methodNames', 'mongoKeys', @@ -34,14 +66,23 @@ const members = [ 'paramsFromClient', 'populate', 'preventChanges', + + // replace 'replaceItems', + 'replaceData', + 'replaceResult', + 'required', 'runHook', 'runParallel', 'sequelizeConvert', 'serialize', 'setField', + 'setNow', + 'setNowData', + 'setNowResult', + 'setSlug', 'sifter', 'softDelete', @@ -49,6 +90,8 @@ const members = [ 'traverse', 'validate', 'validateSchema', + + // iff 'iffElse', 'iff', 'when', @@ -60,6 +103,6 @@ const members = [ describe('services exposed hooks', () => { it('no unexpected hooks', () => { - assert.deepEqual(Object.keys(allExported).sort(), [].concat(members).sort()); + assert.deepEqual(Object.keys(allExported).sort(), [...members].sort()); }); }); diff --git a/vite.config.ts b/vite.config.ts index 4ceeee18..439fd77b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,19 +1,19 @@ -import { defineConfig } from "vitest/config"; +import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { globals: true, coverage: { - provider: "v8", - reporter: ["text", "lcov"], - include: ["src/**/*.{js,ts}"], - exclude: ["**/*.test.{js,ts}", "src/types.ts"], + provider: 'v8', + reporter: ['text', 'lcov'], + include: ['src/**/*.{js,ts}'], + exclude: ['**/*.test.{js,ts}', 'src/types.ts'], thresholds: { lines: 85, functions: 85, branches: 85, statements: 85, - } + }, }, }, }); From d7e41c09eacded716f29e6838c482af6f05b5728 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:50:03 +0100 Subject: [PATCH 02/15] fix things --- .github/workflows/nodejs.yml | 2 +- README.md | 10 + package.json | 4 +- pnpm-lock.yaml | 7004 +++++++++++++++++ src/hooks/fgraphql/fgraphql.ts | 56 +- .../populate/populate-1deep-1child.test.ts | 11 +- src/hooks/populate/populate.ts | 1 - src/hooks/set-dispatch/set-dispatch.ts | 0 src/hooks/set-field/set-field.ts | 6 - src/hooks/stash-before/stash-before.test.ts | 84 +- src/hooks/stash-before/stash-before.ts | 43 +- src/internal.utils.ts | 3 + src/utils/allows-multi/allows-multi.ts | 11 + src/utils/get-items/get-items.ts | 2 - src/utils/get-paginate/get-paginate.test.ts | 73 + src/utils/get-paginate/get-paginate.ts | 29 + src/utils/index.ts | 6 + src/utils/is-multi/is-multi.test.ts | 49 + src/utils/is-multi/is-multi.ts | 25 + src/utils/is-not/is-not.ts | 2 +- src/utils/is-paginated/is-paginated.test.ts | 72 + src/utils/is-paginated/is-paginated.ts | 15 + src/utils/is-provider/is-provider.ts | 2 +- src/utils/skip-result/skip-result.test.ts | 260 + src/utils/skip-result/skip-result.ts | 31 + src/utils/some/some.ts | 4 +- test/index.test.ts | 6 + 27 files changed, 7673 insertions(+), 138 deletions(-) create mode 100644 pnpm-lock.yaml create mode 100644 src/hooks/set-dispatch/set-dispatch.ts create mode 100644 src/internal.utils.ts create mode 100644 src/utils/allows-multi/allows-multi.ts create mode 100644 src/utils/get-paginate/get-paginate.test.ts create mode 100644 src/utils/get-paginate/get-paginate.ts create mode 100644 src/utils/is-multi/is-multi.test.ts create mode 100644 src/utils/is-multi/is-multi.ts create mode 100644 src/utils/is-paginated/is-paginated.test.ts create mode 100644 src/utils/is-paginated/is-paginated.ts create mode 100644 src/utils/skip-result/skip-result.test.ts create mode 100644 src/utils/skip-result/skip-result.ts diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 93cf86b8..846971bb 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -5,7 +5,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x, 20.x, 22.5.1] + node-version: [18.x, 20.x, 22.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} diff --git a/README.md b/README.md index 7c0505c2..aee29a2f 100755 --- a/README.md +++ b/README.md @@ -18,6 +18,16 @@ - renamed 'keepQuery' to 'pickQuery', added alias +- added utils from feathers-utils + + - allowsMulti + - getPaginate + - isMulti + - isPaginated + - setResultEmpty + +- stashBefore multi +

diff --git a/package.json b/package.json index 8a5766a3..eeebb7c2 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "types": "./dist/index.d.ts", "exports": { ".": { + "types": "./dist/index.d.ts", "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" + "import": "./dist/index.mjs" } }, "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..21326894 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7004 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@feathersjs/errors': + specifier: ^5.0.31 + version: 5.0.32 + '@feathersjs/feathers': + specifier: ^5.0.0 + version: 5.0.32 + ajv: + specifier: ^6.12.6 + version: 6.12.6 + graphql: + specifier: ^16.10.0 + version: 16.10.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + neotraverse: + specifier: ^0.6.18 + version: 0.6.18 + devDependencies: + '@eslint/js': + specifier: ^9.18.0 + version: 9.20.0 + '@feathers-plus/batch-loader': + specifier: ^0.3.6 + version: 0.3.6 + '@feathers-plus/cache': + specifier: ^1.4.0 + version: 1.4.0 + '@feathers-plus/graphql': + specifier: ^1.10.0 + version: 1.10.0 + '@feathersjs/authentication': + specifier: ^5.0.31 + version: 5.0.32(typescript@5.7.3) + '@feathersjs/authentication-local': + specifier: ^5.0.31 + version: 5.0.32(typescript@5.7.3) + '@feathersjs/client': + specifier: ^5.0.31 + version: 5.0.32(typescript@5.7.3) + '@feathersjs/express': + specifier: ^5.0.31 + version: 5.0.32(typescript@5.7.3) + '@feathersjs/memory': + specifier: ^5.0.31 + version: 5.0.32 + '@feathersjs/socketio': + specifier: ^5.0.31 + version: 5.0.32 + '@feathersjs/socketio-client': + specifier: ^5.0.31 + version: 5.0.32 + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + '@types/lodash': + specifier: ^4.17.14 + version: 4.17.15 + '@types/node': + specifier: ^22.10.7 + version: 22.13.2 + '@typescript-eslint/eslint-plugin': + specifier: ^8.21.0 + version: 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^8.21.0 + version: 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@vitest/coverage-v8': + specifier: ^3.0.3 + version: 3.0.5(vitest@1.6.1(@types/node@22.13.2)) + eslint: + specifier: ^9.18.0 + version: 9.20.1 + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.0.1(eslint@9.20.1) + eslint-import-resolver-typescript: + specifier: ^3.7.0 + version: 3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1) + eslint-plugin-import-x: + specifier: ^4.6.1 + version: 4.6.1(eslint@9.20.1)(typescript@5.7.3) + eslint-plugin-prettier: + specifier: ^5.2.3 + version: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.20.1))(eslint@9.20.1)(prettier@3.5.0) + mongodb: + specifier: ^5.9.2 + version: 5.9.2 + npm-check-updates: + specifier: ^17.1.14 + version: 17.1.14 + prettier: + specifier: ^3.4.2 + version: 3.5.0 + shx: + specifier: ^0.3.4 + version: 0.3.4 + sift: + specifier: ^17.1.3 + version: 17.1.3 + tsup: + specifier: ^8.3.5 + version: 8.3.6(postcss@8.5.2)(typescript@5.7.3) + typescript: + specifier: ^5.7.3 + version: 5.7.3 + typescript-eslint: + specifier: ^8.21.0 + version: 8.24.0(eslint@9.20.1)(typescript@5.7.3) + vitepress: + specifier: ^1.6.2 + version: 1.6.3(@algolia/client-search@5.20.2)(@types/node@22.13.2)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3) + vitest: + specifier: ^1.6.0 + version: 1.6.1(@types/node@22.13.2) + +packages: + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.20.2': + resolution: {integrity: sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.20.2': + resolution: {integrity: sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.20.2': + resolution: {integrity: sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.20.2': + resolution: {integrity: sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.20.2': + resolution: {integrity: sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.20.2': + resolution: {integrity: sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.20.2': + resolution: {integrity: sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.20.2': + resolution: {integrity: sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.20.2': + resolution: {integrity: sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.20.2': + resolution: {integrity: sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.20.2': + resolution: {integrity: sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.20.2': + resolution: {integrity: sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.20.2': + resolution: {integrity: sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw==} + engines: {node: '>= 14.0.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.8': + resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.8': + resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.11.0': + resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.20.0': + resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@feathers-plus/batch-loader@0.3.0': + resolution: {integrity: sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==} + engines: {node: '>= 6.0.0'} + + '@feathers-plus/batch-loader@0.3.6': + resolution: {integrity: sha512-r+n31iZ/B5Rl1mLkC9/S20UI445MdkZvE3VBmjupep2t8OuyTYHPkFEgR25HY6khH+RothK1VL3B5eumk9N2QQ==} + engines: {node: '>= 6.0.0'} + + '@feathers-plus/cache@1.3.1': + resolution: {integrity: sha512-zFpwVutKiOcPW6Gnm73uit4EwnaawYZEt6pIKP+GkYQz/wVkfNMMwZ28THCNhZvFcR1Cn3WwyUBXcASoApHpvA==} + engines: {node: '>= 6.0.0'} + + '@feathers-plus/cache@1.4.0': + resolution: {integrity: sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==} + engines: {node: '>= 6.0.0'} + + '@feathers-plus/common@0.1.0': + resolution: {integrity: sha512-rK4zNVObmw8UKP7nwTwsCVn0g2Zl92r2rpXMfVdFo8FmYfYY4HECAcGB4Aq38EI6NZnvla51CdDjtY9WxW1OHQ==} + engines: {node: '>= 6.0.0'} + + '@feathers-plus/graphql@1.10.0': + resolution: {integrity: sha512-ausYkHTRRxIQbNKVvQ7dHj/bkNsghsjGGKw9PO+w9XOCs6OJouO/cj1nj6RjfUDxUbZtFcc4y5QluYzDulEmEQ==} + engines: {node: '>= 8.0.0'} + deprecated: This module is no longer maintained + + '@feathersjs/adapter-commons@5.0.32': + resolution: {integrity: sha512-MKoa/i4ylUc/jVjBy+PWS9TgU1IXUkqcRUCqe2uBpM7y1L686XfK56l/opiGWEvScOt1sHIv7ryj7aIS1G2D0A==} + engines: {node: '>= 12'} + + '@feathersjs/authentication-client@5.0.32': + resolution: {integrity: sha512-9NMEtROo8w2uvl+pUM1y4KFlVCXu3pTAeD03ojuuys9wI5UGXB+MBacUwqrVzT3gHLsikfvHqUMeHSTIJcH/Og==} + engines: {node: '>= 12'} + + '@feathersjs/authentication-local@5.0.32': + resolution: {integrity: sha512-fIeMj9b3g3MferUMVq66Tyzhnam5UKRjEzLCshsqTJg1oi46MdMIL4/63B3zVO7KLPsfa77iMZb/72dCHnptNQ==} + engines: {node: '>= 12'} + + '@feathersjs/authentication@5.0.32': + resolution: {integrity: sha512-9C/DPA63SxMkylgkwAbMOfpsif9JQjlXzLoU9gsEzN0dWCGuLZ//0vQ4/hli5Y0jZ61tzPLQzGBIiC2f5SQ7nQ==} + engines: {node: '>= 12'} + + '@feathersjs/client@5.0.32': + resolution: {integrity: sha512-KIkFq0sR+axnWwomtkuLFJ28b99nd2LcCzMGxWqrUFUBl4NCAgXHdOjp7Z2lYSzHBjuM//B5chlDLjmTUtF2sA==} + engines: {node: '>= 12'} + + '@feathersjs/commons@1.4.4': + resolution: {integrity: sha512-ZPpzyZA3CPfoa9AuFv3BJUI/ubzaaXixp8T/pqeMFPT6DOaU/6oF7lz1RxwimzfJNna4gy/HByt0EoLSI3BKWg==} + engines: {node: '>= 6'} + + '@feathersjs/commons@5.0.32': + resolution: {integrity: sha512-Qj2x8xBJS+8fpe6sVor4dBT42pHc5uRuvH91FD+n4/O1YvKHpmuInO0IvD9DPvPtDqodT2WCzA7a2eTDHLOuNw==} + engines: {node: '>= 12'} + + '@feathersjs/errors@3.2.0': + resolution: {integrity: sha512-4xsE7OyzxGvs2hyG19nf2qb4rV2nWoWbQ6/FnDIYrNHi7M9kOy+deLwNhKnXa4r/hg3xf+AVpC8kBjUQjWYWHA==} + engines: {node: '>= 6'} + + '@feathersjs/errors@5.0.32': + resolution: {integrity: sha512-54pBmnAmOOPvkIO5fwHVpYODOxp5TJtpYcC0ABppzUG6P77WqmndpIPCzT5wP+VbQBcCdYP/mOyK05BdeRju7g==} + engines: {node: '>= 12'} + + '@feathersjs/express@5.0.32': + resolution: {integrity: sha512-L/Ex7GrPrCkAo2RJ41VyFv3x1U/ltZFwgbQx7pFm4FQT3sNW/wGJr8UBSC8VN/MBc35y5VcDaGKwk68wEN9Row==} + engines: {node: '>= 12'} + + '@feathersjs/feathers@5.0.32': + resolution: {integrity: sha512-eP05x5xcLvtRFttt9uSJd8GApP+eqdnw/bQFxpZxMDGjvvZXa0Az/M3JT98ucjjoY3kHpoX3XFJbkDe06AoS+A==} + engines: {node: '>= 12'} + + '@feathersjs/hooks@0.9.0': + resolution: {integrity: sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==} + engines: {node: '>= 14'} + + '@feathersjs/memory@5.0.32': + resolution: {integrity: sha512-81PUVSKe+00TelMOl6jvAqItDrG6uhzYDFBSHnrWHEbALxek1rAx6v8ElP8gaz+6wcHiK4hkuljOjwT3AccQhA==} + engines: {node: '>= 12'} + + '@feathersjs/rest-client@5.0.32': + resolution: {integrity: sha512-s7tQmpOa+GYYpGPZayw37bDR35r3K+PXr30cACn6UtBaiPE/v5w4iik4C3wB1RoZojiOkXzd7xTfb4SImrivOw==} + engines: {node: '>= 12'} + + '@feathersjs/schema@5.0.32': + resolution: {integrity: sha512-NBoD4fqWrEFjlSFnPcgk+zhcdOQtyGXPWSTMgKS0xBFvNmH276w7wVlM6yIe7NwGVjaz/4nrlu1yTUqvUb3cyw==} + engines: {node: '>= 12'} + peerDependencies: + typescript: '>=5.6' + + '@feathersjs/socketio-client@5.0.32': + resolution: {integrity: sha512-qAtdt2KGXTSkiFnnp4auovL46pqQ2nrpNoUyObjDFO36bE7siamrgRXM3905u57vgV3Qwog2SFINUT5zjfA5pg==} + engines: {node: '>= 12'} + + '@feathersjs/socketio@5.0.32': + resolution: {integrity: sha512-5/sS/wkkdclag/Nt0euRJQ67r7RbGWVZglB7fds56hudif/Qb/OUqPDn+Cdj8eBKPDfOJdioYkHnIdROaKwq4A==} + engines: {node: '>= 12'} + + '@feathersjs/transport-commons@5.0.32': + resolution: {integrity: sha512-SrOJHnFk1w9cBFpZ6MPR61c2OHEMvWbwk3kNA+9PzIuHc6H3SPrTiWouWzmjVt8jowRzhVeQef46nIJsqx9iqQ==} + engines: {node: '>= 12'} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@iconify-json/simple-icons@1.2.24': + resolution: {integrity: sha512-06ZWXZx3PHCE+02zn+iIGOKKNgE3kyPd0Yh7IUEIa0bCYI6UmGlsYYghRx8As9TnTNYMCEiy5V0zI4Jb6EY6XA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.34.6': + resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.6': + resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.6': + resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.6': + resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.6': + resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.6': + resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.6': + resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.6': + resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.6': + resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.6': + resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@shikijs/core@2.3.2': + resolution: {integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==} + + '@shikijs/engine-javascript@2.3.2': + resolution: {integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==} + + '@shikijs/engine-oniguruma@2.3.2': + resolution: {integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==} + + '@shikijs/langs@2.3.2': + resolution: {integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==} + + '@shikijs/themes@2.3.2': + resolution: {integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==} + + '@shikijs/transformers@2.3.2': + resolution: {integrity: sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==} + + '@shikijs/types@2.3.2': + resolution: {integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==} + + '@shikijs/vscode-textmate@10.0.1': + resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@stem/nesthydrationjs@0.4.0': + resolution: {integrity: sha512-hnoLv6W7CmhWXCEp6MBiZv4CdqI48aYmxM+Lo5T3qogP+x+MBR0DOyt7XdppI/X8McqHisCbSNvAOC4fgPhUiw==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/compression@1.7.5': + resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/graphql@0.11.8': + resolution: {integrity: sha512-xGWx4kx9JKlqxDrZA12gw5qi2lvxPNLxnQQcoTXVX83MuGcXcpb7TADatGyGW51GaaXQOQTbjw3x4HuL3ULBaA==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonwebtoken@9.0.8': + resolution: {integrity: sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.13.2': + resolution: {integrity: sha512-Z+r8y3XL9ZpI2EY52YYygAFmo2/oWfNSj4BCpAXE2McAexDk8VcnBMGC9Djn9gTKt4d2T/hhXqmPzo4hfIXtTg==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@typescript-eslint/eslint-plugin@8.24.0': + resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/parser@8.24.0': + resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/scope-manager@8.24.0': + resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.24.0': + resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/types@8.24.0': + resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.24.0': + resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/utils@8.24.0': + resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + '@typescript-eslint/visitor-keys@8.24.0': + resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vitest/coverage-v8@3.0.5': + resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==} + peerDependencies: + '@vitest/browser': 3.0.5 + vitest: 3.0.5 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/devtools-api@7.7.2': + resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} + + '@vue/devtools-kit@7.7.2': + resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==} + + '@vue/devtools-shared@7.7.2': + resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vueuse/core@12.5.0': + resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} + + '@vueuse/integrations@12.5.0': + resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.5.0': + resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} + + '@vueuse/shared@12.5.0': + resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@5.5.2: + resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch@5.20.2: + resolution: {integrity: sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA==} + engines: {node: '>= 14.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + + birpc@0.2.19: + resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bson@5.5.1: + resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} + engines: {node: '>=14.20.1'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deprecate@1.1.1: + resolution: {integrity: sha512-ZGDXefq1xknT292LnorMY5s8UVU08/WKdzDZCUT6t9JzsiMSP4uzUhgpqugffNVcT5WC6wMBiSQ+LFjlv3v7iQ==} + + deprecated-decorator@0.1.6: + resolution: {integrity: sha512-MHidOOnCHGlZDKsI21+mbIIhf4Fff+hhCTB7gtVg4uoIqjcrTZc5v6M+GS2zVI0sV7PqK415rb8XaOSQsQkHOw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.0.1: + resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import-x@4.6.1: + resolution: {integrity: sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.20.1: + resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fast-deep-equal@1.1.0: + resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + feathers-hooks-common@4.5.6: + resolution: {integrity: sha512-z0KZP/igmHvEJX46x0f6UC/pSYFXUt/2OfgMwumElGqxwFYU4JrAnK8FbGwCo8MYowMDfpMk72ju+axbq9MV1Q==} + engines: {node: '>= 6'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + focus-trap@7.6.4: + resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generatorics@1.1.0: + resolution: {integrity: sha512-LuYDCS1DbKQsvChP1xHmAzHnGdd0z0K1XMebmbNbFzGZI62KODnV2CXA7zOqebiDzlK2sxXrPGfwlDzSm9aP4g==} + engines: {node: '>=6.0.0'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-relay@0.5.5: + resolution: {integrity: sha512-CTsapMI0MZc0antZp+9ZcVcNiVoaXncc2xALCxe2Md25quAUxTjH2135xPRNb6BMOoTiY54HtglfxxUCDTUEbA==} + peerDependencies: + graphql: ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 + + graphql-resolvers-ast@1.4.0: + resolution: {integrity: sha512-L4BeMFgPV7rwyISIvJ+QOsnMfc5+STMsaF097cLzJ9t/kizekDB5dMWNC+jq2pUWq0WoqYZypWYKwFL5vH4dUQ==} + engines: {node: '>= 6.0.0'} + + graphql-tools@2.0.0: + resolution: {integrity: sha512-5cUflK/kECqge0feZxTG/cF05EHlGMvdK47I+xQtDm67KrW8rlfmLTUWHYcyFTOXT+Yl4Sb/6WTJZwnKX+Ofmg==} + deprecated: |- + This package has been deprecated and now it only exports makeExecutableSchema. + And it will no longer receive updates. + We recommend you to migrate to scoped packages such as @graphql-tools/schema, @graphql-tools/utils and etc. + Check out https://www.graphql-tools.com to learn what package you should use instead + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 + + graphql-type-json@0.1.4: + resolution: {integrity: sha512-B1zeWRF50alRvW94s/hpkGbVqvRLTtJD0yEyMs6KAvDSlNyBzJCu/d51fLZalqrVntuJAVgXYh13GbUEqe9MrQ==} + peerDependencies: + graphql: '>=0.4.0' + + graphql@0.11.7: + resolution: {integrity: sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==} + + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-string@1.0.0: + resolution: {integrity: sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterall@1.1.3: + resolution: {integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + join-monster-graphql-tools-adapter@0.0.2: + resolution: {integrity: sha512-Q2DaeL/L6yY7Rh30YvkysB48QdPwbMBElo72gXelDOczymw0DzP1jmrvLuClyxeL5FJs5tt28CHKIKEgYwFAbA==} + peerDependencies: + graphql-tools: ^0.4.0 + join-monster: '*' + + join-monster@2.0.15: + resolution: {integrity: sha512-4ZZd0grGtamGsevMP4iCF+dZ5jyeuvbvEgF5LgPp9Gz1VNUTaL79/ZNfc0Hs/uSNJAVj1vbaUGK/wsnopyYLkA==} + engines: {node: '>=6.0.0'} + peerDependencies: + graphql: 0.6 || 0.7 || 0.8 || 0.9 || 0.10 || 0.11 + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + + json-schema-traverse@0.3.1: + resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.1: + resolution: {integrity: sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.13.1: + resolution: {integrity: sha512-j/GRONYpkXt1aB1bQHzkq0Th7zhv/syoDVrzCDA3FDMntIin0b7TjXi62q9juDC+QfhRs9COr0LFW38vQSH9Tg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@4.1.1: + resolution: {integrity: sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@7.1.1: + resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + mongo-sql@4.0.2: + resolution: {integrity: sha512-/S2uYugCpOx73dwvWRZWlTBIE0U2e6jhIWi9bcfUrM9QkKR4U1yYjP6wXiYt+kdWqhV1lICgTLMoaKR1VMdd6A==} + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb@5.9.2: + resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} + engines: {node: '>=14.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' + snappy: ^7.2.2 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + npm-check-updates@17.1.14: + resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} + engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} + hasBin: true + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + oniguruma-to-es@3.1.0: + resolution: {integrity: sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.25.4: + resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.34.6: + resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@2.3.2: + resolution: {integrity: sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==} + + short-hash@1.0.0: + resolution: {integrity: sha512-qbUCD2Pkl4IXRyVqneEjGnUr0NGDGLzZnBUVGJngIQZf/FrhOL0yJhH+JQzak0t8xMmScIKpoX1SxOsPHdwa4w==} + + shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + sift@17.1.3: + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + traverse@0.6.6: + resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.3.6: + resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.24.0: + resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@11.0.5: + resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} + hasBin: true + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + 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 + + vitepress@1.6.3: + resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + postcss: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + '@algolia/client-search': 5.20.2 + algoliasearch: 5.20.2 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': + dependencies: + '@algolia/client-search': 5.20.2 + algoliasearch: 5.20.2 + + '@algolia/client-abtesting@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/client-analytics@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/client-common@5.20.2': {} + + '@algolia/client-insights@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/client-personalization@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/client-query-suggestions@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/client-search@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/ingestion@1.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/monitoring@1.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/recommend@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + '@algolia/requester-browser-xhr@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + + '@algolia/requester-fetch@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + + '@algolia/requester-node-http@5.20.2': + dependencies: + '@algolia/client-common': 5.20.2 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.8': + dependencies: + '@babel/types': 7.26.8 + + '@babel/runtime@7.26.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.26.8': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@1.0.2': {} + + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) + preact: 10.25.4 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) + '@docsearch/css': 3.8.2 + algoliasearch: 5.20.2 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1)': + dependencies: + eslint: 9.20.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.11.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.20.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.5': + dependencies: + '@eslint/core': 0.10.0 + levn: 0.4.1 + + '@feathers-plus/batch-loader@0.3.0': {} + + '@feathers-plus/batch-loader@0.3.6': {} + + '@feathers-plus/cache@1.3.1': + dependencies: + lru-cache: 4.1.1 + + '@feathers-plus/cache@1.4.0': + dependencies: + lru-cache: 4.1.1 + + '@feathers-plus/common@0.1.0': + dependencies: + short-hash: 1.0.0 + sort-keys: 2.0.0 + + '@feathers-plus/graphql@1.10.0': + dependencies: + '@feathers-plus/batch-loader': 0.3.0 + '@feathers-plus/cache': 1.3.1 + '@feathers-plus/common': 0.1.0 + '@feathersjs/errors': 3.2.0 + debug: 3.1.0 + feathers-hooks-common: 4.5.6 + graphql: 0.11.7 + graphql-resolvers-ast: 1.4.0 + graphql-tools: 2.0.0(graphql@0.11.7) + graphql-type-json: 0.1.4(graphql@0.11.7) + join-monster: 2.0.15(graphql@0.11.7) + join-monster-graphql-tools-adapter: 0.0.2(graphql-tools@2.0.0(graphql@0.11.7))(join-monster@2.0.15(graphql@0.11.7)) + lodash.merge: 4.6.1 + mongo-sql: 4.0.2 + traverse: 0.6.6 + transitivePeerDependencies: + - supports-color + + '@feathersjs/adapter-commons@5.0.32': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + + '@feathersjs/authentication-client@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/authentication': 5.0.32(typescript@5.7.3) + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + transitivePeerDependencies: + - typescript + + '@feathersjs/authentication-local@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/authentication': 5.0.32(typescript@5.7.3) + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + bcryptjs: 2.4.3 + lodash: 4.17.21 + transitivePeerDependencies: + - typescript + + '@feathersjs/authentication@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@feathersjs/hooks': 0.9.0 + '@feathersjs/schema': 5.0.32(typescript@5.7.3) + '@feathersjs/transport-commons': 5.0.32 + '@types/jsonwebtoken': 9.0.8 + jsonwebtoken: 9.0.2 + lodash: 4.17.21 + long-timeout: 0.1.1 + uuid: 11.0.5 + transitivePeerDependencies: + - typescript + + '@feathersjs/client@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/authentication-client': 5.0.32(typescript@5.7.3) + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@feathersjs/rest-client': 5.0.32 + '@feathersjs/socketio-client': 5.0.32 + transitivePeerDependencies: + - typescript + + '@feathersjs/commons@1.4.4': {} + + '@feathersjs/commons@5.0.32': {} + + '@feathersjs/errors@3.2.0': + dependencies: + debug: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@feathersjs/errors@5.0.32': {} + + '@feathersjs/express@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/authentication': 5.0.32(typescript@5.7.3) + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@feathersjs/transport-commons': 5.0.32 + '@types/compression': 1.7.5 + '@types/cors': 2.8.17 + '@types/express': 4.17.21 + '@types/express-serve-static-core': 4.19.6 + compression: 1.8.0 + cors: 2.8.5 + express: 4.21.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@feathersjs/feathers@5.0.32': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/hooks': 0.9.0 + events: 3.3.0 + + '@feathersjs/hooks@0.9.0': {} + + '@feathersjs/memory@5.0.32': + dependencies: + '@feathersjs/adapter-commons': 5.0.32 + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + sift: 17.1.3 + + '@feathersjs/rest-client@5.0.32': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@types/superagent': 8.1.9 + qs: 6.14.0 + + '@feathersjs/schema@5.0.32(typescript@5.7.3)': + dependencies: + '@feathersjs/adapter-commons': 5.0.32 + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@feathersjs/hooks': 0.9.0 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + json-schema-to-ts: 3.1.1 + typescript: 5.7.3 + + '@feathersjs/socketio-client@5.0.32': + dependencies: + '@feathersjs/feathers': 5.0.32 + '@feathersjs/transport-commons': 5.0.32 + + '@feathersjs/socketio@5.0.32': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/feathers': 5.0.32 + '@feathersjs/transport-commons': 5.0.32 + socket.io: 4.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@feathersjs/transport-commons@5.0.32': + dependencies: + '@feathersjs/commons': 5.0.32 + '@feathersjs/errors': 5.0.32 + '@feathersjs/feathers': 5.0.32 + encodeurl: 2.0.0 + lodash: 4.17.21 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + + '@iconify-json/simple-icons@1.2.24': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mongodb-js/saslprep@1.2.0': + dependencies: + sparse-bitfield: 3.0.3 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + + '@nolyfill/is-core-module@1.0.39': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/rollup-android-arm-eabi@4.34.6': + optional: true + + '@rollup/rollup-android-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.6': + optional: true + + '@rollup/rollup-darwin-x64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.6': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.6': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.6': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.6': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.6': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.6': + optional: true + + '@rtsao/scc@1.1.0': + optional: true + + '@shikijs/core@2.3.2': + dependencies: + '@shikijs/engine-javascript': 2.3.2 + '@shikijs/engine-oniguruma': 2.3.2 + '@shikijs/types': 2.3.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@2.3.2': + dependencies: + '@shikijs/types': 2.3.2 + '@shikijs/vscode-textmate': 10.0.1 + oniguruma-to-es: 3.1.0 + + '@shikijs/engine-oniguruma@2.3.2': + dependencies: + '@shikijs/types': 2.3.2 + '@shikijs/vscode-textmate': 10.0.1 + + '@shikijs/langs@2.3.2': + dependencies: + '@shikijs/types': 2.3.2 + + '@shikijs/themes@2.3.2': + dependencies: + '@shikijs/types': 2.3.2 + + '@shikijs/transformers@2.3.2': + dependencies: + '@shikijs/core': 2.3.2 + '@shikijs/types': 2.3.2 + + '@shikijs/types@2.3.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.1': {} + + '@sinclair/typebox@0.27.8': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@stem/nesthydrationjs@0.4.0': + dependencies: + lodash: 4.13.1 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.13.2 + + '@types/compression@1.7.5': + dependencies: + '@types/express': 4.17.21 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.13.2 + + '@types/cookiejar@2.1.5': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.13.2 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/doctrine@0.0.9': {} + + '@types/estree@1.0.6': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.13.2 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/graphql@0.11.8': + optional: true + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': + optional: true + + '@types/jsonwebtoken@9.0.8': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.13.2 + + '@types/linkify-it@5.0.0': {} + + '@types/lodash@4.17.15': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/methods@1.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.13.2': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.13.2 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.13.2 + '@types/send': 0.17.4 + + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.13.2 + form-data: 4.0.1 + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 22.13.2 + '@types/webidl-conversions': 7.0.3 + + '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + eslint: 9.20.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + debug: 4.4.0 + eslint: 9.20.1 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.24.0': + dependencies: + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 + + '@typescript-eslint/type-utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.20.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.24.0': {} + + '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + eslint: 9.20.1 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.24.0': + dependencies: + '@typescript-eslint/types': 8.24.0 + eslint-visitor-keys: 4.2.0 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.2))(vue@3.5.13(typescript@5.7.3))': + dependencies: + vite: 5.4.14(@types/node@22.13.2) + vue: 3.5.13(typescript@5.7.3) + + '@vitest/coverage-v8@3.0.5(vitest@1.6.1(@types/node@22.13.2))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + debug: 4.4.0 + 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.8.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 1.6.1(@types/node@22.13.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.8 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.8 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.2 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/devtools-api@7.7.2': + dependencies: + '@vue/devtools-kit': 7.7.2 + + '@vue/devtools-kit@7.7.2': + dependencies: + '@vue/devtools-shared': 7.7.2 + birpc: 0.2.19 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.7.2': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} + + '@vueuse/core@12.5.0(typescript@5.7.3)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 12.5.0 + '@vueuse/shared': 12.5.0(typescript@5.7.3) + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.5.0(focus-trap@7.6.4)(typescript@5.7.3)': + dependencies: + '@vueuse/core': 12.5.0(typescript@5.7.3) + '@vueuse/shared': 12.5.0(typescript@5.7.3) + vue: 3.5.13(typescript@5.7.3) + optionalDependencies: + focus-trap: 7.6.4 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.5.0': {} + + '@vueuse/shared@12.5.0(typescript@5.7.3)': + dependencies: + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - typescript + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@5.5.2: + dependencies: + co: 4.6.0 + fast-deep-equal: 1.1.0 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.3.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.20.2: + dependencies: + '@algolia/client-abtesting': 5.20.2 + '@algolia/client-analytics': 5.20.2 + '@algolia/client-common': 5.20.2 + '@algolia/client-insights': 5.20.2 + '@algolia/client-personalization': 5.20.2 + '@algolia/client-query-suggestions': 5.20.2 + '@algolia/client-search': 5.20.2 + '@algolia/ingestion': 1.20.2 + '@algolia/monitoring': 1.20.2 + '@algolia/recommend': 5.20.2 + '@algolia/requester-browser-xhr': 5.20.2 + '@algolia/requester-fetch': 5.20.2 + '@algolia/requester-node-http': 5.20.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + optional: true + + array-flatten@1.1.1: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 + optional: true + + array.prototype.findlastindex@1.2.5: + 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.1.1 + es-shim-unscopables: 1.1.0 + optional: true + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + optional: true + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + optional: true + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + optional: true + + assertion-error@1.1.0: {} + + async-function@1.0.0: + optional: true + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + optional: true + + balanced-match@1.0.2: {} + + base64id@2.0.0: {} + + bcryptjs@2.4.3: {} + + birpc@0.2.19: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bson@5.5.1: {} + + buffer-equal-constant-time@1.0.1: {} + + bundle-require@5.1.0(esbuild@0.24.2): + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + optional: true + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + ccount@2.0.1: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + co@4.6.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + optional: true + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.1.0: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + deprecate@1.1.1: {} + + deprecated-decorator@0.1.6: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff-sequences@29.6.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + optional: true + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + emoji-regex-xs@1.0.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.17 + '@types/node': 22.13.2 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + es-abstract@1.23.9: + 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 + 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.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.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + 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.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + optional: true + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + optional: true + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + optional: true + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + optional: true + + esbuild@0.21.5: + 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 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.0.1(eslint@9.20.1): + dependencies: + eslint: 9.20.1 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.1 + eslint: 9.20.1 + fast-glob: 3.3.3 + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.1) + eslint-plugin-import-x: 4.6.1(eslint@9.20.1)(typescript@5.7.3) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1))(eslint@9.20.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + eslint: 9.20.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1) + transitivePeerDependencies: + - supports-color + optional: true + + eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3): + dependencies: + '@types/doctrine': 0.0.9 + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + debug: 4.4.0 + doctrine: 3.0.0 + enhanced-resolve: 5.18.1 + eslint: 9.20.1 + eslint-import-resolver-node: 0.3.9 + get-tsconfig: 4.10.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + stable-hash: 0.0.4 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.20.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1))(eslint@9.20.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + optional: true + + eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.20.1))(eslint@9.20.1)(prettier@3.5.0): + dependencies: + eslint: 9.20.1 + prettier: 3.5.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 10.0.1(eslint@9.20.1) + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.20.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.11.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.20.0 + '@eslint/plugin-kit': 0.2.5 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@1.1.0: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + feathers-hooks-common@4.5.6: + dependencies: + '@feathers-plus/batch-loader': 0.3.0 + '@feathersjs/commons': 1.4.4 + '@feathersjs/errors': 3.2.0 + ajv: 5.5.2 + debug: 3.1.0 + process: 0.11.10 + traverse: 0.6.6 + transitivePeerDependencies: + - supports-color + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + focus-trap@7.6.4: + dependencies: + tabbable: 6.2.0 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + optional: true + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + optional: true + + functions-have-names@1.2.3: + optional: true + + generatorics@1.1.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + optional: true + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-relay@0.5.5(graphql@0.11.7): + dependencies: + graphql: 0.11.7 + + graphql-resolvers-ast@1.4.0: {} + + graphql-tools@2.0.0(graphql@0.11.7): + dependencies: + deprecated-decorator: 0.1.6 + graphql: 0.11.7 + uuid: 3.4.0 + optionalDependencies: + '@types/graphql': 0.11.8 + + graphql-type-json@0.1.4(graphql@0.11.7): + dependencies: + graphql: 0.11.7 + + graphql@0.11.7: + dependencies: + iterall: 1.1.3 + + graphql@16.10.0: {} + + has-bigints@1.1.0: + optional: true + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + optional: true + + hash-string@1.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hookable@5.5.3: {} + + html-escaper@2.0.2: {} + + html-void-elements@3.0.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@5.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + optional: true + + interpret@1.4.0: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ipaddr.js@1.9.1: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + optional: true + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + optional: true + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + optional: true + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + optional: true + + is-bun-module@1.3.0: + dependencies: + semver: 7.7.1 + + is-callable@1.2.7: + optional: true + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + optional: true + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + optional: true + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + optional: true + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: + optional: true + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + optional: true + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + optional: true + + is-set@2.0.3: + optional: true + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + optional: true + + is-stream@3.0.0: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + optional: true + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + optional: true + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + optional: true + + is-weakmap@2.0.2: + optional: true + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.3 + optional: true + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + optional: true + + is-what@4.1.16: {} + + isarray@2.0.5: + optional: true + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterall@1.1.3: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + join-monster-graphql-tools-adapter@0.0.2(graphql-tools@2.0.0(graphql@0.11.7))(join-monster@2.0.15(graphql@0.11.7)): + dependencies: + graphql-tools: 2.0.0(graphql@0.11.7) + join-monster: 2.0.15(graphql@0.11.7) + + join-monster@2.0.15(graphql@0.11.7): + dependencies: + '@stem/nesthydrationjs': 0.4.0 + debug: 3.1.0 + deprecate: 1.1.1 + generatorics: 1.1.0 + graphql: 0.11.7 + graphql-relay: 0.5.5(graphql@0.11.7) + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + joycon@3.1.1: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.26.7 + ts-algebra: 2.0.0 + + json-schema-traverse@0.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + optional: true + + jsonwebtoken@9.0.2: + 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.1.1 + ms: 2.1.3 + semver: 7.7.1 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + 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.merge@4.6.1: {} + + lodash.merge@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash.sortby@4.7.0: {} + + lodash@4.13.1: {} + + lodash@4.17.21: {} + + long-timeout@0.1.1: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + lru-cache@4.1.1: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.8 + '@babel/types': 7.26.8 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.1 + + mark.js@8.11.1: {} + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + media-typer@0.3.0: {} + + memory-pager@1.5.0: + optional: true + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minisearch@7.1.1: {} + + mitt@3.0.1: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + mongo-sql@4.0.2: {} + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb@5.9.2: + dependencies: + bson: 5.5.1 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.4 + optionalDependencies: + '@mongodb-js/saslprep': 1.2.0 + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neotraverse@0.6.18: {} + + npm-check-updates@17.1.14: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: + optional: true + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + optional: true + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + optional: true + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + optional: true + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + optional: true + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + oniguruma-to-es@3.1.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.0.1 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + optional: true + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@1.1.1: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pirates@4.0.6: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + possible-typed-array-names@1.1.0: + optional: true + + postcss-load-config@6.0.1(postcss@8.5.2): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.2 + + postcss@8.5.2: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.25.4: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.0: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process@0.11.10: {} + + property-information@6.5.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pseudomap@1.0.2: {} + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-is@18.3.1: {} + + readdirp@4.1.1: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.10 + + reflect.getprototypeof@1.0.10: + 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.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + optional: true + + regenerator-runtime@0.14.1: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + 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 + optional: true + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rollup@4.34.6: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.6 + '@rollup/rollup-android-arm64': 4.34.6 + '@rollup/rollup-darwin-arm64': 4.34.6 + '@rollup/rollup-darwin-x64': 4.34.6 + '@rollup/rollup-freebsd-arm64': 4.34.6 + '@rollup/rollup-freebsd-x64': 4.34.6 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 + '@rollup/rollup-linux-arm-musleabihf': 4.34.6 + '@rollup/rollup-linux-arm64-gnu': 4.34.6 + '@rollup/rollup-linux-arm64-musl': 4.34.6 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 + '@rollup/rollup-linux-riscv64-gnu': 4.34.6 + '@rollup/rollup-linux-s390x-gnu': 4.34.6 + '@rollup/rollup-linux-x64-gnu': 4.34.6 + '@rollup/rollup-linux-x64-musl': 4.34.6 + '@rollup/rollup-win32-arm64-msvc': 4.34.6 + '@rollup/rollup-win32-ia32-msvc': 4.34.6 + '@rollup/rollup-win32-x64-msvc': 4.34.6 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + optional: true + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + optional: true + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + optional: true + + safer-buffer@2.1.2: {} + + search-insights@2.17.3: {} + + semver@6.3.1: + optional: true + + semver@7.7.1: {} + + send@0.19.0: + 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 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + optional: true + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + optional: true + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + optional: true + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@2.3.2: + dependencies: + '@shikijs/core': 2.3.2 + '@shikijs/engine-javascript': 2.3.2 + '@shikijs/engine-oniguruma': 2.3.2 + '@shikijs/langs': 2.3.2 + '@shikijs/themes': 2.3.2 + '@shikijs/types': 2.3.2 + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + + short-hash@1.0.0: + dependencies: + hash-string: 1.0.0 + + shx@0.3.4: + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sift@17.1.3: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sort-keys@2.0.0: + dependencies: + is-plain-obj: 1.1.0 + + source-map-js@1.2.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + space-separated-tokens@2.0.2: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + optional: true + + speakingurl@14.0.1: {} + + sprintf-js@1.1.3: {} + + stable-hash@0.0.4: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.8.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + optional: true + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + optional: true + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + optional: true + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: + optional: true + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + tabbable@6.2.0: {} + + tapable@2.2.1: {} + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@0.8.4: {} + + tinyrainbow@2.0.0: {} + + tinyspy@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + traverse@0.6.6: {} + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + ts-algebra@2.0.0: {} + + ts-api-utils@2.0.1(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + optional: true + + tslib@2.8.1: {} + + tsup@8.3.6(postcss@8.5.2)(typescript@5.7.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.24.2 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.2) + resolve-from: 5.0.0 + rollup: 4.34.6 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.10 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.2 + typescript: 5.7.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + optional: true + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + optional: true + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + optional: true + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + optional: true + + typescript-eslint@8.24.0(eslint@9.20.1)(typescript@5.7.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + eslint: 9.20.1 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + typescript@5.7.3: {} + + ufo@1.5.4: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + optional: true + + undici-types@6.20.0: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utils-merge@1.0.1: {} + + uuid@11.0.5: {} + + uuid@3.4.0: {} + + vary@1.1.2: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@1.6.1(@types/node@22.13.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.14(@types/node@22.13.2) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.14(@types/node@22.13.2): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.2 + rollup: 4.34.6 + optionalDependencies: + '@types/node': 22.13.2 + fsevents: 2.3.3 + + vitepress@1.6.3(@algolia/client-search@5.20.2)(@types/node@22.13.2)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.24 + '@shikijs/core': 2.3.2 + '@shikijs/transformers': 2.3.2 + '@shikijs/types': 2.3.2 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.13.2))(vue@3.5.13(typescript@5.7.3)) + '@vue/devtools-api': 7.7.2 + '@vue/shared': 3.5.13 + '@vueuse/core': 12.5.0(typescript@5.7.3) + '@vueuse/integrations': 12.5.0(focus-trap@7.6.4)(typescript@5.7.3) + focus-trap: 7.6.4 + mark.js: 8.11.1 + minisearch: 7.1.1 + shiki: 2.3.2 + vite: 5.4.14(@types/node@22.13.2) + vue: 3.5.13(typescript@5.7.3) + optionalDependencies: + postcss: 8.5.2 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vitest@1.6.1(@types/node@22.13.2): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.14(@types/node@22.13.2) + vite-node: 1.6.1(@types/node@22.13.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.13.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + + webidl-conversions@4.0.2: {} + + webidl-conversions@7.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + optional: true + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + optional: true + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + optional: true + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + optional: true + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + yallist@2.1.2: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zwitch@2.0.4: {} diff --git a/src/hooks/fgraphql/fgraphql.ts b/src/hooks/fgraphql/fgraphql.ts index 3fec32cb..54ee8b10 100755 --- a/src/hooks/fgraphql/fgraphql.ts +++ b/src/hooks/fgraphql/fgraphql.ts @@ -1,5 +1,4 @@ import type { Application, HookContext, Query } from '@feathersjs/feathers'; -import makeDebug from 'debug'; import type { parse, GraphQLFieldResolver } from 'graphql'; import type { SyncContextFunction } from '../../types'; import { getItems, replaceItems } from '../../utils'; @@ -34,7 +33,6 @@ export interface FGraphQLHookOptions { parse: typeof parse; } -const debug = makeDebug('fgraphql'); const graphqlActions = ['Query', 'Mutation', 'Subscription']; /** @@ -42,7 +40,6 @@ const graphqlActions = ['Query', 'Mutation', 'Subscription']; * @see https://medium.com/@eddyystop/38faee75dd1 */ export function fgraphql(options1: FGraphQLHookOptions) { - debug('init call'); const { parse, recordType, resolvers, runTime, query } = options1; let { schema } = options1; @@ -58,7 +55,6 @@ export function fgraphql(options1: FGraphQL ...(options1.options || {}), }; - // @ts-ignore schema = isFunction(schema) ? schema() : schema; if (!isObject(schema) && !isString(schema)) { @@ -76,9 +72,7 @@ export function fgraphql(options1: FGraphQL throwError(`recordType is typeof ${typeof recordType} rather than string. (fgraphql)`, 103); } - // @ts-ignore if (!isArray(options.extraAuthProps)) { - // @ts-ignore throwError( `option extraAuthProps is typeof ${typeof options.extraAuthProps} rather than array. (fgraphql)`, 105, @@ -86,22 +80,16 @@ export function fgraphql(options1: FGraphQL } const feathersSdl = isObject(schema) ? schema : convertSdlToFeathersSchemaObject(schema, parse); - debug('schema now in internal form'); // Return the hook. return (context: H) => { const contextParams = context.params; - // @ts-ignore const optSkipHookWhen = options.skipHookWhen; const skipHookWhen = isFunction(optSkipHookWhen) ? optSkipHookWhen(context) : optSkipHookWhen; - debug( - `\n.....hook called. type ${context.type} method ${context.method} resolved skipHookWhen ${skipHookWhen}`, - ); if (context.params.$populate) return context; // populate or fastJoin are running if (skipHookWhen) return context; - // @ts-ignore const q = isFunction(query) ? query(context) : query; if (!isObject(q)) { @@ -109,23 +97,16 @@ export function fgraphql(options1: FGraphQL } if (!ourResolvers) { - // @ts-ignore ourResolvers = resolvers(context.app, runTime); - debug(`ourResolvers has Types ${Object.keys(ourResolvers)}`); } if (!ourResolvers[recordType]) { throwError(`recordType ${recordType} not found in resolvers. (fgraphql)`, 104); } - // @ts-ignore options.inclAllFields = contextParams.provider - ? // @ts-ignore - options.inclAllFieldsClient - : // @ts-ignore - options.inclAllFieldsServer; - // @ts-ignore - debug(`inclAllField ${options.inclAllFields}`); + ? options.inclAllFieldsClient + : options.inclAllFieldsServer; // Build content parameter passed to resolver functions. const resolverContent: Record = { @@ -137,7 +118,6 @@ export function fgraphql(options1: FGraphQL cache: {}, }; - // @ts-ignore (options.extraAuthProps || []).forEach((name: any) => { if (name in contextParams && !(name in resolverContent)) { resolverContent[name] = contextParams[name]; @@ -155,7 +135,6 @@ export function fgraphql(options1: FGraphQL // Populate data. const recs = getItems(context); - // @ts-ignore return processRecords(store, q, recs, recordType).then(() => { replaceItems(context, recs); return context; @@ -168,8 +147,6 @@ function processRecords(store: any, query: any, recs: any, type: any, depth = 0) if (!recs) return; // Catch no data to populate. recs = isArray(recs) ? recs : [recs]; - debug(`\nvvvvvvvvvv enter ${depth}`); - debug(`processRecords depth ${depth} #recs ${recs.length} Type ${type}`); const storeOurResolversType = store.ourResolvers[type]; if (!isObject(storeOurResolversType)) { @@ -185,14 +162,11 @@ function processRecords(store: any, query: any, recs: any, type: any, depth = 0) return Promise.all( recs.map((rec: any, j: any) => processRecord(store, query, depth, rec, type, j)), - ).then(() => { - debug(`^^^^^^^^^^ exit ${depth}\n`); - }); + ); } // Process the a record. function processRecord(store: any, query: any, depth: any, rec: any, type: any, j: any): any { - debug(`processRecord rec# ${j} typeof ${typeof rec} Type ${type}`); if (!rec) return; // Catch any null values from resolvers. const queryPropNames = Object.keys(query); @@ -217,7 +191,6 @@ function processRecord(store: any, query: any, depth: any, rec: any, type: any, ), ).then(() => { // Retain only record fields selected - debug(`field names found ${recFieldNamesInQuery} joined names ${joinedNamesInQuery}`); if ( recFieldNamesInQuery.length || !store.options.inclAllFields || @@ -251,8 +224,6 @@ function processRecordQuery( j: any, i: any, ): any { - debug(`\nprocessRecordQuery rec# ${j} Type ${type} field# ${i} name ${fieldName}`); - // One way to include/exclude rec fields is to give their names a falsey value. // _args and _none are not record field names but special purpose if (query[fieldName] && fieldName !== '_args' && fieldName !== '_none') { @@ -260,7 +231,6 @@ function processRecordQuery( joinedNamesInQuery.push(fieldName); return processRecordFieldResolver(store, query, depth, rec, fieldName, type); } else { - debug('is not resolver call'); recFieldNamesInQuery.push(fieldName); } } @@ -275,7 +245,6 @@ function processRecordFieldResolver( fieldName: any, type: any, ) { - debug('is resolver call'); const ourQuery = store.feathersSdl[type][fieldName]; const ourResolver = store.ourResolvers[type][fieldName]; @@ -287,37 +256,21 @@ function processRecordFieldResolver( } const args = isObject(query[fieldName]) ? query[fieldName]._args : undefined; - debug(`resolver listType ${ourQuery.listType} args ${JSON.stringify(args)}`); // Call resolver function. return Promise.resolve(ourResolver(rec, args || {}, store.resolverContent)).then( async rawResult => { - debug( - `resolver returned typeof ${ - isArray(rawResult) ? `array #recs ${rawResult.length}` : typeof rawResult - }`, - ); - // Convert rawResult to query requirements. const result = convertResolverResult(rawResult, ourQuery, fieldName, type); - if (isArray(rawResult !== isArray(result) || typeof rawResult !== typeof result)) { - debug( - `.....resolver result converted to typeof ${ - isArray(result) ? `array #recs ${result.length}` : typeof result - }`, - ); - } + rec[fieldName] = result; const nextType = ourQuery.typeof; - debug(`Type ${type} fieldName ${fieldName} next Type ${nextType}`); // Populate returned records if their query defn has more fields or Types. // Ignore resolvers returning base values like string. if (store.ourResolvers[nextType] && isObject(query[fieldName])) { return processRecords(store, query[fieldName], result, nextType, depth + 1); - } else { - debug('no population of results required'); } }, ); @@ -438,7 +391,6 @@ function convertFieldDefinitionType(fieldDefinitionType: any, errDesc: any, conv function throwError(msg: any, code: any) { const err = new Error(msg); - // @ts-ignore err.code = code; throw err; } diff --git a/src/hooks/populate/populate-1deep-1child.test.ts b/src/hooks/populate/populate-1deep-1child.test.ts index 37d9a03c..ca5c8d69 100755 --- a/src/hooks/populate/populate-1deep-1child.test.ts +++ b/src/hooks/populate/populate-1deep-1child.test.ts @@ -543,7 +543,7 @@ let provider: any; ); }); - it('throws if no parentField option in related field join', () => { + it.skip('throws if no parentField option in related field join', async () => { const hook = clone(hookAfter); hook.app = app; // app is a func and wouldn't be cloned @@ -567,9 +567,12 @@ let provider: any; ); }); - it('throws if no parentField defined in related field join', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned + it.skip('throws if no parentField defined in related field join', () => { + const hook = { + ...clone(hookAfter), + app, + }; + delete hook.result.postId; const schema = { diff --git a/src/hooks/populate/populate.ts b/src/hooks/populate/populate.ts index cc50951c..9f540801 100755 --- a/src/hooks/populate/populate.ts +++ b/src/hooks/populate/populate.ts @@ -86,7 +86,6 @@ export function populate(options: PopulateO profile: false, }; - // @ts-ignore if (context.params._populate === 'skip') { // this service call made from another populate return context; diff --git a/src/hooks/set-dispatch/set-dispatch.ts b/src/hooks/set-dispatch/set-dispatch.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/hooks/set-field/set-field.ts b/src/hooks/set-field/set-field.ts index 1dc17fcc..d3d374c9 100644 --- a/src/hooks/set-field/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -1,7 +1,6 @@ import _get from 'lodash/get.js'; import _setWith from 'lodash/setWith.js'; import _clone from 'lodash/clone.js'; -import _debug from 'debug'; import { checkContext } from '../../utils'; import { Forbidden } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; @@ -12,8 +11,6 @@ export interface SetFieldOptions { allowUndefined?: boolean; } -const debug = _debug('feathers-hooks-common/setField'); - /** * The `setField` hook allows to set a field on the hook context based on the value of another field on the hook context. * @see https://hooks-common.feathersjs.com/hooks.html#setfield @@ -36,15 +33,12 @@ export function setField({ if (value === undefined) { if (!params.provider || allowUndefined) { - debug(`Skipping call with value ${from} not set`); return context; } throw new Forbidden(`Expected field ${as} not available`); } - debug(`Setting value '${value}' from '${from}' as '${as}'`); - return _setWith(context, as, value, _clone); }; } diff --git a/src/hooks/stash-before/stash-before.test.ts b/src/hooks/stash-before/stash-before.test.ts index 6c702b75..6a49b18d 100755 --- a/src/hooks/stash-before/stash-before.test.ts +++ b/src/hooks/stash-before/stash-before.test.ts @@ -1,5 +1,5 @@ import { assert, expect } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; +import { Application, feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; import { stashBefore } from './stash-before'; import { clone } from '../../common'; @@ -18,11 +18,11 @@ let store; let finalParams: any; let innerCallParams: any; -function services(app: any) { +function services(app: Application) { app.configure(users); } -function users(app: any) { +function users(app: Application) { store = clone(storeInit); app.use( @@ -51,8 +51,8 @@ function users(app: any) { }); } -describe('services stash-before', () => { - let app; +describe('stash-before', () => { + let app: Application<{ users: MemoryService }>; let users: any; beforeEach(() => { @@ -63,47 +63,57 @@ describe('services stash-before', () => { users = app.service('users'); }); - ['get', 'update', 'patch', 'remove'].forEach(method => { - it(`stashes on ${method}`, () => { - return users[method](0, {}).then(() => { - assert.deepEqual(finalParams.before, storeInit[0]); - }); - }); + it(`stashes on 'update'`, async () => { + await users.update(0, {}); + + assert.deepEqual(finalParams.before, storeInit[0]); + }); + + it(`stashes on 'patch'`, async () => { + await users.patch(0, {}); + + assert.deepEqual(finalParams.before, storeInit[0]); + }); + + it(`stashes on 'remove'`, async () => { + await users.remove(0); + + assert.deepEqual(finalParams.before, storeInit[0]); }); - it('Do not stash when query is used in remove', () => { - return users.remove(null, { query: {} }).then(() => { - assert.notProperty(finalParams, 'before'); - }); + it("throws on 'create'", async () => { + await expect(users.create({})).rejects.toThrow(); }); - ['create', 'find'].forEach(method => { - it(`throws on ${method}`, async () => { - await expect(users[method]({})).rejects.toThrow(); - }); + it("throws on 'find'", async () => { + await expect(users.find({})).rejects.toThrow(); + }); + + it("throws on 'get'", async () => { + await expect(users.get(0)).rejects.toThrow(); + }); + + it('stashes on patch with custom params', async () => { + await users.patch(0, {}, { provider: 'socketio', eyecatcher: -1 }); + + assert.equal(finalParams.provider, 'socketio'); + assert.equal(finalParams.eyecatcher, -1); + + assert.equal(innerCallParams.provider, 'socketio'); + assert.property(innerCallParams, 'eyecatcher'); }); - it('stashes on get with original params', () => { - return users.get(0, { provider: 'socketio', eyecatcher: -1 }).then(() => { - assert.equal(finalParams.provider, 'socketio'); - assert.equal(finalParams.eyecatcher, -1); + it('stashes multi patch', async () => { + const items = [storeInit[0], storeInit[1], storeInit[2]]; + await users.patch(null, { key: 'c' }, { query: { id: { $in: items.map(x => x.id) } } }); - assert.equal(innerCallParams.provider, 'socketio'); - assert.equal(innerCallParams.eyecatcher, -1); - assert.notProperty(innerCallParams, 'authenticated'); - assert.notProperty(innerCallParams, 'user'); - }); + assert.deepEqual(finalParams.before, items); }); - it('stashes on patch with custom params', () => { - return users.patch(0, {}, { provider: 'socketio', eyecatcher: -1 }).then(() => { - assert.equal(finalParams.provider, 'socketio'); - assert.equal(finalParams.eyecatcher, -1); + it('stashes multi remove', async () => { + const items = [storeInit[0], storeInit[1], storeInit[2]]; + await users.remove(null, { query: { id: { $in: items.map(x => x.id) } } }); - assert.equal(innerCallParams.provider, 'socketio'); - assert.notProperty(innerCallParams, 'eyecatcher'); - assert.property(innerCallParams, 'authenticated'); - assert.property(innerCallParams, 'user'); - }); + assert.deepEqual(finalParams.before, items); }); }); diff --git a/src/hooks/stash-before/stash-before.ts b/src/hooks/stash-before/stash-before.ts index 87b3ca45..2cd8a626 100755 --- a/src/hooks/stash-before/stash-before.ts +++ b/src/hooks/stash-before/stash-before.ts @@ -1,4 +1,3 @@ -import { BadRequest } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; import { checkContext } from '../../utils'; @@ -10,41 +9,27 @@ export function stashBefore(fieldName?: str const beforeField = fieldName || 'before'; return (context: H) => { - checkContext(context, 'before', ['get', 'update', 'patch', 'remove'], 'stashBefore'); - - // @ts-ignore if (context.params.disableStashBefore) { return context; } - if ((context.id === null || context.id === undefined) && !context.params.query) { - throw new BadRequest('Id is required. (stashBefore)'); - } + checkContext(context, ['before', 'around'], ['update', 'patch', 'remove'], 'stashBefore'); - const params = - context.method === 'get' - ? context.params - : { - provider: context.params.provider, - // @ts-ignore - authenticated: context.params.authenticated, - // @ts-ignore - user: context.params.user, - }; + const isMulti = context.id == null; - return context.service - .get(context.id, { - ...params, - // @ts-ignore - query: params.query || {}, - // @ts-ignore - disableStashBefore: true, - }) - .then((data: any) => { - // @ts-ignore - context.params[beforeField] = JSON.parse(JSON.stringify(data)); + const params = { + ...context.params, + disableStashBefore: true, + ...(isMulti ? { paginate: false } : {}), + }; + + return (!isMulti ? context.service.get(context.id, params) : context.service.find(params)) + .then((result: any) => { + context.params[beforeField] = result; return context; }) - .catch(() => context); + .catch(() => { + return context; + }); }; } diff --git a/src/internal.utils.ts b/src/internal.utils.ts new file mode 100644 index 00000000..f8d032c6 --- /dev/null +++ b/src/internal.utils.ts @@ -0,0 +1,3 @@ +export const hasOwnProperty = (obj: Record, ...keys: string[]): boolean => { + return keys.some(x => Object.prototype.hasOwnProperty.call(obj, x)); +}; diff --git a/src/utils/allows-multi/allows-multi.ts b/src/utils/allows-multi/allows-multi.ts new file mode 100644 index 00000000..a0052479 --- /dev/null +++ b/src/utils/allows-multi/allows-multi.ts @@ -0,0 +1,11 @@ +import { HookContext } from '@feathersjs/feathers'; +import { isMulti } from '../is-multi/is-multi'; + +export const allowsMulti = (context: H): boolean => { + const { service, method } = context; + if (!service.allowsMulti || !isMulti(context) || method === 'find') { + return true; + } + + return service.allowsMulti(method); +}; diff --git a/src/utils/get-items/get-items.ts b/src/utils/get-items/get-items.ts index 72750af4..f3a7591f 100755 --- a/src/utils/get-items/get-items.ts +++ b/src/utils/get-items/get-items.ts @@ -8,10 +8,8 @@ import type { HookContext } from '@feathersjs/feathers'; * @deprecated Use `getDataIsArray` or `getResultIsArray` instead. */ export function getItems(context: H): any { - // @ts-ignore if (context.params && context.params._actOn === 'dispatch') return context.dispatch; const items = context.type === 'before' ? context.data : context.result; - // @ts-ignore return items && context.method === 'find' ? items.data || items : items; } diff --git a/src/utils/get-paginate/get-paginate.test.ts b/src/utils/get-paginate/get-paginate.test.ts new file mode 100644 index 00000000..43891583 --- /dev/null +++ b/src/utils/get-paginate/get-paginate.test.ts @@ -0,0 +1,73 @@ +import { HookContext } from '@feathersjs/feathers'; +import { getPaginate } from './get-paginate'; + +describe('getPaginate', () => { + it('returns service.options.paginate', function () { + const serviceOptions = { + paginate: { + default: 10, + max: 50, + }, + }; + + const paginate = getPaginate({ + params: {}, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, { default: 10, max: 50 }); + }); + + it('returns undefined for params.paginate: false', function () { + const serviceOptions = { + paginate: { + default: 10, + max: 50, + }, + }; + + const paginate = getPaginate({ + params: { paginate: false }, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, undefined); + }); + + it('returns context.adapter.paginate over service.options.paginate', function () { + const serviceOptions = { + paginate: { + default: 10, + max: 50, + }, + }; + + const paginate = getPaginate({ + params: { adapter: { paginate: { default: 20, max: 100 } } }, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, { default: 20, max: 100 }); + }); + + it('returns undefined for no paginate', function () { + const serviceOptions = { + paginate: false, + }; + + const paginate = getPaginate({ + params: {}, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, undefined); + }); +}); diff --git a/src/utils/get-paginate/get-paginate.ts b/src/utils/get-paginate/get-paginate.ts new file mode 100644 index 00000000..6e59fdc4 --- /dev/null +++ b/src/utils/get-paginate/get-paginate.ts @@ -0,0 +1,29 @@ +import type { PaginationOptions } from '@feathersjs/adapter-commons'; +import type { HookContext } from '@feathersjs/feathers'; +import { hasOwnProperty } from '../../internal.utils'; + +/** + * util to get paginate options from context + * 1. it uses `context.params.paginate` if it exists + * 2. it uses `service.options.paginate` if it exists + * 3. it uses `context.params.adapter` if it exists + */ +export const getPaginate = ( + context: H, +): PaginationOptions | undefined => { + if (hasOwnProperty(context.params, 'paginate')) { + return (context.params.paginate as PaginationOptions) || undefined; + } + + if (context.params.paginate === false) { + return undefined; + } + let options = context.service?.options || {}; + + options = { + ...options, + ...context.params.adapter, + }; + + return options.paginate || undefined; +}; diff --git a/src/utils/index.ts b/src/utils/index.ts index 8e5c39d8..3c73911b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -18,3 +18,9 @@ export * from './replace-items/replace-result'; export * from './some/some'; export * from './run-hook/run-hook'; + +export * from './allows-multi/allows-multi'; +export * from './get-paginate/get-paginate'; +export * from './is-multi/is-multi'; +export * from './is-paginated/is-paginated'; +export * from './skip-result/skip-result'; diff --git a/src/utils/is-multi/is-multi.test.ts b/src/utils/is-multi/is-multi.test.ts new file mode 100644 index 00000000..2da57afa --- /dev/null +++ b/src/utils/is-multi/is-multi.test.ts @@ -0,0 +1,49 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { isMulti } from './is-multi'; + +describe('isMulti', () => { + it('returns true', function () { + const makeContext = (type: string, method: string) => { + const context = { + method, + type, + } as HookContext; + if (method === 'create') { + context.data = []; + } + if (method === 'patch' || method === 'remove') { + context.id = null as any; + } + return context; + }; + ['before', 'after', 'around'].forEach(type => { + ['find', 'create', 'patch', 'remove'].forEach(method => { + const context = makeContext(type, method); + assert.strictEqual(isMulti(context), true, `'${type}:${method}': returns true`); + }); + }); + }); + + it('returns false', function () { + const makeContext = (type: string, method: string) => { + const context = { + method, + type, + } as HookContext; + if (method === 'create') { + context.data = {}; + } + if (method === 'patch' || method === 'remove' || method === 'update') { + context.id = 0; + } + + return context; + }; + ['before', 'after', 'around'].forEach(type => { + ['get', 'create', 'update', 'patch', 'remove'].forEach(method => { + const context = makeContext(type, method); + assert.strictEqual(isMulti(context), false, `'${type}:${method}': returns false`); + }); + }); + }); +}); diff --git a/src/utils/is-multi/is-multi.ts b/src/utils/is-multi/is-multi.ts new file mode 100644 index 00000000..44d513ab --- /dev/null +++ b/src/utils/is-multi/is-multi.ts @@ -0,0 +1,25 @@ +import type { HookContext } from '@feathersjs/feathers'; + +/** + * util to check if a hook is a multi hook: + * - find: true + * - get: false + * - create: `context.data` is an array + * - update: false + * - patch: `context.id == null` + * - remove: `context.id == null` + */ +export const isMulti = (context: H): boolean => { + const { method } = context; + if (method === 'find') { + return true; + } else if (method === 'patch' || method === 'remove') { + return context.id == null; + } else if (method === 'create') { + return Array.isArray(context.data); + } else if (method === 'get' || method === 'update') { + return false; + } + + return false; +}; diff --git a/src/utils/is-not/is-not.ts b/src/utils/is-not/is-not.ts index 7556adc5..e5b38a60 100755 --- a/src/utils/is-not/is-not.ts +++ b/src/utils/is-not/is-not.ts @@ -16,7 +16,7 @@ export function isNot( } return (context: H) => { - const result = predicate(context); // Should we pass a clone? (safety vs performance) + const result = predicate(context); if (!isPromise(result)) { return !result; diff --git a/src/utils/is-paginated/is-paginated.test.ts b/src/utils/is-paginated/is-paginated.test.ts new file mode 100644 index 00000000..f86b72ec --- /dev/null +++ b/src/utils/is-paginated/is-paginated.test.ts @@ -0,0 +1,72 @@ +import { HookContext } from '@feathersjs/feathers'; +import { isPaginated } from './is-paginated'; + +describe('isPaginated', () => { + it('returns true for service.options.paginate', function () { + const serviceOptions = { + paginate: { + default: 10, + max: 50, + }, + }; + + const paginate = isPaginated({ + params: {}, + service: { + options: serviceOptions, + }, + method: 'find', + } as HookContext); + + assert.deepStrictEqual(paginate, true); + }); + + it('returns false for params.paginate: false', function () { + const serviceOptions = { + paginate: { + default: 10, + max: 50, + }, + }; + + const paginate = isPaginated({ + params: { paginate: false }, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, false); + }); + + it('returns true for context.adapter.paginate', function () { + const serviceOptions = { + paginate: false, + }; + + const paginate = isPaginated({ + params: { adapter: { paginate: { default: 20, max: 100 } } }, + service: { + options: serviceOptions, + }, + method: 'find', + } as HookContext); + + assert.deepStrictEqual(paginate, true); + }); + + it('returns false for no paginate', function () { + const serviceOptions = { + paginate: false, + }; + + const paginate = isPaginated({ + params: {}, + service: { + options: serviceOptions, + }, + } as HookContext); + + assert.deepStrictEqual(paginate, false); + }); +}); diff --git a/src/utils/is-paginated/is-paginated.ts b/src/utils/is-paginated/is-paginated.ts new file mode 100644 index 00000000..a78d6dcf --- /dev/null +++ b/src/utils/is-paginated/is-paginated.ts @@ -0,0 +1,15 @@ +import { HookContext } from '@feathersjs/feathers'; +import { getPaginate } from '../get-paginate/get-paginate'; + +/** + * util to check if a hook is a paginated hook using `getPaginate` + */ +export const isPaginated = (context: H): boolean => { + if (context.params.paginate === false || context.method !== 'find') { + return false; + } + + const paginate = getPaginate(context); + + return !!paginate; +}; diff --git a/src/utils/is-provider/is-provider.ts b/src/utils/is-provider/is-provider.ts index 03f29ced..223d10f5 100755 --- a/src/utils/is-provider/is-provider.ts +++ b/src/utils/is-provider/is-provider.ts @@ -11,7 +11,7 @@ export function isProvider(...providers: Tr throw new MethodNotAllowed('Calling isProvider predicate incorrectly.'); } - return (context: H) => { + return (context: H): boolean => { const hookProvider = context.params.provider; return providers.some( diff --git a/src/utils/skip-result/skip-result.test.ts b/src/utils/skip-result/skip-result.test.ts new file mode 100644 index 00000000..e209cc43 --- /dev/null +++ b/src/utils/skip-result/skip-result.test.ts @@ -0,0 +1,260 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { skipResult } from './skip-result'; + +describe('skipResult', function () { + const paginatedService = { + options: { + paginate: { + default: 10, + max: 50, + }, + }, + }; + + const nonPaginatedService = { + options: { + paginate: false, + }, + }; + + const paramsEmpty = {}; + const paramsPaginateFalse = { paginate: false }; + const paramsPaginate = { paginate: { default: 10, max: 50 } }; + const paramsAdapterPaginate = { + adapter: { paginate: { default: 10, max: 50 } }, + }; + + it('does not overwrite result', function () { + ['find', 'get', 'create', 'update', 'patch', 'remove'].forEach(method => { + ['before', 'after'].forEach(type => { + [paginatedService, nonPaginatedService].forEach(service => { + [paramsPaginateFalse, paramsAdapterPaginate].forEach(params => { + const context = skipResult({ + method, + type, + service, + params, + result: 123, + } as any as HookContext); + + assert.deepStrictEqual( + context.result, + 123, + `result is not changed. '${type}:${method}': '${service}' - '${params}'`, + ); + }); + }); + }); + }); + }); + + describe('find', function () { + it('sets paginated result', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'find', + } as any as HookContext); + assert.deepStrictEqual( + result, + { total: 0, skip: 0, limit: 0, data: [] }, + `'${i}': result is paginated empty`, + ); + }); + }); + + it('sets empty array', function () { + const combos = [ + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsEmpty }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'find', + } as any as HookContext); + assert.deepStrictEqual(result, [], `'${i}': result is empty array`); + }); + }); + }); + + describe('get', function () { + it('sets result to null', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'get', + } as any as HookContext); + assert.deepStrictEqual(result, null, `'${i}': result is null`); + }); + }); + }); + + describe('create', function () { + it('sets result to null for single data', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'create', + data: { id: 1 }, + } as any as HookContext); + assert.deepStrictEqual(result, null, `'${i}': result is null`); + }); + }); + + it('sets result to empty array for array data', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'create', + data: [{ id: 1 }], + type: 'before', + } as any as HookContext); + assert.deepStrictEqual(result, [], `'${i}': result is empty array`); + }); + }); + }); + + describe('update', function () { + it('sets result to null', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'update', + id: 1, + } as any as HookContext); + assert.deepStrictEqual(result, null, `'${i}': result is null`); + }); + }); + }); + + describe('patch', function () { + it('sets result to null for id: 1', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'patch', + id: 1, + } as any as HookContext); + assert.deepStrictEqual(result, null, `'${i}': result is null`); + }); + }); + + it('sets result to empty array for id: null', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'patch', + id: null, + } as any as HookContext); + assert.deepStrictEqual(result, [], `'${i}': result is empty array`); + }); + }); + }); + + describe('remove', function () { + it('sets result to null for id: 1', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'remove', + id: 1, + } as any as HookContext); + assert.deepStrictEqual(result, null, `'${i}': result is null`); + }); + }); + + it('sets result to empty array for id: null', function () { + const combos = [ + { service: paginatedService, params: paramsEmpty }, + { service: paginatedService, params: paramsAdapterPaginate }, + { service: paginatedService, params: paramsPaginateFalse }, + { service: nonPaginatedService, params: paramsPaginate }, + { service: nonPaginatedService, params: paramsAdapterPaginate }, + ]; + + combos.forEach(({ service, params }, i) => { + const { result } = skipResult({ + service, + params, + method: 'remove', + id: null, + } as any as HookContext); + assert.deepStrictEqual(result, [], `'${i}': result is empty array`); + }); + }); + }); +}); diff --git a/src/utils/skip-result/skip-result.ts b/src/utils/skip-result/skip-result.ts new file mode 100644 index 00000000..7fee1476 --- /dev/null +++ b/src/utils/skip-result/skip-result.ts @@ -0,0 +1,31 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { isMulti } from '../is-multi/is-multi'; +import { isPaginated } from '../is-paginated/is-paginated'; + +/** + * util to set `context.result` to an empty array or object, depending on the hook type + */ +export const skipResult = (context: H) => { + if (context.result) { + return context; + } + + const multi = isMulti(context); + + if (multi) { + if (context.method === 'find' && isPaginated(context)) { + context.result = { + total: 0, + skip: 0, + limit: 0, + data: [], + }; + } else { + context.result = []; + } + } else { + context.result = null; + } + + return context; +}; diff --git a/src/utils/some/some.ts b/src/utils/some/some.ts index 7baf1506..2d4d3404 100755 --- a/src/utils/some/some.ts +++ b/src/utils/some/some.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import type { AsyncPredicateFn, PredicateFn } from '../types'; +import type { AsyncPredicateFn, PredicateFn } from '../../types'; /** * Return the or of a series of sync or async predicate functions. @@ -12,6 +12,6 @@ export function some( const promises = predicates.map(fn => fn.apply(this, [context])); const results = await Promise.all(promises); - return await Promise.resolve(results.some(result => !!result)); + return await Promise.resolve(results.some((result: any) => !!result)); }; } diff --git a/test/index.test.ts b/test/index.test.ts index 3338aac8..e2097f77 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -99,6 +99,12 @@ const members = [ 'some', 'every', 'isNot', + + 'getPaginate', + 'isMulti', + 'isPaginated', + 'allowsMulti', + 'skipResult', ].sort(); describe('services exposed hooks', () => { From 2582a052f017e010b284534d9b2053ad4cc40ec3 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:29:59 +0100 Subject: [PATCH 03/15] lint: fix lints --- README.md | 1 - pnpm-lock.yaml | 7004 ----------------- src/hooks/alter-items/alter-data.test.ts | 30 +- src/hooks/alter-items/alter-items.test.ts | 7 +- src/hooks/fast-join/test/make-services.ts | 8 +- src/hooks/fgraphql/fgraphql.ts | 16 +- src/hooks/iff/iff-else.test.ts | 1 + src/hooks/iff/iff-else.ts | 1 + src/hooks/iff/iff.ts | 1 - .../params-from-client/params-from-client.ts | 1 - src/hooks/run-parallel/run-parallel.test.ts | 1 + src/hooks/unless/unless.ts | 1 - src/hooks/validate-schema/validate-schema.ts | 6 +- src/hooks/validate/validate.ts | 1 - src/utils/allows-multi/allows-multi.ts | 11 - src/utils/calling-params/calling-params.ts | 8 +- src/utils/combine/combine.test.ts | 1 + src/utils/combine/combine.ts | 6 +- src/utils/every/every.ts | 2 +- src/utils/index.ts | 1 - src/utils/replace-items/replace-items.ts | 1 - src/utils/run-hook/run-hook.ts | 31 +- test/index.test.ts | 1 - 23 files changed, 57 insertions(+), 7084 deletions(-) delete mode 100644 pnpm-lock.yaml delete mode 100644 src/utils/allows-multi/allows-multi.ts diff --git a/README.md b/README.md index aee29a2f..afbd7ea1 100755 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ - added utils from feathers-utils - - allowsMulti - getPaginate - isMulti - isPaginated diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 21326894..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,7004 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@feathersjs/errors': - specifier: ^5.0.31 - version: 5.0.32 - '@feathersjs/feathers': - specifier: ^5.0.0 - version: 5.0.32 - ajv: - specifier: ^6.12.6 - version: 6.12.6 - graphql: - specifier: ^16.10.0 - version: 16.10.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - neotraverse: - specifier: ^0.6.18 - version: 0.6.18 - devDependencies: - '@eslint/js': - specifier: ^9.18.0 - version: 9.20.0 - '@feathers-plus/batch-loader': - specifier: ^0.3.6 - version: 0.3.6 - '@feathers-plus/cache': - specifier: ^1.4.0 - version: 1.4.0 - '@feathers-plus/graphql': - specifier: ^1.10.0 - version: 1.10.0 - '@feathersjs/authentication': - specifier: ^5.0.31 - version: 5.0.32(typescript@5.7.3) - '@feathersjs/authentication-local': - specifier: ^5.0.31 - version: 5.0.32(typescript@5.7.3) - '@feathersjs/client': - specifier: ^5.0.31 - version: 5.0.32(typescript@5.7.3) - '@feathersjs/express': - specifier: ^5.0.31 - version: 5.0.32(typescript@5.7.3) - '@feathersjs/memory': - specifier: ^5.0.31 - version: 5.0.32 - '@feathersjs/socketio': - specifier: ^5.0.31 - version: 5.0.32 - '@feathersjs/socketio-client': - specifier: ^5.0.31 - version: 5.0.32 - '@types/debug': - specifier: ^4.1.12 - version: 4.1.12 - '@types/lodash': - specifier: ^4.17.14 - version: 4.17.15 - '@types/node': - specifier: ^22.10.7 - version: 22.13.2 - '@typescript-eslint/eslint-plugin': - specifier: ^8.21.0 - version: 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/parser': - specifier: ^8.21.0 - version: 8.24.0(eslint@9.20.1)(typescript@5.7.3) - '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.0.5(vitest@1.6.1(@types/node@22.13.2)) - eslint: - specifier: ^9.18.0 - version: 9.20.1 - eslint-config-prettier: - specifier: ^10.0.1 - version: 10.0.1(eslint@9.20.1) - eslint-import-resolver-typescript: - specifier: ^3.7.0 - version: 3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1) - eslint-plugin-import-x: - specifier: ^4.6.1 - version: 4.6.1(eslint@9.20.1)(typescript@5.7.3) - eslint-plugin-prettier: - specifier: ^5.2.3 - version: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.20.1))(eslint@9.20.1)(prettier@3.5.0) - mongodb: - specifier: ^5.9.2 - version: 5.9.2 - npm-check-updates: - specifier: ^17.1.14 - version: 17.1.14 - prettier: - specifier: ^3.4.2 - version: 3.5.0 - shx: - specifier: ^0.3.4 - version: 0.3.4 - sift: - specifier: ^17.1.3 - version: 17.1.3 - tsup: - specifier: ^8.3.5 - version: 8.3.6(postcss@8.5.2)(typescript@5.7.3) - typescript: - specifier: ^5.7.3 - version: 5.7.3 - typescript-eslint: - specifier: ^8.21.0 - version: 8.24.0(eslint@9.20.1)(typescript@5.7.3) - vitepress: - specifier: ^1.6.2 - version: 1.6.3(@algolia/client-search@5.20.2)(@types/node@22.13.2)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3) - vitest: - specifier: ^1.6.0 - version: 1.6.1(@types/node@22.13.2) - -packages: - - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.20.2': - resolution: {integrity: sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.20.2': - resolution: {integrity: sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.20.2': - resolution: {integrity: sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.20.2': - resolution: {integrity: sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.20.2': - resolution: {integrity: sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.20.2': - resolution: {integrity: sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.20.2': - resolution: {integrity: sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.20.2': - resolution: {integrity: sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.20.2': - resolution: {integrity: sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.20.2': - resolution: {integrity: sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.20.2': - resolution: {integrity: sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.20.2': - resolution: {integrity: sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.20.2': - resolution: {integrity: sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw==} - engines: {node: '>= 14.0.0'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.8': - resolution: {integrity: sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.8': - resolution: {integrity: sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@docsearch/css@3.8.2': - resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} - - '@docsearch/js@3.8.2': - resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} - - '@docsearch/react@3.8.2': - resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@feathers-plus/batch-loader@0.3.0': - resolution: {integrity: sha512-buElwyOZKVI34kD7jHt+czIDv1brjXLBPJ+7is+RC98JK+TyqWIUuBJ4E0ZMjPxwwkAJIN6IATyPgvhSXhkaxw==} - engines: {node: '>= 6.0.0'} - - '@feathers-plus/batch-loader@0.3.6': - resolution: {integrity: sha512-r+n31iZ/B5Rl1mLkC9/S20UI445MdkZvE3VBmjupep2t8OuyTYHPkFEgR25HY6khH+RothK1VL3B5eumk9N2QQ==} - engines: {node: '>= 6.0.0'} - - '@feathers-plus/cache@1.3.1': - resolution: {integrity: sha512-zFpwVutKiOcPW6Gnm73uit4EwnaawYZEt6pIKP+GkYQz/wVkfNMMwZ28THCNhZvFcR1Cn3WwyUBXcASoApHpvA==} - engines: {node: '>= 6.0.0'} - - '@feathers-plus/cache@1.4.0': - resolution: {integrity: sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==} - engines: {node: '>= 6.0.0'} - - '@feathers-plus/common@0.1.0': - resolution: {integrity: sha512-rK4zNVObmw8UKP7nwTwsCVn0g2Zl92r2rpXMfVdFo8FmYfYY4HECAcGB4Aq38EI6NZnvla51CdDjtY9WxW1OHQ==} - engines: {node: '>= 6.0.0'} - - '@feathers-plus/graphql@1.10.0': - resolution: {integrity: sha512-ausYkHTRRxIQbNKVvQ7dHj/bkNsghsjGGKw9PO+w9XOCs6OJouO/cj1nj6RjfUDxUbZtFcc4y5QluYzDulEmEQ==} - engines: {node: '>= 8.0.0'} - deprecated: This module is no longer maintained - - '@feathersjs/adapter-commons@5.0.32': - resolution: {integrity: sha512-MKoa/i4ylUc/jVjBy+PWS9TgU1IXUkqcRUCqe2uBpM7y1L686XfK56l/opiGWEvScOt1sHIv7ryj7aIS1G2D0A==} - engines: {node: '>= 12'} - - '@feathersjs/authentication-client@5.0.32': - resolution: {integrity: sha512-9NMEtROo8w2uvl+pUM1y4KFlVCXu3pTAeD03ojuuys9wI5UGXB+MBacUwqrVzT3gHLsikfvHqUMeHSTIJcH/Og==} - engines: {node: '>= 12'} - - '@feathersjs/authentication-local@5.0.32': - resolution: {integrity: sha512-fIeMj9b3g3MferUMVq66Tyzhnam5UKRjEzLCshsqTJg1oi46MdMIL4/63B3zVO7KLPsfa77iMZb/72dCHnptNQ==} - engines: {node: '>= 12'} - - '@feathersjs/authentication@5.0.32': - resolution: {integrity: sha512-9C/DPA63SxMkylgkwAbMOfpsif9JQjlXzLoU9gsEzN0dWCGuLZ//0vQ4/hli5Y0jZ61tzPLQzGBIiC2f5SQ7nQ==} - engines: {node: '>= 12'} - - '@feathersjs/client@5.0.32': - resolution: {integrity: sha512-KIkFq0sR+axnWwomtkuLFJ28b99nd2LcCzMGxWqrUFUBl4NCAgXHdOjp7Z2lYSzHBjuM//B5chlDLjmTUtF2sA==} - engines: {node: '>= 12'} - - '@feathersjs/commons@1.4.4': - resolution: {integrity: sha512-ZPpzyZA3CPfoa9AuFv3BJUI/ubzaaXixp8T/pqeMFPT6DOaU/6oF7lz1RxwimzfJNna4gy/HByt0EoLSI3BKWg==} - engines: {node: '>= 6'} - - '@feathersjs/commons@5.0.32': - resolution: {integrity: sha512-Qj2x8xBJS+8fpe6sVor4dBT42pHc5uRuvH91FD+n4/O1YvKHpmuInO0IvD9DPvPtDqodT2WCzA7a2eTDHLOuNw==} - engines: {node: '>= 12'} - - '@feathersjs/errors@3.2.0': - resolution: {integrity: sha512-4xsE7OyzxGvs2hyG19nf2qb4rV2nWoWbQ6/FnDIYrNHi7M9kOy+deLwNhKnXa4r/hg3xf+AVpC8kBjUQjWYWHA==} - engines: {node: '>= 6'} - - '@feathersjs/errors@5.0.32': - resolution: {integrity: sha512-54pBmnAmOOPvkIO5fwHVpYODOxp5TJtpYcC0ABppzUG6P77WqmndpIPCzT5wP+VbQBcCdYP/mOyK05BdeRju7g==} - engines: {node: '>= 12'} - - '@feathersjs/express@5.0.32': - resolution: {integrity: sha512-L/Ex7GrPrCkAo2RJ41VyFv3x1U/ltZFwgbQx7pFm4FQT3sNW/wGJr8UBSC8VN/MBc35y5VcDaGKwk68wEN9Row==} - engines: {node: '>= 12'} - - '@feathersjs/feathers@5.0.32': - resolution: {integrity: sha512-eP05x5xcLvtRFttt9uSJd8GApP+eqdnw/bQFxpZxMDGjvvZXa0Az/M3JT98ucjjoY3kHpoX3XFJbkDe06AoS+A==} - engines: {node: '>= 12'} - - '@feathersjs/hooks@0.9.0': - resolution: {integrity: sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==} - engines: {node: '>= 14'} - - '@feathersjs/memory@5.0.32': - resolution: {integrity: sha512-81PUVSKe+00TelMOl6jvAqItDrG6uhzYDFBSHnrWHEbALxek1rAx6v8ElP8gaz+6wcHiK4hkuljOjwT3AccQhA==} - engines: {node: '>= 12'} - - '@feathersjs/rest-client@5.0.32': - resolution: {integrity: sha512-s7tQmpOa+GYYpGPZayw37bDR35r3K+PXr30cACn6UtBaiPE/v5w4iik4C3wB1RoZojiOkXzd7xTfb4SImrivOw==} - engines: {node: '>= 12'} - - '@feathersjs/schema@5.0.32': - resolution: {integrity: sha512-NBoD4fqWrEFjlSFnPcgk+zhcdOQtyGXPWSTMgKS0xBFvNmH276w7wVlM6yIe7NwGVjaz/4nrlu1yTUqvUb3cyw==} - engines: {node: '>= 12'} - peerDependencies: - typescript: '>=5.6' - - '@feathersjs/socketio-client@5.0.32': - resolution: {integrity: sha512-qAtdt2KGXTSkiFnnp4auovL46pqQ2nrpNoUyObjDFO36bE7siamrgRXM3905u57vgV3Qwog2SFINUT5zjfA5pg==} - engines: {node: '>= 12'} - - '@feathersjs/socketio@5.0.32': - resolution: {integrity: sha512-5/sS/wkkdclag/Nt0euRJQ67r7RbGWVZglB7fds56hudif/Qb/OUqPDn+Cdj8eBKPDfOJdioYkHnIdROaKwq4A==} - engines: {node: '>= 12'} - - '@feathersjs/transport-commons@5.0.32': - resolution: {integrity: sha512-SrOJHnFk1w9cBFpZ6MPR61c2OHEMvWbwk3kNA+9PzIuHc6H3SPrTiWouWzmjVt8jowRzhVeQef46nIJsqx9iqQ==} - engines: {node: '>= 12'} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} - engines: {node: '>=18.18'} - - '@iconify-json/simple-icons@1.2.24': - resolution: {integrity: sha512-06ZWXZx3PHCE+02zn+iIGOKKNgE3kyPd0Yh7IUEIa0bCYI6UmGlsYYghRx8As9TnTNYMCEiy5V0zI4Jb6EY6XA==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@mongodb-js/saslprep@1.2.0': - resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@rollup/rollup-android-arm-eabi@4.34.6': - resolution: {integrity: sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.34.6': - resolution: {integrity: sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.34.6': - resolution: {integrity: sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.34.6': - resolution: {integrity: sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.34.6': - resolution: {integrity: sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.34.6': - resolution: {integrity: sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': - resolution: {integrity: sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.34.6': - resolution: {integrity: sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.34.6': - resolution: {integrity: sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.34.6': - resolution: {integrity: sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': - resolution: {integrity: sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': - resolution: {integrity: sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.34.6': - resolution: {integrity: sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.34.6': - resolution: {integrity: sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.34.6': - resolution: {integrity: sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.6': - resolution: {integrity: sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.34.6': - resolution: {integrity: sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.34.6': - resolution: {integrity: sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.34.6': - resolution: {integrity: sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==} - cpu: [x64] - os: [win32] - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@shikijs/core@2.3.2': - resolution: {integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==} - - '@shikijs/engine-javascript@2.3.2': - resolution: {integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==} - - '@shikijs/engine-oniguruma@2.3.2': - resolution: {integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==} - - '@shikijs/langs@2.3.2': - resolution: {integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==} - - '@shikijs/themes@2.3.2': - resolution: {integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==} - - '@shikijs/transformers@2.3.2': - resolution: {integrity: sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==} - - '@shikijs/types@2.3.2': - resolution: {integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==} - - '@shikijs/vscode-textmate@10.0.1': - resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@stem/nesthydrationjs@0.4.0': - resolution: {integrity: sha512-hnoLv6W7CmhWXCEp6MBiZv4CdqI48aYmxM+Lo5T3qogP+x+MBR0DOyt7XdppI/X8McqHisCbSNvAOC4fgPhUiw==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/compression@1.7.5': - resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/graphql@0.11.8': - resolution: {integrity: sha512-xGWx4kx9JKlqxDrZA12gw5qi2lvxPNLxnQQcoTXVX83MuGcXcpb7TADatGyGW51GaaXQOQTbjw3x4HuL3ULBaA==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/jsonwebtoken@9.0.8': - resolution: {integrity: sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==} - - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - - '@types/methods@1.1.4': - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node@22.13.2': - resolution: {integrity: sha512-Z+r8y3XL9ZpI2EY52YYygAFmo2/oWfNSj4BCpAXE2McAexDk8VcnBMGC9Djn9gTKt4d2T/hhXqmPzo4hfIXtTg==} - - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@types/superagent@8.1.9': - resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - - '@types/webidl-conversions@7.0.3': - resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} - - '@types/whatwg-url@8.2.2': - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} - - '@typescript-eslint/eslint-plugin@8.24.0': - resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/parser@8.24.0': - resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/scope-manager@8.24.0': - resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.24.0': - resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/types@8.24.0': - resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.24.0': - resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/utils@8.24.0': - resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/visitor-keys@8.24.0': - resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@vitejs/plugin-vue@5.2.1': - resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - - '@vitest/coverage-v8@3.0.5': - resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==} - peerDependencies: - '@vitest/browser': 3.0.5 - vitest: 3.0.5 - peerDependenciesMeta: - '@vitest/browser': - optional: true - - '@vitest/expect@1.6.1': - resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - - '@vitest/runner@1.6.1': - resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - - '@vitest/snapshot@1.6.1': - resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - - '@vitest/spy@1.6.1': - resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - - '@vitest/utils@1.6.1': - resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - - '@vue/devtools-api@7.7.2': - resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} - - '@vue/devtools-kit@7.7.2': - resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==} - - '@vue/devtools-shared@7.7.2': - resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==} - - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} - - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} - peerDependencies: - vue: 3.5.13 - - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - - '@vueuse/core@12.5.0': - resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} - - '@vueuse/integrations@12.5.0': - resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - - '@vueuse/metadata@12.5.0': - resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} - - '@vueuse/shared@12.5.0': - resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@5.5.2: - resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - algoliasearch@5.20.2: - resolution: {integrity: sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA==} - engines: {node: '>= 14.0.0'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - bcryptjs@2.4.3: - resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} - - birpc@0.2.19: - resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - bson@5.5.1: - resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} - engines: {node: '>=14.20.1'} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} - engines: {node: '>= 0.8.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - deprecate@1.1.1: - resolution: {integrity: sha512-ZGDXefq1xknT292LnorMY5s8UVU08/WKdzDZCUT6t9JzsiMSP4uzUhgpqugffNVcT5WC6wMBiSQ+LFjlv3v7iQ==} - - deprecated-decorator@0.1.6: - resolution: {integrity: sha512-MHidOOnCHGlZDKsI21+mbIIhf4Fff+hhCTB7gtVg4uoIqjcrTZc5v6M+GS2zVI0sV7PqK415rb8XaOSQsQkHOw==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} - engines: {node: '>=10.2.0'} - - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} - engines: {node: '>=18'} - hasBin: true - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import-x@4.6.1: - resolution: {integrity: sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-prettier@5.2.3: - resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.20.1: - resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - fast-deep-equal@1.1.0: - resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} - - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - feathers-hooks-common@4.5.6: - resolution: {integrity: sha512-z0KZP/igmHvEJX46x0f6UC/pSYFXUt/2OfgMwumElGqxwFYU4JrAnK8FbGwCo8MYowMDfpMk72ju+axbq9MV1Q==} - engines: {node: '>= 6'} - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - - focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - generatorics@1.1.0: - resolution: {integrity: sha512-LuYDCS1DbKQsvChP1xHmAzHnGdd0z0K1XMebmbNbFzGZI62KODnV2CXA7zOqebiDzlK2sxXrPGfwlDzSm9aP4g==} - engines: {node: '>=6.0.0'} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - graphql-relay@0.5.5: - resolution: {integrity: sha512-CTsapMI0MZc0antZp+9ZcVcNiVoaXncc2xALCxe2Md25quAUxTjH2135xPRNb6BMOoTiY54HtglfxxUCDTUEbA==} - peerDependencies: - graphql: ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 - - graphql-resolvers-ast@1.4.0: - resolution: {integrity: sha512-L4BeMFgPV7rwyISIvJ+QOsnMfc5+STMsaF097cLzJ9t/kizekDB5dMWNC+jq2pUWq0WoqYZypWYKwFL5vH4dUQ==} - engines: {node: '>= 6.0.0'} - - graphql-tools@2.0.0: - resolution: {integrity: sha512-5cUflK/kECqge0feZxTG/cF05EHlGMvdK47I+xQtDm67KrW8rlfmLTUWHYcyFTOXT+Yl4Sb/6WTJZwnKX+Ofmg==} - deprecated: |- - This package has been deprecated and now it only exports makeExecutableSchema. - And it will no longer receive updates. - We recommend you to migrate to scoped packages such as @graphql-tools/schema, @graphql-tools/utils and etc. - Check out https://www.graphql-tools.com to learn what package you should use instead - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 - - graphql-type-json@0.1.4: - resolution: {integrity: sha512-B1zeWRF50alRvW94s/hpkGbVqvRLTtJD0yEyMs6KAvDSlNyBzJCu/d51fLZalqrVntuJAVgXYh13GbUEqe9MrQ==} - peerDependencies: - graphql: '>=0.4.0' - - graphql@0.11.7: - resolution: {integrity: sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==} - - graphql@16.10.0: - resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-string@1.0.0: - resolution: {integrity: sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.4: - resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {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. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-bun-module@1.3.0: - resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - iterall@1.1.3: - resolution: {integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - join-monster-graphql-tools-adapter@0.0.2: - resolution: {integrity: sha512-Q2DaeL/L6yY7Rh30YvkysB48QdPwbMBElo72gXelDOczymw0DzP1jmrvLuClyxeL5FJs5tt28CHKIKEgYwFAbA==} - peerDependencies: - graphql-tools: ^0.4.0 - join-monster: '*' - - join-monster@2.0.15: - resolution: {integrity: sha512-4ZZd0grGtamGsevMP4iCF+dZ5jyeuvbvEgF5LgPp9Gz1VNUTaL79/ZNfc0Hs/uSNJAVj1vbaUGK/wsnopyYLkA==} - engines: {node: '>=6.0.0'} - peerDependencies: - graphql: 0.6 || 0.7 || 0.8 || 0.9 || 0.10 || 0.11 - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-to-ts@3.1.1: - resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} - engines: {node: '>=16'} - - json-schema-traverse@0.3.1: - resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} - engines: {node: '>=14'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.merge@4.6.1: - resolution: {integrity: sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash@4.13.1: - resolution: {integrity: sha512-j/GRONYpkXt1aB1bQHzkq0Th7zhv/syoDVrzCDA3FDMntIin0b7TjXi62q9juDC+QfhRs9COr0LFW38vQSH9Tg==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@4.1.1: - resolution: {integrity: sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minisearch@7.1.1: - resolution: {integrity: sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - mongo-sql@4.0.2: - resolution: {integrity: sha512-/S2uYugCpOx73dwvWRZWlTBIE0U2e6jhIWi9bcfUrM9QkKR4U1yYjP6wXiYt+kdWqhV1lICgTLMoaKR1VMdd6A==} - - mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} - - mongodb@5.9.2: - resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} - engines: {node: '>=14.20.1'} - peerDependencies: - '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.0.0 - kerberos: ^1.0.0 || ^2.0.0 - mongodb-client-encryption: '>=2.3.0 <3' - snappy: ^7.2.2 - peerDependenciesMeta: - '@aws-sdk/credential-providers': - optional: true - '@mongodb-js/zstd': - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} - - npm-check-updates@17.1.14: - resolution: {integrity: sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==} - engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} - hasBin: true - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - oniguruma-to-es@3.1.0: - resolution: {integrity: sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss@8.5.2: - resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} - engines: {node: ^10 || ^12 || >=14} - - preact@10.25.4: - resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@3.5.0: - resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} - engines: {node: '>=14'} - hasBin: true - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} - engines: {node: '>= 14.18.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rollup@4.34.6: - resolution: {integrity: sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - shiki@2.3.2: - resolution: {integrity: sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==} - - short-hash@1.0.0: - resolution: {integrity: sha512-qbUCD2Pkl4IXRyVqneEjGnUr0NGDGLzZnBUVGJngIQZf/FrhOL0yJhH+JQzak0t8xMmScIKpoX1SxOsPHdwa4w==} - - shx@0.3.4: - resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} - engines: {node: '>=6'} - hasBin: true - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - sift@17.1.3: - resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} - engines: {node: '>=10.2.0'} - - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - superjson@2.2.2: - resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} - engines: {node: '>=16'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - - traverse@0.6.6: - resolution: {integrity: sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - ts-algebra@2.0.0: - resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsup@8.3.6: - resolution: {integrity: sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript-eslint@8.24.0: - resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} - engines: {node: '>=14.17'} - hasBin: true - - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@11.0.5: - resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} - hasBin: true - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite-node@1.6.1: - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.4.14: - resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - 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 - - vitepress@1.6.3: - resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4 - postcss: ^8 - peerDependenciesMeta: - markdown-it-mathjax3: - optional: true - postcss: - optional: true - - vitest@1.6.1: - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) - '@algolia/client-search': 5.20.2 - algoliasearch: 5.20.2 - - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)': - dependencies: - '@algolia/client-search': 5.20.2 - algoliasearch: 5.20.2 - - '@algolia/client-abtesting@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/client-analytics@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/client-common@5.20.2': {} - - '@algolia/client-insights@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/client-personalization@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/client-query-suggestions@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/client-search@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/ingestion@1.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/monitoring@1.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/recommend@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - '@algolia/requester-browser-xhr@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - - '@algolia/requester-fetch@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - - '@algolia/requester-node-http@5.20.2': - dependencies: - '@algolia/client-common': 5.20.2 - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/parser@7.26.8': - dependencies: - '@babel/types': 7.26.8 - - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/types@7.26.8': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@bcoe/v8-coverage@1.0.2': {} - - '@docsearch/css@3.8.2': {} - - '@docsearch/js@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) - preact: 10.25.4 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.20.2)(algoliasearch@5.20.2) - '@docsearch/css': 3.8.2 - algoliasearch: 5.20.2 - optionalDependencies: - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/aix-ppc64@0.24.2': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.24.2': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-arm@0.24.2': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/android-x64@0.24.2': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.24.2': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.24.2': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.24.2': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.24.2': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.24.2': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-arm@0.24.2': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.24.2': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.24.2': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.24.2': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.24.2': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.24.2': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.24.2': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/linux-x64@0.24.2': - optional: true - - '@esbuild/netbsd-arm64@0.24.2': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.24.2': - optional: true - - '@esbuild/openbsd-arm64@0.24.2': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.24.2': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.24.2': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.24.2': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.24.2': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@esbuild/win32-x64@0.24.2': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.1)': - dependencies: - eslint: 9.20.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.19.2': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/core@0.10.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.11.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.2.0': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.20.0': {} - - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.2.5': - dependencies: - '@eslint/core': 0.10.0 - levn: 0.4.1 - - '@feathers-plus/batch-loader@0.3.0': {} - - '@feathers-plus/batch-loader@0.3.6': {} - - '@feathers-plus/cache@1.3.1': - dependencies: - lru-cache: 4.1.1 - - '@feathers-plus/cache@1.4.0': - dependencies: - lru-cache: 4.1.1 - - '@feathers-plus/common@0.1.0': - dependencies: - short-hash: 1.0.0 - sort-keys: 2.0.0 - - '@feathers-plus/graphql@1.10.0': - dependencies: - '@feathers-plus/batch-loader': 0.3.0 - '@feathers-plus/cache': 1.3.1 - '@feathers-plus/common': 0.1.0 - '@feathersjs/errors': 3.2.0 - debug: 3.1.0 - feathers-hooks-common: 4.5.6 - graphql: 0.11.7 - graphql-resolvers-ast: 1.4.0 - graphql-tools: 2.0.0(graphql@0.11.7) - graphql-type-json: 0.1.4(graphql@0.11.7) - join-monster: 2.0.15(graphql@0.11.7) - join-monster-graphql-tools-adapter: 0.0.2(graphql-tools@2.0.0(graphql@0.11.7))(join-monster@2.0.15(graphql@0.11.7)) - lodash.merge: 4.6.1 - mongo-sql: 4.0.2 - traverse: 0.6.6 - transitivePeerDependencies: - - supports-color - - '@feathersjs/adapter-commons@5.0.32': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - - '@feathersjs/authentication-client@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/authentication': 5.0.32(typescript@5.7.3) - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - transitivePeerDependencies: - - typescript - - '@feathersjs/authentication-local@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/authentication': 5.0.32(typescript@5.7.3) - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - bcryptjs: 2.4.3 - lodash: 4.17.21 - transitivePeerDependencies: - - typescript - - '@feathersjs/authentication@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@feathersjs/hooks': 0.9.0 - '@feathersjs/schema': 5.0.32(typescript@5.7.3) - '@feathersjs/transport-commons': 5.0.32 - '@types/jsonwebtoken': 9.0.8 - jsonwebtoken: 9.0.2 - lodash: 4.17.21 - long-timeout: 0.1.1 - uuid: 11.0.5 - transitivePeerDependencies: - - typescript - - '@feathersjs/client@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/authentication-client': 5.0.32(typescript@5.7.3) - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@feathersjs/rest-client': 5.0.32 - '@feathersjs/socketio-client': 5.0.32 - transitivePeerDependencies: - - typescript - - '@feathersjs/commons@1.4.4': {} - - '@feathersjs/commons@5.0.32': {} - - '@feathersjs/errors@3.2.0': - dependencies: - debug: 3.1.0 - transitivePeerDependencies: - - supports-color - - '@feathersjs/errors@5.0.32': {} - - '@feathersjs/express@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/authentication': 5.0.32(typescript@5.7.3) - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@feathersjs/transport-commons': 5.0.32 - '@types/compression': 1.7.5 - '@types/cors': 2.8.17 - '@types/express': 4.17.21 - '@types/express-serve-static-core': 4.19.6 - compression: 1.8.0 - cors: 2.8.5 - express: 4.21.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@feathersjs/feathers@5.0.32': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/hooks': 0.9.0 - events: 3.3.0 - - '@feathersjs/hooks@0.9.0': {} - - '@feathersjs/memory@5.0.32': - dependencies: - '@feathersjs/adapter-commons': 5.0.32 - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - sift: 17.1.3 - - '@feathersjs/rest-client@5.0.32': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@types/superagent': 8.1.9 - qs: 6.14.0 - - '@feathersjs/schema@5.0.32(typescript@5.7.3)': - dependencies: - '@feathersjs/adapter-commons': 5.0.32 - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@feathersjs/hooks': 0.9.0 - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - json-schema-to-ts: 3.1.1 - typescript: 5.7.3 - - '@feathersjs/socketio-client@5.0.32': - dependencies: - '@feathersjs/feathers': 5.0.32 - '@feathersjs/transport-commons': 5.0.32 - - '@feathersjs/socketio@5.0.32': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/feathers': 5.0.32 - '@feathersjs/transport-commons': 5.0.32 - socket.io: 4.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@feathersjs/transport-commons@5.0.32': - dependencies: - '@feathersjs/commons': 5.0.32 - '@feathersjs/errors': 5.0.32 - '@feathersjs/feathers': 5.0.32 - encodeurl: 2.0.0 - lodash: 4.17.21 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.1': {} - - '@iconify-json/simple-icons@1.2.24': - dependencies: - '@iconify/types': 2.0.0 - - '@iconify/types@2.0.0': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@mongodb-js/saslprep@1.2.0': - dependencies: - sparse-bitfield: 3.0.3 - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 - - '@nolyfill/is-core-module@1.0.39': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/core@0.1.1': {} - - '@rollup/rollup-android-arm-eabi@4.34.6': - optional: true - - '@rollup/rollup-android-arm64@4.34.6': - optional: true - - '@rollup/rollup-darwin-arm64@4.34.6': - optional: true - - '@rollup/rollup-darwin-x64@4.34.6': - optional: true - - '@rollup/rollup-freebsd-arm64@4.34.6': - optional: true - - '@rollup/rollup-freebsd-x64@4.34.6': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.34.6': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.34.6': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.34.6': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.34.6': - optional: true - - '@rollup/rollup-linux-x64-musl@4.34.6': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.34.6': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.34.6': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.34.6': - optional: true - - '@rtsao/scc@1.1.0': - optional: true - - '@shikijs/core@2.3.2': - dependencies: - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 - - '@shikijs/engine-javascript@2.3.2': - dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 3.1.0 - - '@shikijs/engine-oniguruma@2.3.2': - dependencies: - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - - '@shikijs/langs@2.3.2': - dependencies: - '@shikijs/types': 2.3.2 - - '@shikijs/themes@2.3.2': - dependencies: - '@shikijs/types': 2.3.2 - - '@shikijs/transformers@2.3.2': - dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/types': 2.3.2 - - '@shikijs/types@2.3.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.1': {} - - '@sinclair/typebox@0.27.8': {} - - '@socket.io/component-emitter@3.1.2': {} - - '@stem/nesthydrationjs@0.4.0': - dependencies: - lodash: 4.13.1 - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.13.2 - - '@types/compression@1.7.5': - dependencies: - '@types/express': 4.17.21 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.13.2 - - '@types/cookiejar@2.1.5': {} - - '@types/cors@2.8.17': - dependencies: - '@types/node': 22.13.2 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/doctrine@0.0.9': {} - - '@types/estree@1.0.6': {} - - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 22.13.2 - '@types/qs': 6.9.18 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 - - '@types/graphql@0.11.8': - optional: true - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/http-errors@2.0.4': {} - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': - optional: true - - '@types/jsonwebtoken@9.0.8': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 22.13.2 - - '@types/linkify-it@5.0.0': {} - - '@types/lodash@4.17.15': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdurl@2.0.0': {} - - '@types/methods@1.1.4': {} - - '@types/mime@1.3.5': {} - - '@types/ms@2.1.0': {} - - '@types/node@22.13.2': - dependencies: - undici-types: 6.20.0 - - '@types/qs@6.9.18': {} - - '@types/range-parser@1.2.7': {} - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.13.2 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.13.2 - '@types/send': 0.17.4 - - '@types/superagent@8.1.9': - dependencies: - '@types/cookiejar': 2.1.5 - '@types/methods': 1.1.4 - '@types/node': 22.13.2 - form-data: 4.0.1 - - '@types/unist@3.0.3': {} - - '@types/web-bluetooth@0.0.20': {} - - '@types/webidl-conversions@7.0.3': {} - - '@types/whatwg-url@8.2.2': - dependencies: - '@types/node': 22.13.2 - '@types/webidl-conversions': 7.0.3 - - '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 - eslint: 9.20.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 - debug: 4.4.0 - eslint: 9.20.1 - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.24.0': - dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 - - '@typescript-eslint/type-utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - debug: 4.4.0 - eslint: 9.20.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.24.0': {} - - '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': - dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 - debug: 4.4.0 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - eslint: 9.20.1 - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.24.0': - dependencies: - '@typescript-eslint/types': 8.24.0 - eslint-visitor-keys: 4.2.0 - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.13.2))(vue@3.5.13(typescript@5.7.3))': - dependencies: - vite: 5.4.14(@types/node@22.13.2) - vue: 3.5.13(typescript@5.7.3) - - '@vitest/coverage-v8@3.0.5(vitest@1.6.1(@types/node@22.13.2))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - debug: 4.4.0 - 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.8.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 1.6.1(@types/node@22.13.2) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@1.6.1': - dependencies: - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - chai: 4.5.0 - - '@vitest/runner@1.6.1': - dependencies: - '@vitest/utils': 1.6.1 - p-limit: 5.0.0 - pathe: 1.1.2 - - '@vitest/snapshot@1.6.1': - dependencies: - magic-string: 0.30.17 - pathe: 1.1.2 - pretty-format: 29.7.0 - - '@vitest/spy@1.6.1': - dependencies: - tinyspy: 2.2.1 - - '@vitest/utils@1.6.1': - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - - '@vue/compiler-core@3.5.13': - dependencies: - '@babel/parser': 7.26.8 - '@vue/shared': 3.5.13 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.13': - dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 - - '@vue/compiler-sfc@3.5.13': - dependencies: - '@babel/parser': 7.26.8 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - estree-walker: 2.0.2 - magic-string: 0.30.17 - postcss: 8.5.2 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.13': - dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 - - '@vue/devtools-api@7.7.2': - dependencies: - '@vue/devtools-kit': 7.7.2 - - '@vue/devtools-kit@7.7.2': - dependencies: - '@vue/devtools-shared': 7.7.2 - birpc: 0.2.19 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.2 - - '@vue/devtools-shared@7.7.2': - dependencies: - rfdc: 1.4.1 - - '@vue/reactivity@3.5.13': - dependencies: - '@vue/shared': 3.5.13 - - '@vue/runtime-core@3.5.13': - dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 - - '@vue/runtime-dom@3.5.13': - dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 - csstype: 3.1.3 - - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': - dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.7.3) - - '@vue/shared@3.5.13': {} - - '@vueuse/core@12.5.0(typescript@5.7.3)': - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.5.0 - '@vueuse/shared': 12.5.0(typescript@5.7.3) - vue: 3.5.13(typescript@5.7.3) - transitivePeerDependencies: - - typescript - - '@vueuse/integrations@12.5.0(focus-trap@7.6.4)(typescript@5.7.3)': - dependencies: - '@vueuse/core': 12.5.0(typescript@5.7.3) - '@vueuse/shared': 12.5.0(typescript@5.7.3) - vue: 3.5.13(typescript@5.7.3) - optionalDependencies: - focus-trap: 7.6.4 - transitivePeerDependencies: - - typescript - - '@vueuse/metadata@12.5.0': {} - - '@vueuse/shared@12.5.0(typescript@5.7.3)': - dependencies: - vue: 3.5.13(typescript@5.7.3) - transitivePeerDependencies: - - typescript - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 - - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.0 - - acorn@8.14.0: {} - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv@5.5.2: - dependencies: - co: 4.6.0 - fast-deep-equal: 1.1.0 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.3.1 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - algoliasearch@5.20.2: - dependencies: - '@algolia/client-abtesting': 5.20.2 - '@algolia/client-analytics': 5.20.2 - '@algolia/client-common': 5.20.2 - '@algolia/client-insights': 5.20.2 - '@algolia/client-personalization': 5.20.2 - '@algolia/client-query-suggestions': 5.20.2 - '@algolia/client-search': 5.20.2 - '@algolia/ingestion': 1.20.2 - '@algolia/monitoring': 1.20.2 - '@algolia/recommend': 5.20.2 - '@algolia/requester-browser-xhr': 5.20.2 - '@algolia/requester-fetch': 5.20.2 - '@algolia/requester-node-http': 5.20.2 - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - argparse@2.0.1: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.3 - is-array-buffer: 3.0.5 - optional: true - - array-flatten@1.1.1: {} - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 - is-string: 1.1.1 - optional: true - - array.prototype.findlastindex@1.2.5: - 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.1.1 - es-shim-unscopables: 1.1.0 - optional: true - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - optional: true - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - optional: true - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - is-array-buffer: 3.0.5 - optional: true - - assertion-error@1.1.0: {} - - async-function@1.0.0: - optional: true - - asynckit@0.4.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - optional: true - - balanced-match@1.0.2: {} - - base64id@2.0.0: {} - - bcryptjs@2.4.3: {} - - birpc@0.2.19: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - bson@5.5.1: {} - - buffer-equal-constant-time@1.0.1: {} - - bundle-require@5.1.0(esbuild@0.24.2): - dependencies: - esbuild: 0.24.2 - load-tsconfig: 0.2.5 - - bytes@3.1.2: {} - - cac@6.7.14: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.2.7 - set-function-length: 1.2.2 - optional: true - - call-bound@1.0.3: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 - - callsites@3.1.0: {} - - ccount@2.0.1: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.1 - - co@4.6.0: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - comma-separated-tokens@2.0.3: {} - - commander@4.1.1: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.53.0 - - compression@1.8.0: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - confbox@0.1.8: {} - - consola@3.4.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.6: {} - - cookie@0.7.1: {} - - cookie@0.7.2: {} - - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.1.3: {} - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - optional: true - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - optional: true - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - optional: true - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.1.0: - dependencies: - ms: 2.0.0 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - optional: true - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - optional: true - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - deprecate@1.1.1: {} - - deprecated-decorator@0.1.6: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff-sequences@29.6.3: {} - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - optional: true - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - emoji-regex-xs@1.0.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - engine.io-parser@5.2.3: {} - - engine.io@6.6.4: - dependencies: - '@types/cors': 2.8.17 - '@types/node': 22.13.2 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.5 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - entities@4.5.0: {} - - es-abstract@1.23.9: - 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 - 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.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.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - 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.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 - optional: true - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - optional: true - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - optional: true - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - optional: true - - esbuild@0.21.5: - 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 - - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 - - escape-html@1.0.3: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-prettier@10.0.1(eslint@9.20.1): - dependencies: - eslint: 9.20.1 - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - enhanced-resolve: 5.18.1 - eslint: 9.20.1 - fast-glob: 3.3.3 - get-tsconfig: 4.10.0 - is-bun-module: 1.3.0 - is-glob: 4.0.3 - stable-hash: 0.0.4 - optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.1) - eslint-plugin-import-x: 4.6.1(eslint@9.20.1)(typescript@5.7.3) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1))(eslint@9.20.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - eslint: 9.20.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1) - transitivePeerDependencies: - - supports-color - optional: true - - eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3): - dependencies: - '@types/doctrine': 0.0.9 - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - debug: 4.4.0 - doctrine: 3.0.0 - enhanced-resolve: 5.18.1 - eslint: 9.20.1 - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.10.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - stable-hash: 0.0.4 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.20.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import-x@4.6.1(eslint@9.20.1)(typescript@5.7.3))(eslint-plugin-import@2.31.0)(eslint@9.20.1))(eslint@9.20.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - optional: true - - eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.1(eslint@9.20.1))(eslint@9.20.1)(prettier@3.5.0): - dependencies: - eslint: 9.20.1 - prettier: 3.5.0 - prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 - optionalDependencies: - eslint-config-prettier: 10.0.1(eslint@9.20.1) - - eslint-scope@8.2.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.0: {} - - eslint@9.20.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.5 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - - espree@10.3.0: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.6 - - esutils@2.0.3: {} - - etag@1.8.1: {} - - events@3.3.0: {} - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@1.1.0: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.6: {} - - fastq@1.19.0: - dependencies: - reusify: 1.0.4 - - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - feathers-hooks-common@4.5.6: - dependencies: - '@feathers-plus/batch-loader': 0.3.0 - '@feathersjs/commons': 1.4.4 - '@feathersjs/errors': 3.2.0 - ajv: 5.5.2 - debug: 3.1.0 - process: 0.11.10 - traverse: 0.6.6 - transitivePeerDependencies: - - supports-color - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.2 - keyv: 4.5.4 - - flatted@3.3.2: {} - - focus-trap@7.6.4: - dependencies: - tabbable: 6.2.0 - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - optional: true - - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - optional: true - - functions-have-names@1.2.3: - optional: true - - generatorics@1.1.0: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.7: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@8.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - optional: true - - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@14.0.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - optional: true - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - graphql-relay@0.5.5(graphql@0.11.7): - dependencies: - graphql: 0.11.7 - - graphql-resolvers-ast@1.4.0: {} - - graphql-tools@2.0.0(graphql@0.11.7): - dependencies: - deprecated-decorator: 0.1.6 - graphql: 0.11.7 - uuid: 3.4.0 - optionalDependencies: - '@types/graphql': 0.11.8 - - graphql-type-json@0.1.4(graphql@0.11.7): - dependencies: - graphql: 0.11.7 - - graphql@0.11.7: - dependencies: - iterall: 1.1.3 - - graphql@16.10.0: {} - - has-bigints@1.1.0: - optional: true - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - optional: true - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - optional: true - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - optional: true - - hash-string@1.0.0: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-util-to-html@9.0.4: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hookable@5.5.3: {} - - html-escaper@2.0.2: {} - - html-void-elements@3.0.0: {} - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - human-signals@5.0.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - optional: true - - interpret@1.4.0: {} - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - - ipaddr.js@1.9.1: {} - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - optional: true - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.3 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - optional: true - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - optional: true - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - optional: true - - is-bun-module@1.3.0: - dependencies: - semver: 7.7.1 - - is-callable@1.2.7: - optional: true - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - is-typed-array: 1.1.15 - optional: true - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - optional: true - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.3 - optional: true - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.3 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - optional: true - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.3: - optional: true - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - optional: true - - is-number@7.0.0: {} - - is-plain-obj@1.1.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - optional: true - - is-set@2.0.3: - optional: true - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.3 - optional: true - - is-stream@3.0.0: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - optional: true - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.3 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - optional: true - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.18 - optional: true - - is-weakmap@2.0.2: - optional: true - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.3 - optional: true - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - optional: true - - is-what@4.1.16: {} - - isarray@2.0.5: - optional: true - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - iterall@1.1.3: {} - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - join-monster-graphql-tools-adapter@0.0.2(graphql-tools@2.0.0(graphql@0.11.7))(join-monster@2.0.15(graphql@0.11.7)): - dependencies: - graphql-tools: 2.0.0(graphql@0.11.7) - join-monster: 2.0.15(graphql@0.11.7) - - join-monster@2.0.15(graphql@0.11.7): - dependencies: - '@stem/nesthydrationjs': 0.4.0 - debug: 3.1.0 - deprecate: 1.1.1 - generatorics: 1.1.0 - graphql: 0.11.7 - graphql-relay: 0.5.5(graphql@0.11.7) - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - joycon@3.1.1: {} - - js-tokens@9.0.1: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@1.1.0: {} - - json-buffer@3.0.1: {} - - json-schema-to-ts@3.1.1: - dependencies: - '@babel/runtime': 7.26.7 - ts-algebra: 2.0.0 - - json-schema-traverse@0.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonwebtoken@9.0.2: - 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.1.1 - ms: 2.1.3 - semver: 7.7.1 - - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - load-tsconfig@0.2.5: {} - - local-pkg@0.5.1: - dependencies: - mlly: 1.7.4 - pkg-types: 1.3.1 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - 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.merge@4.6.1: {} - - lodash.merge@4.6.2: {} - - lodash.once@4.1.1: {} - - lodash.sortby@4.7.0: {} - - lodash@4.13.1: {} - - lodash@4.17.21: {} - - long-timeout@0.1.1: {} - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.4.3: {} - - lru-cache@4.1.1: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magicast@0.3.5: - dependencies: - '@babel/parser': 7.26.8 - '@babel/types': 7.26.8 - source-map-js: 1.2.1 - - make-dir@4.0.0: - dependencies: - semver: 7.7.1 - - mark.js@8.11.1: {} - - math-intrinsics@1.1.0: {} - - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - media-typer@0.3.0: {} - - memory-pager@1.5.0: - optional: true - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.53.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@4.0.0: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - minisearch@7.1.1: {} - - mitt@3.0.1: {} - - mlly@1.7.4: - dependencies: - acorn: 8.14.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.5.4 - - mongo-sql@4.0.2: {} - - mongodb-connection-string-url@2.6.0: - dependencies: - '@types/whatwg-url': 8.2.2 - whatwg-url: 11.0.0 - - mongodb@5.9.2: - dependencies: - bson: 5.5.1 - mongodb-connection-string-url: 2.6.0 - socks: 2.8.4 - optionalDependencies: - '@mongodb-js/saslprep': 1.2.0 - - ms@2.0.0: {} - - ms@2.1.3: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.8: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - neotraverse@0.6.18: {} - - npm-check-updates@17.1.14: {} - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: - optional: true - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - optional: true - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - optional: true - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - optional: true - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - optional: true - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - oniguruma-to-es@3.1.0: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 6.0.1 - regex-recursion: 6.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.2.7 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - optional: true - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-limit@5.0.0: - dependencies: - yocto-queue: 1.1.1 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - package-json-from-dist@1.0.1: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parseurl@1.3.3: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} - - pathe@1.1.2: {} - - pathe@2.0.3: {} - - pathval@1.1.1: {} - - perfect-debounce@1.0.0: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pirates@4.0.6: {} - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - possible-typed-array-names@1.1.0: - optional: true - - postcss-load-config@6.0.1(postcss@8.5.2): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - postcss: 8.5.2 - - postcss@8.5.2: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - preact@10.25.4: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@3.5.0: {} - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - process@0.11.10: {} - - property-information@6.5.0: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - pseudomap@1.0.2: {} - - punycode@2.3.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - queue-microtask@1.2.3: {} - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - react-is@18.3.1: {} - - readdirp@4.1.1: {} - - rechoir@0.6.2: - dependencies: - resolve: 1.22.10 - - reflect.getprototypeof@1.0.10: - 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.1.1 - get-intrinsic: 1.2.7 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - optional: true - - regenerator-runtime@0.14.1: {} - - regex-recursion@6.0.2: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@6.0.1: - dependencies: - regex-utilities: 2.3.0 - - regexp.prototype.flags@1.5.4: - dependencies: - 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 - optional: true - - require-from-string@2.0.2: {} - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rfdc@1.4.1: {} - - rollup@4.34.6: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.6 - '@rollup/rollup-android-arm64': 4.34.6 - '@rollup/rollup-darwin-arm64': 4.34.6 - '@rollup/rollup-darwin-x64': 4.34.6 - '@rollup/rollup-freebsd-arm64': 4.34.6 - '@rollup/rollup-freebsd-x64': 4.34.6 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.6 - '@rollup/rollup-linux-arm-musleabihf': 4.34.6 - '@rollup/rollup-linux-arm64-gnu': 4.34.6 - '@rollup/rollup-linux-arm64-musl': 4.34.6 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.6 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.6 - '@rollup/rollup-linux-riscv64-gnu': 4.34.6 - '@rollup/rollup-linux-s390x-gnu': 4.34.6 - '@rollup/rollup-linux-x64-gnu': 4.34.6 - '@rollup/rollup-linux-x64-musl': 4.34.6 - '@rollup/rollup-win32-arm64-msvc': 4.34.6 - '@rollup/rollup-win32-ia32-msvc': 4.34.6 - '@rollup/rollup-win32-x64-msvc': 4.34.6 - fsevents: 2.3.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - has-symbols: 1.1.0 - isarray: 2.0.5 - optional: true - - safe-buffer@5.2.1: {} - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - optional: true - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-regex: 1.2.1 - optional: true - - safer-buffer@2.1.2: {} - - search-insights@2.17.3: {} - - semver@6.3.1: - optional: true - - semver@7.7.1: {} - - send@0.19.0: - 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 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.7 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - optional: true - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - optional: true - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - optional: true - - setprototypeof@1.2.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - - shiki@2.3.2: - dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/langs': 2.3.2 - '@shikijs/themes': 2.3.2 - '@shikijs/types': 2.3.2 - '@shikijs/vscode-textmate': 10.0.1 - '@types/hast': 3.0.4 - - short-hash@1.0.0: - dependencies: - hash-string: 1.0.0 - - shx@0.3.4: - dependencies: - minimist: 1.2.8 - shelljs: 0.8.5 - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - sift@17.1.3: {} - - siginfo@2.0.0: {} - - signal-exit@4.1.0: {} - - smart-buffer@4.2.0: {} - - socket.io-adapter@2.5.5: - dependencies: - debug: 4.3.7 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - socket.io@4.8.1: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.6.4 - socket.io-adapter: 2.5.5 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socks@2.8.4: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - - sort-keys@2.0.0: - dependencies: - is-plain-obj: 1.1.0 - - source-map-js@1.2.1: {} - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - space-separated-tokens@2.0.2: {} - - sparse-bitfield@3.0.3: - dependencies: - memory-pager: 1.5.0 - optional: true - - speakingurl@14.0.1: {} - - sprintf-js@1.1.3: {} - - stable-hash@0.0.4: {} - - stackback@0.0.2: {} - - statuses@2.0.1: {} - - std-env@3.8.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - optional: true - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - optional: true - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - optional: true - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@3.0.0: - optional: true - - strip-final-newline@3.0.0: {} - - strip-json-comments@3.1.1: {} - - strip-literal@2.1.1: - dependencies: - js-tokens: 9.0.1 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - superjson@2.2.2: - dependencies: - copy-anything: 3.0.5 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.9.2: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 - - tabbable@6.2.0: {} - - tapable@2.2.1: {} - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - tinybench@2.9.0: {} - - tinyexec@0.3.2: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 - - tinypool@0.8.4: {} - - tinyrainbow@2.0.0: {} - - tinyspy@2.2.1: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tr46@3.0.0: - dependencies: - punycode: 2.3.1 - - traverse@0.6.6: {} - - tree-kill@1.2.2: {} - - trim-lines@3.0.1: {} - - ts-algebra@2.0.0: {} - - ts-api-utils@2.0.1(typescript@5.7.3): - dependencies: - typescript: 5.7.3 - - ts-interface-checker@0.1.13: {} - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.8.1: {} - - tsup@8.3.6(postcss@8.5.2)(typescript@5.7.3): - dependencies: - bundle-require: 5.1.0(esbuild@0.24.2) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.24.2 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.2) - resolve-from: 5.0.0 - rollup: 4.34.6 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.10 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.2 - typescript: 5.7.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.1.0: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - optional: true - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - optional: true - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - optional: true - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - optional: true - - typescript-eslint@8.24.0(eslint@9.20.1)(typescript@5.7.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) - eslint: 9.20.1 - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - - typescript@5.7.3: {} - - ufo@1.5.4: {} - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.3 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - optional: true - - undici-types@6.20.0: {} - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - unpipe@1.0.0: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - utils-merge@1.0.1: {} - - uuid@11.0.5: {} - - uuid@3.4.0: {} - - vary@1.1.2: {} - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite-node@1.6.1(@types/node@22.13.2): - dependencies: - cac: 6.7.14 - debug: 4.4.0 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.14(@types/node@22.13.2) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite@5.4.14(@types/node@22.13.2): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.2 - rollup: 4.34.6 - optionalDependencies: - '@types/node': 22.13.2 - fsevents: 2.3.3 - - vitepress@1.6.3(@algolia/client-search@5.20.2)(@types/node@22.13.2)(postcss@8.5.2)(search-insights@2.17.3)(typescript@5.7.3): - dependencies: - '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.20.2)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.24 - '@shikijs/core': 2.3.2 - '@shikijs/transformers': 2.3.2 - '@shikijs/types': 2.3.2 - '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.13.2))(vue@3.5.13(typescript@5.7.3)) - '@vue/devtools-api': 7.7.2 - '@vue/shared': 3.5.13 - '@vueuse/core': 12.5.0(typescript@5.7.3) - '@vueuse/integrations': 12.5.0(focus-trap@7.6.4)(typescript@5.7.3) - focus-trap: 7.6.4 - mark.js: 8.11.1 - minisearch: 7.1.1 - shiki: 2.3.2 - vite: 5.4.14(@types/node@22.13.2) - vue: 3.5.13(typescript@5.7.3) - optionalDependencies: - postcss: 8.5.2 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jwt-decode - - less - - lightningcss - - nprogress - - qrcode - - react - - react-dom - - sass - - sass-embedded - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - typescript - - universal-cookie - - vitest@1.6.1(@types/node@22.13.2): - dependencies: - '@vitest/expect': 1.6.1 - '@vitest/runner': 1.6.1 - '@vitest/snapshot': 1.6.1 - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - acorn-walk: 8.3.4 - chai: 4.5.0 - debug: 4.4.0 - execa: 8.0.1 - local-pkg: 0.5.1 - magic-string: 0.30.17 - pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.8.0 - strip-literal: 2.1.1 - tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.14(@types/node@22.13.2) - vite-node: 1.6.1(@types/node@22.13.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.13.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vue@3.5.13(typescript@5.7.3): - dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) - '@vue/shared': 3.5.13 - optionalDependencies: - typescript: 5.7.3 - - webidl-conversions@4.0.2: {} - - webidl-conversions@7.0.0: {} - - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - optional: true - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.3 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.18 - optional: true - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - optional: true - - which-typed-array@1.1.18: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.5 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - optional: true - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - ws@8.17.1: {} - - yallist@2.1.2: {} - - yocto-queue@0.1.0: {} - - yocto-queue@1.1.1: {} - - zwitch@2.0.4: {} diff --git a/src/hooks/alter-items/alter-data.test.ts b/src/hooks/alter-items/alter-data.test.ts index 758eb39b..222a8839 100755 --- a/src/hooks/alter-items/alter-data.test.ts +++ b/src/hooks/alter-items/alter-data.test.ts @@ -66,31 +66,29 @@ describe('alterData', () => { assert.deepEqual(result, hookBefore); }); - it('updates hook before::create with new item returned', () => { - // @ts-ignore - return alterData((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( + it('updates hook before::create with new item returned', async () => { + await alterData((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( hookBefore, - ).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + ); + + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); }); - it('updates hook before::create async', () => { + it('updates hook before::create async', async () => { const alterFunc = (rec: any) => { rec.state = 'UT'; return Promise.resolve(); }; - // @ts-ignore - return alterData(alterFunc)(hookBefore).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + await alterData(alterFunc)(hookBefore); + + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); }); - it('updates hook before::create async with new item returned', () => { + it('updates hook before::create async with new item returned', async () => { const alterFunc = (rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })); - // @ts-ignore - return alterData(alterFunc)(hookBefore).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + + await alterData(alterFunc)(hookBefore); + + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); }); }); diff --git a/src/hooks/alter-items/alter-items.test.ts b/src/hooks/alter-items/alter-items.test.ts index cd500f80..6e024805 100755 --- a/src/hooks/alter-items/alter-items.test.ts +++ b/src/hooks/alter-items/alter-items.test.ts @@ -54,7 +54,7 @@ describe('services alterItems', () => { }); it('default func is a no-op', () => { - // @ts-ignore + // @ts-expect-error test case alterItems()(hookBefore); assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe' }); }); @@ -69,10 +69,9 @@ describe('services alterItems', () => { it('throws if 1st param is not a func', () => { try { - // @ts-ignore + // @ts-expect-error test case alterItems('no-func'); - } catch (error) { - // @ts-ignore + } catch (error: any) { assert.equal(error.message, 'Function required. (alter)'); return; } diff --git a/src/hooks/fast-join/test/make-services.ts b/src/hooks/fast-join/test/make-services.ts index 85d2e533..aa9f615f 100755 --- a/src/hooks/fast-join/test/make-services.ts +++ b/src/hooks/fast-join/test/make-services.ts @@ -33,11 +33,11 @@ const usersStore = [ { id: 104, name: 'Aubree' }, ]; -export const posts: any = makeService(postsStore, 'posts'); -export const comments: any = makeService(commentsStore, 'comments'); -export const users: any = makeService(usersStore, 'users'); +export const posts: any = makeService(postsStore); +export const comments: any = makeService(commentsStore); +export const users: any = makeService(usersStore); -function makeService(store1: any, _name: any) { +function makeService(store1: any) { return { get(id: any) { // console.log(`... ${name} get ${id}`); diff --git a/src/hooks/fgraphql/fgraphql.ts b/src/hooks/fgraphql/fgraphql.ts index 54ee8b10..7d5358d8 100755 --- a/src/hooks/fgraphql/fgraphql.ts +++ b/src/hooks/fgraphql/fgraphql.ts @@ -55,6 +55,7 @@ export function fgraphql(options1: FGraphQL ...(options1.options || {}), }; + // @ts-expect-error TODO schema = isFunction(schema) ? schema() : schema; if (!isObject(schema) && !isString(schema)) { @@ -90,6 +91,7 @@ export function fgraphql(options1: FGraphQL if (context.params.$populate) return context; // populate or fastJoin are running if (skipHookWhen) return context; + // @ts-expect-error TODO const q = isFunction(query) ? query(context) : query; if (!isObject(q)) { @@ -97,6 +99,7 @@ export function fgraphql(options1: FGraphQL } if (!ourResolvers) { + // @ts-expect-error TODO ourResolvers = resolvers(context.app, runTime); } @@ -160,13 +163,11 @@ function processRecords(store: any, query: any, recs: any, type: any, depth = 0) throwError(`query at Type ${type} are typeof ${typeof query} not object. (fgraphql)`, 202); } - return Promise.all( - recs.map((rec: any, j: any) => processRecord(store, query, depth, rec, type, j)), - ); + return Promise.all(recs.map((rec: any) => processRecord(store, query, depth, rec, type))); } // Process the a record. -function processRecord(store: any, query: any, depth: any, rec: any, type: any, j: any): any { +function processRecord(store: any, query: any, depth: any, rec: any, type: any): any { if (!rec) return; // Catch any null values from resolvers. const queryPropNames = Object.keys(query); @@ -175,7 +176,7 @@ function processRecord(store: any, query: any, depth: any, rec: any, type: any, // Process every query item. return Promise.all( - queryPropNames.map((fieldName, i) => + queryPropNames.map(fieldName => processRecordQuery( store, query, @@ -185,8 +186,6 @@ function processRecord(store: any, query: any, depth: any, rec: any, type: any, type, recFieldNamesInQuery, joinedNamesInQuery, - j, - i, ), ), ).then(() => { @@ -221,8 +220,6 @@ function processRecordQuery( type: any, recFieldNamesInQuery: any, joinedNamesInQuery: any, - j: any, - i: any, ): any { // One way to include/exclude rec fields is to give their names a falsey value. // _args and _none are not record field names but special purpose @@ -391,6 +388,7 @@ function convertFieldDefinitionType(fieldDefinitionType: any, errDesc: any, conv function throwError(msg: any, code: any) { const err = new Error(msg); + // @ts-expect-error code does not exist on Error err.code = code; throw err; } diff --git a/src/hooks/iff/iff-else.test.ts b/src/hooks/iff/iff-else.test.ts index 65b7e88e..d2b29f98 100755 --- a/src/hooks/iff/iff-else.test.ts +++ b/src/hooks/iff/iff-else.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-this-alias */ import type { HookContext } from '@feathersjs/feathers'; import { assert } from 'vitest'; import { iffElse, some, every } from '../..'; diff --git a/src/hooks/iff/iff-else.ts b/src/hooks/iff/iff-else.ts index 7f3ee8ca..581539a2 100755 --- a/src/hooks/iff/iff-else.ts +++ b/src/hooks/iff/iff-else.ts @@ -26,6 +26,7 @@ export function iffElse( ? [falseHook] : undefined; + // eslint-disable-next-line @typescript-eslint/no-this-alias const that = this; const check = typeof predicate === 'function' ? predicate.apply(that, [ctx]) : !!predicate; diff --git a/src/hooks/iff/iff.ts b/src/hooks/iff/iff.ts index f755aef8..19345c25 100755 --- a/src/hooks/iff/iff.ts +++ b/src/hooks/iff/iff.ts @@ -25,7 +25,6 @@ export function iff( iffWithoutElse.else = (...falseHooks: any[]) => (context: H) => - // @ts-ignore iffElse(predicate, hooks.slice(), falseHooks.slice())(context); return iffWithoutElse as IffHook; diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts index 9c0a53b7..a0570925 100755 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -13,7 +13,6 @@ export function paramsFromClient(...whiteli whitelist.forEach(key => { if (key in client) { - // @ts-ignore params[key] = client[key]; } }); diff --git a/src/hooks/run-parallel/run-parallel.test.ts b/src/hooks/run-parallel/run-parallel.test.ts index 5692855f..ffb24a43 100755 --- a/src/hooks/run-parallel/run-parallel.test.ts +++ b/src/hooks/run-parallel/run-parallel.test.ts @@ -6,6 +6,7 @@ let that: any; function test(tester: any) { return function (this: any, contextCloned: any) { + // eslint-disable-next-line @typescript-eslint/no-this-alias that = this; tester(contextCloned); }; diff --git a/src/hooks/unless/unless.ts b/src/hooks/unless/unless.ts index 5f4e864c..a289d3e3 100755 --- a/src/hooks/unless/unless.ts +++ b/src/hooks/unless/unless.ts @@ -11,6 +11,5 @@ export function unless( predicate: boolean | PredicateFn, ...hooks: HookFunction[] ) { - // @ts-ignore return iffElse(predicate, undefined, hooks.slice()); } diff --git a/src/hooks/validate-schema/validate-schema.ts b/src/hooks/validate-schema/validate-schema.ts index 95f2e1f4..54297cc0 100755 --- a/src/hooks/validate-schema/validate-schema.ts +++ b/src/hooks/validate-schema/validate-schema.ts @@ -10,7 +10,7 @@ import { getItems } from '../../utils'; export function validateSchema( schema: object | string, ajvOrAjv: AjvOrNewable, - // @ts-ignore + // @ts-expect-error TODO options: ValidateSchemaOptions = { allErrors: true }, ) { const addNewError = options?.addNewError || addNewErrorDflt; @@ -18,10 +18,10 @@ export function validateSchema( // TODO: Any better way to tell if ajvOrAjv is an instance or a constructor? let ajv: any; let Ajv; - // @ts-ignore + // @ts-expect-error TODO if (typeof ajvOrAjv.addKeyword !== 'function') { Ajv = ajvOrAjv; - // @ts-ignore + // @ts-expect-error TODO ajv = new Ajv(options); } else { ajv = ajvOrAjv; diff --git a/src/hooks/validate/validate.ts b/src/hooks/validate/validate.ts index 4a0f2aa5..89628044 100755 --- a/src/hooks/validate/validate.ts +++ b/src/hooks/validate/validate.ts @@ -59,7 +59,6 @@ export function validate(validator: Validat // Sync function returns errors. It cannot sanitize. if (results && Object.keys(results).length) { - // @ts-ignore throw new BadRequest({ errors: results }); } diff --git a/src/utils/allows-multi/allows-multi.ts b/src/utils/allows-multi/allows-multi.ts deleted file mode 100644 index a0052479..00000000 --- a/src/utils/allows-multi/allows-multi.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { HookContext } from '@feathersjs/feathers'; -import { isMulti } from '../is-multi/is-multi'; - -export const allowsMulti = (context: H): boolean => { - const { service, method } = context; - if (!service.allowsMulti || !isMulti(context) || method === 'find') { - return true; - } - - return service.allowsMulti(method); -}; diff --git a/src/utils/calling-params/calling-params.ts b/src/utils/calling-params/calling-params.ts index fdd58d31..08ee037e 100755 --- a/src/utils/calling-params/calling-params.ts +++ b/src/utils/calling-params/calling-params.ts @@ -89,7 +89,7 @@ export function callingParams({ switch (name) { case 'populate': // fall through case 'fastJoin': - // @ts-ignore + // @ts-expect-error TODO newParams._populate = 'skip'; break; case 'softDelete': @@ -97,15 +97,15 @@ export function callingParams({ newParams.query.$disableSoftDelete = true; break; case 'softDelete2': - // @ts-ignore + // @ts-expect-error TODO newParams.$disableSoftDelete2 = true; break; case 'ignoreDeletedAt': - // @ts-ignore + // @ts-expect-error TODO newParams.$ignoreDeletedAt = true; break; case 'stashBefore': - // @ts-ignore + // @ts-expect-error TODO newParams.disableStashBefore = true; break; } diff --git a/src/utils/combine/combine.test.ts b/src/utils/combine/combine.test.ts index ac7d1db5..f2c347a0 100755 --- a/src/utils/combine/combine.test.ts +++ b/src/utils/combine/combine.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-this-alias */ import { assert } from 'vitest'; import { feathers } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; diff --git a/src/utils/combine/combine.ts b/src/utils/combine/combine.ts index 66ec8a08..5b2d3fc6 100755 --- a/src/utils/combine/combine.ts +++ b/src/utils/combine/combine.ts @@ -34,16 +34,16 @@ export function combine(...serviceHooks: Ho }; // Go through all hooks and chain them into our promise - // @ts-ignore + + // @ts-expect-error TODO const promise = serviceHooks.reduce(async (current, fn) => { - // @ts-ignore + // @ts-expect-error TODO const hook = fn.bind(this); // Use the returned hook object or the old one const currentHook = await current; const currentCtx = await hook(currentHook); - // @ts-ignore return updateCurrentHook(currentCtx); }, Promise.resolve(ctx)); diff --git a/src/utils/every/every.ts b/src/utils/every/every.ts index 3768c312..ef46016a 100755 --- a/src/utils/every/every.ts +++ b/src/utils/every/every.ts @@ -9,7 +9,7 @@ export function every( ...predicates: PredicateFn[] ): AsyncPredicateFn { return async function (this: any, ...fnArgs: any[]) { - // @ts-ignore + // @ts-expect-error TODO const promises = predicates.map(fn => fn.apply(this, fnArgs)); const results = await Promise.all(promises); diff --git a/src/utils/index.ts b/src/utils/index.ts index 3c73911b..23fa7083 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -19,7 +19,6 @@ export * from './replace-items/replace-result'; export * from './some/some'; export * from './run-hook/run-hook'; -export * from './allows-multi/allows-multi'; export * from './get-paginate/get-paginate'; export * from './is-multi/is-multi'; export * from './is-paginated/is-paginated'; diff --git a/src/utils/replace-items/replace-items.ts b/src/utils/replace-items/replace-items.ts index 660e4263..548e2b2e 100755 --- a/src/utils/replace-items/replace-items.ts +++ b/src/utils/replace-items/replace-items.ts @@ -7,7 +7,6 @@ import type { HookContext } from '@feathersjs/feathers'; * @deprecated Use `replaceData` or `replaceResult` instead. */ export function replaceItems(context: H, items: any): void { - // @ts-ignore if (context.params && context.params._actOn === 'dispatch') { if (context.method === 'find' && context.dispatch?.data) { context.dispatch.data = Array.isArray(items) ? items : [items]; diff --git a/src/utils/run-hook/run-hook.ts b/src/utils/run-hook/run-hook.ts index 706b08f4..1ff4524a 100755 --- a/src/utils/run-hook/run-hook.ts +++ b/src/utils/run-hook/run-hook.ts @@ -12,30 +12,27 @@ export function runHook( return hookFunc => result => { const ctx = Object.assign({}, { type: 'after', params: {}, result }, extraContent); - // @ts-ignore + // @ts-expect-error TODO if (typeof result === 'object' && result !== null && result.total && result.data) { // @ts-expect-error method is readonly ctx.method = 'find'; } - return ( - Promise.resolve() - // @ts-ignore - .then(() => hookFunc(ctx)) - .then(newContext => { - if (!newContext) { - return; - } + return Promise.resolve() + .then(() => hookFunc(ctx)) + .then(newContext => { + if (!newContext) { + return; + } - const result = newContext.result; + const result = newContext.result; - if (typeof result === 'object' && result !== null && result.total && result.data) { - // find - return newContext.result; - } + if (typeof result === 'object' && result !== null && result.total && result.data) { + // find + return newContext.result; + } - return newContext.result.data || newContext.result; - }) - ); + return newContext.result.data || newContext.result; + }); }; } diff --git a/test/index.test.ts b/test/index.test.ts index e2097f77..de9f42a6 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -103,7 +103,6 @@ const members = [ 'getPaginate', 'isMulti', 'isPaginated', - 'allowsMulti', 'skipResult', ].sort(); From 914b084104be84fb7ab0925298ac89fd7407ae31 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:03:55 +0100 Subject: [PATCH 04/15] WIP --- README.md | 49 +- eslint.config.mjs | 3 +- package-lock.json | 7 + package.json | 6 +- src/common/index.ts | 2 +- src/hooks/alter-items/alter-data.ts | 2 +- src/hooks/alter-items/alter-result.test.ts | 145 +++-- src/hooks/alter-items/alter-result.ts | 11 +- .../check-required.test.ts} | 19 +- .../check-required.ts} | 12 +- .../create-related/create-related.test.ts | 247 ++++++++ src/hooks/create-related/create-related.ts | 54 ++ src/hooks/de-populate/de-populate.test.ts | 13 +- src/hooks/disallow/disallow.test.ts | 16 +- src/hooks/disallow/disallow.ts | 15 +- src/hooks/fast-join/test/make-services.ts | 2 - src/hooks/fgraphql/fgraphql.test.ts | 8 - src/hooks/{unless => iff}/unless.test.ts | 14 +- src/hooks/{unless => iff}/unless.ts | 4 +- src/hooks/index.ts | 5 +- src/hooks/lowercase/lowercase-result.test.ts | 82 ++- src/hooks/lowercase/lowercase-result.ts | 43 +- src/hooks/omit-query/omit-query.ts | 6 +- src/hooks/omit/omit-result.test.ts | 2 +- src/hooks/omit/omit-result.ts | 10 +- src/hooks/on-delete/on-delete.test.ts | 558 ++++++++++++++++++ src/hooks/on-delete/on-delete.ts | 78 +++ .../params-for-server2.test.ts | 46 ++ .../params-for-server2/params-for-server2.ts | 61 ++ .../params-from-client/params-from-client.ts | 2 + .../params-from-client2.test.ts | 54 ++ .../params-from-client2.ts | 53 ++ src/hooks/pick-query/pick-query.ts | 4 +- src/hooks/pick/pick-result.ts | 19 +- src/hooks/set-dispatch/set-dispatch.ts | 0 src/hooks/set-field/set-field.test.ts | 27 - src/hooks/set-field/set-field.ts | 14 +- src/hooks/set-now/set-now-data.test.ts | 3 +- src/hooks/set-now/set-now-result.test.ts | 3 +- src/hooks/set-now/set-now-result.ts | 26 +- src/hooks/set-now/set-now.test.ts | 3 +- src/hooks/set-slug/set-slug.ts | 6 +- src/hooks/sifter/sifter.test.ts | 34 +- src/hooks/sifter/sifter.ts | 8 +- src/hooks/soft-delete/soft-delete.test.ts | 2 +- src/hooks/soft-delete/soft-delete.ts | 74 ++- src/hooks/throw-if/throw-if-is-multi.ts | 25 + src/hooks/throw-if/throw-if-is-provider.ts | 20 + src/hooks/throw-if/throw-if.ts | 21 + src/index.ts | 1 + src/internal.utils.ts | 6 + src/{utils => predicates}/every/every.test.ts | 49 +- src/predicates/every/every.ts | 35 ++ src/predicates/index.ts | 7 + src/predicates/is-context/is-context.ts | 39 ++ .../is-multi/is-multi.test.ts | 2 +- .../is-multi/is-multi.ts | 0 .../is-paginated/is-paginated.test.ts | 2 +- .../is-paginated/is-paginated.ts | 2 +- .../is-provider/is-provider.test.ts | 2 +- .../is-provider/is-provider.ts | 0 .../not/not.test.ts} | 26 +- .../is-not.ts => predicates/not/not.ts} | 17 +- src/predicates/some/some.test.ts | 61 ++ src/predicates/some/some.ts | 38 ++ src/types.ts | 22 +- src/utils/calling-params/calling-params.ts | 18 +- src/utils/check-context/check-context.test.ts | 80 +-- src/utils/check-context/check-context.ts | 28 +- src/utils/combine/combine.ts | 2 +- src/utils/every/every.ts | 18 - .../get-result-is-array.test.ts | 80 +++ .../get-result-is-array.ts | 17 +- src/utils/index.ts | 8 +- .../params-for-server/params-for-server.ts | 2 + src/utils/replace-items/replace-data.ts | 2 +- .../replace-items/replace-result.test.ts | 169 ++++++ src/utils/replace-items/replace-result.ts | 76 ++- src/utils/skip-result/skip-result.ts | 3 +- src/utils/some/some.test.ts | 138 ----- src/utils/some/some.ts | 17 - .../transform-params/transform-params.ts | 18 + test/index.test.ts | 9 +- 83 files changed, 2282 insertions(+), 630 deletions(-) rename src/hooks/{required/required.test.ts => check-required/check-required.test.ts} (50%) rename src/hooks/{required/required.ts => check-required/check-required.ts} (72%) create mode 100644 src/hooks/create-related/create-related.test.ts create mode 100644 src/hooks/create-related/create-related.ts rename src/hooks/{unless => iff}/unless.test.ts (96%) rename src/hooks/{unless => iff}/unless.ts (81%) create mode 100644 src/hooks/on-delete/on-delete.test.ts create mode 100644 src/hooks/on-delete/on-delete.ts create mode 100644 src/hooks/params-for-server2/params-for-server2.test.ts create mode 100644 src/hooks/params-for-server2/params-for-server2.ts create mode 100644 src/hooks/params-from-client2/params-from-client2.test.ts create mode 100644 src/hooks/params-from-client2/params-from-client2.ts delete mode 100644 src/hooks/set-dispatch/set-dispatch.ts create mode 100644 src/hooks/throw-if/throw-if-is-multi.ts create mode 100644 src/hooks/throw-if/throw-if-is-provider.ts create mode 100644 src/hooks/throw-if/throw-if.ts rename src/{utils => predicates}/every/every.test.ts (72%) create mode 100755 src/predicates/every/every.ts create mode 100644 src/predicates/index.ts create mode 100644 src/predicates/is-context/is-context.ts rename src/{utils => predicates}/is-multi/is-multi.test.ts (97%) rename src/{utils => predicates}/is-multi/is-multi.ts (100%) rename src/{utils => predicates}/is-paginated/is-paginated.test.ts (97%) rename src/{utils => predicates}/is-paginated/is-paginated.ts (84%) rename src/{utils => predicates}/is-provider/is-provider.test.ts (98%) rename src/{utils => predicates}/is-provider/is-provider.ts (100%) rename src/{utils/is-not/is-not.test.ts => predicates/not/not.test.ts} (81%) rename src/{utils/is-not/is-not.ts => predicates/not/not.ts} (58%) create mode 100755 src/predicates/some/some.test.ts create mode 100755 src/predicates/some/some.ts delete mode 100755 src/utils/every/every.ts create mode 100644 src/utils/replace-items/replace-result.test.ts delete mode 100755 src/utils/some/some.test.ts delete mode 100755 src/utils/some/some.ts create mode 100644 src/utils/transform-params/transform-params.ts diff --git a/README.md b/README.md index afbd7ea1..b9035ba5 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## feathers-hooks-common -### WIP Changes: +#### hooks - added alterData, alterResult, deprecated alterItems - added discardData, discardResult, deprecated discard @@ -10,23 +10,54 @@ - added lowercaseData, lowercaseResult, deprecated lowercase - added setNowData, setNowResult, deprecated setNow -- added getDataIsArray, getResultIsArray, deprecated getItems -- added replaceData, replaceResult, deprecated replaceItems - - removed several checks that are handled by typescript - removed check for `preventChanges(true, ...fieldNames)` - renamed 'keepQuery' to 'pickQuery', added alias +- renamed 'required' to 'checkRequired', added alias + +- added throwIf +- added throwIfIsProvider +- added throwIfIsMulti +- added paramsForServer2 & paramsForClient2 -- added utils from feathers-utils +- added 'onDelete' & 'createRelated' - - getPaginate - - isMulti - - isPaginated - - setResultEmpty +- rm support for spread argument + +#### predicates + +- renamed 'isNot' to 'not' (added alias for 'isNot') +- added predicate isMulti +- added predicate isPaginated +- added predicate isContext + +#### utils + +- added getDataIsArray, getResultIsArray, deprecated getItems +- added replaceData, replaceResult, deprecated replaceItems +- added util getPaginate +- added util setResultEmpty + +- add onDelete - stashBefore multi +- new: createRelated +- new: onDelete + +- softDelete: added 'transformParams' & added 'key' option + +### Hooks to discuss + +- cache +- populate +- dePopulate +- fgraphql +- fastJoin +- sequelizeConvert +- serialize +

diff --git a/eslint.config.mjs b/eslint.config.mjs index a89133cf..42c7b388 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -36,7 +36,7 @@ export default tseslint.config( }, rules: { 'import-x/no-dynamic-require': 'warn', - 'import-x/no-nodejs-modules': 'off', + 'import-x/no-nodejs-modules': 'error', }, }, { @@ -45,6 +45,7 @@ export default tseslint.config( '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-unused-vars': 'off', + 'import-x/no-nodejs-modules': 'off', }, }, eslintPluginPrettierRecommended, diff --git a/package-lock.json b/package-lock.json index 21a70e00..c545ac3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@feathersjs/errors": "^5.0.31", "ajv": "^6.12.6", + "fast-copy": "^3.0.2", "graphql": "^16.10.0", "lodash": "^4.17.21", "neotraverse": "^0.6.18" @@ -4901,6 +4902,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" diff --git a/package.json b/package.json index eeebb7c2..1756b4a0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "update-dependencies": "ncu -u -x ajv", "test:unit": "vitest run", "coverage": "vitest run --coverage", - "test": "npm run lint && npm run coverage" + "test": "npm run lint && npm run coverage", + "vitest": "vitest" }, "repository": { "type": "git", @@ -64,6 +65,7 @@ "dependencies": { "@feathersjs/errors": "^5.0.31", "ajv": "^6.12.6", + "fast-copy": "^3.0.2", "graphql": "^16.10.0", "lodash": "^4.17.21", "neotraverse": "^0.6.18" @@ -87,8 +89,8 @@ "@typescript-eslint/parser": "^8.21.0", "@vitest/coverage-v8": "^3.0.3", "eslint": "^9.18.0", - "eslint-import-resolver-typescript": "^3.7.0", "eslint-config-prettier": "^10.0.1", + "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import-x": "^4.6.1", "eslint-plugin-prettier": "^5.2.3", "mongodb": "^5.9.2", diff --git a/src/common/index.ts b/src/common/index.ts index dc71d900..ccd73a42 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,5 +1,5 @@ export function isPromise(p: any): p is Promise { - return !!p && (typeof p === 'object' || typeof p === 'function') && typeof p.then === 'function'; + return p instanceof Promise; } export { setFields } from './set-fields'; diff --git a/src/hooks/alter-items/alter-data.ts b/src/hooks/alter-items/alter-data.ts index 95b76082..35fdc768 100755 --- a/src/hooks/alter-items/alter-data.ts +++ b/src/hooks/alter-items/alter-data.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; import { replaceData } from '../../utils/replace-items/replace-data'; -import { isPromise } from 'util/types'; +import { isPromise } from '../../common'; /** * Make changes to data items. Very flexible. diff --git a/src/hooks/alter-items/alter-result.test.ts b/src/hooks/alter-items/alter-result.test.ts index c185b675..31468f85 100755 --- a/src/hooks/alter-items/alter-result.test.ts +++ b/src/hooks/alter-items/alter-result.test.ts @@ -1,5 +1,6 @@ import { assert } from 'vitest'; import { alterResult } from './alter-result'; +import { HookContext } from '@feathersjs/feathers'; let hookAfter: any; let hookFindPaginate: any; @@ -40,6 +41,7 @@ describe('alterResult', () => { alterResult((rec: any) => { delete rec.last; })(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); @@ -47,6 +49,7 @@ describe('alterResult', () => { alterResult((rec: any) => { rec.new = rec.first; })(hookFind); + assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, @@ -57,16 +60,19 @@ describe('alterResult', () => { alterResult((rec: any) => { rec.new = rec.first; })(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); }); it('updates hook after::find with pagination with new item returned', () => { alterResult((rec: any) => Object.assign({}, { first: rec.first }))(hookFindPaginate); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); it('updates hook after::find with pagination with new item returned', () => { alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookFind); + assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, @@ -75,69 +81,124 @@ describe('alterResult', () => { it('updates hook after with new item returned', () => { alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookAfter); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); }); - it('updates hook after::create', () => { - return alterResult((rec: any) => { + it('updates hook after::create', async () => { + await alterResult((rec: any) => { rec.new = rec.first; return Promise.resolve(); - // @ts-ignore - })(hookAfter).then(() => { - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + })(hookAfter); + + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); }); - it('updates hook after::create with new item returned', () => { - // @ts-ignore - return alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( + it('updates hook after::create with new item returned', async () => { + await alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( hookAfter, - ).then(() => { - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + ); + + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); }); - it('updates hook after::find with pagination', () => { - return alterResult((rec: any) => { + it('updates hook after::find with pagination', async () => { + await alterResult((rec: any) => { delete rec.last; return Promise.resolve(); - // @ts-ignore - })(hookFindPaginate).then(() => { - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + })(hookFindPaginate); + + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); - it('updates hook after::find with no pagination', () => { - return alterResult((rec: any) => { + it('updates hook after::find with no pagination', async () => { + await alterResult((rec: any) => { rec.new = rec.first; return Promise.resolve(); - // @ts-ignore - })(hookFind).then(() => { - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + })(hookFind); + + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); }); - it('updates hook after::find with pagination with new item returned', () => { - // @ts-ignore - return alterResult((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( + it('updates hook after::find with pagination with new item returned', async () => { + await alterResult((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( hookFindPaginate, - ).then(() => { - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + ); + + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); }); - it('updates hook after::find with no pagination with new item returned', () => { - // @ts-ignore - return alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( + it('updates hook after::find with no pagination with new item returned', async () => { + await alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( hookFind, - ).then(() => { - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + ); + + assert.deepEqual(hookFind.result, [ + { first: 'John', last: 'Doe', new: 'John' }, + { first: 'Jane', last: 'Doe', new: 'Jane' }, + ]); + }); + + it('updates dispatch', () => { + const context = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + dispatch: { first: 'Jack', last: 'Doe' }, + } as HookContext; + + alterResult( + (rec: any) => { + rec.new = rec.first; + }, + { dispatch: true }, + )(context); + + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }); + assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }); + }); + + it('updates dispatch even though it is not defined', () => { + const context = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + dispatch: undefined, + } as HookContext; + + alterResult( + (rec: any) => { + rec.new = rec.first; + }, + { dispatch: true }, + )(context); + + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }); + assert.deepEqual(context.dispatch, { first: 'Jane', last: 'Doe', new: 'Jane' }); + }); + + it('updates dispatch and result', () => { + const context = { + type: 'after', + method: 'create', + params: { provider: 'rest' }, + result: { first: 'Jane', last: 'Doe' }, + dispatch: { first: 'Jack', last: 'Doe' }, + } as HookContext; + + alterResult( + (rec: any) => { + rec.new = rec.first; + }, + { dispatch: 'both' }, + )(context); + + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); + assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }); }); }); diff --git a/src/hooks/alter-items/alter-result.ts b/src/hooks/alter-items/alter-result.ts index 3baf16e6..f637d259 100755 --- a/src/hooks/alter-items/alter-result.ts +++ b/src/hooks/alter-items/alter-result.ts @@ -1,13 +1,21 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { isPromise } from '../../common'; import { replaceResult } from '../../utils/replace-items/replace-result'; +import { DispatchOption } from '../../types'; + +export type AlterResultOptions = { + dispatch?: DispatchOption; +}; /** * Make changes to result items. Very flexible. * @see https://hooks-common.feathersjs.com/hooks.html#alteritems */ export const alterResult = - (cb: (record: T, context: H) => any) => + ( + cb: (record: T, context: H) => any, + options?: AlterResultOptions, + ) => (context: H, next?: NextFunction) => replaceResult( context, @@ -22,5 +30,6 @@ export const alterResult = }, { next, + dispatch: options?.dispatch, }, ); diff --git a/src/hooks/required/required.test.ts b/src/hooks/check-required/check-required.test.ts similarity index 50% rename from src/hooks/required/required.test.ts rename to src/hooks/check-required/check-required.test.ts index cb4c3338..0a1b5bc0 100755 --- a/src/hooks/required/required.test.ts +++ b/src/hooks/check-required/check-required.test.ts @@ -1,35 +1,36 @@ import { assert } from 'vitest'; -import { required } from './required'; +import { checkRequired } from './check-required'; +import { HookContext } from '@feathersjs/feathers'; -let hookBefore: any; +let hookBefore: HookContext; -describe('services required', () => { +describe('checkRequired', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' }, data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; + } as HookContext; }); it('does 1 prop with no dots', () => { - required('empl')(hookBefore); + checkRequired('empl')(hookBefore); }); it('does multi props with 1 dot', () => { - required('empl.name', 'dept')(hookBefore); + checkRequired(['empl.name', 'dept'])(hookBefore); }); it('does multi props with 2 dots', () => { - required('empl.name.last', 'empl.status', 'dept')(hookBefore); + checkRequired(['empl.name.last', 'empl.status', 'dept'])(hookBefore); }); it('throws on bad or missing paths', () => { - assert.throws(() => required('empl.name.first', 'empl.name.surname')(hookBefore)); + assert.throws(() => checkRequired(['empl.name.first', 'empl.name.surname'])(hookBefore)); }); it('ignores bad or missing no dot path', () => { - assert.throws(() => required('xx')(hookBefore)); + assert.throws(() => checkRequired('xx')(hookBefore)); }); }); diff --git a/src/hooks/required/required.ts b/src/hooks/check-required/check-required.ts similarity index 72% rename from src/hooks/required/required.ts rename to src/hooks/check-required/check-required.ts index d5b41ba9..0e61d286 100755 --- a/src/hooks/required/required.ts +++ b/src/hooks/check-required/check-required.ts @@ -1,15 +1,17 @@ import _get from 'lodash/get.js'; -import { BadRequest } from '@feathersjs/errors'; import _has from 'lodash/has.js'; +import { BadRequest } from '@feathersjs/errors'; import { checkContext, getDataIsArray } from '../../utils'; import type { HookContext } from '@feathersjs/feathers'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Check selected fields exist and are not falsey. Numeric 0 is acceptable. * @see https://hooks-common.feathersjs.com/hooks.html#required */ -export function required(...fieldNames: string[]) { +export function checkRequired(fieldNames: MaybeArray) { + const fieldNamesArray = toArray(fieldNames); return (context: H) => { checkContext(context, 'before', ['create', 'update', 'patch'], 'required'); @@ -18,8 +20,8 @@ export function required(...fieldNames: str for (let i = 0; i < data.length; i++) { const item = data[i]; - for (let j = 0; j < fieldNames.length; j++) { - const name = fieldNames[j]; + for (let j = 0; j < fieldNamesArray.length; j++) { + const name = fieldNamesArray[j]; if (!_has(item, name)) { throw new BadRequest(`Field ${name} does not exist. (required)`); @@ -34,3 +36,5 @@ export function required(...fieldNames: str } }; } + +export { checkRequired as required }; diff --git a/src/hooks/create-related/create-related.test.ts b/src/hooks/create-related/create-related.test.ts new file mode 100644 index 00000000..21555782 --- /dev/null +++ b/src/hooks/create-related/create-related.test.ts @@ -0,0 +1,247 @@ +import assert from 'assert'; +import { feathers } from '@feathersjs/feathers'; +import { MemoryService } from '@feathersjs/memory'; +import { createRelated } from './create-related'; + +type MockAppOptions = { + multi?: boolean; +}; + +const defaultOptions = { + multi: true, +}; + +const mockApp = (_options?: MockAppOptions) => { + const options = Object.assign({}, defaultOptions, _options); + const app = feathers(); + + app.use('users', new MemoryService({ startId: 1, multi: true })); + app.use('todos', new MemoryService({ startId: 1, multi: options.multi })); + + const usersService = app.service('users'); + const todosService = app.service('todos'); + + return { + app, + todosService, + usersService, + }; +}; + +describe('hook - createRelated', function () { + it('creates single item for single item', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => ({ + title: 'First issue', + userId: item.id, + }), + }), + ], + }, + }); + + const user = await app.service('users').create({ + name: 'John Doe', + }); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [{ id: 1, title: 'First issue', userId: 1 }]); + }); + + it('can use context in data function', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => ({ + title: context.path, + userId: item.id, + }), + }), + ], + }, + }); + + const user = await app.service('users').create({ + name: 'John Doe', + }); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [{ id: 1, title: 'users', userId: 1 }]); + }); + + it('creates multiple items for multiple items', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => ({ + title: item.name, + userId: item.id, + }), + }), + ], + }, + }); + + const users = await app + .service('users') + .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]); + + const todos = await todosService.find({ query: { $sort: { userId: 1 } } }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'user1', userId: 1 }, + { id: 2, title: 'user2', userId: 2 }, + { id: 3, title: 'user3', userId: 3 }, + ]); + }); + + it('creates multple items for multiple items with multi: false', async function () { + const { app, todosService } = mockApp({ multi: false }); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => ({ + title: item.name, + userId: item.id, + }), + multi: false, + }), + ], + }, + }); + + // @ts-expect-error - does not have options + assert.strictEqual(todosService.options.multi, false); + + const users = await app + .service('users') + .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]); + + const todos = await todosService.find({ query: { $sort: { userId: 1 } } }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'user1', userId: 1 }, + { id: 2, title: 'user2', userId: 2 }, + { id: 3, title: 'user3', userId: 3 }, + ]); + }); + + it('can create multiple data for one record', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => [ + { + title: 1, + userId: item.id, + }, + { + title: 2, + userId: item.id, + }, + ], + }), + ], + }, + }); + + const user = await app.service('users').create({ + name: 'John Doe', + }); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 1, userId: 1 }, + { id: 2, title: 2, userId: 1 }, + ]); + }); + + it('can pass an array', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated([ + { + service: 'todos', + data: (item, context) => [ + { + title: 1, + userId: item.id, + }, + ], + }, + { + service: 'todos', + data: (item, context) => [ + { + title: 2, + userId: item.id, + }, + ], + }, + ]), + ], + }, + }); + + const user = await app.service('users').create({ + name: 'John Doe', + }); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 1, userId: 1 }, + { id: 2, title: 2, userId: 1 }, + ]); + }); + + it('does not create items if falsey', async function () { + const { app, todosService } = mockApp(); + + app.service('users').hooks({ + after: { + create: [ + createRelated({ + service: 'todos', + data: (item, context) => null as any, + }), + ], + }, + }); + + const user = await app.service('users').create({ + name: 'John Doe', + }); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, []); + }); +}); diff --git a/src/hooks/create-related/create-related.ts b/src/hooks/create-related/create-related.ts new file mode 100644 index 00000000..bd8862a0 --- /dev/null +++ b/src/hooks/create-related/create-related.ts @@ -0,0 +1,54 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import { checkContext, getResultIsArray } from '../../utils'; +import { MaybeArray, Promisable } from '../../internal.utils'; + +export interface CreateRelatedOptions> { + service: keyof S; + multi?: boolean; + data: (item: any, context: HookContext) => Promisable>; +} + +/** + * hook to create related items + */ +export function createRelated, H extends HookContext = HookContext>( + options: MaybeArray>, +) { + return async (context: H, next?: NextFunction) => { + checkContext(context, ['after', 'around'], undefined, 'createRelated'); + + if (next) { + await next(); + } + + const { result } = getResultIsArray(context); + + const entries = Array.isArray(options) ? options : [options]; + + await Promise.all( + entries.map(async entry => { + const { data, service, multi } = entry; + + const dataToCreate = ( + await Promise.all(result.map(async item => data(item, context))) + ).filter(x => !!x); + + if (!dataToCreate || dataToCreate.length <= 0) { + return context; + } + + if (multi || dataToCreate.length === 1) { + await context.app + .service(service as string) + .create(dataToCreate.length === 1 ? dataToCreate[0] : dataToCreate); + } else { + await Promise.all( + dataToCreate.map(async item => context.app.service(service as string).create(item)), + ); + } + }), + ); + + return context; + }; +} diff --git a/src/hooks/de-populate/de-populate.test.ts b/src/hooks/de-populate/de-populate.test.ts index 77223f41..c07f4e88 100755 --- a/src/hooks/de-populate/de-populate.test.ts +++ b/src/hooks/de-populate/de-populate.test.ts @@ -1,6 +1,5 @@ import { assert } from 'vitest'; import { dePopulate } from './de-populate'; -import { clone } from '../../common'; describe('services dePopulate - not dot notation', () => { let hookAfter: any; @@ -95,7 +94,7 @@ describe('services dePopulate - not dot notation', () => { }); it('one item, after hook, missing props', () => { - const hook = clone(hookAfter); + const hook = structuredClone(hookAfter); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.result, { userId: 'as61389dadhga62343hads6712', @@ -105,7 +104,7 @@ describe('services dePopulate - not dot notation', () => { }); it('one item, before hook, not populated', () => { - const hook = clone(hookBefore); + const hook = structuredClone(hookBefore); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.data, { userId: 'as61389dadhga62343hads6712', @@ -115,7 +114,7 @@ describe('services dePopulate - not dot notation', () => { }); it('item array, before hook', () => { - const hook = clone(hookBeforeArray); + const hook = structuredClone(hookBeforeArray); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.data, [ { @@ -239,7 +238,7 @@ describe('services dePopulate - dot notation', () => { }); it('one item, after hook, missing props', () => { - const hook = clone(hookAfter); + const hook = structuredClone(hookAfter); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.result, { userId: 'as61389dadhga62343hads6712', @@ -250,7 +249,7 @@ describe('services dePopulate - dot notation', () => { }); it('one item, before hook, not populated', () => { - const hook = clone(hookBefore); + const hook = structuredClone(hookBefore); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.data, { userId: 'as61389dadhga62343hads6712', @@ -260,7 +259,7 @@ describe('services dePopulate - dot notation', () => { }); it('item array, before hook', () => { - const hook = clone(hookBeforeArray); + const hook = structuredClone(hookBeforeArray); const deHook: any = dePopulate()(hook); assert.deepEqual(deHook.data, [ { diff --git a/src/hooks/disallow/disallow.test.ts b/src/hooks/disallow/disallow.test.ts index 80b74bd0..7093a938 100755 --- a/src/hooks/disallow/disallow.test.ts +++ b/src/hooks/disallow/disallow.test.ts @@ -1,7 +1,5 @@ import { assert } from 'vitest'; - import { disallow } from './disallow'; -import { clone } from '../../common'; describe('services disallow', () => { describe('disallow is compatible with .disable (without predicate)', () => { @@ -86,7 +84,7 @@ describe('services disallow', () => { }); it('finds provider with 1 arg', () => { - const hook = clone(hookSocketio); + const hook = structuredClone(hookSocketio); const result = disallow('rest')(hook); assert.equal(result, undefined); @@ -97,7 +95,7 @@ describe('services disallow', () => { }); it('finds provider with 2 args', () => { - const hook = clone(hookSocketio); + const hook = structuredClone(hookSocketio); const result = disallow('rest', 'server')(hook); assert.equal(result, undefined); @@ -108,7 +106,7 @@ describe('services disallow', () => { }); it('finds server', () => { - const hook = clone(hookServer); + const hook = structuredClone(hookServer); const result = disallow('rest', 'socketio', 'external')(hook); assert.equal(result, undefined); @@ -119,7 +117,7 @@ describe('services disallow', () => { }); it('finds external', () => { - const hook = clone(hookSocketio); + const hook = structuredClone(hookSocketio); const result = disallow('rest', 'server')(hook); assert.equal(result, undefined); @@ -130,21 +128,21 @@ describe('services disallow', () => { }); it('succeeds if not provider', () => { - const hook = clone(hookServer); + const hook = structuredClone(hookServer); const result = disallow('socketio')(hook); assert.equal(result, undefined); }); it('succeeds if not external', () => { - const hook = clone(hookServer); + const hook = structuredClone(hookServer); const result = disallow('external')(hook); assert.equal(result, undefined); }); it('succeeds if not server', () => { - const hook = clone(hookSocketio); + const hook = structuredClone(hookSocketio); const result = disallow('server')(hook); assert.equal(result, undefined); diff --git a/src/hooks/disallow/disallow.ts b/src/hooks/disallow/disallow.ts index a6dec104..f54f3fd7 100755 --- a/src/hooks/disallow/disallow.ts +++ b/src/hooks/disallow/disallow.ts @@ -1,6 +1,7 @@ import { MethodNotAllowed } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; import type { TransportName } from '../../types'; +import { isProvider } from '../../predicates'; /** * Prevents access to a service method completely or for specific transports. @@ -8,17 +9,11 @@ import type { TransportName } from '../../types'; */ export function disallow(...transports: TransportName[]) { return (context: H) => { - const hookProvider = context.params?.provider; - - const anyProvider = transports.length === 0; - const thisProvider = transports.some( - provider => - provider === hookProvider || - (provider === 'server' && !hookProvider) || - (provider === 'external' && !!hookProvider), - ); + if (transports.length === 0) { + throw new MethodNotAllowed('Method not allowed'); + } - if (anyProvider || thisProvider) { + if (isProvider(...transports)(context)) { throw new MethodNotAllowed( `Provider '${context.params.provider}' can not call '${context.method}'. (disallow)`, ); diff --git a/src/hooks/fast-join/test/make-services.ts b/src/hooks/fast-join/test/make-services.ts index aa9f615f..42fb13c3 100755 --- a/src/hooks/fast-join/test/make-services.ts +++ b/src/hooks/fast-join/test/make-services.ts @@ -40,7 +40,6 @@ export const users: any = makeService(usersStore); function makeService(store1: any) { return { get(id: any) { - // console.log(`... ${name} get ${id}`); const store = clone(store1); for (let i = 0, leni = store.length; i < leni; i++) { @@ -51,7 +50,6 @@ function makeService(store1: any) { }, find(params: any) { - // console.log(`... ${name} find`, params ? params.query : ''); const store = clone(store1); if (!params || !params.query) return asyncReturn(store); diff --git a/src/hooks/fgraphql/fgraphql.test.ts b/src/hooks/fgraphql/fgraphql.test.ts index 0bc08d29..320fad0b 100755 --- a/src/hooks/fgraphql/fgraphql.test.ts +++ b/src/hooks/fgraphql/fgraphql.test.ts @@ -758,11 +758,3 @@ function a(typ: any) { } /* eslint-enable */ } - -/* -const { inspect } = require('util'); -function inspector(desc, obj) { - console.log(desc); - console.log(inspect(obj, { colors: true, depth: 5 })); -} -*/ diff --git a/src/hooks/unless/unless.test.ts b/src/hooks/iff/unless.test.ts similarity index 96% rename from src/hooks/unless/unless.test.ts rename to src/hooks/iff/unless.test.ts index 6c3c8f46..cb5e804a 100755 --- a/src/hooks/unless/unless.test.ts +++ b/src/hooks/iff/unless.test.ts @@ -64,7 +64,7 @@ const hookFcn = (hook: HookContext): HookContext => { return hook; }; -describe('services unless - sync predicate, sync hook', () => { +describe('sync predicate, sync hook', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -124,7 +124,7 @@ describe('services unless - sync predicate, sync hook', () => { }); }); -describe('services unless - sync predicate, async hook', () => { +describe('sync predicate, async hook', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -174,7 +174,7 @@ describe('services unless - sync predicate, async hook', () => { }); }); -describe('services unless - async predicate, sync hook', () => { +describe('async predicate, sync hook', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -212,7 +212,7 @@ describe('services unless - async predicate, sync hook', () => { }); }); -describe('services unless - async predicate, async hook', () => { +describe('async predicate, async hook', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -250,7 +250,7 @@ describe('services unless - async predicate, async hook', () => { }); }); -describe('services unless - sync predicate', () => { +describe('sync predicate', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -304,7 +304,7 @@ describe('services unless - sync predicate', () => { }); }); -describe('services unless - async predicate', () => { +describe('async predicate', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; @@ -366,7 +366,7 @@ describe('services unless - async predicate', () => { }); }); -describe('services unless - runs multiple hooks', () => { +describe('runs multiple hooks', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; diff --git a/src/hooks/unless/unless.ts b/src/hooks/iff/unless.ts similarity index 81% rename from src/hooks/unless/unless.ts rename to src/hooks/iff/unless.ts index a289d3e3..ca49ea78 100755 --- a/src/hooks/unless/unless.ts +++ b/src/hooks/iff/unless.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import { iffElse } from '..'; +import { iffElse } from './iff-else'; import type { PredicateFn, HookFunction } from '../../types'; /** @@ -11,5 +11,5 @@ export function unless( predicate: boolean | PredicateFn, ...hooks: HookFunction[] ) { - return iffElse(predicate, undefined, hooks.slice()); + return iffElse(predicate, undefined, [...hooks]); } diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 93697bf6..734e7dae 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -23,6 +23,7 @@ export * from './fgraphql/fgraphql'; // iff export * from './iff/iff'; export * from './iff/iff-else'; +export * from './iff/unless'; // pick export * from './pick/pick'; @@ -42,7 +43,7 @@ export * from './mongo-keys/mongo-keys'; export * from './params-from-client/params-from-client'; export * from './populate/populate'; export * from './prevent-changes/prevent-changes'; -export * from './required/required'; +export * from './check-required/check-required'; export * from './run-parallel/run-parallel'; export * from './sequelize-convert/sequelize-convert'; export * from './serialize/serialize'; @@ -57,6 +58,6 @@ export * from './sifter/sifter'; export * from './soft-delete/soft-delete'; export * from './stash-before/stash-before'; export * from './traverse/traverse'; -export * from './unless/unless'; + export * from './validate/validate'; export * from './validate-schema/validate-schema'; diff --git a/src/hooks/lowercase/lowercase-result.test.ts b/src/hooks/lowercase/lowercase-result.test.ts index 276bf015..9a4eaa5d 100755 --- a/src/hooks/lowercase/lowercase-result.test.ts +++ b/src/hooks/lowercase/lowercase-result.test.ts @@ -1,54 +1,52 @@ import { assert } from 'vitest'; import { lowercaseResult } from './lowercase-result'; - -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; +import { HookContext } from '@feathersjs/feathers'; describe('lowercaseResult', () => { - describe('updates data', () => { - beforeEach(() => { - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - result: [ + it('updates hook after::find with pagination', () => { + const context = { + type: 'after', + method: 'find', + result: { + total: 2, + data: [ { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + }, + } as HookContext; + + lowercaseResult(['first', 'last'])(context); + assert.deepEqual(context.result.data, [ + { first: 'john', last: 'doe' }, + { first: 'jane', last: 'doe' }, + ]); + }); - it('updates hook after::find with pagination', () => { - lowercaseResult('first', 'last')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [ - { first: 'john', last: 'doe' }, - { first: 'jane', last: 'doe' }, - ]); - }); + it('updates hook after::find with no pagination', () => { + const context = { + type: 'after', + method: 'find', + result: [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ], + } as HookContext; + lowercaseResult(['first', 'last'])(context); + assert.deepEqual(context.result, [ + { first: 'john', last: 'doe' }, + { first: 'jane', last: 'doe' }, + ]); + }); - it('updates hook after::find with no pagination', () => { - lowercaseResult('first', 'last')(hookFind); - assert.deepEqual(hookFind.result, [ - { first: 'john', last: 'doe' }, - { first: 'jane', last: 'doe' }, - ]); - }); + it('updates hook after', () => { + const context = { + type: 'after', + method: 'create', + result: { first: 'Jane', last: 'Doe' }, + } as HookContext; + lowercaseResult(['first', 'last'])(context); - it('updates hook after', () => { - lowercaseResult('first', 'last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'jane', last: 'doe' }); - }); + assert.deepEqual(context.result, { first: 'jane', last: 'doe' }); }); }); diff --git a/src/hooks/lowercase/lowercase-result.ts b/src/hooks/lowercase/lowercase-result.ts index d305e982..9646d671 100755 --- a/src/hooks/lowercase/lowercase-result.ts +++ b/src/hooks/lowercase/lowercase-result.ts @@ -2,25 +2,40 @@ import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; import { BadRequest } from '@feathersjs/errors'; import { alterResult } from '../alter-items/alter-result'; +import { DispatchOption } from '../../types'; +import { MaybeArray, toArray } from '../../internal.utils'; + +export type LowercaseResultOptions = { + dispatch?: DispatchOption; +}; /** * Convert certain field values to lower case. * @see https://hooks-common.feathersjs.com/hooks.html#lowercase */ -export const lowercaseResult = (...fieldNames: string[]) => - alterResult(item => { - for (let i = 0; i < fieldNames.length; i++) { - const fieldName = fieldNames[i]; - const value = _get(item, fieldName); +export const lowercaseResult = ( + fieldNames: MaybeArray, + options?: LowercaseResultOptions, +) => { + const fieldNamesArray = toArray(fieldNames); - if (value == null) { - continue; - } + return alterResult( + item => { + for (let i = 0; i < fieldNamesArray.length; i++) { + const fieldName = fieldNamesArray[i]; + const value = _get(item, fieldName); - if (typeof value !== 'string') { - throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); - } + if (value == null) { + continue; + } - _set(item, fieldName, value.toLowerCase()); - } - }); + if (typeof value !== 'string') { + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); + } + + _set(item, fieldName, value.toLowerCase()); + } + }, + { dispatch: options?.dispatch }, + ); +}; diff --git a/src/hooks/omit-query/omit-query.ts b/src/hooks/omit-query/omit-query.ts index 8b2b7ed7..f5c90cc7 100755 --- a/src/hooks/omit-query/omit-query.ts +++ b/src/hooks/omit-query/omit-query.ts @@ -5,8 +5,9 @@ import _omit from 'lodash/omit.js'; * Delete certain fields from the query object. * @see https://hooks-common.feathersjs.com/hooks.html#discardquery */ -export function omitQuery(...fieldNames: string[]) { - return (context: H) => { +export const omitQuery = + (...fieldNames: string[]) => + (context: H) => { if (!context.params.query) { return context; } @@ -15,6 +16,5 @@ export function omitQuery(...fieldNames: st return context; }; -} export { omitQuery as discardQuery }; diff --git a/src/hooks/omit/omit-result.test.ts b/src/hooks/omit/omit-result.test.ts index 979fdd38..7dfc0c12 100755 --- a/src/hooks/omit/omit-result.test.ts +++ b/src/hooks/omit/omit-result.test.ts @@ -75,7 +75,7 @@ describe('omitResult', () => { query: {}, }; - omitResult('email', 'password')(hook); + omitResult(['email', 'password'])(hook); assert.deepEqual(hook.result, { roles: ['super'], diff --git a/src/hooks/omit/omit-result.ts b/src/hooks/omit/omit-result.ts index f243967a..f3e4cfe2 100755 --- a/src/hooks/omit/omit-result.ts +++ b/src/hooks/omit/omit-result.ts @@ -1,12 +1,18 @@ import _omit from 'lodash/omit.js'; import { alterResult } from '../alter-items/alter-result'; +import { MaybeArray } from '../../internal.utils'; +import { DispatchOption } from '../../types'; + +export type OmitResultOptions = { + dispatch?: DispatchOption; +}; /** * Delete certain fields from the record(s). * @see https://hooks-common.feathersjs.com/hooks.html#discard */ -export const omitResult = (...fieldNames: string[]) => - alterResult((item: any) => _omit(item, fieldNames)); +export const omitResult = (fieldNames: MaybeArray, options?: OmitResultOptions) => + alterResult((item: any) => _omit(item, fieldNames), { dispatch: options?.dispatch }); // alias export { omitResult as discardResult }; diff --git a/src/hooks/on-delete/on-delete.test.ts b/src/hooks/on-delete/on-delete.test.ts new file mode 100644 index 00000000..b888601f --- /dev/null +++ b/src/hooks/on-delete/on-delete.test.ts @@ -0,0 +1,558 @@ +import assert from 'assert'; +import { feathers } from '@feathersjs/feathers'; +import { MemoryService } from '@feathersjs/memory'; +import { onDelete } from './on-delete'; + +const mockApp = () => { + const app = feathers(); + + app.use('users', new MemoryService({ startId: 1, multi: true })); + app.use('todos', new MemoryService({ startId: 1, multi: true })); + app.use('tasks', new MemoryService({ startId: 1, multi: true })); + + const usersService = app.service('users'); + const todosService = app.service('todos'); + const tasksService = app.service('tasks'); + + return { + app, + todosService, + usersService, + tasksService, + }; +}; + +describe('hook - onDelete', function () { + describe('cascade', function () { + it('removes single item for single item', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + const user = await usersService.create({ + name: 'John Doe', + }); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: user.id, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + await usersService.remove(user.id); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]); + }); + + it('removes multiple items for single item', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + const user = await usersService.create({ + name: 'John Doe', + }); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: user.id, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: user.id, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(user.id); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]); + }); + + it('removes single item for multiple items', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 1, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(1); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [ + { id: 2, name: 'Jane Doe' }, + { id: 3, name: 'Jack Doe' }, + ]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 2, title: 'Buy eggs', userId: 2 }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + + it('removes multiple items for multiple items', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 1, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(null, { query: { id: { $in: [1, 2] } } }); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]); + }); + + it('does not remove items if not found', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 2, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(1); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [ + { id: 2, name: 'Jane Doe' }, + { id: 3, name: 'Jack Doe' }, + ]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: 2 }, + { id: 2, title: 'Buy eggs', userId: 2 }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + + it('can pass an array', async function () { + const { app, usersService, todosService, tasksService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete([ + { + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }, + { + service: 'tasks', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }, + ]), + ], + }, + }); + + const user = await usersService.create({ + name: 'John Doe', + }); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: user.id, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const task = await tasksService.create({ + title: 'Buy milk task', + userId: user.id, + }); + + const task2 = await tasksService.create({ + title: 'Buy eggs task', + userId: 2, + }); + + await usersService.remove(user.id); + + const todos = await todosService.find({ query: {} }); + assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]); + + const tasks = await tasksService.find({ query: {} }); + assert.deepStrictEqual(tasks, [{ id: 2, title: 'Buy eggs task', userId: 2 }]); + }); + }); + + describe('set null', function () { + it('sets null single item for single item', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'set null', + blocking: true, + }), + ], + }, + }); + + const user = await usersService.create({ + name: 'John Doe', + }); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: user.id, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + await usersService.remove(user.id); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: null }, + { id: 2, title: 'Buy eggs', userId: 2 }, + ]); + }); + + it('sets null multiple items for single item', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'set null', + blocking: true, + }), + ], + }, + }); + + const user = await usersService.create({ + name: 'John Doe', + }); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: user.id, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: user.id, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(user.id); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: null }, + { id: 2, title: 'Buy eggs', userId: null }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + + it('sets null single item for multiple items', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'set null', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 1, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(1); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [ + { id: 2, name: 'Jane Doe' }, + { id: 3, name: 'Jack Doe' }, + ]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: null }, + { id: 2, title: 'Buy eggs', userId: 2 }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + + it('sets null multiple items for multiple items', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'set null', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 1, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(null, { query: { id: { $in: [1, 2] } } }); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: null }, + { id: 2, title: 'Buy eggs', userId: null }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + + it('does not set null for items if not found', async function () { + const { app, usersService, todosService } = mockApp(); + + usersService.hooks({ + after: { + remove: [ + onDelete({ + service: 'todos', + keyThere: 'userId', + keyHere: 'id', + onDelete: 'cascade', + blocking: true, + }), + ], + }, + }); + + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + + const todo = await todosService.create({ + title: 'Buy milk', + userId: 2, + }); + + const todo2 = await todosService.create({ + title: 'Buy eggs', + userId: 2, + }); + + const todo3 = await todosService.create({ + title: 'Buy bread', + userId: 3, + }); + + await usersService.remove(1); + + const users = await usersService.find({ query: {} }); + + assert.deepStrictEqual(users, [ + { id: 2, name: 'Jane Doe' }, + { id: 3, name: 'Jack Doe' }, + ]); + + const todos = await todosService.find({ query: {} }); + + assert.deepStrictEqual(todos, [ + { id: 1, title: 'Buy milk', userId: 2 }, + { id: 2, title: 'Buy eggs', userId: 2 }, + { id: 3, title: 'Buy bread', userId: 3 }, + ]); + }); + }); +}); diff --git a/src/hooks/on-delete/on-delete.ts b/src/hooks/on-delete/on-delete.ts new file mode 100644 index 00000000..3a8c3c4d --- /dev/null +++ b/src/hooks/on-delete/on-delete.ts @@ -0,0 +1,78 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import { checkContext, getResultIsArray } from '../../utils'; +import { KeyOf, MaybeArray } from '../../internal.utils'; + +export type OnDeleteAction = 'cascade' | 'set null'; + +export interface OnDeleteOptions { + service: Path; + keyThere: string; + keyHere: string; + onDelete: OnDeleteAction; + /** + * If true, the hook will wait for the service to finish before continuing + * + * @default false + */ + blocking?: boolean; +} + +/** + * hook to manipulate related items on delete + */ +export const onDelete = , H extends HookContext = HookContext>( + options: MaybeArray>>, +) => { + const optionsMulti = Array.isArray(options) ? options : [options]; + + return async (context: H, next?: NextFunction) => { + checkContext(context, ['after', 'around'], 'remove', 'onDelete'); + + if (next) { + await next(); + } + + const { result } = getResultIsArray(context); + + if (!result.length) { + return context; + } + + const promises: Promise[] = []; + + optionsMulti.forEach(async ({ keyHere, keyThere, onDelete, service, blocking }) => { + let ids = result.map(x => x[keyHere]).filter(x => !!x); + ids = [...new Set(ids)]; + + if (!ids || ids.length <= 0) { + return context; + } + + const params = { + query: { + ...(ids.length === 1 ? { [keyThere]: ids[0] } : { [keyThere]: { $in: ids } }), + }, + paginate: false, + }; + + let promise: Promise | undefined = undefined; + + if (onDelete === 'cascade') { + promise = context.app.service(service as string).remove(null, params); + } else if (onDelete === 'set null') { + const data = { [keyThere]: null }; + promise = context.app.service(service as string).patch(null, data, params); + } + + if (blocking) { + promises.push(promise); + } + }); + + if (promises.length) { + await Promise.all(promises); + } + + return context; + }; +}; diff --git a/src/hooks/params-for-server2/params-for-server2.test.ts b/src/hooks/params-for-server2/params-for-server2.test.ts new file mode 100644 index 00000000..c940d926 --- /dev/null +++ b/src/hooks/params-for-server2/params-for-server2.test.ts @@ -0,0 +1,46 @@ +import { HookContext } from '@feathersjs/feathers'; +import { paramsForServer2 } from './params-for-server2'; + +describe('paramsForServer2', () => { + it('should move params to query._$client', () => { + expect( + paramsForServer2(['a', 'b'])({ + params: { + a: 1, + b: 2, + query: {}, + }, + } as HookContext), + ).toEqual({ + params: { + query: { + _$client: { + a: 1, + b: 2, + }, + }, + }, + }); + }); + + it('should move params to query._$client and leave remaining', () => { + expect( + paramsForServer2('a')({ + params: { + a: 1, + b: 2, + query: {}, + }, + } as HookContext), + ).toEqual({ + params: { + b: 2, + query: { + _$client: { + a: 1, + }, + }, + }, + }); + }); +}); diff --git a/src/hooks/params-for-server2/params-for-server2.ts b/src/hooks/params-for-server2/params-for-server2.ts new file mode 100644 index 00000000..f46ad15d --- /dev/null +++ b/src/hooks/params-for-server2/params-for-server2.ts @@ -0,0 +1,61 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { MaybeArray, toArray } from '../../internal.utils'; + +export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const; + +export type ParamsForServer2Options = { + /** + * @default '_$client' + */ + keyToHide?: string; +}; + +/** + * a hook to move params to query._$client + * the server only receives 'query' from params. All other params are ignored. + * So, to use `$populateParams` on the server, we need to move the params to query._$client + * the server will move them back to params + */ +export const paramsForServer2 = ( + whitelist: MaybeArray, + options?: ParamsForServer2Options, +) => { + const whitelistArr = toArray(whitelist); + + const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; + + return (context: H) => { + // clone params on demand + let clonedParams: any; + + Object.keys(context.params).forEach(key => { + if (key === 'query') { + return; + } + + if (whitelistArr.includes(key)) { + if (!clonedParams) { + clonedParams = { + ...context.params, + query: { + ...context.params.query, + }, + }; + } + + if (!clonedParams.query[keyToHide]) { + clonedParams.query[keyToHide] = {}; + } + + clonedParams.query[keyToHide][key] = clonedParams[key]; + delete clonedParams[key]; + } + }); + + if (clonedParams) { + context.params = clonedParams; + } + + return context; + }; +}; diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts index a0570925..ee7d9425 100755 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -3,6 +3,8 @@ import type { HookContext } from '@feathersjs/feathers'; /** * Pass context.params from client to server. Server hook. * @see https://hooks-common.feathersjs.com/hooks.html#paramsfromclient + * + * @deprecated use `paramsFromClient2` instead */ export function paramsFromClient(...whitelist: string[]) { return (context: H) => { diff --git a/src/hooks/params-from-client2/params-from-client2.test.ts b/src/hooks/params-from-client2/params-from-client2.test.ts new file mode 100644 index 00000000..8ac46bb5 --- /dev/null +++ b/src/hooks/params-from-client2/params-from-client2.test.ts @@ -0,0 +1,54 @@ +import { HookContext } from '@feathersjs/feathers'; +import { paramsFromClient2 } from './params-from-client2'; + +describe('paramsFromClient2', () => { + it('should move params to query._$client', () => { + expect( + paramsFromClient2(['a', 'b'])({ + params: { + query: { + _$client: { + a: 1, + b: 2, + }, + c: 3, + }, + }, + } as HookContext), + ).toEqual({ + params: { + a: 1, + b: 2, + query: { + c: 3, + }, + }, + }); + }); + + it('should move params to query._$client and leave remaining', () => { + expect( + paramsFromClient2('a')({ + params: { + query: { + _$client: { + a: 1, + b: 2, + }, + c: 3, + }, + }, + } as HookContext), + ).toEqual({ + params: { + a: 1, + query: { + _$client: { + b: 2, + }, + c: 3, + }, + }, + }); + }); +}); diff --git a/src/hooks/params-from-client2/params-from-client2.ts b/src/hooks/params-from-client2/params-from-client2.ts new file mode 100644 index 00000000..97c93b3d --- /dev/null +++ b/src/hooks/params-from-client2/params-from-client2.ts @@ -0,0 +1,53 @@ +import type { HookContext } from '@feathersjs/feathers'; +import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server2/params-for-server2'; +import { MaybeArray, toArray } from '../../internal.utils'; + +export type ParamsFromClient2Options = { + /** + * @default '_$client' + */ + keyToHide?: string; +}; + +export const paramsFromClient2 = ( + whitelist: MaybeArray, + options?: ParamsFromClient2Options, +): ((context: HookContext) => HookContext) => { + const whitelistArr = toArray(whitelist); + const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; + return (context: HookContext): HookContext => { + if ( + !context.params?.query?.[keyToHide] || + typeof context.params.query[keyToHide] !== 'object' + ) { + return context; + } + + const params = { + ...context.params, + query: { + ...context.params.query, + [keyToHide]: { + ...context.params.query[keyToHide], + }, + }, + }; + + const client = params.query[keyToHide]; + + whitelistArr.forEach(key => { + if (key in client) { + params[key] = client[key]; + delete client[key]; + } + }); + + if (Object.keys(client).length === 0) { + delete params.query[keyToHide]; + } + + context.params = params; + + return context; + }; +}; diff --git a/src/hooks/pick-query/pick-query.ts b/src/hooks/pick-query/pick-query.ts index fc844f28..ed7767b6 100755 --- a/src/hooks/pick-query/pick-query.ts +++ b/src/hooks/pick-query/pick-query.ts @@ -5,7 +5,7 @@ import _pick from 'lodash/pick'; * Keep certain fields in the query object, deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keepquery */ -export function pickQuery(...fieldNames: string[]) { +export const pickQuery = (...fieldNames: string[]) => { return (context: H) => { if (!context.params.query) { return context; @@ -15,7 +15,7 @@ export function pickQuery(...fieldNames: st return context; }; -} +}; // alias export { pickQuery as keepQuery }; diff --git a/src/hooks/pick/pick-result.ts b/src/hooks/pick/pick-result.ts index 8a3703f4..c3cf6949 100755 --- a/src/hooks/pick/pick-result.ts +++ b/src/hooks/pick/pick-result.ts @@ -1,17 +1,26 @@ import _pick from 'lodash/pick.js'; import { alterResult } from '../alter-items/alter-result'; +import { DispatchOption } from '../../types'; +import { MaybeArray } from '../../internal.utils'; + +export type PickResultOptions = { + dispatch?: DispatchOption; +}; /** * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep */ -export const pickResult = (...fieldNames: string[]) => - alterResult((item: any) => { - if (typeof item !== 'object' || item === null) return item; +export const pickResult = (fieldNames: MaybeArray, options?: PickResultOptions) => + alterResult( + (item: any) => { + if (typeof item !== 'object' || item === null) return item; - return _pick(item, fieldNames); - }); + return _pick(item, fieldNames); + }, + { dispatch: options?.dispatch }, + ); // alias export { pickResult as keepResult }; diff --git a/src/hooks/set-dispatch/set-dispatch.ts b/src/hooks/set-dispatch/set-dispatch.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/hooks/set-field/set-field.test.ts b/src/hooks/set-field/set-field.test.ts index 6e6fecb9..02e0c6ff 100644 --- a/src/hooks/set-field/set-field.test.ts +++ b/src/hooks/set-field/set-field.test.ts @@ -38,33 +38,6 @@ describe('setField', () => { }); }); - it('errors when options not set', () => { - assert.throws(() => - app.service('messages').hooks({ - before: { - // @ts-expect-error - get: setField(), - }, - }), - ); - assert.throws(() => - app.service('messages').hooks({ - before: { - // @ts-expect-error - get: setField({ as: 'me' }), - }, - }), - ); - assert.throws(() => - app.service('messages').hooks({ - before: { - // @ts-expect-error - get: setField({ from: 'you' }), - }, - }), - ); - }); - it('find queries with user information, does not modify original objects', async () => { const query = {}; // @ts-ignore diff --git a/src/hooks/set-field/set-field.ts b/src/hooks/set-field/set-field.ts index d3d374c9..3131eabc 100644 --- a/src/hooks/set-field/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -15,16 +15,9 @@ export interface SetFieldOptions { * The `setField` hook allows to set a field on the hook context based on the value of another field on the hook context. * @see https://hooks-common.feathersjs.com/hooks.html#setfield */ -export function setField({ - as, - from, - allowUndefined = false, -}: SetFieldOptions) { - if (!as || !from) { - throw new Error("'as' and 'from' options have to be set"); - } - - return (context: H) => { +export const setField = + ({ as, from, allowUndefined = false }: SetFieldOptions) => + (context: H) => { const { params } = context; checkContext(context, 'before', null, 'setField'); @@ -41,4 +34,3 @@ export function setField({ return _setWith(context, as, value, _clone); }; -} diff --git a/src/hooks/set-now/set-now-data.test.ts b/src/hooks/set-now/set-now-data.test.ts index 058d83d4..b576edf0 100755 --- a/src/hooks/set-now/set-now-data.test.ts +++ b/src/hooks/set-now/set-now-data.test.ts @@ -1,6 +1,5 @@ import { assert } from 'vitest'; import { setNowData } from './set-now-data'; -import { clone } from '../../common'; let hookBefore: any; let hookBefore2: any; @@ -121,7 +120,7 @@ describe('setNowData', () => { // Helpers function checkHook(item: any, template: any, dateFields: any) { - const item1 = clone(item); + const item1 = structuredClone(item); if (typeof dateFields === 'string') { dateFields = [dateFields]; } diff --git a/src/hooks/set-now/set-now-result.test.ts b/src/hooks/set-now/set-now-result.test.ts index 7f5938ea..bb2801be 100755 --- a/src/hooks/set-now/set-now-result.test.ts +++ b/src/hooks/set-now/set-now-result.test.ts @@ -1,6 +1,5 @@ import { assert } from 'vitest'; import { setNowResult } from './set-now-result'; -import { clone } from '../../common'; let hookAfter: any; let hookFindPaginate: any; @@ -54,7 +53,7 @@ describe('setNowResult', () => { // Helpers function checkHook(item: any, template: any, dateFields: any) { - const item1 = clone(item); + const item1 = structuredClone(item); if (typeof dateFields === 'string') { dateFields = [dateFields]; } diff --git a/src/hooks/set-now/set-now-result.ts b/src/hooks/set-now/set-now-result.ts index 1dd24d85..08a66a7a 100755 --- a/src/hooks/set-now/set-now-result.ts +++ b/src/hooks/set-now/set-now-result.ts @@ -1,16 +1,28 @@ import _set from 'lodash/set.js'; import { alterResult } from '../alter-items/alter-result'; +import { MaybeArray, toArray } from '../../internal.utils'; +import { DispatchOption } from '../../types'; + +type SetNowResultOptions = { + dispatch?: DispatchOption; +}; /** * Create/update certain fields to the current date-time. * * @see https://hooks-common.feathersjs.com/hooks.html#setnow */ -export const setNowResult = (...fieldNames: string[]) => - alterResult(data => { - for (let i = 0; i < fieldNames.length; i++) { - const key = fieldNames[i]; +export const setNowResult = (fieldNames: MaybeArray, options?: SetNowResultOptions) => { + const fieldNamesArray = toArray(fieldNames); + + return alterResult( + data => { + for (let i = 0, n = fieldNamesArray.length; i < n; i++) { + const key = fieldNamesArray[i]; - _set(data, key, new Date()); - } - }); + _set(data, key, new Date()); + } + }, + { dispatch: options?.dispatch }, + ); +}; diff --git a/src/hooks/set-now/set-now.test.ts b/src/hooks/set-now/set-now.test.ts index 119329a7..e98b2917 100755 --- a/src/hooks/set-now/set-now.test.ts +++ b/src/hooks/set-now/set-now.test.ts @@ -1,6 +1,5 @@ import { assert } from 'vitest'; import { setNow } from './set-now'; -import { clone } from '../../common'; let hookBefore: any; let hookBefore2: any; @@ -168,7 +167,7 @@ describe('services setNow', () => { // Helpers function checkHook(item: any, template: any, dateFields: any) { - const item1 = clone(item); + const item1 = structuredClone(item); if (typeof dateFields === 'string') { dateFields = [dateFields]; } diff --git a/src/hooks/set-slug/set-slug.ts b/src/hooks/set-slug/set-slug.ts index c880088b..caeeff61 100755 --- a/src/hooks/set-slug/set-slug.ts +++ b/src/hooks/set-slug/set-slug.ts @@ -6,8 +6,9 @@ import type { HookContext } from '@feathersjs/feathers'; * * @see https://hooks-common.feathersjs.com/hooks.html#setslug */ -export function setSlug(slug: string, fieldName?: string) { - return (context: H) => { +export const setSlug = + (slug: string, fieldName?: string) => + (context: H) => { if (typeof fieldName !== 'string') { fieldName = `query.${slug}`; } @@ -19,4 +20,3 @@ export function setSlug(slug: string, field } } }; -} diff --git a/src/hooks/sifter/sifter.test.ts b/src/hooks/sifter/sifter.test.ts index eb3ae7a8..be8c7b52 100755 --- a/src/hooks/sifter/sifter.test.ts +++ b/src/hooks/sifter/sifter.test.ts @@ -11,44 +11,38 @@ const dataCanada = [ const dataUsa = [{ name: 'marshall', address: { city: 'utah', country: 'usa' } }]; -const data = ([] as any[]).concat(dataCanada, dataUsa); - -const origHook = { type: 'after', method: 'find', result: data }; - -const origHookPaginated = { - type: 'after', - method: 'find', - result: { total: 1, limit: 10, skip: 0, data }, -}; - -const getCountry = (country: any) => (_hook: any) => sift({ 'address.country': country }); - -let hook: any; -let hookPaginated: any; +let context: any; +let contextPaginated: any; describe('sifter', () => { beforeEach(() => { - hook = clone(origHook); - hookPaginated = clone(origHookPaginated); + const data = [...dataCanada, ...dataUsa]; + + context = clone({ type: 'after', method: 'find', result: data }); + contextPaginated = clone({ + type: 'after', + method: 'find', + result: { total: 1, limit: 10, skip: 0, data }, + }); }); it('sifts non-paginated data', async () => { - const hook1: any = await sifter(getCountry('canada'))(hook); + const hook1: any = await sifter(() => sift({ 'address.country': 'canada' }))(context); assert.deepEqual(hook1.result, dataCanada); }); it('sifts paginated data', async () => { - const hook1: any = await sifter(getCountry('canada'))(hookPaginated); + const hook1: any = await sifter(() => sift({ 'address.country': 'canada' }))(contextPaginated); assert.deepEqual(hook1.result.data, dataCanada); }); it('throws if getSifter not a function', async () => { // @ts-expect-error throws if getSifter not a function - assert.throws(() => sifter({})(hookPaginated)); + assert.throws(() => sifter({})(contextPaginated)); }); it('throws if getSifter does not return a function', () => { // @ts-expect-error throws if getSifter does not return a function - assert.throws(() => sifter((hook: any) => ({}))(hookPaginated)); + assert.throws(() => sifter((hook: any) => ({}))(contextPaginated)); }); }); diff --git a/src/hooks/sifter/sifter.ts b/src/hooks/sifter/sifter.ts index 4ad90b26..e75712af 100755 --- a/src/hooks/sifter/sifter.ts +++ b/src/hooks/sifter/sifter.ts @@ -3,10 +3,9 @@ import type { HookContext } from '@feathersjs/feathers'; import type { SyncContextFunction } from '../../types'; import { replaceResult } from '../../utils/replace-items/replace-result'; -export function sifter( - siftFunc: SyncContextFunction<(item: any) => boolean, H>, -) { - return (context: H) => { +export const sifter = + (siftFunc: SyncContextFunction<(item: any) => boolean, H>) => + (context: H) => { const sifter = siftFunc(context); if (typeof sifter !== 'function') { @@ -17,4 +16,3 @@ export function sifter( transform: items => items.filter(sifter), }); }; -} diff --git a/src/hooks/soft-delete/soft-delete.test.ts b/src/hooks/soft-delete/soft-delete.test.ts index e9d20375..154a2ab1 100755 --- a/src/hooks/soft-delete/soft-delete.test.ts +++ b/src/hooks/soft-delete/soft-delete.test.ts @@ -12,7 +12,7 @@ const initialUsers = [ { name: 'Mick Doe', key: 'b', deleted: true }, ]; -describe('services softDelete', () => { +describe('softDelete', () => { let userService: any; beforeEach(() => { diff --git a/src/hooks/soft-delete/soft-delete.ts b/src/hooks/soft-delete/soft-delete.ts index a983429e..49bbfaec 100755 --- a/src/hooks/soft-delete/soft-delete.ts +++ b/src/hooks/soft-delete/soft-delete.ts @@ -1,52 +1,84 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { checkContext } from '../../utils'; +import { TransformParamsFn } from '../../types'; +import { transformParams } from '../../utils/transform-params/transform-params'; +import { Promisable } from '../../internal.utils'; export type SoftDeleteOptionFunction = ( context?: H, -) => Promise<{ [key: string]: any }>; +) => Promisable<{ [key: string]: any }>; export interface SoftDeleteOptions { + /** + * @default { deleted: { $ne: true } } + */ deletedQuery?: { [key: string]: any } | SoftDeleteOptionFunction; + /** + * @default { deleted: true } + */ removeData?: { [key: string]: any } | SoftDeleteOptionFunction; + /** + * Transform the params before calling the service method. E.g. remove 'params.provider' or add custom params. + */ + transformParams?: TransformParamsFn; + + /** + * @default 'disableSoftDelete' + */ + disableSoftDeleteKey?: string; } const defaultQuery = { deleted: { $ne: true } }; const defaultData = { deleted: true }; -const getValue = (value: any, ...args: any[]) => { - if (typeof value === 'function') { - return Promise.resolve(value(...args)); - } - return Promise.resolve(value); -}; /** * Allow to mark items as deleted instead of removing them. */ -export function softDelete({ - deletedQuery = defaultQuery, - removeData = defaultData, -}: SoftDeleteOptions = {}) { - return async (context: H) => { - const { service, method, params } = context; - const { disableSoftDelete, query = {} } = params; +export const softDelete = + (options: SoftDeleteOptions = {}) => + async (context: H, next?: NextFunction) => { + checkContext(context, ['before', 'around'], null, 'softDelete'); - checkContext(context, 'before', null, 'softDelete'); + const { disableSoftDeleteKey = 'disableSoftDelete' } = options; - if (disableSoftDelete) { + if (context.params[disableSoftDeleteKey]) { return context; } + const { deletedQuery = defaultQuery, removeData = defaultData } = options; + const deleteQuery = await getValue(deletedQuery, context); - context.params.query = Object.assign({}, query, deleteQuery); + const params = transformParams( + { + ...context.params, + query: { + ...context.params.query, + ...deleteQuery, + }, + }, + options.transformParams, + ); - if (method === 'remove') { + context.params = params; + + if (context.method === 'remove') { const data = await getValue(removeData, context); - const result = await service.patch(context.id, data, params); + const result = await context.service.patch(context.id, data, params); context.result = result; } + if (next) { + await next(); + } + return context; }; -} + +const getValue = (value: any, ...args: any[]) => { + if (typeof value === 'function') { + return value(...args); + } + return value; +}; diff --git a/src/hooks/throw-if/throw-if-is-multi.ts b/src/hooks/throw-if/throw-if-is-multi.ts new file mode 100644 index 00000000..d9323d85 --- /dev/null +++ b/src/hooks/throw-if/throw-if-is-multi.ts @@ -0,0 +1,25 @@ +import { HookContext } from '@feathersjs/feathers'; +import { checkContext, isMulti } from '../../utils'; +import { PredicateFn } from '../../types'; +import { BadRequest, type FeathersError } from '@feathersjs/errors'; + +export type ThrowIfIsMultiOptions = { + filter?: PredicateFn; + error?: (context: HookContext) => FeathersError; +}; + +export const throwIfIsMulti = ( + options?: ThrowIfIsMultiOptions, +) => { + return async (context: H) => { + checkContext(context, 'before', ['create', 'patch', 'remove'], 'throwIfIsMulti'); + + if (!isMulti(context)) { + return context; + } + + if (!options?.filter || (await options.filter(context))) { + throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); + } + }; +}; diff --git a/src/hooks/throw-if/throw-if-is-provider.ts b/src/hooks/throw-if/throw-if-is-provider.ts new file mode 100644 index 00000000..4003cb18 --- /dev/null +++ b/src/hooks/throw-if/throw-if-is-provider.ts @@ -0,0 +1,20 @@ +import { HookContext } from '@feathersjs/feathers'; +import { TransportName } from '../../types'; +import { throwIf, ThrowIfOptions } from './throw-if'; +import { toArray } from 'lodash'; +import { isProvider } from '../../predicates'; +import { MethodNotAllowed } from '@feathersjs/errors'; + +const defaultError = (context: HookContext) => + new MethodNotAllowed(`Provider '${context.params.provider}' can not call '${context.method}'.`); + +export const throwIfIsProvider = ( + transports: TransportName | TransportName[], + options?: ThrowIfOptions, +) => { + const disallowTransports = toArray(transports); + + return throwIf(isProvider(...(disallowTransports as any)), { + error: options?.error ?? defaultError, + }); +}; diff --git a/src/hooks/throw-if/throw-if.ts b/src/hooks/throw-if/throw-if.ts new file mode 100644 index 00000000..0d52a3ee --- /dev/null +++ b/src/hooks/throw-if/throw-if.ts @@ -0,0 +1,21 @@ +import { HookContext } from '@feathersjs/feathers'; +import { PredicateFn } from '../../types'; +import { BadRequest } from '@feathersjs/errors'; +import type { FeathersError } from '@feathersjs/errors'; + +export type ThrowIfOptions = { + error?: (context: HookContext) => FeathersError; +}; + +export const throwIf = ( + predicate: PredicateFn, + options?: ThrowIfOptions, +) => { + return async (context: H) => { + const result = await predicate(context); + + if (result) { + throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); + } + }; +}; diff --git a/src/index.ts b/src/index.ts index 6071133f..a091ab85 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ export * from './hooks'; export * from './utils'; +export * from './predicates'; export * from './types'; diff --git a/src/internal.utils.ts b/src/internal.utils.ts index f8d032c6..0636f7b5 100644 --- a/src/internal.utils.ts +++ b/src/internal.utils.ts @@ -1,3 +1,9 @@ export const hasOwnProperty = (obj: Record, ...keys: string[]): boolean => { return keys.some(x => Object.prototype.hasOwnProperty.call(obj, x)); }; + +export type MaybeArray = T | T[]; +export const toArray = (value: T | T[]): T[] => (Array.isArray(value) ? value : [value]); + +export type Promisable = T | Promise; +export type KeyOf = Extract; diff --git a/src/utils/every/every.test.ts b/src/predicates/every/every.test.ts similarity index 72% rename from src/utils/every/every.test.ts rename to src/predicates/every/every.test.ts index 4bb3c75e..b3e65b2b 100755 --- a/src/utils/every/every.test.ts +++ b/src/predicates/every/every.test.ts @@ -1,10 +1,53 @@ import { assert } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; +import { feathers, HookContext } from '@feathersjs/feathers'; import { MemoryService } from '@feathersjs/memory'; import { iff } from '../../hooks'; -import { every, isNot } from '../'; +import { every } from './every'; +import { isNot } from '../not/not'; + +describe('predicates/every', () => { + it('returns true synchronously when empty', () => { + assert.equal(every()({} as HookContext), true); + }); + + it('returns false synchronously when at least 1 hook is false', () => { + expect( + every( + () => true, + () => Promise.resolve(false), + () => Promise.resolve(true), + () => false, + )({} as HookContext), + ).toBe(false); + }); + + it('returns true when all hooks are truthy', async () => { + await expect( + every( + () => true, + () => Promise.resolve(true), + () => Promise.resolve(true), + )({} as HookContext), + ).resolves.toBe(true); + }); + + it('rejects with the error', async () => { + await expect( + async () => await every(() => Promise.reject(new Error('errored')))({} as HookContext), + ).rejects.toThrow('errored'); + }); + + it('does not run all predicates when one is false', () => { + let ran = 0; + const fn = () => { + ran++; + return false; + }; + + expect(every(fn, fn, fn)({} as HookContext)).toBe(false); + expect(ran).toBe(1); + }); -describe('util every', () => { let app: any; beforeEach(() => { diff --git a/src/predicates/every/every.ts b/src/predicates/every/every.ts new file mode 100755 index 00000000..b969b841 --- /dev/null +++ b/src/predicates/every/every.ts @@ -0,0 +1,35 @@ +import type { HookContext } from '@feathersjs/feathers'; +import type { PredicateFn } from '../../types'; +import { isPromise } from '../../common'; + +/** + * Return the and of a series of sync or async predicate functions. + * @see https://hooks-common.feathersjs.com/utilities.html#every + */ +export const every = + (...predicates: PredicateFn[]): PredicateFn => + (context: H): boolean | Promise => { + if (!predicates.length) { + // same as Array.prototype.every + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#description + return true; + } + + const promises: Promise[] = []; + + for (const predicate of predicates) { + const result = predicate(context); + if (result === false) { + return false; + } else if (isPromise(result)) { + promises.push(result); + } + } + + if (!promises.length) { + // no promises returned -> all predicates are sync and true + return true; + } + + return Promise.all(promises).then(results => results.every(result => !!result)); + }; diff --git a/src/predicates/index.ts b/src/predicates/index.ts new file mode 100644 index 00000000..2fc5b9b5 --- /dev/null +++ b/src/predicates/index.ts @@ -0,0 +1,7 @@ +export * from './every/every'; +export * from './is-context/is-context'; +export * from './is-multi/is-multi'; +export * from './is-paginated/is-paginated'; +export * from './is-provider/is-provider'; +export * from './not/not'; +export * from './some/some'; diff --git a/src/predicates/is-context/is-context.ts b/src/predicates/is-context/is-context.ts new file mode 100644 index 00000000..56058833 --- /dev/null +++ b/src/predicates/is-context/is-context.ts @@ -0,0 +1,39 @@ +import { HookType } from '@feathersjs/feathers'; +import { MethodName } from '../../types'; +import { MaybeArray, toArray } from '../../internal.utils'; + +export type IsContextOptions = { + path?: MaybeArray; + type?: MaybeArray; + method?: MaybeArray; +}; + +export const isContext = + (options: IsContextOptions) => + (context: any): boolean => { + if (options.path != null) { + const path = toArray(options.path); + + if (!path.some(x => context.path.includes(x))) { + return false; + } + } + + if (options.type != null) { + const type = toArray(options.type); + + if (!type.some(x => context.type === x)) { + return false; + } + } + + if (options.method != null) { + const method = toArray(options.method); + + if (!method.some(x => context.method === x)) { + return false; + } + } + + return true; + }; diff --git a/src/utils/is-multi/is-multi.test.ts b/src/predicates/is-multi/is-multi.test.ts similarity index 97% rename from src/utils/is-multi/is-multi.test.ts rename to src/predicates/is-multi/is-multi.test.ts index 2da57afa..2895e8e0 100644 --- a/src/utils/is-multi/is-multi.test.ts +++ b/src/predicates/is-multi/is-multi.test.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers'; import { isMulti } from './is-multi'; -describe('isMulti', () => { +describe('predicates/isMulti', () => { it('returns true', function () { const makeContext = (type: string, method: string) => { const context = { diff --git a/src/utils/is-multi/is-multi.ts b/src/predicates/is-multi/is-multi.ts similarity index 100% rename from src/utils/is-multi/is-multi.ts rename to src/predicates/is-multi/is-multi.ts diff --git a/src/utils/is-paginated/is-paginated.test.ts b/src/predicates/is-paginated/is-paginated.test.ts similarity index 97% rename from src/utils/is-paginated/is-paginated.test.ts rename to src/predicates/is-paginated/is-paginated.test.ts index f86b72ec..bc9c680b 100644 --- a/src/utils/is-paginated/is-paginated.test.ts +++ b/src/predicates/is-paginated/is-paginated.test.ts @@ -1,7 +1,7 @@ import { HookContext } from '@feathersjs/feathers'; import { isPaginated } from './is-paginated'; -describe('isPaginated', () => { +describe('predicates/isPaginated', () => { it('returns true for service.options.paginate', function () { const serviceOptions = { paginate: { diff --git a/src/utils/is-paginated/is-paginated.ts b/src/predicates/is-paginated/is-paginated.ts similarity index 84% rename from src/utils/is-paginated/is-paginated.ts rename to src/predicates/is-paginated/is-paginated.ts index a78d6dcf..0de967d5 100644 --- a/src/utils/is-paginated/is-paginated.ts +++ b/src/predicates/is-paginated/is-paginated.ts @@ -1,5 +1,5 @@ import { HookContext } from '@feathersjs/feathers'; -import { getPaginate } from '../get-paginate/get-paginate'; +import { getPaginate } from '../../utils/get-paginate/get-paginate'; /** * util to check if a hook is a paginated hook using `getPaginate` diff --git a/src/utils/is-provider/is-provider.test.ts b/src/predicates/is-provider/is-provider.test.ts similarity index 98% rename from src/utils/is-provider/is-provider.test.ts rename to src/predicates/is-provider/is-provider.test.ts index c0a5635c..3e32f09f 100755 --- a/src/utils/is-provider/is-provider.test.ts +++ b/src/predicates/is-provider/is-provider.test.ts @@ -18,7 +18,7 @@ const hookFcnSync = (hook: any) => { return hook; }; -describe('services isProvider - predicate', () => { +describe('predicates/isProvider', () => { beforeEach(() => { hookServer = { type: 'before', method: 'create', params: { provider: '' } }; hookSocketio = { type: 'before', method: 'create', params: { provider: 'socketio' } }; diff --git a/src/utils/is-provider/is-provider.ts b/src/predicates/is-provider/is-provider.ts similarity index 100% rename from src/utils/is-provider/is-provider.ts rename to src/predicates/is-provider/is-provider.ts diff --git a/src/utils/is-not/is-not.test.ts b/src/predicates/not/not.test.ts similarity index 81% rename from src/utils/is-not/is-not.test.ts rename to src/predicates/not/not.test.ts index 2194afe5..3e42bb69 100755 --- a/src/utils/is-not/is-not.test.ts +++ b/src/predicates/not/not.test.ts @@ -1,7 +1,8 @@ import { assert } from 'vitest'; import { iff } from '../../hooks'; import { clone, isPromise } from '../../common'; -import { isProvider, isNot } from '../../utils'; +import { not } from './not'; +import { isProvider } from '../is-provider/is-provider'; let hookServer: any; let hook: any; @@ -30,22 +31,15 @@ const hookFcnSync = (hook: any) => { return hook; }; -describe('util isNot - predicate', () => { +describe('predicates/not', () => { beforeEach(() => { hookServer = { type: 'before', method: 'create', params: { provider: '' } }; predicateCalls = 0; }); - it('expects a function param', () => { - assert.throws(() => { - // @ts-ignore - isNot('not a function'); - }); - }); - it('negates a sync function 1', () => { const hook = clone(hookServer); - const result = isNot(predicateSync(true))(hook); + const result = not(predicateSync(true))(hook); assert.equal(predicateCalls, 1); assert.equal(result, false); @@ -53,7 +47,7 @@ describe('util isNot - predicate', () => { it('negates a sync function 2', () => { const hook = clone(hookServer); - const result = isNot(predicateSync(false))(hook); + const result = not(predicateSync(false))(hook); assert.equal(predicateCalls, 1); assert.equal(result, true); @@ -62,7 +56,7 @@ describe('util isNot - predicate', () => { it('negates an async function 1', async () => { const hook = clone(hookServer); - await isNot(predicateAsync(true))(hook) + await not(predicateAsync(true))(hook) // @ts-ignore .then((result: any) => { assert.equal(predicateCalls, 1); @@ -75,7 +69,7 @@ describe('util isNot - predicate', () => { it('negates an async function 2', async () => { const hook = clone(hookServer); - await isNot(predicateAsync(false))(hook) + await not(predicateAsync(false))(hook) // @ts-ignore .then((result: any) => { assert.equal(predicateCalls, 1); @@ -87,7 +81,7 @@ describe('util isNot - predicate', () => { }); }); -describe('services isNot - works with iff and isProvider', () => { +describe('services not - works with iff and isProvider', () => { beforeEach(() => { hookBefore = { type: 'before', @@ -107,7 +101,7 @@ describe('services isNot - works with iff and isProvider', () => { it('calls sync hook function if truthy', () => { iff( - isNot(isProvider('server')), + not(isProvider('server')), hookFcnSync, )(hook) // @ts-ignore @@ -119,7 +113,7 @@ describe('services isNot - works with iff and isProvider', () => { }); it('does not call sync hook function if falsey', () => { - const result = iff(isNot(isProvider('rest')), hookFcnSync)(hook); + const result = iff(not(isProvider('rest')), hookFcnSync)(hook); if (isPromise(result)) { assert.fail('promise unexpectedly returned'); diff --git a/src/utils/is-not/is-not.ts b/src/predicates/not/not.ts similarity index 58% rename from src/utils/is-not/is-not.ts rename to src/predicates/not/not.ts index e5b38a60..14709db2 100755 --- a/src/utils/is-not/is-not.ts +++ b/src/predicates/not/not.ts @@ -4,18 +4,13 @@ import { isPromise } from '../../common'; import type { PredicateFn } from '../../types'; /** - * Negate a sync or async predicate function. + * Negate a predicate function. * * @see https://hooks-common.feathersjs.com/utilities.html#isnot */ -export function isNot( - predicate: boolean | PredicateFn, -): PredicateFn { - if (typeof predicate !== 'function') { - throw new MethodNotAllowed('Expected function as param. (isNot)'); - } - - return (context: H) => { +export const not = + (predicate: PredicateFn): PredicateFn => + (context: H) => { const result = predicate(context); if (!isPromise(result)) { @@ -24,4 +19,6 @@ export function isNot( return result.then(result1 => !result1); }; -} + +// alias +export { not as isNot }; diff --git a/src/predicates/some/some.test.ts b/src/predicates/some/some.test.ts new file mode 100755 index 00000000..8290b582 --- /dev/null +++ b/src/predicates/some/some.test.ts @@ -0,0 +1,61 @@ +import { assert, expect } from 'vitest'; +import { HookContext } from '@feathersjs/feathers'; +import { some } from './some'; + +describe('predicates/some', () => { + it('returns true synchronously when empty', () => { + expect(some()({} as HookContext)).toBe(true); + }); + + it('returns true synchronously when at least 1 hook is true', () => { + expect( + some( + () => false, + () => false, + () => Promise.resolve(false), + () => Promise.resolve(true), + () => true, + )({} as HookContext), + ).toBe(true); + }); + + it('returns true when at least 1 async hook is true', async () => { + expect( + some( + () => false, + () => Promise.resolve(false), + () => Promise.resolve(true), + )({} as HookContext), + ).resolves.toBe(true); + }); + + it('rejects with the error', async () => { + await expect( + async () => await some(() => Promise.reject(new Error('errored')))({} as HookContext), + ).rejects.toThrow('errored'); + }); + + it('does not run all predicates when one is true', () => { + let ran = 0; + const fn = () => { + ran++; + return true; + }; + + expect(some(fn, fn, fn)({} as HookContext)).toBe(true); + expect(ran).toBe(1); + }); + + it('when all hooks are falsey', async () => { + await expect( + some( + () => false, + () => Promise.resolve(false), + // @ts-expect-error test case + () => null, + () => undefined, + () => 0, + )({} as HookContext), + ).resolves.toBe(false); + }); +}); diff --git a/src/predicates/some/some.ts b/src/predicates/some/some.ts new file mode 100755 index 00000000..0357ae12 --- /dev/null +++ b/src/predicates/some/some.ts @@ -0,0 +1,38 @@ +import type { HookContext } from '@feathersjs/feathers'; +import type { PredicateFn } from '../../types'; +import { isPromise } from '../../common'; + +/** + * Return the or of a series of sync or async predicate functions. + * @see https://hooks-common.feathersjs.com/utilities.html#some + */ +export const some = + (...predicates: PredicateFn[]): PredicateFn => + (context: H): boolean | Promise => { + if (!predicates.length) { + // same as Array.prototype.some + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#description + return true; + } + + const promises: Promise[] = []; + + for (const predicate of predicates) { + const result = predicate(context); + + if (result === true) { + return true; + } else if (result === false) { + continue; + } else if (isPromise(result)) { + promises.push(result); + } + } + + if (!promises.length) { + // no promises returned -> all predicates are sync and false + return false; + } + + return Promise.all(promises).then(results => results.some(result => !!result)); + }; diff --git a/src/types.ts b/src/types.ts index 53558c46..7fbbcc67 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,10 +1,10 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, Params } from '@feathersjs/feathers'; export const hookTypes = ['around', 'before', 'after', 'error'] as const; export type HookType = (typeof hookTypes)[number]; export const methodNames = ['find', 'get', 'create', 'update', 'patch', 'remove'] as const; -export type MethodName = (typeof methodNames)[number]; +export type MethodName = (typeof methodNames)[number] | ({} & string); // allow custom methods export type TransportName = 'socketio' | 'rest' | 'external' | 'server'; @@ -16,15 +16,19 @@ export type ContextFunction = ( context: H, ) => T | Promise; -export type SyncPredicateFn = SyncContextFunction; -export type AsyncPredicateFn = AsyncContextFunction< - boolean, - H ->; -export type PredicateFn = ContextFunction; +export type SyncPredicateFn = (context: H) => boolean; +export type AsyncPredicateFn = ( + context: H, +) => Promise; + +export type PredicateFn = ( + context: H, +) => boolean | Promise; export declare type HookFunction = ( context: H, ) => Promise | H | void; -export type Promisable = T | Promise; +export type TransformParamsFn

= (params: P) => P | void; + +export type DispatchOption = boolean | 'both'; diff --git a/src/utils/calling-params/calling-params.ts b/src/utils/calling-params/calling-params.ts index 08ee037e..8a1e08b8 100755 --- a/src/utils/calling-params/calling-params.ts +++ b/src/utils/calling-params/calling-params.ts @@ -58,14 +58,15 @@ export function callingParamsDefaults(propNames: string[], newProps?: any): void * Build params for a service call. (Utility function.) * @see https://hooks-common.feathersjs.com/utilities.html#callingparams */ -export function callingParams({ - query, - propNames = [], - newProps = {}, - hooksToDisable = [], - ignoreDefaults, -}: CallingParamsOptions = {}) { - return (context: H) => { +export const callingParams = + ({ + query, + propNames = [], + newProps = {}, + hooksToDisable = [], + ignoreDefaults, + }: CallingParamsOptions = {}) => + (context: H) => { propNames = Array.isArray(propNames) ? propNames : [propNames]; hooksToDisable = Array.isArray(hooksToDisable) ? hooksToDisable : [hooksToDisable]; @@ -113,7 +114,6 @@ export function callingParams({ return newParams; }; -} /** * You should prefer using the callingParams utility to makeCallingParams. diff --git a/src/utils/check-context/check-context.test.ts b/src/utils/check-context/check-context.test.ts index aaa50cdc..52388ba3 100755 --- a/src/utils/check-context/check-context.test.ts +++ b/src/utils/check-context/check-context.test.ts @@ -1,101 +1,77 @@ -import { assert } from 'vitest'; +import { assert, expect } from 'vitest'; import { checkContext } from './check-context'; +import { HookContext } from '@feathersjs/feathers'; -describe('util checkContext', () => { - var hook: any; // eslint-disable-line no-var - - beforeEach(() => { - hook = { type: 'before', method: 'create' }; - }); +const make = (type: any, method: any) => ({ type, method }) as HookContext; +describe('util checkContext', () => { it('handles "any" type and method', () => { - assert.equal(checkContext(hook), undefined); + expect(() => checkContext(make('before', 'create'))).not.toThrow(); }); it('handles expected type', () => { - hook.type = 'before'; - assert.equal(checkContext(hook, 'before'), undefined); + expect(() => checkContext(make('before', 'create'), 'before')).not.toThrow(); }); it('handles unexpected type', () => { - hook.type = 'after'; - assert.throws(() => { - checkContext(hook, 'before'); - }); + expect(() => checkContext(make('after', 'create'), 'before')).toThrow(); }); it('handles undefined type', () => { - hook.type = 'after'; - assert.equal(checkContext(hook), undefined); + expect(() => checkContext(make('after', 'create'), undefined, 'create')).not.toThrow(); }); it('handles null type', () => { - hook.type = 'after'; - assert.equal(checkContext(hook, null), undefined); + expect(() => checkContext(make('after', 'create'), null, 'create')).not.toThrow(); }); it('handles expected type as array', () => { - hook.type = 'before'; - assert.equal(checkContext(hook, ['before', 'after']), undefined); + expect(() => checkContext(make('before', 'create'), ['before', 'after'])).not.toThrow(); }); it('handles unexpected type as array', () => { - hook.type = 'error'; - assert.throws(() => { - checkContext(hook, ['before', 'after']); - }); + expect(() => checkContext(make('error', 'create'), ['before', 'after'])).toThrow(); }); it('handles expected method as string', () => { - hook.method = 'create'; - assert.equal(checkContext(hook, null, 'create'), undefined); + expect(() => checkContext(make('before', 'create'), null, 'create')).not.toThrow(); }); it('handles unexpected method as string', () => { - hook.method = 'patch'; - assert.throws(() => { - checkContext(hook, null, 'create'); - }); + expect(() => checkContext(make('before', 'patch'), null, 'create')).toThrow(); }); it('handles expected method as array', () => { - hook.method = 'create'; - assert.equal(checkContext(hook, null, ['create']), undefined); - assert.equal(checkContext(hook, null, ['create', 'update', 'remove']), undefined); + expect(() => + checkContext(make('before', 'create'), null, ['create', 'update', 'remove']), + ).not.toThrow(); }); it('handles unexpected method as array', () => { - hook.method = 'patch'; - assert.throws(() => { - checkContext(hook, null, ['create']); - }); - assert.throws(() => { - checkContext(hook, null, ['create', 'update', 'remove']); - }); + expect(() => + checkContext(make('before', 'patch'), null, ['create', 'update', 'remove']), + ).toThrow(); }); it('handles undefined method', () => { - hook.method = 'patch'; - assert.equal(checkContext(hook, null), undefined); + expect(() => checkContext(make('before', 'patch'), null, undefined)).not.toThrow(); }); it('handles null method', () => { - hook.method = 'patch'; - assert.equal(checkContext(hook, null, null), undefined); + expect(() => checkContext(make('before', 'patch'), null, null)).not.toThrow(); }); it('handles expected type and method as array', () => { - hook.type = 'before'; - hook.method = 'create'; - assert.equal(checkContext(hook, 'before', ['create']), undefined); - assert.equal(checkContext(hook, 'before', ['create', 'update', 'remove']), undefined); + expect(() => + checkContext(make('before', 'create'), ['before', 'after'], ['create', 'update', 'remove']), + ).not.toThrow(); }); it('allows custom methods', () => { - hook.type = 'before'; - hook.method = 'custom'; - assert.equal(checkContext(hook, 'before', ['create']), undefined); - assert.equal(checkContext(hook, 'before', ['create', 'update', 'remove']), undefined); + expect(() => checkContext(make('before', 'custom'), 'before', 'create')).toThrow(); + expect(() => + checkContext(make('before', 'custom'), 'before', ['create', 'custom']), + ).not.toThrow(); }); }); diff --git a/src/utils/check-context/check-context.ts b/src/utils/check-context/check-context.ts index 26df7c5f..4dbe6b14 100755 --- a/src/utils/check-context/check-context.ts +++ b/src/utils/check-context/check-context.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers'; -import { methodNames } from '../../types'; import type { HookType, MethodName } from '../../types'; +import { isContext } from '../../predicates/is-context/is-context'; /** * Restrict a hook to run for certain methods and method types. (Utility function.) @@ -12,24 +12,12 @@ export function checkContext( methods?: MethodName | MethodName[] | null, label = 'anonymous', ): void { - if (type) { - const types = Array.isArray(type) ? type : [type]; // safe enough for allowed values - if (!types.includes(context.type)) { - throw new Error(`The '${label}' hook can only be used as a '${type}' hook.`); - } - } - - if (!methods) { - return; - } - if (!methodNames.includes(context.method as any)) { - return; - } // allow custom methods - - const methodsArr = Array.isArray(methods) ? methods : [methods]; // safe enough for allowed values - - if (methodsArr.length > 0 && !methodsArr.includes(context.method as any)) { - const msg = JSON.stringify(methodsArr); - throw new Error(`The '${label}' hook can only be used on the '${msg}' service method(s).`); + if ( + !isContext({ + method: methods ?? undefined, + type: type ?? undefined, + })(context) + ) { + throw new Error(`The '${label}' hook has invalid context.`); } } diff --git a/src/utils/combine/combine.ts b/src/utils/combine/combine.ts index 5b2d3fc6..8a75aca4 100755 --- a/src/utils/combine/combine.ts +++ b/src/utils/combine/combine.ts @@ -2,7 +2,7 @@ import type { HookContext } from '@feathersjs/feathers'; import type { HookFunction } from '../../types'; /** - * Sequentially execute multiple sync or async hooks. + * Sequentially execute multiple hooks. * @see https://hooks-common.feathersjs.com/utilities.html#combine */ export function combine(...serviceHooks: HookFunction[]) { diff --git a/src/utils/every/every.ts b/src/utils/every/every.ts deleted file mode 100755 index ef46016a..00000000 --- a/src/utils/every/every.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { AsyncPredicateFn, PredicateFn } from '../../types'; - -/** - * Return the and of a series of sync or async predicate functions. - * @see https://hooks-common.feathersjs.com/utilities.html#every - */ -export function every( - ...predicates: PredicateFn[] -): AsyncPredicateFn { - return async function (this: any, ...fnArgs: any[]) { - // @ts-expect-error TODO - const promises = predicates.map(fn => fn.apply(this, fnArgs)); - - const results = await Promise.all(promises); - return await Promise.resolve(results.every(result => !!result)); - }; -} diff --git a/src/utils/get-result-is-array/get-result-is-array.test.ts b/src/utils/get-result-is-array/get-result-is-array.test.ts index 41f890c0..01cf0c7d 100644 --- a/src/utils/get-result-is-array/get-result-is-array.test.ts +++ b/src/utils/get-result-is-array/get-result-is-array.test.ts @@ -56,4 +56,84 @@ describe('getResultIsArray', () => { key: 'result', }); }); + + it('dispatch', () => { + const result = { a: 1, b: 2 }; + const dispatch = { c: 3, d: 4 }; + expect(getResultIsArray({ result, dispatch } as any, { dispatch: true })).toEqual({ + isArray: false, + result: [dispatch], + key: 'dispatch', + }); + + expect( + getResultIsArray({ method: 'find', result, dispatch } as any, { dispatch: true }), + ).toEqual({ + isArray: false, + result: [dispatch], + key: 'dispatch', + }); + + expect( + getResultIsArray({ method: 'find', result: { data: result }, dispatch } as any, { + dispatch: true, + }), + ).toEqual({ + isArray: false, + result: [dispatch], + key: 'dispatch', + }); + }); + + it('returns dispatch if is missing with single result', () => { + const result = { a: 1, b: 2 }; + const context = { result } as any; + expect(getResultIsArray(context, { dispatch: true })).toEqual({ + isArray: false, + result: [result], + key: 'result', + }); + expect(context.dispatch).toEqual(undefined); + }); + + it("doesn't set dispatch if is missing with array result", () => { + const result = [{ a: 1, b: 2 }]; + const context = { method: 'create', result } as any; + + expect(getResultIsArray(context, { dispatch: true })).toEqual({ + isArray: true, + result: result, + key: 'result', + }); + expect(context.dispatch).toEqual(undefined); + }); + + it("doesn't set dispatch if is missing with find array", () => { + const result = [{ a: 1, b: 2 }]; + const dispatch = undefined; + const context = { method: 'find', result, dispatch } as any; + + expect(getResultIsArray(context, { dispatch: true })).toEqual({ + isArray: true, + result, + key: 'result', + }); + }); + + it('sets dispatch if is missing with paginated result', () => { + const result = [{ a: 1, b: 2 }]; + const dispatch = undefined; + const context = { method: 'find', result: { data: result, total: 3 }, dispatch } as any; + + expect( + getResultIsArray(context, { + dispatch: true, + }), + ).toEqual({ + isArray: true, + result, + key: 'result', + }); + expect(context.dispatch).toEqual(undefined); + }); }); diff --git a/src/utils/get-result-is-array/get-result-is-array.ts b/src/utils/get-result-is-array/get-result-is-array.ts index dc44570e..1c2b261d 100644 --- a/src/utils/get-result-is-array/get-result-is-array.ts +++ b/src/utils/get-result-is-array/get-result-is-array.ts @@ -1,16 +1,25 @@ import { HookContext } from '@feathersjs/feathers'; +import copy from 'fast-copy'; + +type GetResultIsArrayOptions = { + dispatch?: boolean; +}; export function getResultIsArray( context: H, - dispatch?: boolean, + options?: GetResultIsArrayOptions, ): { isArray: boolean; result: any[]; key: 'dispatch' | 'result' } { - const result = dispatch ? context.dispatch : context.result; + const { dispatch = false } = options || {}; + + const isDispatch: boolean = dispatch && context.dispatch !== undefined; + + const result = dispatch ? (isDispatch ? context.dispatch : copy(context.result)) : context.result; if (!result) { return { isArray: false, result: [], - key: dispatch ? 'dispatch' : 'result', + key: isDispatch ? 'dispatch' : 'result', }; } @@ -21,6 +30,6 @@ export function getResultIsArray( return { isArray, result: isArray ? items : items ? [items] : [], - key: dispatch ? 'dispatch' : 'result', + key: isDispatch ? 'dispatch' : 'result', }; } diff --git a/src/utils/index.ts b/src/utils/index.ts index 23fa7083..0008a25e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -2,24 +2,20 @@ export * from './calling-params/calling-params'; export * from './check-context/check-context'; export * from './check-context-if'; export * from './combine/combine'; -export * from './every/every'; export * from './get-items/get-items'; export * from './get-data-is-array/get-data-is-array'; export * from './get-result-is-array/get-result-is-array'; -export * from './is-not/is-not'; -export * from './is-provider/is-provider'; export * from './params-for-server/params-for-server'; export * from './replace-items/replace-items'; export * from './replace-items/replace-data'; export * from './replace-items/replace-result'; -export * from './some/some'; export * from './run-hook/run-hook'; export * from './get-paginate/get-paginate'; -export * from './is-multi/is-multi'; -export * from './is-paginated/is-paginated'; +export * from '../predicates/is-multi/is-multi'; +export * from '../predicates/is-paginated/is-paginated'; export * from './skip-result/skip-result'; diff --git a/src/utils/params-for-server/params-for-server.ts b/src/utils/params-for-server/params-for-server.ts index eeec4eb1..db86fdcb 100755 --- a/src/utils/params-for-server/params-for-server.ts +++ b/src/utils/params-for-server/params-for-server.ts @@ -4,6 +4,8 @@ import type { Params } from '@feathersjs/feathers'; * Pass an explicit context.params from client to server. Client-side. (Utility function.) * * @see https://hooks-common.feathersjs.com/utilities.html#paramsforserver + * + * @deprecated use the hook `paramsForServer2` instead */ export function paramsForServer(params?: Params, ...whitelist: string[]): Params { const ifWhitelist = !!whitelist.length; diff --git a/src/utils/replace-items/replace-data.ts b/src/utils/replace-items/replace-data.ts index a6155de4..881164e2 100644 --- a/src/utils/replace-items/replace-data.ts +++ b/src/utils/replace-items/replace-data.ts @@ -1,7 +1,7 @@ import { HookContext } from '@feathersjs/feathers'; import { getDataIsArray } from '../get-data-is-array/get-data-is-array'; import { isPromise } from '../../common'; -import { Promisable } from '../../types'; +import { Promisable } from '../../internal.utils'; export function replaceData( context: H, diff --git a/src/utils/replace-items/replace-result.test.ts b/src/utils/replace-items/replace-result.test.ts new file mode 100644 index 00000000..30fbf894 --- /dev/null +++ b/src/utils/replace-items/replace-result.test.ts @@ -0,0 +1,169 @@ +import { expect } from 'vitest'; +import { replaceResult } from './replace-result'; + +// Tests when context.params._actOn === 'dispatch' are in act-on.test.ts +describe('replaceResult', () => { + it("replaces context.result on paginated 'find'", async () => { + const context = { + method: 'find', + result: { total: 2, data: [{ id: 1 }, { id: 2 }] }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ total: 2, data: [{ id: 2 }, { id: 3 }] }); + }); + + it("replaces context.result on array 'find'", async () => { + const context = { + method: 'find', + result: [{ id: 1 }, { id: 2 }], + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); + }); + + it("replaces context.result on 'get'", async () => { + const context = { + method: 'find', + id: 1, + result: { id: 1 }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ id: 2 }); + }); + + it("replaces context.result on 'create'", async () => { + const context = { + method: 'create', + result: { id: 1 }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ id: 2 }); + }); + + it("replaces context.result on multi:'create'", async () => { + const context = { + method: 'create', + result: [{ id: 1 }, { id: 2 }], + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); + }); + + it('replaces context.result on update', async () => { + const context = { + method: 'update', + id: 1, + result: { id: 1 }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ id: 2 }); + }); + + it('replaces context.result on patch', async () => { + const context = { + method: 'patch', + id: 1, + result: { id: 1 }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ id: 2 }); + }); + + it('replaces context.result on multi patch', async () => { + const context = { + method: 'patch', + id: null, + result: [{ id: 1 }, { id: 2 }], + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); + }); + + it('replaces context.result on remove', async () => { + const context = { + method: 'remove', + id: 1, + result: { id: 1 }, + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual({ id: 2 }); + }); + + it('replaces context.result on multi remove', async () => { + const context = { + method: 'remove', + id: null, + result: [{ id: 1 }, { id: 2 }], + }; + + await replaceResult(context as any, item => ({ id: item.id + 1 })); + + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); + }); + + it("replaces context.dispatch on 'get'", async () => { + const context = { + method: 'find', + id: 1, + result: { result: true }, + dispatch: { dispatch: true }, + }; + + await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: true }); + + expect(context.result).toStrictEqual({ result: true }); + expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }); + }); + + it("replaces both context.result & context.dispatch on 'get'", async () => { + const context = { + method: 'find', + id: 1, + result: { result: true }, + dispatch: { dispatch: true }, + }; + + await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: 'both' }); + + expect(context.result).toStrictEqual({ result: true, test: true }); + expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }); + }); + + it("replaces context.dispatch even though it was not there before on 'get'", async () => { + const context = { + method: 'find', + id: 1, + result: { result: true }, + } as any; + + await replaceResult( + context as any, + item => { + item.test = true; + return item; + }, + { dispatch: true }, + ); + + expect(context.result).toStrictEqual({ result: true }); + expect(context.dispatch).toStrictEqual({ result: true, test: true }); + }); +}); diff --git a/src/utils/replace-items/replace-result.ts b/src/utils/replace-items/replace-result.ts index 43a8fa2c..2c4478e0 100644 --- a/src/utils/replace-items/replace-result.ts +++ b/src/utils/replace-items/replace-result.ts @@ -1,60 +1,74 @@ import { HookContext, NextFunction } from '@feathersjs/feathers'; import { getResultIsArray } from '../get-result-is-array/get-result-is-array'; import { isPromise } from '../../common'; +import copy from 'fast-copy'; +import { DispatchOption } from '../../types'; + +export type ReplaceResultOptions = { + next?: NextFunction; + transform?: (items: any[]) => any[]; + dispatch?: DispatchOption; +}; export async function replaceResult( context: H, cb: (item: any) => any, - options?: { - next?: NextFunction; - transform?: (items: any[]) => any[]; - }, + options?: ReplaceResultOptions, ): Promise { if (options?.next) { await options.next(); } - if (!context.result) { - return context; + if (!!options?.dispatch && !context.dispatch) { + context.dispatch = copy(context.result); } - const { result, isArray, key } = getResultIsArray(context); + async function forResult(dispatch: boolean) { + const { result, isArray, key } = getResultIsArray(context, { dispatch }); - if (!result.length) { - return context; - } + if (!result.length) { + return context; + } - let hasPromises = false; + let hasPromises = false; - const results = result.map(item => { - const result = cb(item); + const results = result.map(item => { + const result = cb(item); - if (!hasPromises && isPromise(result)) { - hasPromises = true; - } + if (!hasPromises && isPromise(result)) { + hasPromises = true; + } + + return result; + }); + + function replace(r: any) { + if (options?.transform) { + r = options.transform(r); + } - return result; - }); + if (!isArray) { + context[key] = r[0]; + } else if (isArray && !Array.isArray(context[key]) && context[key].data) { + context[key].data = r; + } else { + context[key] = r; + } - function replace(r: any) { - if (options?.transform) { - r = options.transform(r); + return context; } - if (!isArray) { - context[key] = r[0]; - } else if (isArray && !Array.isArray(context[key]) && context[key].data) { - context[key].data = r; + if (hasPromises) { + return await Promise.all(results).then(replace); } else { - context[key] = r; + return replace(results); } + } + if (options?.dispatch === 'both') { + await Promise.all([forResult(true), forResult(false)]); return context; } - if (hasPromises) { - return await Promise.all(results).then(replace); - } else { - return replace(results); - } + return await forResult(options?.dispatch ?? false); } diff --git a/src/utils/skip-result/skip-result.ts b/src/utils/skip-result/skip-result.ts index 7fee1476..afdc8565 100644 --- a/src/utils/skip-result/skip-result.ts +++ b/src/utils/skip-result/skip-result.ts @@ -1,6 +1,5 @@ import type { HookContext } from '@feathersjs/feathers'; -import { isMulti } from '../is-multi/is-multi'; -import { isPaginated } from '../is-paginated/is-paginated'; +import { isMulti, isPaginated } from '../../predicates'; /** * util to set `context.result` to an empty array or object, depending on the hook type diff --git a/src/utils/some/some.test.ts b/src/utils/some/some.test.ts deleted file mode 100755 index 2abfeb80..00000000 --- a/src/utils/some/some.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { assert } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { some } from './some'; -import { iff } from '../../hooks/iff/iff'; -import { isNot } from '../is-not/is-not'; - -describe('util some', () => { - let app: any; - - beforeEach(() => { - app = feathers().use('/users', new MemoryService()); - }); - - describe('when at least 1 hook is truthy', () => { - beforeEach(() => { - app.service('users').hooks({ - before: { - all: [ - iff( - some( - (_hook: any) => false, - (_hook: any) => Promise.resolve(false), - (_hook: any) => Promise.resolve(true), - (_hook: any) => true, - // @ts-ignore - (_hook: any) => 1, - (_hook: any) => {}, - ), - (hook: any) => Promise.resolve(hook), - ), - ], - }, - }); - }); - - it('returns true', () => { - return app - .service('users') - .find() - .then((result: any) => { - assert.deepEqual(result, []); - }); - }); - }); - - describe('when a hook throws an error', () => { - beforeEach(() => { - app.service('users').hooks({ - before: { - all: [ - iff( - some( - (_hook: any) => true, - (_hook: any) => { - throw new Error('Hook 2 errored'); - }, - (_hook: any) => true, - ), - (hook: any) => Promise.resolve(hook), - ), - ], - }, - }); - }); - - it('rejects with the error', () => { - return app - .service('users') - .find() - .catch((error: any) => { - assert.equal(error.message, 'Hook 2 errored'); - }); - }); - }); - - describe('when a hook rejects with an error', () => { - beforeEach(() => { - app.service('users').hooks({ - before: { - all: [ - iff( - some( - (_hook: any) => true, - (_hook: any) => Promise.reject(Error('Hook 2 errored')), - (_hook: any) => true, - ), - (hook: any) => Promise.resolve(hook), - ), - ], - }, - }); - }); - - it('rejects with the error', () => { - return app - .service('users') - .find() - .catch((error: any) => { - assert.equal(error.message, 'Hook 2 errored'); - }); - }); - }); - - describe('when all hooks are falsey', () => { - beforeEach(() => { - app.service('users').hooks({ - before: { - all: [ - iff( - isNot( - some( - (_hook: any) => false, - (_hook: any) => Promise.resolve(false), - // @ts-ignore - (_hook: any) => null, - (_hook: any) => undefined, - // @ts-ignore - (_hook: any) => 0, - ), - ), - () => Promise.reject(new Error('All hooks returned false')), - ), - ], - }, - }); - }); - - it('returns false', () => { - return app - .service('users') - .find() - .catch((error: any) => { - assert.equal(error.message, 'All hooks returned false'); - }); - }); - }); -}); diff --git a/src/utils/some/some.ts b/src/utils/some/some.ts deleted file mode 100755 index 2d4d3404..00000000 --- a/src/utils/some/some.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { AsyncPredicateFn, PredicateFn } from '../../types'; - -/** - * Return the or of a series of sync or async predicate functions. - * @see https://hooks-common.feathersjs.com/utilities.html#some - */ -export function some( - ...predicates: PredicateFn[] -): AsyncPredicateFn { - return async function (this: any, context: H) { - const promises = predicates.map(fn => fn.apply(this, [context])); - - const results = await Promise.all(promises); - return await Promise.resolve(results.some((result: any) => !!result)); - }; -} diff --git a/src/utils/transform-params/transform-params.ts b/src/utils/transform-params/transform-params.ts new file mode 100644 index 00000000..17d17ebe --- /dev/null +++ b/src/utils/transform-params/transform-params.ts @@ -0,0 +1,18 @@ +import { Params } from '@feathersjs/feathers'; +import { TransformParamsFn } from '../../types'; + +/** + * Safely use a transformParams function to modify params. + */ +export const transformParams =

( + params: P, + fn: TransformParamsFn

| undefined, +): P => { + if (!fn) { + return params; + } + + const result = fn({ ...params }); + + return result ?? params; +}; diff --git a/test/index.test.ts b/test/index.test.ts index de9f42a6..67d80b94 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -72,6 +72,7 @@ const members = [ 'replaceData', 'replaceResult', + 'checkRequired', 'required', 'runHook', 'runParallel', @@ -96,13 +97,17 @@ const members = [ 'iff', 'when', 'unless', + + // predicates 'some', 'every', 'isNot', - - 'getPaginate', + 'not', 'isMulti', 'isPaginated', + 'isContext', + + 'getPaginate', 'skipResult', ].sort(); From e6bb8c02d5ca1b22da936506dee17c2df9820d8c Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:07:36 +0100 Subject: [PATCH 05/15] WIP --- README.md | 15 +++++---------- src/predicates/not/not.ts | 1 - src/utils/index.ts | 2 -- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index b9035ba5..07226b81 100755 --- a/README.md +++ b/README.md @@ -23,6 +23,10 @@ - added 'onDelete' & 'createRelated' +- stashBefore multi + +- softDelete: added 'transformParams' & added 'key' option + - rm support for spread argument #### predicates @@ -37,16 +41,7 @@ - added getDataIsArray, getResultIsArray, deprecated getItems - added replaceData, replaceResult, deprecated replaceItems - added util getPaginate -- added util setResultEmpty - -- add onDelete - -- stashBefore multi - -- new: createRelated -- new: onDelete - -- softDelete: added 'transformParams' & added 'key' option +- added util skipResult ### Hooks to discuss diff --git a/src/predicates/not/not.ts b/src/predicates/not/not.ts index 14709db2..6de6a03f 100755 --- a/src/predicates/not/not.ts +++ b/src/predicates/not/not.ts @@ -1,4 +1,3 @@ -import { MethodNotAllowed } from '@feathersjs/errors'; import type { HookContext } from '@feathersjs/feathers'; import { isPromise } from '../../common'; import type { PredicateFn } from '../../types'; diff --git a/src/utils/index.ts b/src/utils/index.ts index 0008a25e..7d39e7f6 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -16,6 +16,4 @@ export * from './replace-items/replace-result'; export * from './run-hook/run-hook'; export * from './get-paginate/get-paginate'; -export * from '../predicates/is-multi/is-multi'; -export * from '../predicates/is-paginated/is-paginated'; export * from './skip-result/skip-result'; From 36090bbf8a0c479555cbc31f4449cf44d2696010 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Tue, 13 May 2025 10:29:10 +0200 Subject: [PATCH 06/15] WIP --- README.md | 16 +- package.json | 4 +- .../act-on-dispatch/act-on-dispatch.test.ts | 108 --- src/hooks/act-on-dispatch/act-on-dispatch.ts | 28 - src/hooks/alter-items/alter-data.ts | 11 +- src/hooks/alter-items/alter-items.test.ts | 248 ------ src/hooks/alter-items/alter-items.ts | 56 -- src/hooks/cache/cache.ts | 2 + src/hooks/check-required/check-required.ts | 10 +- src/hooks/de-populate/de-populate.test.ts | 284 ------- src/hooks/de-populate/de-populate.ts | 28 - src/hooks/debug/debug.ts | 12 +- .../disable-pagination/disable-pagination.ts | 10 +- src/hooks/disallow/disallow.ts | 18 +- src/hooks/fast-join/fast-join-cache.test.ts | 375 --------- src/hooks/fast-join/fast-join.test.ts | 753 ----------------- src/hooks/fast-join/fast-join.ts | 124 --- src/hooks/fast-join/test/make-services.ts | 98 --- src/hooks/fgraphql/fgraphql.test.ts | 760 ------------------ src/hooks/fgraphql/fgraphql.ts | 410 ---------- src/hooks/keep-in-array/keep-in-array.test.ts | 274 ------- src/hooks/keep-in-array/keep-in-array.ts | 57 -- .../keep-query-in-array.test.ts | 179 ----- .../keep-query-in-array.ts | 53 -- src/hooks/lowercase/lowercase-data.ts | 11 +- src/hooks/lowercase/lowercase.test.ts | 140 ---- src/hooks/lowercase/lowercase.ts | 35 - src/hooks/mongo-keys/mongo-keys.test.ts | 74 -- src/hooks/mongo-keys/mongo-keys.ts | 67 -- src/hooks/omit-query/omit-query.ts | 7 +- src/hooks/omit/omit-1.test.ts | 134 --- src/hooks/omit/omit-2.test.ts | 187 ----- src/hooks/omit/omit-data.ts | 8 +- src/hooks/omit/omit-result.ts | 7 +- src/hooks/omit/omit.test.ts | 191 ----- src/hooks/omit/omit.ts | 27 - .../params-for-server.test.ts} | 8 +- .../params-for-server.ts} | 6 +- .../params-from-client.test.ts | 203 +---- .../params-from-client/params-from-client.ts | 69 +- .../params-from-client2.test.ts | 54 -- .../params-from-client2.ts | 53 -- src/hooks/pick-query/pick-query.ts | 15 +- src/hooks/pick/pick-data.ts | 13 +- src/hooks/pick/pick-result.ts | 11 +- src/hooks/pick/pick.test.ts | 220 ----- src/hooks/pick/pick.ts | 36 - .../populate/populate-1deep-1child.test.ts | 668 --------------- src/hooks/populate/populate-basics.test.ts | 128 --- src/hooks/populate/populate-misc.test.ts | 294 ------- src/hooks/populate/populate-relations.test.ts | 326 -------- .../populate/populate-scaffolding.test.ts | 33 - src/hooks/populate/populate.ts | 350 -------- src/hooks/populate/test/config-app.ts | 38 - src/hooks/populate/test/get-init-db.ts | 111 --- src/hooks/prevent-changes/prevent-changes.ts | 33 +- src/hooks/resolvers/resolve-data.ts | 28 + src/hooks/resolvers/resolve-query.ts | 18 + src/hooks/resolvers/resolve-result.ts | 43 + src/hooks/resolvers/resolver.test.ts | 108 +++ src/hooks/resolvers/resolvers.internal.ts | 135 ++++ .../sequelize-convert.test.ts | 428 ---------- .../sequelize-convert/sequelize-convert.ts | 74 -- src/hooks/serialize/serialize.test.ts | 210 ----- src/hooks/serialize/serialize.ts | 84 -- src/hooks/set-field/set-field.ts | 12 +- src/hooks/set-now/set-now.test.ts | 182 ----- src/hooks/set-now/set-now.ts | 22 - src/hooks/set-slug/set-slug.ts | 8 +- src/hooks/sifter/sifter.ts | 9 +- src/hooks/soft-delete/soft-delete.ts | 8 +- src/hooks/stash-before/stash-before.ts | 12 +- src/hooks/throw-if/throw-if-is-multi.ts | 15 +- src/hooks/throw-if/throw-if.ts | 10 +- .../validate-schema/validate-schema.test.ts | 292 ------- src/hooks/validate-schema/validate-schema.ts | 93 --- src/hooks/validate/validate.test.ts | 92 --- src/hooks/validate/validate.ts | 67 -- src/predicates/not/not.ts | 3 - .../get-exposed-methods.ts | 11 + 80 files changed, 590 insertions(+), 8849 deletions(-) delete mode 100755 src/hooks/act-on-dispatch/act-on-dispatch.test.ts delete mode 100755 src/hooks/act-on-dispatch/act-on-dispatch.ts delete mode 100755 src/hooks/alter-items/alter-items.test.ts delete mode 100755 src/hooks/alter-items/alter-items.ts delete mode 100755 src/hooks/de-populate/de-populate.test.ts delete mode 100755 src/hooks/de-populate/de-populate.ts delete mode 100755 src/hooks/fast-join/fast-join-cache.test.ts delete mode 100755 src/hooks/fast-join/fast-join.test.ts delete mode 100755 src/hooks/fast-join/fast-join.ts delete mode 100755 src/hooks/fast-join/test/make-services.ts delete mode 100755 src/hooks/fgraphql/fgraphql.test.ts delete mode 100755 src/hooks/fgraphql/fgraphql.ts delete mode 100755 src/hooks/keep-in-array/keep-in-array.test.ts delete mode 100755 src/hooks/keep-in-array/keep-in-array.ts delete mode 100755 src/hooks/keep-query-in-array/keep-query-in-array.test.ts delete mode 100644 src/hooks/keep-query-in-array/keep-query-in-array.ts delete mode 100755 src/hooks/lowercase/lowercase.test.ts delete mode 100755 src/hooks/lowercase/lowercase.ts delete mode 100755 src/hooks/mongo-keys/mongo-keys.test.ts delete mode 100755 src/hooks/mongo-keys/mongo-keys.ts delete mode 100755 src/hooks/omit/omit-1.test.ts delete mode 100755 src/hooks/omit/omit-2.test.ts delete mode 100755 src/hooks/omit/omit.test.ts delete mode 100755 src/hooks/omit/omit.ts rename src/hooks/{params-for-server2/params-for-server2.test.ts => params-for-server/params-for-server.test.ts} (81%) rename src/hooks/{params-for-server2/params-for-server2.ts => params-for-server/params-for-server.ts} (92%) mode change 100755 => 100644 src/hooks/params-from-client/params-from-client.test.ts mode change 100755 => 100644 src/hooks/params-from-client/params-from-client.ts delete mode 100644 src/hooks/params-from-client2/params-from-client2.test.ts delete mode 100644 src/hooks/params-from-client2/params-from-client2.ts delete mode 100755 src/hooks/pick/pick.test.ts delete mode 100755 src/hooks/pick/pick.ts delete mode 100755 src/hooks/populate/populate-1deep-1child.test.ts delete mode 100755 src/hooks/populate/populate-basics.test.ts delete mode 100755 src/hooks/populate/populate-misc.test.ts delete mode 100755 src/hooks/populate/populate-relations.test.ts delete mode 100755 src/hooks/populate/populate-scaffolding.test.ts delete mode 100755 src/hooks/populate/populate.ts delete mode 100755 src/hooks/populate/test/config-app.ts delete mode 100755 src/hooks/populate/test/get-init-db.ts create mode 100644 src/hooks/resolvers/resolve-data.ts create mode 100644 src/hooks/resolvers/resolve-query.ts create mode 100644 src/hooks/resolvers/resolve-result.ts create mode 100644 src/hooks/resolvers/resolver.test.ts create mode 100644 src/hooks/resolvers/resolvers.internal.ts delete mode 100755 src/hooks/sequelize-convert/sequelize-convert.test.ts delete mode 100755 src/hooks/sequelize-convert/sequelize-convert.ts delete mode 100755 src/hooks/serialize/serialize.test.ts delete mode 100755 src/hooks/serialize/serialize.ts delete mode 100755 src/hooks/set-now/set-now.test.ts delete mode 100755 src/hooks/set-now/set-now.ts delete mode 100755 src/hooks/validate-schema/validate-schema.test.ts delete mode 100755 src/hooks/validate-schema/validate-schema.ts delete mode 100755 src/hooks/validate/validate.test.ts delete mode 100755 src/hooks/validate/validate.ts create mode 100644 src/utils/get-exposed-methods/get-exposed-methods.ts diff --git a/README.md b/README.md index 07226b81..df2ff069 100755 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ #### hooks -- added alterData, alterResult, deprecated alterItems -- added discardData, discardResult, deprecated discard - - moved to omitData, omitResult, deprecated omit -- added keepData, keepResult, deprecated keep - - moved to pickData, pickResult, deprecated pick -- added lowercaseData, lowercaseResult, deprecated lowercase -- added setNowData, setNowResult, deprecated setNow +- added alterData, alterResult, rm alterItems +- added discardData, discardResult, rm discard + - moved to omitData, omitResult, rm omit +- added keepData, keepResult, rm keep + - moved to pickData, pickResult, rm pick +- added lowercaseData, lowercaseResult, rm lowercase +- added setNowData, setNowResult, rm setNow - removed several checks that are handled by typescript - removed check for `preventChanges(true, ...fieldNames)` @@ -29,6 +29,8 @@ - rm support for spread argument +- rm 'actOnDispatch' & 'actOnDefault' + #### predicates - renamed 'isNot' to 'not' (added alias for 'isNot') diff --git a/package.json b/package.json index 1756b4a0..d142d735 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "release:major": "npm version major && npm publish", "changelog": "github_changelog_generator --max-issues 200 -u feathersjs-ecosystem -p feathers-hooks-common && git add CHANGELOG.md && git commit -am \"Updating changelog\"", "lint": "eslint .", - "update-dependencies": "ncu -u -x ajv", + "update-dependencies": "ncu -u", "test:unit": "vitest run", "coverage": "vitest run --coverage", "test": "npm run lint && npm run coverage", @@ -64,9 +64,7 @@ ], "dependencies": { "@feathersjs/errors": "^5.0.31", - "ajv": "^6.12.6", "fast-copy": "^3.0.2", - "graphql": "^16.10.0", "lodash": "^4.17.21", "neotraverse": "^0.6.18" }, diff --git a/src/hooks/act-on-dispatch/act-on-dispatch.test.ts b/src/hooks/act-on-dispatch/act-on-dispatch.test.ts deleted file mode 100755 index 7ef45a36..00000000 --- a/src/hooks/act-on-dispatch/act-on-dispatch.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { actOnDefault, actOnDispatch } from './act-on-dispatch'; -import { combine, getItems, replaceItems } from '../../utils'; - -let hookBefore: any; - -function testHook(what: any, code: any) { - return (context: HookContext) => { - if (context.params._actOn !== what) { - throw new Error(`Hook code ${code} expected ${what} found ${context.params._actOn}`); - } - - context.params._actOnCodes.push(code); - }; -} - -describe('services actOn', () => { - describe('Call hooks which do not call other hooks', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'get', - params: { _actOnCodes: [] }, - }; - }); - - it('actOnDefault', async () => { - const result: any = await actOnDefault( - testHook(undefined, 1), - testHook(undefined, 2), - testHook(undefined, 3), - )(hookBefore); - - assert.deepEqual(result.params._actOnCodes, [1, 2, 3]); - }); - - it('actOnDispatch', async () => { - const result: any = await actOnDispatch( - testHook('dispatch', 10), - testHook('dispatch', 20), - testHook('dispatch', 30), - )(hookBefore); - - assert.deepEqual(result.params._actOnCodes, [10, 20, 30]); - }); - }); - - describe('Call hooks calling others same actOn', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'get', - params: { _actOnCodes: [] }, - }; - }); - - it('actOnDefault calling actOnDefault', async () => { - const result: any = await actOnDefault( - combine(testHook(undefined, 11), testHook(undefined, 12)), - combine(testHook(undefined, 21), testHook(undefined, 22)), - )(hookBefore); - - assert.deepEqual(result.params._actOnCodes, [11, 12, 21, 22]); - }); - - it('actOnDefault calling actOnDispatch', async () => { - const result: any = await actOnDefault( - actOnDispatch(combine(testHook('dispatch', 11), testHook('dispatch', 12))), - combine(testHook(undefined, 21), testHook(undefined, 22)), - )(hookBefore); - - assert.deepEqual(result.params._actOnCodes, [11, 12, 21, 22]); - }); - - it('actOnDispatch calling actOnDefault', async () => { - const result: any = await actOnDispatch( - actOnDefault(combine(testHook(undefined, 11), testHook(undefined, 12))), - combine(testHook('dispatch', 21), testHook('dispatch', 22)), - )(hookBefore); - - assert.deepEqual(result.params._actOnCodes, [11, 12, 21, 22]); - }); - }); - - describe('getItems & replaceItems', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'get', - data: { a: 1 }, - result: { b: 2 }, - dispatch: { c: 3 }, - params: { _actOn: 'dispatch' }, - }; - }); - - it('Gets dispatch data', () => { - assert.deepEqual(getItems(hookBefore), hookBefore.dispatch); - }); - - it('Returns dispatch data', () => { - replaceItems(hookBefore, { foo: 'bar' }); - - assert.deepEqual(hookBefore.dispatch, { foo: 'bar' }); - }); - }); -}); diff --git a/src/hooks/act-on-dispatch/act-on-dispatch.ts b/src/hooks/act-on-dispatch/act-on-dispatch.ts deleted file mode 100755 index 5954eaf7..00000000 --- a/src/hooks/act-on-dispatch/act-on-dispatch.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../../types'; -import { combine } from '../../utils'; - -/** - * Runs a series of hooks which mutate context.data or context.result (the Feathers default). - * @see https://hooks-common.feathersjs.com/hooks.html#actondefault - */ -export const actOnDefault = (...hooks: HookFunction[]) => - actOn(undefined, ...hooks); - -/** - * Runs a series of hooks which mutate context.dispatch. - * @see https://hooks-common.feathersjs.com/hooks.html#actondispatch - */ -export const actOnDispatch = (...hooks: HookFunction[]) => - actOn('dispatch', ...hooks); - -function actOn(what: any, ...hooks: HookFunction[]) { - return async (context: H) => { - const currActOn = context.params._actOn; - context.params._actOn = what; - - const newContext = await combine(...hooks)(context); - newContext.params._actOn = currActOn; - return newContext; - }; -} diff --git a/src/hooks/alter-items/alter-data.ts b/src/hooks/alter-items/alter-data.ts index 35fdc768..0f944af1 100755 --- a/src/hooks/alter-items/alter-data.ts +++ b/src/hooks/alter-items/alter-data.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { replaceData } from '../../utils/replace-items/replace-data'; import { isPromise } from '../../common'; @@ -8,8 +8,8 @@ import { isPromise } from '../../common'; */ export const alterData = (cb: (record: T, context: H) => any) => - (context: H) => - replaceData(context, (item: any) => { + async (context: H, next?: NextFunction) => { + await replaceData(context, (item: any) => { const result = cb(item, context); if (isPromise(result)) { @@ -18,3 +18,8 @@ export const alterData = return result ?? item; } }); + + if (next) { + return next(); + } + }; diff --git a/src/hooks/alter-items/alter-items.test.ts b/src/hooks/alter-items/alter-items.test.ts deleted file mode 100755 index 6e024805..00000000 --- a/src/hooks/alter-items/alter-items.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { assert } from 'vitest'; -import { alterItems } from './alter-items'; - -let hookBefore: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookCreateMulti: any; -let hookFind: any; - -describe('services alterItems', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane', last: 'Doe' }, - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - hookCreateMulti = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('default func is a no-op', () => { - // @ts-expect-error test case - alterItems()(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe' }); - }); - - it('context is 2nd param', () => { - let contextParam; - alterItems((_rec: any, context: any) => { - contextParam = context; - })(hookBefore); - assert.deepEqual(contextParam, hookBefore); - }); - - it('throws if 1st param is not a func', () => { - try { - // @ts-expect-error test case - alterItems('no-func'); - } catch (error: any) { - assert.equal(error.message, 'Function required. (alter)'); - return; - } - throw new Error('alterItems does not throw an error if 1st param is not a function'); - }); - - it('updates hook before::create', () => { - alterItems((rec: any) => { - rec.state = 'UT'; - })(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); - - it('updates hook before::create::multi', () => { - alterItems((rec: any) => { - rec.state = 'UT'; - })(hookCreateMulti); - assert.deepEqual(hookCreateMulti.data, [ - { first: 'John', last: 'Doe', state: 'UT' }, - { first: 'Jane', last: 'Doe', state: 'UT' }, - ]); - }); - - it('updates hook after::find with pagination', () => { - alterItems((rec: any) => { - delete rec.last; - })(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after::find with no pagination', () => { - alterItems((rec: any) => { - rec.new = rec.first; - })(hookFind); - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); - - it('updates hook after', () => { - alterItems((rec: any) => { - rec.new = rec.first; - })(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); - - it('updates hook before::create with new item returned', () => { - alterItems((rec: any) => Object.assign({}, rec, { state: 'UT' }))(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); - - it('updates hook after::find with pagination with new item returned', () => { - alterItems((rec: any) => Object.assign({}, { first: rec.first }))(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after::find with pagination with new item returned', () => { - alterItems((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookFind); - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); - - it('updates hook after with new item returned', () => { - alterItems((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); - - it('returns a promise that contains context', async () => { - const promise = alterItems((rec: any) => { - rec.state = 'UT'; - return Promise.resolve(); - })(hookBefore); - - assert.ok(promise instanceof Promise); - - const result = await promise; - - assert.deepEqual(result, hookBefore); - }); - - it('updates hook before::create with new item returned', () => { - // @ts-ignore - return alterItems((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( - hookBefore, - ).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); - }); - - it('updates hook before::create async', () => { - const alterFunc = (rec: any) => { - rec.state = 'UT'; - return Promise.resolve(); - }; - // @ts-ignore - return alterItems(alterFunc)(hookBefore).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); - }); - - it('updates hook before::create async with new item returned', () => { - const alterFunc = (rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })); - // @ts-ignore - return alterItems(alterFunc)(hookBefore).then(() => { - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); - }); - - it('updates hook after::create', () => { - return alterItems((rec: any) => { - rec.new = rec.first; - return Promise.resolve(); - // @ts-ignore - })(hookAfter).then(() => { - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); - }); - - it('updates hook after::create with new item returned', () => { - // @ts-ignore - return alterItems((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( - hookAfter, - ).then(() => { - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); - }); - - it('updates hook after::find with pagination', () => { - return alterItems((rec: any) => { - delete rec.last; - return Promise.resolve(); - // @ts-ignore - })(hookFindPaginate).then(() => { - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - }); - - it('updates hook after::find with no pagination', () => { - return alterItems((rec: any) => { - rec.new = rec.first; - return Promise.resolve(); - // @ts-ignore - })(hookFind).then(() => { - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); - }); - - it('updates hook after::find with pagination with new item returned', () => { - // @ts-ignore - return alterItems((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( - hookFindPaginate, - ).then(() => { - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - }); - - it('updates hook after::find with no pagination with new item returned', () => { - // @ts-ignore - return alterItems((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( - hookFind, - ).then(() => { - assert.deepEqual(hookFind.result, [ - { first: 'John', last: 'Doe', new: 'John' }, - { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); - }); -}); diff --git a/src/hooks/alter-items/alter-items.ts b/src/hooks/alter-items/alter-items.ts deleted file mode 100755 index 06b29cc2..00000000 --- a/src/hooks/alter-items/alter-items.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; - -import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../../common'; -import { getItems, replaceItems } from '../../utils'; - -/** - * Make changes to data or result items. Very flexible. - * @see https://hooks-common.feathersjs.com/hooks.html#alteritems - * - * @deprecated Use the explicit 'alterData' or 'alterResult' hooks instead. - */ -export function alterItems( - cb: (record: T, context: H) => any, -) { - if (!cb) { - cb = () => {}; - } - - if (typeof cb !== 'function') { - throw new BadRequest('Function required. (alter)'); - } - - return (context: H) => { - let items = getItems(context); - const isArray = Array.isArray(items); - - const results: any[] = (isArray ? items : [items]).map((item: any) => cb(item, context)); - - const hasPromises = results.some((result: any) => isPromise(result)); - - const setItem = (value: any, index: any) => { - if (typeof value === 'object' && value !== null) { - if (isArray) { - items[index] = value; - } else { - items = value; - } - } - }; - - if (hasPromises) { - return Promise.all(results).then(values => { - values.forEach(setItem); - - replaceItems(context, items); - return context; - }); - } else { - results.forEach(setItem); - - replaceItems(context, items); - return context; - } - }; -} diff --git a/src/hooks/cache/cache.ts b/src/hooks/cache/cache.ts index c9b56055..8b895735 100755 --- a/src/hooks/cache/cache.ts +++ b/src/hooks/cache/cache.ts @@ -12,6 +12,8 @@ export interface CacheOptions { const defaultMakeCacheKey = (key: any) => key; /** + * TODO: rm 'getItems' & migrate to around hook + * * Persistent, most-recently-used record cache for services. * * @see https://hooks-common.feathersjs.com/hooks.html#cache diff --git a/src/hooks/check-required/check-required.ts b/src/hooks/check-required/check-required.ts index 0e61d286..60f4aeb3 100755 --- a/src/hooks/check-required/check-required.ts +++ b/src/hooks/check-required/check-required.ts @@ -3,7 +3,7 @@ import _has from 'lodash/has.js'; import { BadRequest } from '@feathersjs/errors'; import { checkContext, getDataIsArray } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { MaybeArray, toArray } from '../../internal.utils'; /** @@ -12,8 +12,8 @@ import { MaybeArray, toArray } from '../../internal.utils'; */ export function checkRequired(fieldNames: MaybeArray) { const fieldNamesArray = toArray(fieldNames); - return (context: H) => { - checkContext(context, 'before', ['create', 'update', 'patch'], 'required'); + return (context: H, next?: NextFunction) => { + checkContext(context, ['before', 'around'], ['create', 'update', 'patch'], 'required'); const { data } = getDataIsArray(context); @@ -34,7 +34,7 @@ export function checkRequired(fieldNames: M } } } + + if (next) return next().then(() => context); }; } - -export { checkRequired as required }; diff --git a/src/hooks/de-populate/de-populate.test.ts b/src/hooks/de-populate/de-populate.test.ts deleted file mode 100755 index c07f4e88..00000000 --- a/src/hooks/de-populate/de-populate.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { assert } from 'vitest'; -import { dePopulate } from './de-populate'; - -describe('services dePopulate - not dot notation', () => { - let hookAfter: any; - let hookBeforeArray: any; - let hookBefore: any; - - beforeEach(() => { - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post', 'x'], - _elapsed: { post: 16051500, total: 20707798, x: 1 }, - _computed: ['a1', 'a1'], - a1: 1, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - }; - hookBefore = { - type: 'before', - method: 'update', - params: { provider: 'rest' }, - data: { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }, - }; - hookBeforeArray = { - type: 'before', - method: 'patch', - params: { provider: 'rest' }, - data: [ - { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 3456238, total: 3642135 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 3457496, total: 3878535 }, - post: { - id: 2, - title: 'Post 2', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 3446912, total: 3857237 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - ], - }; - }); - - it('one item, after hook, missing props', () => { - const hook = structuredClone(hookAfter); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.result, { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }); - }); - - it('one item, before hook, not populated', () => { - const hook = structuredClone(hookBefore); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.data, { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }); - }); - - it('item array, before hook', () => { - const hook = structuredClone(hookBeforeArray); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.data, [ - { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }, - { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - }, - { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - }, - ]); - }); -}); - -describe('services dePopulate - dot notation', () => { - let hookAfter: any; - let hookBeforeArray: any; - let hookBefore: any; - - beforeEach(() => { - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post.a.b', 'x'], - _elapsed: { post: 16051500, total: 20707798, x: 1 }, - _computed: ['a1', 'a1'], - a1: 1, - post: { - a: { - b: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - }, - }, - }; - hookBefore = { - type: 'before', - method: 'update', - params: { provider: 'rest' }, - data: { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }, - }; - hookBeforeArray = { - type: 'before', - method: 'patch', - params: { provider: 'rest' }, - data: [ - { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post.a'], - _elapsed: { post: 3456238, total: 3642135 }, - post: { - a: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - }, - { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - _include: ['post.a', 'x', 'post.b.c', 'comments'], - _elapsed: { post: 3457496, total: 3878535 }, - comments: {}, - post: { - a: { - id: 2, - title: 'Post 2', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - }, - { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 3446912, total: 3857237 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - }, - ], - }; - }); - - it('one item, after hook, missing props', () => { - const hook = structuredClone(hookAfter); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.result, { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - post: { a: {} }, - }); - }); - - it('one item, before hook, not populated', () => { - const hook = structuredClone(hookBefore); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.data, { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }); - }); - - it('item array, before hook', () => { - const hook = structuredClone(hookBeforeArray); - const deHook: any = dePopulate()(hook); - assert.deepEqual(deHook.data, [ - { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - post: {}, - }, - { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - post: {}, - }, - { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - }, - ]); - }); -}); diff --git a/src/hooks/de-populate/de-populate.ts b/src/hooks/de-populate/de-populate.ts deleted file mode 100755 index 2eac0305..00000000 --- a/src/hooks/de-populate/de-populate.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import _omit from 'lodash/omit.js'; -import { getItems, replaceItems } from '../../utils'; - -/** - * Remove records and properties created by the populate hook. - * @see https://hooks-common.feathersjs.com/hooks.html#depopulate - */ -export function dePopulate(func?: (item: any) => void) { - return (context: H) => { - const items = getItems(context); - const converter = (item: any) => { - if (typeof func === 'function') { - func(item); - } - - const keys = ['_elapsed', '_computed', '_include']; - const { _computed = [], _include = [] } = item; - - return _omit(item, keys.concat(_computed).concat(_include)); - }; - const converted = Array.isArray(items) ? items.map(converter) : converter(items); - - replaceItems(context, converted); - - return context; - }; -} diff --git a/src/hooks/debug/debug.ts b/src/hooks/debug/debug.ts index 6ed34bf4..c6244d77 100755 --- a/src/hooks/debug/debug.ts +++ b/src/hooks/debug/debug.ts @@ -1,11 +1,16 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; /** * Display the current hook context for debugging. * @see https://hooks-common.feathersjs.com/hooks.html#debug */ -export function debug(msg: string, ...fieldNames: string[]) { - return (context: H) => { +export const debug = + (msg: string, ...fieldNames: string[]) => + async (context: H, next?: NextFunction) => { + if (next) { + await next(); + } + // display timestamp const now = new Date(); console.log( @@ -50,4 +55,3 @@ export function debug(msg: string, ...field console.log('error', context.error); } }; -} diff --git a/src/hooks/disable-pagination/disable-pagination.ts b/src/hooks/disable-pagination/disable-pagination.ts index cf2e09dc..6aa520fc 100755 --- a/src/hooks/disable-pagination/disable-pagination.ts +++ b/src/hooks/disable-pagination/disable-pagination.ts @@ -1,12 +1,13 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { checkContext } from '../../utils'; /** * Disables pagination when query.$limit is -1 or '-1'. * @see https://hooks-common.feathersjs.com/hooks.html#disablepagination */ -export function disablePagination() { - return (context: H) => { +export const disablePagination = + () => + (context: H, next?: NextFunction) => { checkContext(context, 'before', ['find'], 'disablePagination'); const $limit = context.params?.query?.$limit; @@ -15,6 +16,7 @@ export function disablePagination() { delete context.params.query.$limit; } + if (next) return next().then(() => context); + return context; }; -} diff --git a/src/hooks/disallow/disallow.ts b/src/hooks/disallow/disallow.ts index f54f3fd7..7298ea23 100755 --- a/src/hooks/disallow/disallow.ts +++ b/src/hooks/disallow/disallow.ts @@ -1,22 +1,28 @@ import { MethodNotAllowed } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import type { TransportName } from '../../types'; import { isProvider } from '../../predicates'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Prevents access to a service method completely or for specific transports. * @see https://hooks-common.feathersjs.com/hooks.html#disallow */ -export function disallow(...transports: TransportName[]) { - return (context: H) => { - if (transports.length === 0) { +export const disallow = ( + transports: MaybeArray, +) => { + const transportsArr = toArray(transports); + return (context: H, next?: NextFunction) => { + if (transportsArr.length === 0) { throw new MethodNotAllowed('Method not allowed'); } - if (isProvider(...transports)(context)) { + if (isProvider(...transportsArr)(context)) { throw new MethodNotAllowed( `Provider '${context.params.provider}' can not call '${context.method}'. (disallow)`, ); } + + if (next) return next().then(() => context); }; -} +}; diff --git a/src/hooks/fast-join/fast-join-cache.test.ts b/src/hooks/fast-join/fast-join-cache.test.ts deleted file mode 100755 index d7acb693..00000000 --- a/src/hooks/fast-join/fast-join-cache.test.ts +++ /dev/null @@ -1,375 +0,0 @@ -import { assert } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import BatchLoader from '@feathers-plus/batch-loader'; -// @ts-ignore -import CacheMap from '@feathers-plus/cache'; -import { MemoryService } from '@feathersjs/memory'; -import { fastJoin } from './fast-join'; -import { cache } from '../cache/cache'; -import { iff } from '../iff/iff'; -import { makeCallingParams } from '../../utils'; -import { clone } from '../../common'; - -const { getResultsByKey, getUniqueKeys } = BatchLoader; - -const postsStoreStartId = 5; -const postsStoreInit = [ - { id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] }, - { id: 2, body: 'Marshall post', userId: 102, starIds: [101, 103, 104] }, - { id: 3, body: 'Barbara post', userId: 103 }, - { id: 4, body: 'Aubree post', userId: 104 }, -]; - -const usersStoreStartId = 105; -const usersStoreInit = [ - { id: 101, name: 'John' }, - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, -]; - -let app: any; -let users: any; -let posts: any; -let enableCache: any; -let joinAuthorCount: any; -let joinStarersCount: any; -let userBatchLoaderCount: any; - -const cacheMapUsers = CacheMap({ max: 100 }); -const userBatchLoader = new BatchLoader( - async (keys: any, context: any) => { - userBatchLoaderCount += 1; - const result: any = await users.find( - makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }), - ); - return getResultsByKey(keys, result, (user: any) => user.id, '!'); - }, - { context: {}, cacheMap: cacheMapUsers }, -); - -function services(app: any) { - app.configure(usersService); - app.configure(postsService); -} - -function postsService(app: any) { - const store = clone(postsStoreInit); - - class PostsService extends MemoryService { - foo: boolean; - - constructor(...args: any[]) { - super(...args); - this.foo = true; - } - - get(...args: any[]) { - // @ts-ignore - return super.get(...args); - } - } - - app.use('/posts', new PostsService({ store, postsStoreStartId })); - - app.service('posts').hooks({ - before: { - all: [], - }, - }); -} - -function usersService(app: any) { - const store = clone(usersStoreInit); - - class UsersService extends MemoryService { - junk: boolean; - constructor(...args: any[]) { - super(...args); - this.junk = true; - } - - get(...args: any[]) { - // @ts-ignore - return super.get(...args); - } - } - - app.use('/users', new UsersService({ store, usersStoreStartId })); - - app.service('users').hooks({ - before: { - all: iff(enableCache, cache(cacheMapUsers)), - }, - after: { - all: iff(enableCache, cache(cacheMapUsers)), - }, - }); -} - -describe('services fastJoin & cache', () => { - beforeEach(() => { - app = feathers().configure(services); - - posts = app.service('posts'); - users = app.service('users'); - - enableCache = false; - joinAuthorCount = 0; - joinStarersCount = 0; - userBatchLoaderCount = 0; - }); - - describe('check services work', () => { - it('find posts', async () => { - const data = await posts.find(); - assert.deepEqual(data, postsStoreInit); - }); - - it('find users', async () => { - const data = await users.find(); - assert.deepEqual(data, usersStoreInit); - }); - }); - - describe('test fastJoin', () => { - it('no cacheMap, no cache hook', async () => { - const context = await ex8(); - - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('with cacheMap, no cache hook', async () => { - const context = await ex8a(); - - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - }); - - describe('test fastJoin with cacheMap & cache', () => { - beforeEach(() => { - enableCache = true; - cacheMapUsers.reset(); - }); - - it('works for 1 call', async () => { - const context = await ex8b(); - - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - assert.equal(joinAuthorCount, 1, 'joinAuthorCount'); - assert.equal(joinStarersCount, 1, 'joinStarersCount'); - }); - - it('uses persistent cache for 2 calls', async () => { - assert.equal(cacheMapUsers.itemCount, 0, '0 cache'); - - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - // First call - let context = await ex8b(); - - assert.deepEqual(context, result); - assert.equal(cacheMapUsers.itemCount, 4, '1 cache'); - assert.equal(joinAuthorCount, 1, '1 joinAuthorCount'); - assert.equal(joinStarersCount, 1, '1 joinStarersCount'); - assert.equal(userBatchLoaderCount, 1, '1 userBatchLoaderCount'); - - // Second call - joinAuthorCount = 0; - joinStarersCount = 0; - userBatchLoaderCount = 0; - - context = await ex8b(); - - assert.deepEqual(context, result); - assert.equal(cacheMapUsers.itemCount, 4, '2 cache'); - assert.equal(joinAuthorCount, 1, '2 joinAuthorCount'); - assert.equal(joinStarersCount, 1, '2 joinStarersCount'); - assert.equal(userBatchLoaderCount, 0, '2 userBatchLoaderCount'); // key check - }); - }); -}); - -async function ex8() { - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {} }; - - context._loaders.user.id = new BatchLoader( - async (keys: any, context: any) => { - const result = await users.find( - makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }), - ); - return getResultsByKey(keys, result, (user: any) => user.id, '!'); - }, - { context }, - ); - }, - - joins: { - author: () => async (post: any, context: any) => { - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - }, - }; - - const context: any = { - method: 'find', - result: clone(await posts.find({ query: { id: 1 } })), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex8a() { - const cacheMap = CacheMap({ max: 100 }); - - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {} }; - - context._loaders.user.id = new BatchLoader( - async (keys: any, context: any) => { - const result = await users.find( - makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }), - ); - return getResultsByKey(keys, result, (user: any) => user.id, '!'); - }, - { context, cacheMap }, - ); - }, - - joins: { - author: () => async (post: any, context: any) => { - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - }, - }; - - const context: any = { - method: 'find', - result: clone(await posts.find({ query: { id: 1 } })), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex8b() { - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {} }; - - context._loaders.user.id = userBatchLoader; - }, - - joins: { - author: () => async (post: any, context: any) => { - joinAuthorCount += 1; - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - joinStarersCount += 1; - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - }, - }; - - const context: any = { - method: 'find', - result: clone(await posts.find({ query: { id: 1 } })), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} diff --git a/src/hooks/fast-join/fast-join.test.ts b/src/hooks/fast-join/fast-join.test.ts deleted file mode 100755 index 308878b5..00000000 --- a/src/hooks/fast-join/fast-join.test.ts +++ /dev/null @@ -1,753 +0,0 @@ -import { assert } from 'vitest'; -import BatchLoader from '@feathers-plus/batch-loader'; -import { fastJoin } from './fast-join'; -import { makeCallingParams } from '../../utils'; -import { posts, users, comments } from './test/make-services'; - -const { getResultsByKey, getUniqueKeys, loaderFactory } = BatchLoader; - -describe('service fast-join', () => { - it('Guide - resolvers', async () => { - const context = await ex1(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - shaping the result', async () => { - const context = await ex2(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - author: { id: 101, name: 'John' }, - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Customize Resolver Operation', async () => { - const context = await ex3(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Calculated Fields', async () => { - const context = await ex4(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - starerCount: 3, - author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Recursive Operations', async () => { - const context = await ex5(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - comments: [ - { - id: 11, - text: 'John post Marshall comment 11', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 12, - text: 'John post Marshall comment 12', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 13, - text: 'John post Marshall comment 13', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Keeping Resolvers DRY', async () => { - const context = await ex6(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - comments: [ - { - id: 11, - text: 'John post Marshall comment 11', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 12, - text: 'John post Marshall comment 12', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 13, - text: 'John post Marshall comment 13', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Using a Simple Batch-Loader', async () => { - const context = await ex7(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Using Batch-Loaders', async () => { - const context = await ex8(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); - - it('Guide - Putting It All Together', async () => { - const context = await ex9(); - const result: any = { - method: 'find', - result: [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - { userId: 102, points: 1, author: 'Marshall' }, - { userId: 103, points: 1, author: 'Barbara' }, - { userId: 104, points: 1, author: 'Aubree' }, - ], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - comments: [ - { - id: 11, - text: 'John post Marshall comment 11', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 12, - text: 'John post Marshall comment 12', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - { - id: 13, - text: 'John post Marshall comment 13', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - ], - }, - { - id: 2, - body: 'Marshall post', - userId: 102, - starIds: [101, 103, 104], - author: { id: 102, name: 'Marshall' }, - starers: [ - { id: 101, name: 'John' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - comments: [ - { - id: 14, - text: 'Marshall post John comment 14', - postId: 2, - userId: 101, - author: { id: 101, name: 'John' }, - }, - { - id: 15, - text: 'Marshall post John comment 15', - postId: 2, - userId: 101, - author: { id: 101, name: 'John' }, - }, - ], - }, - { - id: 3, - body: 'Barbara post', - userId: 103, - author: { id: 103, name: 'Barbara' }, - comments: [ - { - id: 16, - text: 'Barbara post John comment 16', - postId: 3, - userId: 101, - author: { id: 101, name: 'John' }, - }, - ], - }, - { - id: 4, - body: 'Aubree post', - userId: 104, - author: { id: 104, name: 'Aubree' }, - comments: [ - { - id: 17, - text: 'Aubree post Marshall comment 17', - postId: 4, - userId: 102, - author: { id: 102, name: 'Marshall' }, - }, - ], - }, - ], - params: {}, - _loaders: undefined, - }; - - assert.deepEqual(context, result); - }); -}); - -async function ex1() { - const postResolvers = { - joins: { - author: () => async (post: any) => { - post.author = ( - await users.find({ - query: { - id: post.userId, - }, - }) - )[0]; - }, - starers: ($select: any) => async (post: any) => { - post.starers = await users.find({ - query: { - id: { $in: post.starIds }, - $select: $select || ['name'], - }, - }); - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex2() { - const postResolvers = { - joins: { - author: () => async (post: any) => { - post.author = ( - await users.find({ - query: { - id: post.userId, - }, - }) - )[0]; - }, - starers: ($select: any) => async (post: any) => { - post.starers = await users.find({ - query: { - id: { $in: post.starIds }, - $select: $select || ['name'], - }, - }); - }, - }, - }; - - const query = { - author: true, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers, (_context: any) => query)(context); -} - -async function ex3() { - const postResolvers = { - joins: { - author: () => async (post: any) => { - post.author = ( - await users.find({ - query: { - id: post.userId, - }, - }) - )[0]; - }, - starers: ($select: any) => async (post: any) => { - post.starers = await users.find({ - query: { - id: { $in: post.starIds }, - $select: $select || ['name'], - }, - }); - }, - }, - }; - - const query = { - author: true, - starers: [['id', 'name']], - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin( - (_context: any) => postResolvers, - (_context: any) => query, - )(context); -} - -async function ex4() { - const postResolvers: any = { - joins: { - author: () => async (post: any) => { - post.author = ( - await users.find({ - query: { - id: post.userId, - }, - }) - )[0]; - }, - starers: ($select: any) => async (post: any) => { - post.starers = await users.find({ - query: { - id: { $in: post.starIds }, - $select: $select || ['name'], - }, - }); - }, - starerCount: () => (post: any) => { - post.starerCount = post.starIds.length; - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex5() { - const postResolvers: any = { - joins: { - comments: { - resolver: ($select: any, $limit: any, $sort: any) => async (post: any) => { - post.comments = await comments.find({ - query: { - postId: post.id, - $select, - $limit: $limit || 5, - [$sort]: { createdAt: -1 }, - }, - }); - return post.comments; - }, - joins: { - author: ($select: any) => async (comment: any) => { - comment.author = ( - await users.find({ - query: { - id: comment.userId, - $select, - }, - }) - )[0]; - }, - }, - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex6() { - const commentResolvers = { - joins: { - author: (_$select: any) => async (comment: any) => { - comment.author = ( - await users.find({ - query: { - id: comment.userId, - }, - }) - )[0]; - }, - }, - }; - - const postResolvers = { - joins: { - comments: { - resolver: ($select: any, $limit: any, $sort: any) => async (post: any) => { - post.comments = await comments.find({ - query: { - postId: post.id, - $select, - $limit: $limit || 5, - [$sort]: { createdAt: -1 }, - }, - }); - return post.comments; - }, - joins: commentResolvers, - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex7() { - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {} }; - - context._loaders.user.id = loaderFactory(users, 'id', false)(context); - }, - - joins: { - author: () => async (post: any, context: any) => { - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex8() { - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {} }; - - context._loaders.user.id = new BatchLoader( - async (keys: any, context: any) => { - const result = await users.find( - makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }), - ); - return getResultsByKey(keys, result, (user: any) => user.id, '!'); - }, - { context }, - ); - }, - - joins: { - author: () => async (post: any, context: any) => { - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: 1 } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} - -async function ex9() { - const commentResolvers = { - joins: { - author: () => async (comment: any, context: any) => { - if (!comment.userId) return; - comment.author = await context._loaders.user.id.load(comment.userId); - }, - }, - }; - - const postResolvers = { - before: (context: any) => { - context._loaders = { user: {}, comments: {} }; - - context._loaders.user.id = new BatchLoader( - async (keys: any, context: any) => { - const result = await users.find( - makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }), - ); - return getResultsByKey(keys, result, (user: any) => user.id, '!'); - }, - { context }, - ); - - context._loaders.comments.postId = new BatchLoader( - async (keys: any, context: any) => { - const result = await comments.find( - makeCallingParams(context, { postId: { $in: getUniqueKeys(keys) } }), - ); - // @ts-ignore - return getResultsByKey(keys, result, (comment: any) => comment.postId, '[!]'); - }, - { context }, - ); - }, - - joins: { - author: () => async (post: any, context: any) => { - post.author = await context._loaders.user.id.load(post.userId); - }, - - starers: () => async (post: any, context: any) => { - if (!post.starIds) return; - post.starers = await context._loaders.user.id.loadMany(post.starIds); - }, - - reputation_author: - (..._args: any[]): any => - async (post: any, context: any): Promise => { - if (!post.reputation) return null; - const authors = await context._loaders.user.id.loadMany( - post.reputation.map((rep: any) => rep.userId), - ); - post.reputation.forEach((rep: any, i: any) => { - rep.author = authors[i].name; - }); - }, - - comments: { - resolver: - (..._args: any[]) => - async (post: any, context: any) => { - post.comments = await context._loaders.comments.postId.load(post.id); - return post.comments; - }, - joins: commentResolvers, - }, - }, - }; - - const context: any = { - method: 'find', - result: await posts.find({ query: { id: { $in: [1, 2, 3, 4] } } }), - params: {}, - }; - - return fastJoin(postResolvers)(context); -} diff --git a/src/hooks/fast-join/fast-join.ts b/src/hooks/fast-join/fast-join.ts deleted file mode 100755 index b12e989f..00000000 --- a/src/hooks/fast-join/fast-join.ts +++ /dev/null @@ -1,124 +0,0 @@ -import type { Application, HookContext, Query, Service } from '@feathersjs/feathers'; -import type { SyncContextFunction } from '../../types'; - -export interface ResolverContext - extends HookContext { - _loaders: any; -} - -export type SimpleResolver = ( - ...args: any[] -) => (item: any, context: H) => Promise; - -export interface RecursiveResolver { - resolver: SimpleResolver; - joins: ResolverMap; -} - -export interface ResolverMap { - after?: (context: H) => void | Promise; - before?: (context: H) => void | Promise; - joins: { - [property: string]: SimpleResolver | RecursiveResolver; - }; -} - -/** - * We often want to combine rows from two or more tables based on a relationship between them. The fastJoin hook - * will select records that have matching values in both tables. It can batch service calls and cache records, - * thereby needing roughly an order of magnitude fewer database calls than the populate hook, i.e. 2 calls instead - * of 20. It uses a GraphQL-like imperative API. - * - * fastJoin is not restricted to using data from Feathers services. Resources for which there are no Feathers - * adapters can also be used. - * - * - * fastJoin(postResolvers) - * fastJoin(postResolvers, query) - * fastJoin(context => postResolvers) - * fastJoin(postResolvers, context => query) // supports queries from client - * @see https://hooks-common.feathersjs.com/hooks.html#fastjoin - */ -export function fastJoin( - resolvers: ResolverMap | SyncContextFunction, H>, - query?: Query | SyncContextFunction, -) { - return (context: H) => { - const { method, data, result, params } = context; - - // @ts-expect-error _populate is not part of the Feathers context - if (params._populate || params._graphql) return context; // our service called within another populate - - const q = typeof query === 'function' ? query(context) : query; - const joins2 = typeof resolvers === 'function' ? resolvers(context) : resolvers; - const { before, joins, after } = joins2; - - const temp = result || (Array.isArray(data) ? data : [data]); - const results = method === 'find' ? result.data || temp : temp; - - const prevLoaders = context._loaders; - context._loaders = {}; - - return Promise.resolve() - .then(() => before && before(context)) - .then( - () => joins && results && recursive(joinsForQuery(joins2, q, context), results, context), - ) - .then(() => after && after(context)) - .then(() => { - context._loaders = prevLoaders; - return context; - }); - }; -} - -function joinsForQuery({ joins }: any = {}, query: any = undefined, context = {}) { - const runtime: any = []; - - Object.keys(joins).forEach(outerLabel => { - if (query && !query[outerLabel]) return; - - let join = joins[outerLabel]; - if (typeof join === 'function') { - join = { resolver: join }; - } - - const { resolver } = join; - let { joins: innerJoins } = join; - if (innerJoins && !innerJoins.resolver && innerJoins.joins) { - // support embedded resolvers for other services - innerJoins = innerJoins.joins; - } - - let args: any = query ? query[outerLabel] : []; - if (!Array.isArray(args)) { - args = typeof args === 'object' && args !== null ? args.args : []; - } - - runtime.push({ - args, - resolver, - joins: innerJoins - ? joinsForQuery({ joins: innerJoins }, query ? query[outerLabel] : null, context) - : null, - }); - }); - - return runtime; -} - -function recursive(joins: any, results: any, context: any) { - return Promise.all( - (Array.isArray(results) ? results : [results]).map(result => - Promise.all( - joins.map(({ args = [], resolver, joins }: any) => { - return Promise.resolve(resolver(...args)(result, context)).then(addedResults => { - if (!addedResults || !joins) return context; - - return recursive(joins, addedResults, context); - }); - }), - ), - ), - ); -} diff --git a/src/hooks/fast-join/test/make-services.ts b/src/hooks/fast-join/test/make-services.ts deleted file mode 100755 index 42fb13c3..00000000 --- a/src/hooks/fast-join/test/make-services.ts +++ /dev/null @@ -1,98 +0,0 @@ -const postsStore = [ - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ - // The current populate hook cannot handle this structure. - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 }, - ], - }, - { id: 2, body: 'Marshall post', userId: 102, starIds: [101, 103, 104] }, - { id: 3, body: 'Barbara post', userId: 103 }, - { id: 4, body: 'Aubree post', userId: 104 }, -]; - -const commentsStore = [ - { id: 11, text: 'John post Marshall comment 11', postId: 1, userId: 102 }, - { id: 12, text: 'John post Marshall comment 12', postId: 1, userId: 102 }, - { id: 13, text: 'John post Marshall comment 13', postId: 1, userId: 102 }, - { id: 14, text: 'Marshall post John comment 14', postId: 2, userId: 101 }, - { id: 15, text: 'Marshall post John comment 15', postId: 2, userId: 101 }, - { id: 16, text: 'Barbara post John comment 16', postId: 3, userId: 101 }, - { id: 17, text: 'Aubree post Marshall comment 17', postId: 4, userId: 102 }, -]; - -const usersStore = [ - { id: 101, name: 'John' }, - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, -]; - -export const posts: any = makeService(postsStore); -export const comments: any = makeService(commentsStore); -export const users: any = makeService(usersStore); - -function makeService(store1: any) { - return { - get(id: any) { - const store = clone(store1); - - for (let i = 0, leni = store.length; i < leni; i++) { - if (store[i].id === id) return asyncReturn(store[i]); - } - - throw Error(`post id ${id} not found`); - }, - - find(params: any) { - const store = clone(store1); - - if (!params || !params.query) return asyncReturn(store); - - const field = Object.keys(params.query)[0]; - const value = params.query[field]; - const $select = params.query.$select; - - return asyncReturn( - store - .filter((post: any) => { - return typeof value !== 'object' - ? post[field] === value - : value.$in.indexOf(post[field]) !== -1; - }) - .map((post: any) => pluck(post, $select)), - ); - }, - }; -} - -function asyncReturn(value: any) { - return new Promise(resolve => { - setTimeout(() => { - resolve(value); - }, 10); - }); -} - -function pluck(obj: any, fields: any) { - if (!fields) return obj; - - const res: any = {}; - - fields.forEach((name: any) => { - if (name in obj) { - res[name] = obj[name]; - } - }); - - return res; -} - -function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/src/hooks/fgraphql/fgraphql.test.ts b/src/hooks/fgraphql/fgraphql.test.ts deleted file mode 100755 index 320fad0b..00000000 --- a/src/hooks/fgraphql/fgraphql.test.ts +++ /dev/null @@ -1,760 +0,0 @@ -// @ts-ignore -import runTime from '@feathers-plus/graphql/lib/run-time'; -import BatchLoader from '@feathers-plus/batch-loader'; -import { assert } from 'vitest'; -import { parse } from 'graphql'; -import { fgraphql } from './fgraphql'; - -const { getResultsByKey } = BatchLoader; - -describe('services fgraphql', () => { - describe('using service resolver', () => { - /* eslint-disable */ - const beforeJane = () => ({ type: 'before', data: { first: 'Jane', last: 'Doe' } }); - const afterJane = () => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); - - const decisionTable: any[] = [ - // Test options - // desc, schema, resolvers, recordType, query, options, context, client, result - ['schema str', s('str'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['schema fcn', s('fcn'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['schema obj', s('obj'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['query str', s('str'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['query fcn', s('str'), r('full'), 'User', q('fcn'), o('both'), afterJane(), false, a('janeFull') ], - ['opt server-', s('str'), r('full'), 'User', q('obj'), o('server-'), afterJane(), false, a('janeFull-') ], - ['opt client-', s('str'), r('full'), 'User', q('obj'), o('client-'), afterJane(), true, a('janeFull-') ], - ['before hook', s('str'), r('full'), 'User', q('obj'), o('both'), beforeJane(), false, a('janeFull') ], - ['func params', s('param'),r('params'), 'User', q('params'),o('both'), afterJane(), false, a('janeParams')], - ['join names', s('str'), r('full'), 'User', q('obj'), o('join-'), afterJane(), false, a('janeJoin') ], - // Test conversion of resolver results - // desc, schema, resolvers, recordType, query, options, context, client, result - ['undef->null', s('cnv0'), r('undefin'),'User', q('obj'), o('both'), beforeJane(), false, a('janeNull') ], - ['undef->array',s('cnv1'), r('undefin'),'User', q('obj'), o('both'), beforeJane(), false, a('janeArray0')], - ['obj->array', s('cnv1'), r('full'), 'User', q('obj'), o('both'), beforeJane(), false, a('janeArray') ], - ['array->obj', s('str'), r('array1'), 'User', q('obj'), o('both'), beforeJane(), false, a('janeFull') ], - // Test error checking - // desc, schema, resolvers, recordType, query, options, context, client, result - ['x schema', s('err1'), r('full'), 'User', 1, o('both'), afterJane(), false, 101 ], - ['x query', s('str'), r('full'), 'User', q('err1'), o('both'), afterJane(), false, 102 ], - ['x hook type', s('str'), r('full'), 'Userxxx', q('obj'), o('both'), afterJane(), false, 104 ], - ['x context', s('str'), r('full'), 'User', q('obj'), o('prop-'), afterJane(), false, 105 ], - ['x reso func', s('str'), r('err1'), 'User', q('obj'), o('both'), afterJane(), false, 203 ], - ['x array len2',s('str'), r('array2'), 'User', q('obj'), o('both'), afterJane(), false, 204 ], - // Test features not available in GraphQL - // desc, schema, resolvers, recordType, query, options, context, client, result - ['normal', s('str'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['chge parent', s('str'), r('parent'), 'User', q('obj'), o('both'), afterJane(), false, a('janeMess') ], - ['value 1', s('str'), r('full'), 'User', q('value1'),o('both'), afterJane(), false, a('janeFull') ], - ['value 0', s('str'), r('full'), 'User', q('value0'),o('both'), afterJane(), false, a('jane0') ], - ['value falsey',s('str'), r('full'), 'User', q('falsey'),o('both'), afterJane(), false, a('janeFalsey')], - ['incl flds 1', s('str'), r('full'), 'User', q('obj'), o('both'), afterJane(), false, a('janeFull') ], - ['incl flds s', s('str'), r('full'), 'User', q('obj'), o('server-'), afterJane(), false, a('janeFull-') ], - ['incl flds c', s('str'), r('full'), 'User', q('obj'), o('client-'), afterJane(), true, a('janeFull-') ], - ['_none', s('str'), r('full'), 'User', q('none'), o('both'), afterJane(), false, a('janeFull-') ], - // Test join type at top level #2 - // desc, schema, resolvers, recordType, query, options, context, client, result - ['1 post', s('S2'), r('S2'), 'User', q('S2post'),o('both'), afterJane(), false, a('S2post') ], - ['1 comment', s('S2'), r('S2'), 'User', q('S2comm'),o('both'), afterJane(), false, a('S2comm') ], - ['l both', s('S2'), r('S2'), 'User', q('S2both'),o('both'), afterJane(), false, a('S2both') ], - ['1 post args', s('S2'), r('S2'), 'User', q('S2parm'),o('both'), afterJane(), false, a('S2parm') ], - ['1 post cont', s('S2'), r('S2'), 'User', q('S2parm'),o('prop+'), afterJane(), false, a('S2cont') ], - // Test join type at level #3 - // desc, schema, resolvers, recordType, query, options, ontext, client, result - ['2 all', s('S3'), r('S3'), 'User', q('S3all'), o('both'), afterJane(), false, a('S3all') ], - ]; - /* eslint-enable */ - - decisionTable.forEach( - ([desc, schema, resolvers, recordType, query, options, context, client, result]) => { - it(desc, async () => { - context.params = context.params || {}; - if (client) { - context.params.provider = 'socketio'; - } - - try { - const newContext: any = await fgraphql({ - parse, - runTime, - schema, - resolvers, - recordType, - query, - options, - })(context); - - if (!isObject(result)) { - assert.fail(`Unexpected success. Expected ${result}.`); - } else { - // inspector('result=', result); - // inspector('actual=', newContext.data || newContext.result); - assert.deepEqual(newContext.data || newContext.result, result, 'unexpected result'); - } - } catch (err: any) { - if (err.message.substr(0, 19) === 'Unexpected success.') { - throw err; - } - - if (isObject(result)) { - assert.fail(`unexpected fail: ${err.message}`); - } - - assert.strictEqual(err.code, result, `unexpected error: ${err.message}`); - } - }); - }, - ); - }); - - describe('using batchloader', () => { - let recordType: any; - let schema: any; - let context: any; - let query: any; - let options: any; - let usersBatchLoader: any; - let usersBatchLoaderCalls: any; - let resolvers: any; - let result: any; - - const usersDb: any = { - 31: { _id: '31', name: 'user 31' }, - 32: { _id: '32', name: 'user 32' }, - 35: { _id: '35', name: 'user 35' }, - 36: { _id: '36', name: 'user 36' }, - 37: { _id: '37', name: 'user 37' }, - }; - - const postsDb: any = { - 11: { _id: '11', body: 'body 11', userId: '31' }, - 12: { _id: '12', body: 'body 12', userId: '31' }, - 13: { _id: '13', body: 'body 13', userId: '32' }, - }; - - const commentsDb: any = { - 21: { _id: '21', comment: 'comment 21', postId: '11', userId: '35' }, - 22: { _id: '22', comment: 'comment 22', postId: '12', userId: '35' }, - 23: { _id: '23', comment: 'comment 23', postId: '13', userId: '35' }, - 24: { _id: '24', comment: 'comment 24', postId: '11', userId: '36' }, - 25: { _id: '25', comment: 'comment 25', postId: '12', userId: '36' }, - 26: { _id: '26', comment: 'comment 26', postId: '13', userId: '36' }, - 27: { _id: '27', comment: 'comment 24', postId: '11', userId: '37' }, - 28: { _id: '28', comment: 'comment 25', postId: '12', userId: '37' }, - 29: { _id: '29', comment: 'comment 26', postId: '13', userId: '37' }, - }; - - beforeEach(() => { - usersBatchLoaderCalls = []; - recordType = 'Post'; - - schema = ` - type User { - _id: ID - name: String - } - type Post { - _id: ID - body: String - userId: ID, - author: User - comments: [Comment] - } - type Comment { - _id: ID - comment: String - postId: ID, - userId: ID, - post: Post - author: User - }`; - - context = { - type: 'after', - params: {}, - result: Object.keys(postsDb).map(key => postsDb[key]), - }; - - query = { - body: 1, - userId: 1, - author: { - name: 1, - }, - comments: { - userId: 1, - author: { - name: 1, - }, - }, - }; - - options = { - inclJoinedNames: false, - }; - - usersBatchLoader = new BatchLoader(async (keys: any) => { - usersBatchLoaderCalls.push(keys); - const result = keys.map((key: any) => usersDb[key]); - return getResultsByKey(keys, result, (rec: any) => rec._id, '!'); - }); - - resolvers = () => ({ - Post: { - // tests returning a Promise - author: (parent: any, _args: any, _content: any, _ast: any) => - usersBatchLoader.load(parent.userId), - // tests returning a value - comments: (parent: any, _args: any, _content: any, _ast: any) => { - const x: any = []; - Object.keys(commentsDb).forEach(key => { - if (commentsDb[key].postId === parent._id) { - x.push(commentsDb[key]); - } - }); - return x; - }, - }, - Comment: { - author: (parent: any, _args: any, _content: any, _ast: any) => - usersBatchLoader.load(parent.userId), - }, - }); - - result = [ - { - body: 'body 11', - userId: '31', - comments: [ - { userId: '35', author: { _id: '35', name: 'user 35' } }, - { userId: '36', author: { _id: '36', name: 'user 36' } }, - { userId: '37', author: { _id: '37', name: 'user 37' } }, - ], - author: { _id: '31', name: 'user 31' }, - }, - { - body: 'body 12', - userId: '31', - comments: [ - { userId: '35', author: { _id: '35', name: 'user 35' } }, - { userId: '36', author: { _id: '36', name: 'user 36' } }, - { userId: '37', author: { _id: '37', name: 'user 37' } }, - ], - author: { _id: '31', name: 'user 31' }, - }, - { - body: 'body 13', - userId: '32', - comments: [ - { userId: '35', author: { _id: '35', name: 'user 35' } }, - { userId: '36', author: { _id: '36', name: 'user 36' } }, - { userId: '37', author: { _id: '37', name: 'user 37' } }, - ], - author: { _id: '32', name: 'user 32' }, - }, - ]; - }); - - it('batches calls', async () => { - try { - const newContext: any = await fgraphql({ - parse, - runTime, - schema, - resolvers, - recordType, - query, - options, - })(context); - - // inspector('batchloader calls', usersBatchLoaderCalls); - // inspector('actual=', newContext.data || newContext.result); - - assert.deepEqual(newContext.data || newContext.result, result, 'unexpected result'); - assert.deepEqual( - usersBatchLoaderCalls, - [['31', '32', '35', '36', '37']], - 'unexpected calls', - ); - } catch (err) { - console.log(err); - throw err; - } - }); - }); -}); - -function isObject(obj: any) { - return typeof obj === 'object' && obj !== null; -} - -// schemas -function s(typ: any) { - const SDL1 = ` -type User { - _id: ID - firstName: String - lastName: String - fullName: String! -}`; - - const S2 = ` -type User { - _id: ID - firstName: String - lastName: String - posts: [Post] - comments: [Comment] -} -type Post { - _id: ID - body: String -} -type Comment { - _id: ID - comment: String -}`; - - const S3 = ` -type User { - _id: ID - firstName: String - lastName: String - posts: [Post] - comments: [Comment] -} -type Post { - _id: ID - body: String - author: User -} -type Comment { - _id: ID - comment: String - author: User -}`; - - const C0 = ` -type User { - _id: ID - firstName: String - lastName: String - fullName: String -}`; - - const C1 = ` -type User { - _id: ID - firstName: String - lastName: String - fullName: [String] -}`; - - switch (typ) { - case 'str': - return SDL1; - case 'cnv0': - return C0; - case 'cnv1': - return C1; - case 'fcn': - return () => SDL1; - case 'obj': - return { - User: { - firstName: { typeof: 'String' }, - lastName: { typeof: 'String' }, - fullName: { nonNullTypeField: true, typeof: 'String' }, - }, - }; - case 'param': - return { - User: { - firstName: { typeof: 'String' }, - lastName: { typeof: 'String' }, - fullName: { nonNullTypeField: true, typeof: 'String' }, - params: { typeof: 'JSON' }, - }, - }; - case 'err1': - return (): any => null; - - case 'S2': - return S2; - case 'S3': - return S3; - default: - throw new Error(`Invalid typ ${typ} for "s" function.`); - } -} - -// resolvers -function r(typ: any) { - return function resolvers(_app: any, _options: any) { - // const { convertArgsToFeathers, extractAllItems, extractFirstItem } = options; // eslint-disable-line no-unused-vars - // const convertArgs = convertArgsToFeathers([]); // eslint-disable-line no-unused-vars - // let comments = app.service('/comments'); - - switch (typ) { - case 'full': - return { - User: { - // fullName: String! - fullName: (parent: any, _args: any, _content: any, _ast: any) => - `${parent.first} ${parent.last}`, - }, - }; - case 'parent': - return { - User: { - // fullName: String! - fullName: (parent: any, _args: any, _content: any, _ast: any) => { - const returns = `${parent.first} ${parent.last}`; - parent.first = 'foo'; - return returns; - }, - }, - }; - case 'params': - return { - User: { - // fullName: String! - fullName: (parent: any, _args: any, _content: any, _ast: any) => - `${parent.first} ${parent.last}`, - params: (_parent: any, args: any, _content: any, ast: any) => ({ - args, - ast, - }), - }, - }; - case 'err1': - return { User: { fullName: 'foo' } }; - - case 'array2': - return { - User: { - fullName: () => [{ fullName: 'foo' }, { fullName: 'foo' }], - }, - }; - case 'undefin': - return { - User: { - fullName: (): any => undefined, - }, - }; - case 'array1': - return { - User: { - fullName: (parent: any) => [`${parent.first} ${parent.last}`], - }, - }; - - case 'S2': - return { - User: { - // posts: [Post] - posts: (_parent: any, args: any, content: any, _ast: any) => { - return [ - { _id: '1001', body: 'foo body' }, - { _id: (args.params || content.foo || {})._id || '1002', body: 'bar body' }, - ]; - }, - // comments: [Comment] - comments: (_parent: any, _args: any, _content: any, _ast: any) => { - return [ - { _id: '2001', comment: 'foo comment' }, - { _id: '2002', comment: 'bar comment' }, - ]; - }, - }, - Post: {}, - }; - - case 'S3': - return { - User: { - // posts: [Post] - posts: (_parent: any, args: any, _content: any, _ast: any) => { - return [ - { _id: '1001', body: 'foo body' }, - { _id: (args.params || {})._id || '1002', body: 'bar body' }, - ]; - }, - // comments: [Comment] - comments: (_parent: any, _args: any, _content: any, _ast: any) => { - return [ - { _id: '2001', comment: 'foo comment' }, - { _id: '2002', comment: 'bar comment' }, - ]; - }, - }, - Post: { - // author: User - author: (_parent: any, _args: any, _content: any, _ast: any) => { - return { _id: '3001', first: 'Jane', last: 'Doe' }; - }, - }, - Comment: { - // author: User - author: (_parent: any, _args: any, _content: any, _ast: any) => { - return { _id: '4001', first: 'Jane', last: 'Doe' }; - }, - }, - }; - default: - throw new Error(`Invalid typ ${typ} for "r" function.`); - } - }; -} - -// query -function q(typ: any): any { - switch (typ) { - /* eslint-disable */ - case 'obj': - return { fullName: {} } ; - case 'none': - return { fullName: {}, _none: {} } ; - case 'value1': - return { fullName: 1, first: 1, last: 1 } ; - case 'value0': - return { fullName: 0, first: 1, last: 0 } ; - case 'falsey': - return { fullName: '', first: null, last: 1 } ; - case 'fcn': - return () => ({ fullName: {} } ); - case 'params': - return { fullName: {}, params: { - _args: { key: 1, query: { foo: 2 }, params: { bar: 3 }, baz: 4 } - } } ; - case 'err1': - return undefined; - - case 'S2post': - return { posts: {} } ; - case 'S2comm': - return { comments: {} } ; - case 'S2both': - return { posts: {}, comments: {} } ; - case 'S2parm': - return { - posts: { - _args: { params: { _id: '9999' } } - } - }; - case 'S2cont': - return { - posts: {} - }; - - case 'S3all': - return { - posts: { - author: {} - }, - comments: { - author: {} - } - }; - - case 'big1': - return { - fullName: {}, - posts: { - _args: { query: { } }, // { key: any, query: { ... }, params: { ... } - author: { - firstName: '', - fullName: '', // {} or '' doesn't matter as no props inside would-have-been {} - posts: { - draft: '', - }, - }, - }, - comments: {}, - followed_by: { - foo: '', // non-resolver name looks like field name. forces drop of real fields - follower: { - foo: '', - fullName: {}, - } - }, - following: { - foo: '', - followee: { - foo: '', - fullName: {}, - }, - }, - likes: { - author: { - firstName: '', - lastName: '', - }, - comment: { - body: '' - }, - }, - }; - default: - throw new Error(`Invalid typ ${typ} for "q" function.`); - /* eslint-enable */ - } -} - -// options -function o(typ: any) { - switch (typ) { - case 'both': - return { - inclAllFieldsServer: true, - inclAllFieldsClient: true, - }; - case 'server-': - return { inclAllFieldsServer: false }; - case 'client-': - return { inclAllFieldsClient: false }; - case 'loop': - return { skipHookWhen: () => false }; - case 'prop-': - return { - inclAllFieldsServer: true, - inclAllFieldsClient: true, - extraAuthProps: 1, - }; - case 'prop+': - return { - inclAllFieldsServer: true, - inclAllFieldsClient: true, - extraAuthProps: ['foo'], - }; - case 'join-': - return { - inclAllFieldsServer: true, - inclAllFieldsClient: true, - inclJoinedNames: false, - }; - default: - throw new Error(`Invalid typ ${typ} for "o" function.`); - } -} - -// results -function a(typ: any) { - switch (typ) { - /* eslint-disable */ - case 'janeNull' : - return { first: 'Jane', last: 'Doe', fullName: null, _include: ['fullName'] }; - case 'janeFull' : - return { first: 'Jane', last: 'Doe', fullName: 'Jane Doe', _include: ['fullName'] }; - case 'janeArray' : - return { first: 'Jane', last: 'Doe', fullName: ['Jane Doe'], _include: ['fullName'] }; - case 'janeArray0' : - return { first: 'Jane', last: 'Doe', fullName: [], _include: ['fullName'] }; - case 'janeFull-' : - return { fullName: 'Jane Doe', _include: ['fullName'] }; - case 'janeMess' : - return { first: 'foo', last: 'Doe', fullName: 'Jane Doe', _include: ['fullName'] }; - case 'jane0' : - return { first: 'Jane' }; - case 'janeFalsey' : - return { last: 'Doe' }; - case 'janeJoin' : - return { first: 'Jane', last: 'Doe', fullName: 'Jane Doe' }; - case 'janeParams' : - return { first: 'Jane', last: 'Doe', fullName: 'Jane Doe', _include: ['fullName', 'params'], - params: { - args: { key: 1, query: { foo: 2 }, params: { bar: 3 }, baz: 4 }, ast: undefined - } as any }; - - case 'S2post' : - return { - first: 'Jane', - last: 'Doe', - posts: [ - { _id: '1001', body: 'foo body' }, - { _id: '1002', body: 'bar body' }, - ], - _include: ['posts'] - }; - case 'S2parm' : - return { - first: 'Jane', - last: 'Doe', - posts: [ - { _id: '1001', body: 'foo body' }, - { _id: '9999', body: 'bar body' }, - ], - _include: ['posts'] - }; - case 'S2comm' : - return { - first: 'Jane', - last: 'Doe', - comments: [ - { _id: '2001', comment: 'foo comment' }, - { _id: '2002', comment: 'bar comment' }, - ], - _include: ['comments'] - }; - case 'S2cont' : - return { - first: 'Jane', - last: 'Doe', - posts: [ - { _id: '1001', body: 'foo body' }, - { _id: '9999', body: 'bar body' }, - ], - _include: ['posts'] - }; - case 'S2both' : - return { - first: 'Jane', - last: 'Doe', - posts: [ - { _id: '1001', body: 'foo body' }, - { _id: '1002', body: 'bar body' }, - ], - comments: [ - { _id: '2001', comment: 'foo comment' }, - { _id: '2002', comment: 'bar comment' }, - ], - _include: ['posts', 'comments'] - }; - - case 'S3all' : - return { - first: 'Jane', - last: 'Doe', - posts: [ - { _id: '1001', - body: 'foo body', - author: { _id: '3001', first: 'Jane', last: 'Doe' }, - _include: ['author'] - }, - { - _id: '1002', - body: 'bar body', - author: { _id: '3001', first: 'Jane', last: 'Doe' }, - _include: ['author'] - } - ], - comments: [ - { _id: '2001', - comment: 'foo comment', - author: { _id: '4001', first: 'Jane', last: 'Doe' }, - _include: ['author'] - }, - { - _id: '2002', - comment: 'bar comment', - author: { _id: '4001', first: 'Jane', last: 'Doe' }, - _include: ['author'] - } - ], - _include: ['posts', 'comments'] - } - - default: - throw new Error(`Invalid typ ${typ} for "a" function.`); - } - /* eslint-enable */ -} diff --git a/src/hooks/fgraphql/fgraphql.ts b/src/hooks/fgraphql/fgraphql.ts deleted file mode 100755 index 7d5358d8..00000000 --- a/src/hooks/fgraphql/fgraphql.ts +++ /dev/null @@ -1,410 +0,0 @@ -import type { Application, HookContext, Query } from '@feathersjs/feathers'; -import type { parse, GraphQLFieldResolver } from 'graphql'; -import type { SyncContextFunction } from '../../types'; -import { getItems, replaceItems } from '../../utils'; - -export type FGraphQLResolverMapFactory = (app: Application, runtime: any) => FGraphQLResolverMap; - -export interface FGraphQLResolverMap { - [i: string]: { - [i: string]: GraphQLFieldResolver; - }; - Query: { - [i: string]: GraphQLFieldResolver; - }; -} - -export interface FGraphQLOptions { - skipHookWhen?: SyncContextFunction; - inclAllFieldsServer?: boolean; - inclAllFieldsClient?: boolean; - inclAllFields?: boolean; - inclJoinedNames?: boolean; - extraAuthProps?: string[]; -} - -export interface FGraphQLHookOptions { - recordType: string; - schema: string; - resolvers: FGraphQLResolverMap | FGraphQLResolverMapFactory; - query: Query | SyncContextFunction; - options?: FGraphQLOptions; - runTime: any; - parse: typeof parse; -} - -const graphqlActions = ['Query', 'Mutation', 'Subscription']; - -/** - * Generate Graphql Resolvers for services - * @see https://medium.com/@eddyystop/38faee75dd1 - */ -export function fgraphql(options1: FGraphQLHookOptions) { - const { parse, recordType, resolvers, runTime, query } = options1; - let { schema } = options1; - - let ourResolvers: any; // will be initialized when hook is first called - - const options = { - skipHookWhen: (context: any) => !!(context.params || {}).graphql, - inclAllFieldsServer: true, - inclAllFieldsClient: true, - inclAllFields: null, // Will be initialized each hook call. - inclJoinedNames: true, - extraAuthProps: [], - ...(options1.options || {}), - }; - - // @ts-expect-error TODO - schema = isFunction(schema) ? schema() : schema; - - if (!isObject(schema) && !isString(schema)) { - throwError( - `Resolved schema is typeof ${typeof schema} rather than string or object. (fgraphql)`, - 101, - ); - } - - if (!isObject(runTime)) { - throwError(`option runTime is typeof ${typeof runTime} rather than an object. (fgraphql)`, 106); - } - - if (!isString(recordType)) { - throwError(`recordType is typeof ${typeof recordType} rather than string. (fgraphql)`, 103); - } - - if (!isArray(options.extraAuthProps)) { - throwError( - `option extraAuthProps is typeof ${typeof options.extraAuthProps} rather than array. (fgraphql)`, - 105, - ); - } - - const feathersSdl = isObject(schema) ? schema : convertSdlToFeathersSchemaObject(schema, parse); - - // Return the hook. - return (context: H) => { - const contextParams = context.params; - const optSkipHookWhen = options.skipHookWhen; - const skipHookWhen = isFunction(optSkipHookWhen) ? optSkipHookWhen(context) : optSkipHookWhen; - - if (context.params.$populate) return context; // populate or fastJoin are running - if (skipHookWhen) return context; - - // @ts-expect-error TODO - const q = isFunction(query) ? query(context) : query; - - if (!isObject(q)) { - throwError(`Resolved query is typeof ${typeof q} rather than object. (fgraphql)`, 102); - } - - if (!ourResolvers) { - // @ts-expect-error TODO - ourResolvers = resolvers(context.app, runTime); - } - - if (!ourResolvers[recordType]) { - throwError(`recordType ${recordType} not found in resolvers. (fgraphql)`, 104); - } - - options.inclAllFields = contextParams.provider - ? options.inclAllFieldsClient - : options.inclAllFieldsServer; - - // Build content parameter passed to resolver functions. - const resolverContent: Record = { - app: context.app, - provider: contextParams.provider, - user: contextParams.user, - authenticated: contextParams.authenticated, - batchLoaders: {}, - cache: {}, - }; - - (options.extraAuthProps || []).forEach((name: any) => { - if (name in contextParams && !(name in resolverContent)) { - resolverContent[name] = contextParams[name]; - } - }); - - // Static values used by fgraphql functions. - const store = { - feathersSdl, - ourResolvers, - options, - resolverContent, - }; - - // Populate data. - const recs = getItems(context); - - return processRecords(store, q, recs, recordType).then(() => { - replaceItems(context, recs); - return context; - }); - }; -} - -// Process records recursively. -function processRecords(store: any, query: any, recs: any, type: any, depth = 0): any { - if (!recs) return; // Catch no data to populate. - - recs = isArray(recs) ? recs : [recs]; - - const storeOurResolversType = store.ourResolvers[type]; - if (!isObject(storeOurResolversType)) { - throwError( - `Resolvers for Type ${type} are typeof ${typeof storeOurResolversType} not object. (fgraphql)`, - 201, - ); - } - - if (!isObject(query)) { - throwError(`query at Type ${type} are typeof ${typeof query} not object. (fgraphql)`, 202); - } - - return Promise.all(recs.map((rec: any) => processRecord(store, query, depth, rec, type))); -} - -// Process the a record. -function processRecord(store: any, query: any, depth: any, rec: any, type: any): any { - if (!rec) return; // Catch any null values from resolvers. - - const queryPropNames = Object.keys(query); - const recFieldNamesInQuery: any = []; - const joinedNamesInQuery: any = []; - - // Process every query item. - return Promise.all( - queryPropNames.map(fieldName => - processRecordQuery( - store, - query, - depth, - rec, - fieldName, - type, - recFieldNamesInQuery, - joinedNamesInQuery, - ), - ), - ).then(() => { - // Retain only record fields selected - if ( - recFieldNamesInQuery.length || - !store.options.inclAllFields || - queryPropNames.includes('_none') - ) { - // recs[0] may have been created by [rec] so can't replace array elem - Object.keys(rec).forEach(key => { - if (!recFieldNamesInQuery.includes(key) && !joinedNamesInQuery.includes(key)) { - delete rec[key]; - } - }); - } - - // Include joined names in record. - if (store.options.inclJoinedNames && joinedNamesInQuery.length) { - rec._include = joinedNamesInQuery; - } - }); -} - -// Process one query field for a record. -function processRecordQuery( - store: any, - query: any, - depth: any, - rec: any, - fieldName: any, - type: any, - recFieldNamesInQuery: any, - joinedNamesInQuery: any, -): any { - // One way to include/exclude rec fields is to give their names a falsey value. - // _args and _none are not record field names but special purpose - if (query[fieldName] && fieldName !== '_args' && fieldName !== '_none') { - if (store.ourResolvers[type][fieldName]) { - joinedNamesInQuery.push(fieldName); - return processRecordFieldResolver(store, query, depth, rec, fieldName, type); - } else { - recFieldNamesInQuery.push(fieldName); - } - } -} - -// Process a resolver call. -function processRecordFieldResolver( - store: any, - query: any, - depth: any, - rec: any, - fieldName: any, - type: any, -) { - const ourQuery = store.feathersSdl[type][fieldName]; - const ourResolver = store.ourResolvers[type][fieldName]; - - if (!isFunction(ourResolver)) { - throwError( - `Resolver for Type ${type} fieldName ${fieldName} is typeof ${typeof ourResolver} not function. (fgraphql)`, - 203, - ); - } - - const args = isObject(query[fieldName]) ? query[fieldName]._args : undefined; - - // Call resolver function. - return Promise.resolve(ourResolver(rec, args || {}, store.resolverContent)).then( - async rawResult => { - // Convert rawResult to query requirements. - const result = convertResolverResult(rawResult, ourQuery, fieldName, type); - - rec[fieldName] = result; - - const nextType = ourQuery.typeof; - - // Populate returned records if their query defn has more fields or Types. - // Ignore resolvers returning base values like string. - if (store.ourResolvers[nextType] && isObject(query[fieldName])) { - return processRecords(store, query[fieldName], result, nextType, depth + 1); - } - }, - ); -} - -// Convert result of resolver function to match query field requirements. -function convertResolverResult(result: any, ourQuery: any, fieldName: any, type: any) { - if (result === null || result === undefined) { - return ourQuery.listType ? [] : null; - } - - if (ourQuery.listType) { - if (!isArray(result)) return [result]; - } else if (isArray(result)) { - if (result.length > 1) { - throwError( - `Query listType true. Resolver for Type ${type} fieldName ${fieldName} result is array len ${result.length} (fgraphql)`, - 204, - ); - } - - return result[0]; - } - - return result; -} - -function convertSdlToFeathersSchemaObject(schemaDefinitionLanguage: any, parse: any) { - const graphQLSchemaObj = parse(schemaDefinitionLanguage); - return convertDocument(graphQLSchemaObj); -} - -function convertDocument(ast: any) { - const result: Record = {}; - - if (ast.kind !== 'Document' || !isArray(ast.definitions)) { - throw new Error('Not a valid GraphQL Document.'); - } - - ast.definitions.forEach((definition: any, definitionIndex: any) => { - const [objectName, converted] = convertObjectTypeDefinition(definition, definitionIndex); - - if (objectName) { - result[objectName] = converted; - } - }); - - return result; -} - -function convertObjectTypeDefinition(definition: any, definitionIndex: any) { - const converted: Record = {}; - - if (definition.kind !== 'ObjectTypeDefinition' || !isArray(definition.fields)) { - throw new Error(`Type# ${definitionIndex} is not a valid ObjectTypeDefinition`); - } - - const objectTypeName = convertName(definition.name, `Type# ${definitionIndex}`); - if (graphqlActions.includes(objectTypeName)) return [null, null]; - - definition.fields.forEach((field: any) => { - const [fieldName, fieldDefinition] = convertFieldDefinition(field, `Type ${objectTypeName}`); - converted[fieldName] = fieldDefinition; - }); - - return [objectTypeName, converted]; -} - -function convertName(nameObj: any, errDesc?: any) { - if (!isObject(nameObj) || !isString(nameObj.value)) { - throw new Error(`${errDesc} does not have a valid name prop.`); - } - - return nameObj.value; -} - -function convertFieldDefinition(field: any, errDesc: any) { - if (field.kind !== 'FieldDefinition' || !isObject(field.type)) { - throw new Error(`${errDesc} is not a valid ObjectTypeDefinition`); - } - - const fieldName = convertName(field.name, errDesc); - const converted = convertFieldDefinitionType(field.type, errDesc); - converted.inputValues = field.arguments && field.arguments.length !== 0; - - return [fieldName, converted]; -} - -function convertFieldDefinitionType(fieldDefinitionType: any, errDesc: any, converted?: any): any { - converted = converted || { - nonNullTypeList: false, - listType: false, - nonNullTypeField: false, - typeof: null, - }; - - if (!isObject(fieldDefinitionType)) { - throw new Error(`${errDesc} is not a valid Fielddefinition "type".`); - } - - switch (fieldDefinitionType.kind) { - case 'NamedType': - converted.typeof = convertName(fieldDefinitionType.name); - return converted; - case 'NonNullType': - if (fieldDefinitionType.type.kind === 'NamedType') { - converted.nonNullTypeField = true; - } else { - converted.nonNullTypeList = true; - } - - return convertFieldDefinitionType(fieldDefinitionType.type, errDesc, converted); - case 'ListType': - converted.listType = true; - return convertFieldDefinitionType(fieldDefinitionType.type, errDesc, converted); - } -} - -function throwError(msg: any, code: any) { - const err = new Error(msg); - // @ts-expect-error code does not exist on Error - err.code = code; - throw err; -} - -function isObject(obj: any) { - return typeof obj === 'object' && obj !== null; -} - -function isString(str: any) { - return typeof str === 'string'; -} - -function isFunction(func: any) { - return typeof func === 'function'; -} - -function isArray(array: any) { - return Array.isArray(array); -} diff --git a/src/hooks/keep-in-array/keep-in-array.test.ts b/src/hooks/keep-in-array/keep-in-array.test.ts deleted file mode 100755 index 9af7f563..00000000 --- a/src/hooks/keep-in-array/keep-in-array.test.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { assert } from 'vitest'; - -import { keepInArray } from './keep-in-array'; - -let hookBefore: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; -let hookFindNested: any; - -describe('services keepInArray', () => { - describe('removes fields', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: 'John', last: 'Doe' }] }, - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { users: [{ first: 'Jane', last: 'Doe' }] }, - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { users: [{ first: 'John', last: 'Doe' }] }, - { users: [{ first: 'Jane', last: 'Doe' }] }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { users: [{ first: 'John', last: 'Doe' }] }, - { users: [{ first: 'Jane', last: 'Doe' }] }, - ], - }; - }); - - it('updates hook before::create', () => { - keepInArray('users', ['last'])(hookBefore); - assert.deepEqual(hookBefore.data, { users: [{ last: 'Doe' }] }); - }); - - it('ignores bad or missing field', () => { - keepInArray('xx', ['last'])(hookBefore); - assert.deepEqual(hookBefore.data, { users: [{ first: 'John', last: 'Doe' }] }); - }); - - it('updates hook after::find with pagination', () => { - keepInArray('users', ['first'])(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [ - { users: [{ first: 'John' }] }, - { users: [{ first: 'Jane' }] }, - ]); - }); - - it('updates hook after::find with no pagination', () => { - keepInArray('users', ['first'])(hookFind); - assert.deepEqual(hookFind.result, [ - { users: [{ first: 'John' }] }, - { users: [{ first: 'Jane' }] }, - ]); - }); - - it('updates hook after', () => { - keepInArray('users', ['first'])(hookAfter); - assert.deepEqual(hookAfter.result, { users: [{ first: 'Jane' }] }); - }); - - it('updates when called internally on server', () => { - hookAfter.params.provider = ''; - keepInArray('users', ['first'])(hookAfter); - assert.deepEqual(hookAfter.result, { users: [{ first: 'Jane' }] }); - }); - - it('does not throw if field is missing', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: 'John', last: 'Doe' }] }, - }; - keepInArray('users', ['last', 'xx'])(hook); - assert.deepEqual(hook.data, { users: [{ last: 'Doe' }] }); - }); - - it('keeps undefined values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: undefined, last: 'Doe' }] }, - }; - keepInArray('users', ['first'])(hook); - assert.deepEqual(hook.data, { users: [{ first: undefined }] }); - }); - - it('keeps null values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: null, last: 'Doe' }] }, - }; - keepInArray('users', ['first'])(hook); - assert.deepEqual(hook.data, { users: [{ first: null }] }); - }); - - it('keeps false values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: false, last: 'Doe' }] }, - }; - keepInArray('users', ['first'])(hook); - assert.deepEqual(hook.data, { users: [{ first: false }] }); - }); - - it('keeps 0 values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: 0, last: 'Doe' }] }, - }; - keepInArray('users', ['first'])(hook); - assert.deepEqual(hook.data, { users: [{ first: 0 }] }); - }); - - it('keeps empty string values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { users: [{ first: '', last: 'Doe' }] }, - }; - keepInArray('users', ['first'])(hook); - assert.deepEqual(hook.data, { users: [{ first: '' }] }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { - users: [{ empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }], - }, - }; - hookFindNested = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { account: { users: [{ first: 'John', last: 'Doe' }] } }, - { account: { users: [{ first: 'Jane', last: 'Doe' }] } }, - ], - }; - }); - - it('updates hook after::find with dot notation field ', () => { - keepInArray('account.users', ['first'])(hookFindNested); - assert.deepEqual(hookFindNested.result, [ - { account: { users: [{ first: 'John' }] } }, - { account: { users: [{ first: 'Jane' }] } }, - ]); - }); - - it('prop with no dots', () => { - keepInArray('users', ['empl'])(hookBefore); - assert.deepEqual(hookBefore.data, { - users: [{ empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }], - }); - }); - - it('prop with 1 dot', () => { - keepInArray('users', ['empl.name', 'dept'])(hookBefore); - assert.deepEqual(hookBefore.data, { - users: [{ empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' }], - }); - }); - - it('prop with 2 dots', () => { - keepInArray('users', ['empl.name.last', 'empl.status', 'dept'])(hookBefore); - assert.deepEqual(hookBefore.data, { - users: [{ empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' }], - }); - }); - - it('ignores bad or missing paths', () => { - keepInArray('users', ['empl.name.first', 'empl.name.surname'])(hookBefore); - assert.deepEqual(hookBefore.data, { users: [{ empl: { name: { first: 'John' } } }] }); - }); - - it('ignores bad or missing no dot path', () => { - keepInArray('users', ['xx'])(hookBefore); - assert.deepEqual(hookBefore.data, { users: [{}] }); - }); - }); - - describe('ignore non-object records', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { - users: [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - null, - undefined, - Infinity, - ], - }, - null, - undefined, - Infinity, - ], - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: [ - { users: [{ first: 'Jane', last: 'Doe' }, null, undefined, Infinity] }, - null, - undefined, - Infinity, - ], - }; - }); - - it('before', () => { - keepInArray('users', ['empl'])(hookBefore); - assert.deepEqual(hookBefore.data, [ - { - users: [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, - null, - undefined, - Infinity, - ], - }, - null, - undefined, - Infinity, - ]); - }); - - it('after', () => { - keepInArray('users', ['first'])(hookAfter); - assert.deepEqual(hookAfter.result, [ - { users: [{ first: 'Jane' }, null, undefined, Infinity] }, - null, - undefined, - Infinity, - ]); - }); - }); -}); diff --git a/src/hooks/keep-in-array/keep-in-array.ts b/src/hooks/keep-in-array/keep-in-array.ts deleted file mode 100755 index b2ce3179..00000000 --- a/src/hooks/keep-in-array/keep-in-array.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import _has from 'lodash/has.js'; -import { getItems } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; - -/** - * Keep certain fields in a nested array inside the record(s), deleting the rest. - * @see https://hooks-common.feathersjs.com/hooks.html#keepinarray - */ -export function keepInArray( - arrayName: string, - fieldNames: string[], -) { - return (context: H) => { - const items = getItems(context); - - if (Array.isArray(items)) { - items.forEach(item => replaceIn(item, arrayName, fieldNames)); - } else { - replaceIn(items, arrayName, fieldNames); - } - - return context; - }; -} - -function replaceIn(item: any, field: any, fieldNames: any) { - const target = _get(item, field); - if (target) { - if (!Array.isArray(target)) - throw new BadRequest( - `The 'field' param must lead to array. found type '${typeof target}' instead`, - ); - - _set( - item, - field, - target.map(item => replaceItem(item, fieldNames)), - ); - } -} - -function replaceItem(item: any, fields: any) { - if (typeof item !== 'object' || item === null) return item; - - const newItem = {}; - fields.forEach((field: any) => { - if (!_has(item, field)) return; - - const value = _get(item, field); - _set(newItem, field, value); - }); - item = newItem; - return item; -} diff --git a/src/hooks/keep-query-in-array/keep-query-in-array.test.ts b/src/hooks/keep-query-in-array/keep-query-in-array.test.ts deleted file mode 100755 index 0d690693..00000000 --- a/src/hooks/keep-query-in-array/keep-query-in-array.test.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { assert } from 'vitest'; -import { keepQueryInArray } from './keep-query-in-array'; - -let hookBefore: any; -let hookFindNested: any; - -describe('services keepQueryInArray', () => { - describe('removes fields', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: 'John', last: 'Doe' }] }, - }; - }); - - it('updates hook before::find', () => { - keepQueryInArray('users', ['last'])(hookBefore); - assert.deepEqual(hookBefore.query, { users: [{ last: 'Doe' }] }); - }); - - it('ignores bad or missing field', () => { - keepQueryInArray('xx', ['last'])(hookBefore); - assert.deepEqual(hookBefore.query, { users: [{ first: 'John', last: 'Doe' }] }); - }); - - it('does not throw if field is missing', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: 'John', last: 'Doe' }] }, - }; - keepQueryInArray('users', ['last', 'xx'])(hook); - assert.deepEqual(hook.query, { users: [{ last: 'Doe' }] }); - }); - - it('keeps undefined values', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: undefined, last: 'Doe' }] }, - }; - keepQueryInArray('users', ['first'])(hook); - assert.deepEqual(hook.query, { users: [{ first: undefined }] }); - }); - - it('keeps null values', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: null, last: 'Doe' }] }, - }; - keepQueryInArray('users', ['first'])(hook); - assert.deepEqual(hook.query, { users: [{ first: null }] }); - }); - - it('keeps false values', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: false, last: 'Doe' }] }, - }; - keepQueryInArray('users', ['first'])(hook); - assert.deepEqual(hook.query, { users: [{ first: false }] }); - }); - - it('keeps 0 values', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: 0, last: 'Doe' }] }, - }; - keepQueryInArray('users', ['first'])(hook); - assert.deepEqual(hook.query, { users: [{ first: 0 }] }); - }); - - it('keeps empty string values', () => { - const hook: any = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { users: [{ first: '', last: 'Doe' }] }, - }; - keepQueryInArray('users', ['first'])(hook); - assert.deepEqual(hook.query, { users: [{ first: '' }] }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { - users: [{ empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }], - }, - }; - hookFindNested = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { account: { users: [{ first: 'John', last: 'Doe' }] } }, - }; - }); - - it('updates hook find with dot notation field ', () => { - keepQueryInArray('account.users', ['first'])(hookFindNested); - assert.deepEqual(hookFindNested.query, { account: { users: [{ first: 'John' }] } }); - }); - - it('prop with no dots', () => { - keepQueryInArray('users', ['empl'])(hookBefore); - assert.deepEqual(hookBefore.query, { - users: [{ empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }], - }); - }); - - it('prop with 1 dot', () => { - keepQueryInArray('users', ['empl.name', 'dept'])(hookBefore); - assert.deepEqual(hookBefore.query, { - users: [{ empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' }], - }); - }); - - it('prop with 2 dots', () => { - keepQueryInArray('users', ['empl.name.last', 'empl.status', 'dept'])(hookBefore); - assert.deepEqual(hookBefore.query, { - users: [{ empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' }], - }); - }); - - it('ignores bad or missing paths', () => { - keepQueryInArray('users', ['empl.name.first', 'empl.name.surname'])(hookBefore); - assert.deepEqual(hookBefore.query, { users: [{ empl: { name: { first: 'John' } } }] }); - }); - - it('ignores bad or missing no dot path', () => { - keepQueryInArray('users', ['xx'])(hookBefore); - assert.deepEqual(hookBefore.query, { users: [{}] }); - }); - }); - - describe('removes non-object records', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'find', - params: { provider: 'rest' }, - query: { - users: [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - null, - undefined, - Infinity, - ], - }, - }; - }); - - it('before', () => { - keepQueryInArray('users', ['empl'])(hookBefore); - assert.deepEqual(hookBefore.query, { - users: [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, - null, - undefined, - Infinity, - ], - }); - }); - }); -}); diff --git a/src/hooks/keep-query-in-array/keep-query-in-array.ts b/src/hooks/keep-query-in-array/keep-query-in-array.ts deleted file mode 100644 index 704cae39..00000000 --- a/src/hooks/keep-query-in-array/keep-query-in-array.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { checkContext } from '../../utils'; -import { BadRequest } from '@feathersjs/errors'; -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import _has from 'lodash/has.js'; -import type { HookContext } from '@feathersjs/feathers'; - -/** - * Keep certain fields in a nested array inside the query object, deleting the rest. - * @see https://hooks-common.feathersjs.com/hooks.html#keepqueryinarray - */ -export function keepQueryInArray( - arrayName: string, - fieldNames: string[], -) { - return (context: H) => { - checkContext(context, 'before', null, 'keepQueryInArray'); - - replaceIn(context.query, arrayName, fieldNames); - - return context; - }; -} - -function replaceIn(item: any, field: any, fieldNames: any) { - const target = _get(item, field); - if (target) { - if (!Array.isArray(target)) - throw new BadRequest( - `The 'field' param must lead to array. found type '${typeof target}' instead`, - ); - - _set( - item, - field, - target.map(item => replaceItem(item, fieldNames)), - ); - } -} - -function replaceItem(item: any, fields: any) { - if (typeof item !== 'object' || item === null) return item; - - const newItem = {}; - fields.forEach((field: any) => { - if (!_has(item, field)) return; - - const value = _get(item, field); - _set(newItem, field, value); - }); - item = newItem; - return item; -} diff --git a/src/hooks/lowercase/lowercase-data.ts b/src/hooks/lowercase/lowercase-data.ts index cd75d0a3..6bc545a4 100755 --- a/src/hooks/lowercase/lowercase-data.ts +++ b/src/hooks/lowercase/lowercase-data.ts @@ -2,15 +2,17 @@ import _get from 'lodash/get.js'; import _set from 'lodash/set.js'; import { BadRequest } from '@feathersjs/errors'; import { alterData } from '../alter-items/alter-data'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Convert certain field values to lower case. * @see https://hooks-common.feathersjs.com/hooks.html#lowercase */ -export const lowercaseData = (...fieldNames: string[]) => - alterData(item => { - for (let i = 0; i < fieldNames.length; i++) { - const fieldName = fieldNames[i]; +export const lowercaseData = (fieldNames: MaybeArray) => { + const fieldNamesArr = toArray(fieldNames); + return alterData(item => { + for (let i = 0; i < fieldNamesArr.length; i++) { + const fieldName = fieldNamesArr[i]; const value = _get(item, fieldName); if (value == null) { @@ -24,3 +26,4 @@ export const lowercaseData = (...fieldNames: string[]) => _set(item, fieldName, value.toLowerCase()); } }); +}; diff --git a/src/hooks/lowercase/lowercase.test.ts b/src/hooks/lowercase/lowercase.test.ts deleted file mode 100755 index 692b269d..00000000 --- a/src/hooks/lowercase/lowercase.test.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { assert } from 'vitest'; -import { lowerCase } from './lowercase'; - -let hookBefore: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; - -describe('lowercase', () => { - describe('updates data', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('updates hook before::create', () => { - lowerCase('first', 'last')(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'john', last: 'doe' }); - }); - - it('updates hook after::find with pagination', () => { - lowerCase('first', 'last')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [ - { first: 'john', last: 'doe' }, - { first: 'jane', last: 'doe' }, - ]); - }); - - it('updates hook after::find with no pagination', () => { - lowerCase('first', 'last')(hookFind); - assert.deepEqual(hookFind.result, [ - { first: 'john', last: 'doe' }, - { first: 'jane', last: 'doe' }, - ]); - }); - - it('updates hook after', () => { - lowerCase('first', 'last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'jane', last: 'doe' }); - }); - - it('does not throw if field is missing', () => { - const hook: any = { type: 'before', method: 'create', data: { last: 'Doe' } }; - lowerCase('first', 'last')(hook); - assert.deepEqual(hook.data, { last: 'doe' }); - }); - - it('does not throw if field is undefined', () => { - const hook: any = { - type: 'before', - method: 'create', - data: { first: undefined, last: 'Doe' }, - }; - lowerCase('first', 'last')(hook); - assert.deepEqual(hook.data, { first: undefined, last: 'doe' }); - }); - - it('does not throw if field is null', () => { - const hook: any = { type: 'before', method: 'create', data: { first: null, last: 'Doe' } }; - lowerCase('first', 'last')(hook); - assert.deepEqual(hook.data, { first: null, last: 'doe' }); - }); - - it('throws if field is not a string', () => { - const hook: any = { type: 'before', method: 'create', data: { first: 1, last: 'Doe' } }; - assert.throws(() => { - lowerCase('first', 'last')(hook); - }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); - - it('prop with no dots', () => { - lowerCase('dept')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'acct', - }); - }); - - it('prop with 1 dot', () => { - lowerCase('empl.status')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'aa' }, - dept: 'Acct', - }); - }); - - it('prop with 2 dots', () => { - lowerCase('empl.name.first')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'john', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('ignores bad or missing paths', () => { - lowerCase('empl.xx.first')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('ignores bad or missing no dot path', () => { - lowerCase('xx')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - }); -}); diff --git a/src/hooks/lowercase/lowercase.ts b/src/hooks/lowercase/lowercase.ts deleted file mode 100755 index 8b37bba9..00000000 --- a/src/hooks/lowercase/lowercase.ts +++ /dev/null @@ -1,35 +0,0 @@ -import _set from 'lodash/set.js'; -import { BadRequest } from '@feathersjs/errors'; - -import { transformItems } from '../../common'; -import { checkContextIf, getItems } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; - -/** - * Convert certain field values to lower case. - * @see https://hooks-common.feathersjs.com/hooks.html#lowercase - * - * @deprecated Use `lowercaseData` or `lowercaseResult` instead. - */ -export function lowercase(...fieldNames: string[]) { - return (context: H) => { - checkContextIf(context, 'before', ['create', 'update', 'patch'], 'lowercase'); - - transformItems(getItems(context), fieldNames, (item: any, fieldName: any, value: any) => { - if (value !== undefined) { - if (typeof value !== 'string' && value !== null) { - throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); - } - - _set(item, fieldName, value ? value.toLowerCase() : value); - } - }); - - return context; - }; -} - -export { - // backwards compatible - lowercase as lowerCase, -}; diff --git a/src/hooks/mongo-keys/mongo-keys.test.ts b/src/hooks/mongo-keys/mongo-keys.test.ts deleted file mode 100755 index b288b1fa..00000000 --- a/src/hooks/mongo-keys/mongo-keys.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { assert } from 'vitest'; -import { ObjectId } from 'mongodb'; -import { mongoKeys } from './mongo-keys'; - -const s0 = '000000000000'; -const s1 = '111111111111'; -const s2 = '222222222222'; -const s5 = '555555555555'; -const s8 = '888888888888'; - -describe('services mongoKeys', () => { - it('{ a: s1, c: s0 }', () => { - const newQuery = wrapper(['a'], { a: s1, c: s0 }); - - assert.instanceOf(newQuery.a, ObjectId, '"a" not ObjectID'); - assert.isString(newQuery.c, '"c" not a string'); - }); - - it('{ a: { b: s0 }, c: s0 }', () => { - const newQuery = wrapper(['a'], { a: { b: s0 }, c: s0 }); - - assert.isString(newQuery.a.b, '"a.b" not a string'); - assert.isString(newQuery.c, '"c" not a string'); - }); - - it('{ a: { $in: [s1, s2] }, c: s0 }', () => { - const newQuery = wrapper(['a'], { a: { $in: [s1, s2] }, c: s0 }); - - assert.instanceOf(newQuery.a.$in[0], ObjectId, '"a.$in[0]" not ObjectID'); - assert.instanceOf(newQuery.a.$in[1], ObjectId, '"a.$in[1]" not ObjectID'); - assert.isString(newQuery.c, '"c" not a string'); - }); - - it("{ a: s1, b: '111111111111', c: s0 }", () => { - const newQuery = wrapper(['a', 'b'], { a: s1, b: s2, c: s0 }); - - assert.instanceOf(newQuery.a, ObjectId, '"a" not ObjectID'); - assert.instanceOf(newQuery.b, ObjectId, '"b" not ObjectID'); - assert.isString(newQuery.c, '"c" not a string'); - }); - - it('{ a: { x: s8 } }', () => { - const newQuery = wrapper(['a.x'], { a: { x: s8 } }); - - assert.instanceOf(newQuery.a.x, ObjectId, '"a.x" not ObjectID'); - }); - - it('{ $or: [{ a: { x: s8 } }, { b: s5 }, { c: s0 }], d: s0 }', () => { - const newQuery = wrapper(['a.x', 'b'], { - $or: [{ a: { x: s8 } }, { b: s5 }, { c: s0 }], - d: s0, - }); - - assert.instanceOf(newQuery.$or[0].a.x, ObjectId, '"$or[0].a.x" not ObjectID'); - assert.instanceOf(newQuery.$or[1].b, ObjectId, '"$or[1].b" not ObjectID'); - assert.isString(newQuery.$or[2].c, '"$or[2].c" not a string'); - assert.isString(newQuery.d, '"d" not a string'); - }); - - it('{ $or: [{ a: { x: s8 } }, { a: s5 }] } - questionable', () => { - const newQuery = wrapper(['a', 'a.x'], { $or: [{ a: { x: s8 } }, { a: s5 }] }); - - assert.instanceOf(newQuery.$or[0].a.x, ObjectId, '"$or[0].a.x" not ObjectID'); - assert.instanceOf(newQuery.$or[1].a, ObjectId, '"$or[1].a" not ObjectID'); - }); -}); - -function wrapper(keys: any, query: any) { - const newContext: any = mongoKeys( - ObjectId, - keys, - )({ params: { query }, type: 'before', method: 'find' } as any); - return newContext.params.query; -} diff --git a/src/hooks/mongo-keys/mongo-keys.ts b/src/hooks/mongo-keys/mongo-keys.ts deleted file mode 100755 index 30eba299..00000000 --- a/src/hooks/mongo-keys/mongo-keys.ts +++ /dev/null @@ -1,67 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import traverse from 'neotraverse/legacy'; -import { checkContext } from '../../utils'; - -/** - * Wrap MongoDB foreign keys in ObjectId. - * - * @see https://hooks-common.feathersjs.com/hooks.html#mongokeys - */ -export function mongoKeys( - ObjectId: new (id?: string | number) => any, - keyFields: string | string[], -) { - keyFields = Array.isArray(keyFields) ? keyFields : [keyFields]; - const keyLeaves: any = []; - - const keysInfo = keyFields.map((field: any) => { - const fieldNames = field.split('.'); - const leaf = fieldNames.slice(-1)[0]; - keyLeaves.push(leaf); - - return { leaf, len: fieldNames.length, path: JSON.stringify(fieldNames) }; - }); - - return (context: H) => { - checkContext(context, 'before', null, 'mongoKeys'); - const query = context.params.query || {}; - - traverse(query).forEach(function (node: any) { - const typeofNode = typeof node; - const key = this.key; - const path = this.path; - - if (keyLeaves.indexOf(key) === -1) return; - if (path.indexOf('$sort') !== -1) return; - - keysInfo.forEach((info: any) => { - if (info.leaf === key && info.len <= path.length) { - const endPath = path.slice(-info.len); - if (JSON.stringify(endPath) === info.path) { - if (typeofNode === 'object' && node !== null && !Array.isArray(node)) { - // { keyPath: { ... } } - const actualProps = Object.keys(node); - const onlyProp = actualProps[0]; - - if (actualProps.length === 1 && onlyProp === '$in') { - // { keyPath: { $in: [...] } } - const newNode = { $in: wrapValue(node[onlyProp]) }; - this.update(newNode); - } - } else if (typeofNode === 'string' || typeofNode === 'number') { - // { keyPath: '111111111111' } - const newNode = wrapValue(node); - this.update(newNode); - } - } - } - }); - }); - - return context; - }; - - function wrapValue(value: any) { - return Array.isArray(value) ? value.map(val => new ObjectId(val)) : new ObjectId(value); - } -} diff --git a/src/hooks/omit-query/omit-query.ts b/src/hooks/omit-query/omit-query.ts index f5c90cc7..00b70d3a 100755 --- a/src/hooks/omit-query/omit-query.ts +++ b/src/hooks/omit-query/omit-query.ts @@ -1,20 +1,19 @@ import type { HookContext } from '@feathersjs/feathers'; import _omit from 'lodash/omit.js'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Delete certain fields from the query object. * @see https://hooks-common.feathersjs.com/hooks.html#discardquery */ export const omitQuery = - (...fieldNames: string[]) => + (fieldNames: MaybeArray) => (context: H) => { if (!context.params.query) { return context; } - context.params.query = _omit(context.params.query, fieldNames); + context.params.query = _omit(context.params.query, toArray(fieldNames)); return context; }; - -export { omitQuery as discardQuery }; diff --git a/src/hooks/omit/omit-1.test.ts b/src/hooks/omit/omit-1.test.ts deleted file mode 100755 index afe2cb75..00000000 --- a/src/hooks/omit/omit-1.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { assert } from 'vitest'; -import { omit } from './omit'; - -describe('omit', () => { - describe('removes fields', () => { - const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); - const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }); - const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }); - const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); - const afterBoth = (): any => ({ - type: 'after', - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }); - const afterPage = (): any => ({ - type: 'after', - result: { - total: 2, - skip: 0, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }); - - const decisionTable = [ - ['before::create', beforeJohn(), 'create', null, ['first'], { last: 'Doe' }], - [ - 'after::find with paginate', - afterPage(), - 'find', - null, - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find no paginate', - afterBoth(), - 'find', - null, - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - ['after', afterJane(), 'create', null, ['last'], { first: 'Jane' }], - ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], - ['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' }], - ['not throw field undefined', beforeUndef(), 'create', 'rest', ['first'], { last: 'Doe' }], - ['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' }], - ]; - - decisionTable.forEach(([desc, context, method, provider, args, result]) => { - it(desc, () => { - context.method = method; - if (provider !== null) { - context.params = context.params || {}; - context.params.provider = provider; - } - - omit(...args)(context); - assert.deepEqual( - context.data ? context.data : context.result.data || context.result, - result, - ); - }); - }); - }); - - describe('handles dot notation', () => { - const ctx = (): any => ({ - type: 'before', - method: 'create', - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }); - const ctx2 = (): any => ({ - type: 'after', - method: 'get', - result: { property: null, foo: 'bar' }, - }); - - const decisionTable = [ - // desc, context, args, result - [ - 'handles dots', - ctx(), - ['dept'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, - ], - [ - 'handle 1 dot', - ctx(), - ['empl.status'], - { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' }, - ], - [ - 'handle 2 dot', - ctx(), - ['empl.name.first'], - { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - 'missing path', - ctx(), - ['empl.xx.first'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - 'missing no dot', - ctx(), - ['xx'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - '2 fields', - ctx(), - ['empl.status', 'dept'], - { empl: { name: { first: 'John', last: 'Doe' } } }, - ], - ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], - ]; - - decisionTable.forEach(([desc, context, args, result]) => { - it(desc, () => { - omit(...args)(context); - assert.deepEqual( - context.data ? context.data : context.result.data || context.result, - result, - ); - }); - }); - }); -}); diff --git a/src/hooks/omit/omit-2.test.ts b/src/hooks/omit/omit-2.test.ts deleted file mode 100755 index db1d9285..00000000 --- a/src/hooks/omit/omit-2.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { assert } from 'vitest'; -import { omit } from './omit'; - -describe('omit', () => { - describe('removes fields', () => { - const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); - const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }); - const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); - const afterBoth = (): any => ({ - type: 'after', - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }); - const afterPage = (): any => ({ - type: 'after', - result: { - total: 2, - skip: 0, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }); - - const decisionTable = [ - // desc, context, method, provider, args, result - ['before::create', beforeJohn(), 'create', undefined, ['first'], { last: 'Doe' }], - ['before::create', beforeJohn(), 'create', 'rest', ['first'], { last: 'Doe' }], - ['before::create', beforeJohn(), 'create', 'socketio', ['first'], { last: 'Doe' }], - [ - 'after::find with paginate', - afterPage(), - 'find', - undefined, - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find with paginate', - afterPage(), - 'find', - 'rest', - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find with paginate', - afterPage(), - 'find', - 'socketio', - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find no paginate', - afterBoth(), - 'find', - undefined, - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find no paginate', - afterBoth(), - 'find', - 'rest', - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - [ - 'after::find no paginate', - afterBoth(), - 'find', - 'socketio', - ['last'], - [{ first: 'John' }, { first: 'Jane' }], - ], - ['after', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], - ['after', afterJane(), 'create', 'rest', ['last'], { first: 'Jane' }], - ['after', afterJane(), 'create', 'socketio', ['last'], { first: 'Jane' }], - ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], - [ - 'not throw field missing', - beforeJohn(), - 'create', - undefined, - ['first', 'xx'], - { last: 'Doe' }, - ], - ['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' }], - [ - 'not throw field missing', - beforeJohn(), - 'create', - 'socketio', - ['first', 'xx'], - { last: 'Doe' }, - ], - ['not throw field null', beforeNull(), 'create', undefined, ['first'], { last: 'Doe' }], - ['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' }], - ['not throw field null', beforeNull(), 'create', 'socketio', ['first'], { last: 'Doe' }], - ]; - - decisionTable.forEach(([desc, context, method, provider, args, result]) => { - it(desc, () => { - context.method = method; - if (provider !== null) { - context.params = context.params || {}; - context.params.provider = provider; - } - - omit(...args)(context); - assert.deepEqual( - context.data ? context.data : context.result.data || context.result, - result, - ); - }); - }); - }); - - describe('handles dot notation', () => { - const ctx = (): any => ({ - type: 'before', - method: 'create', - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }); - const ctx2 = (): any => ({ - type: 'after', - method: 'get', - result: { property: null, foo: 'bar' }, - }); - - const decisionTable = [ - // desc, context, args, result - [ - 'handles dots', - ctx(), - ['dept'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, - ], - [ - 'handle 1 dot', - ctx(), - ['empl.status'], - { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct' }, - ], - [ - 'handle 2 dot', - ctx(), - ['empl.name.first'], - { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - 'missing path', - ctx(), - ['empl.xx.first'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - 'missing no dot', - ctx(), - ['xx'], - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ], - [ - '2 fields', - ctx(), - ['empl.status', 'dept'], - { empl: { name: { first: 'John', last: 'Doe' } } }, - ], - ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], - ]; - - decisionTable.forEach(([desc, context, args, result]) => { - it(desc, () => { - omit(...args)(context); - assert.deepEqual( - context.data ? context.data : context.result.data || context.result, - result, - ); - }); - }); - }); -}); diff --git a/src/hooks/omit/omit-data.ts b/src/hooks/omit/omit-data.ts index ab21790b..cdcf5e40 100755 --- a/src/hooks/omit/omit-data.ts +++ b/src/hooks/omit/omit-data.ts @@ -1,12 +1,10 @@ import _omit from 'lodash/omit.js'; import { alterData } from '../alter-items/alter-data'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Delete certain fields from the record(s). * @see https://hooks-common.feathersjs.com/hooks.html#discard */ -export const omitData = (...fieldNames: string[]) => - alterData((item: any) => _omit(item, fieldNames)); - -// alias -export { omitData as discardData }; +export const omitData = (fieldNames: MaybeArray) => + alterData((item: any) => _omit(item, toArray(fieldNames))); diff --git a/src/hooks/omit/omit-result.ts b/src/hooks/omit/omit-result.ts index f3e4cfe2..262ef378 100755 --- a/src/hooks/omit/omit-result.ts +++ b/src/hooks/omit/omit-result.ts @@ -1,6 +1,6 @@ import _omit from 'lodash/omit.js'; import { alterResult } from '../alter-items/alter-result'; -import { MaybeArray } from '../../internal.utils'; +import { MaybeArray, toArray } from '../../internal.utils'; import { DispatchOption } from '../../types'; export type OmitResultOptions = { @@ -12,7 +12,4 @@ export type OmitResultOptions = { * @see https://hooks-common.feathersjs.com/hooks.html#discard */ export const omitResult = (fieldNames: MaybeArray, options?: OmitResultOptions) => - alterResult((item: any) => _omit(item, fieldNames), { dispatch: options?.dispatch }); - -// alias -export { omitResult as discardResult }; + alterResult((item: any) => _omit(item, toArray(fieldNames)), { dispatch: options?.dispatch }); diff --git a/src/hooks/omit/omit.test.ts b/src/hooks/omit/omit.test.ts deleted file mode 100755 index e134ca54..00000000 --- a/src/hooks/omit/omit.test.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { assert } from 'vitest'; -import { omit } from './omit'; - -let hookBefore: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; - -describe('omit', () => { - describe('removes fields', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane', last: 'Doe' }, - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('updates hook before::create', () => { - omit('first')(hookBefore); - assert.deepEqual(hookBefore.data, { last: 'Doe' }); - }); - - it('updates hook after::find with pagination', () => { - omit('last')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after::find with no pagination', () => { - omit('last')(hookFind); - assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after', () => { - omit('last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - - it('updates when called internally on server', () => { - hookAfter.params.provider = ''; - omit('last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - - it('does not throw if field is missing', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - omit('first', 'xx')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); - - it('does not throw if field is null', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: null, last: 'Doe' }, - }; - omit('first')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); - - it('prop with no dots', () => { - omit('dept')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); - - it('prop with 1 dot', () => { - omit('empl.status')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' } }, - dept: 'Acct', - }); - }); - - it('prop with 2 dots', () => { - omit('empl.name.first')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('ignores bad or missing paths', () => { - omit('empl.xx.first')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('ignores bad or missing no dot path', () => { - omit('xx')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('discards multiple fields', () => { - const hook: any = { - type: 'after', - method: 'get', - result: { - roles: ['super'], - _id: 'a', - email: 'foo', - password: 'bar', - name: 'Rafael', - id: 'b', - }, - query: {}, - }; - - omit('email', 'password')(hook); - - assert.deepEqual(hook.result, { - roles: ['super'], - _id: 'a', - // email: 'foo', - // password: 'bar', - name: 'Rafael', - id: 'b', - } as any); - }); - - it('null prop', () => { - const hook: any = { - type: 'after', - method: 'get', - result: { - property: null, - other: 'bar', - }, - query: {}, - }; - - omit('property.secret')(hook); - - assert.deepEqual(hook.result, { - property: null, - other: 'bar', - }); - }); - }); -}); diff --git a/src/hooks/omit/omit.ts b/src/hooks/omit/omit.ts deleted file mode 100755 index 33d1e59f..00000000 --- a/src/hooks/omit/omit.ts +++ /dev/null @@ -1,27 +0,0 @@ -import _omit from 'lodash/omit.js'; -import { getItems, replaceItems, checkContextIf } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; -import { replaceData } from '../../utils/replace-items/replace-data'; - -/** - * Delete certain fields from the record(s). - * @see https://hooks-common.feathersjs.com/hooks.html#discard - * - * @deprecated Use the explicit 'omitData' or 'omitResult' hooks instead. - */ -export function omit(...fieldNames: string[]) { - return (context: H) => { - checkContextIf(context, 'before', ['create', 'update', 'patch'], 'discard'); - - const items = getItems(context); - const convert = (item: any) => _omit(item, fieldNames); - const converted = Array.isArray(items) ? items.map(convert) : convert(items); - - replaceItems(context, converted); - - return replaceData(context, (item: any) => _omit(item, fieldNames)); - }; -} - -// alias -export { omit as discard }; diff --git a/src/hooks/params-for-server2/params-for-server2.test.ts b/src/hooks/params-for-server/params-for-server.test.ts similarity index 81% rename from src/hooks/params-for-server2/params-for-server2.test.ts rename to src/hooks/params-for-server/params-for-server.test.ts index c940d926..47af45eb 100644 --- a/src/hooks/params-for-server2/params-for-server2.test.ts +++ b/src/hooks/params-for-server/params-for-server.test.ts @@ -1,10 +1,10 @@ import { HookContext } from '@feathersjs/feathers'; -import { paramsForServer2 } from './params-for-server2'; +import { paramsForServer } from './params-for-server'; -describe('paramsForServer2', () => { +describe('paramsForServer', () => { it('should move params to query._$client', () => { expect( - paramsForServer2(['a', 'b'])({ + paramsForServer(['a', 'b'])({ params: { a: 1, b: 2, @@ -25,7 +25,7 @@ describe('paramsForServer2', () => { it('should move params to query._$client and leave remaining', () => { expect( - paramsForServer2('a')({ + paramsForServer('a')({ params: { a: 1, b: 2, diff --git a/src/hooks/params-for-server2/params-for-server2.ts b/src/hooks/params-for-server/params-for-server.ts similarity index 92% rename from src/hooks/params-for-server2/params-for-server2.ts rename to src/hooks/params-for-server/params-for-server.ts index f46ad15d..5537fe4e 100644 --- a/src/hooks/params-for-server2/params-for-server2.ts +++ b/src/hooks/params-for-server/params-for-server.ts @@ -3,7 +3,7 @@ import { MaybeArray, toArray } from '../../internal.utils'; export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const; -export type ParamsForServer2Options = { +export type ParamsForServerOptions = { /** * @default '_$client' */ @@ -16,9 +16,9 @@ export type ParamsForServer2Options = { * So, to use `$populateParams` on the server, we need to move the params to query._$client * the server will move them back to params */ -export const paramsForServer2 = ( +export const paramsForServer = ( whitelist: MaybeArray, - options?: ParamsForServer2Options, + options?: ParamsForServerOptions, ) => { const whitelistArr = toArray(whitelist); diff --git a/src/hooks/params-from-client/params-from-client.test.ts b/src/hooks/params-from-client/params-from-client.test.ts old mode 100755 new mode 100644 index b0272903..9b2d0af9 --- a/src/hooks/params-from-client/params-from-client.test.ts +++ b/src/hooks/params-from-client/params-from-client.test.ts @@ -1,187 +1,54 @@ -import { assert } from 'vitest'; +import { HookContext } from '@feathersjs/feathers'; import { paramsFromClient } from './params-from-client'; -describe('services params-from-client', () => { - describe('basics', () => { - it('works no params', () => { - const hook: any = {}; - const hook1 = paramsFromClient('populate', 'serialize')(hook); - - assert.deepEqual(hook1, {} as any); - }); - - it('works no query', () => { - const hook: any = { params: {} }; - const hook1 = paramsFromClient('populate', 'serialize')(hook); - - assert.deepEqual(hook1, { params: {} } as any); - }); - - it('works no $client', () => { - const hook: any = { +describe('paramsFromClient', () => { + it('should move params to query._$client', () => { + expect( + paramsFromClient(['a', 'b'])({ params: { query: { - div: 'a', - dept: 'b', + _$client: { + a: 1, + b: 2, + }, + c: 3, }, }, - }; - const hook1 = paramsFromClient('populate', 'serialize')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - }, + } as HookContext), + ).toEqual({ + params: { + a: 1, + b: 2, + query: { + c: 3, }, - } as any); - }); - - it('leaves hook unchanged if $client not an object', () => { - const hook: any = { - params: { - query: { - div: 'a', - dept: 'b', - $client: 'z', - }, - }, - }; - - const hook1 = paramsFromClient('populate', 'serialize')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - $client: 'z', - }, - }, - } as any); + }, }); }); - describe('copies client params', () => { - it('works no whitelisted params', () => { - const hook: any = { - params: { - query: { - div: 'a', - dept: 'b', - $client: { populate: 'aa', serialize: 'bb' }, - }, - }, - }; - - const hook1 = paramsFromClient()(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - }, - }, - } as any); - }); - - it('copies whitelisted params', () => { - const hook: any = { - params: { - query: { - div: 'a', - dept: 'b', - $client: { populate: 'aa', serialize: 'bb' }, - }, - }, - }; - - const hook1 = paramsFromClient('populate', 'serialize')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - }, - populate: 'aa', - serialize: 'bb', - }, - } as any); - }); - - it('copies whitelisted params even if some missing', () => { - const hook: any = { + it('should move params to query._$client and leave remaining', () => { + expect( + paramsFromClient('a')({ params: { query: { - div: 'a', - dept: 'b', - $client: { populate: 'aa', serialize: 'bb' }, + _$client: { + a: 1, + b: 2, + }, + c: 3, }, }, - }; - - const hook1 = paramsFromClient('a', 'populate', 'b', 'serialize', 'q', 'r')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - }, - populate: 'aa', - serialize: 'bb', - }, - } as any); - }); - - it('copies only whitelisted params', () => { - const hook: any = { - params: { - query: { - div: 'a', - dept: 'b', - $client: { populate: 'aa', serialize: 'bb' }, - }, - }, - }; - - const hook1 = paramsFromClient('populate')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', - }, - populate: 'aa', - }, - } as any); - }); - - it('copies only whitelisted params even if none', () => { - const hook: any = { - params: { - query: { - div: 'a', - dept: 'b', - $client: { populate: 'aa', serialize: 'bb' }, - }, - }, - }; - - const hook1 = paramsFromClient('q', 'q')(hook); - - assert.deepEqual(hook1, { - params: { - query: { - div: 'a', - dept: 'b', + } as HookContext), + ).toEqual({ + params: { + a: 1, + query: { + _$client: { + b: 2, }, + c: 3, }, - } as any); + }, }); }); }); diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts old mode 100755 new mode 100644 index ee7d9425..fab0c5d6 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -1,28 +1,53 @@ import type { HookContext } from '@feathersjs/feathers'; +import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-server'; +import { MaybeArray, toArray } from '../../internal.utils'; -/** - * Pass context.params from client to server. Server hook. - * @see https://hooks-common.feathersjs.com/hooks.html#paramsfromclient - * - * @deprecated use `paramsFromClient2` instead - */ -export function paramsFromClient(...whitelist: string[]) { - return (context: H) => { - const params = context.params; - - if (params?.query?.$client && typeof params.query.$client === 'object') { - const client = params.query.$client; - - whitelist.forEach(key => { - if (key in client) { - params[key] = client[key]; - } - }); - - params.query = Object.assign({}, params.query); - delete params.query.$client; +export type paramsFromClientOptions = { + /** + * @default '_$client' + */ + keyToHide?: string; +}; + +export const paramsFromClient = ( + whitelist: MaybeArray, + options?: paramsFromClientOptions, +): ((context: HookContext) => HookContext) => { + const whitelistArr = toArray(whitelist); + const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; + return (context: HookContext): HookContext => { + if ( + !context.params?.query?.[keyToHide] || + typeof context.params.query[keyToHide] !== 'object' + ) { + return context; } + const params = { + ...context.params, + query: { + ...context.params.query, + [keyToHide]: { + ...context.params.query[keyToHide], + }, + }, + }; + + const client = params.query[keyToHide]; + + whitelistArr.forEach(key => { + if (key in client) { + params[key] = client[key]; + delete client[key]; + } + }); + + if (Object.keys(client).length === 0) { + delete params.query[keyToHide]; + } + + context.params = params; + return context; }; -} +}; diff --git a/src/hooks/params-from-client2/params-from-client2.test.ts b/src/hooks/params-from-client2/params-from-client2.test.ts deleted file mode 100644 index 8ac46bb5..00000000 --- a/src/hooks/params-from-client2/params-from-client2.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { HookContext } from '@feathersjs/feathers'; -import { paramsFromClient2 } from './params-from-client2'; - -describe('paramsFromClient2', () => { - it('should move params to query._$client', () => { - expect( - paramsFromClient2(['a', 'b'])({ - params: { - query: { - _$client: { - a: 1, - b: 2, - }, - c: 3, - }, - }, - } as HookContext), - ).toEqual({ - params: { - a: 1, - b: 2, - query: { - c: 3, - }, - }, - }); - }); - - it('should move params to query._$client and leave remaining', () => { - expect( - paramsFromClient2('a')({ - params: { - query: { - _$client: { - a: 1, - b: 2, - }, - c: 3, - }, - }, - } as HookContext), - ).toEqual({ - params: { - a: 1, - query: { - _$client: { - b: 2, - }, - c: 3, - }, - }, - }); - }); -}); diff --git a/src/hooks/params-from-client2/params-from-client2.ts b/src/hooks/params-from-client2/params-from-client2.ts deleted file mode 100644 index 97c93b3d..00000000 --- a/src/hooks/params-from-client2/params-from-client2.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server2/params-for-server2'; -import { MaybeArray, toArray } from '../../internal.utils'; - -export type ParamsFromClient2Options = { - /** - * @default '_$client' - */ - keyToHide?: string; -}; - -export const paramsFromClient2 = ( - whitelist: MaybeArray, - options?: ParamsFromClient2Options, -): ((context: HookContext) => HookContext) => { - const whitelistArr = toArray(whitelist); - const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; - return (context: HookContext): HookContext => { - if ( - !context.params?.query?.[keyToHide] || - typeof context.params.query[keyToHide] !== 'object' - ) { - return context; - } - - const params = { - ...context.params, - query: { - ...context.params.query, - [keyToHide]: { - ...context.params.query[keyToHide], - }, - }, - }; - - const client = params.query[keyToHide]; - - whitelistArr.forEach(key => { - if (key in client) { - params[key] = client[key]; - delete client[key]; - } - }); - - if (Object.keys(client).length === 0) { - delete params.query[keyToHide]; - } - - context.params = params; - - return context; - }; -}; diff --git a/src/hooks/pick-query/pick-query.ts b/src/hooks/pick-query/pick-query.ts index ed7767b6..b0d07900 100755 --- a/src/hooks/pick-query/pick-query.ts +++ b/src/hooks/pick-query/pick-query.ts @@ -1,21 +1,22 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import _pick from 'lodash/pick'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Keep certain fields in the query object, deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keepquery */ -export const pickQuery = (...fieldNames: string[]) => { - return (context: H) => { +export const pickQuery = (fieldNames: MaybeArray) => { + const fieldNamesArr = toArray(fieldNames); + return (context: H, next?: NextFunction) => { if (!context.params.query) { return context; } - context.params.query = _pick(context.params.query, fieldNames); + context.params.query = _pick(context.params.query, fieldNamesArr); + + if (next) return next().then(() => context); return context; }; }; - -// alias -export { pickQuery as keepQuery }; diff --git a/src/hooks/pick/pick-data.ts b/src/hooks/pick/pick-data.ts index 6870e740..7aa676a7 100755 --- a/src/hooks/pick/pick-data.ts +++ b/src/hooks/pick/pick-data.ts @@ -1,17 +1,16 @@ import _pick from 'lodash/pick.js'; - import { alterData } from '../alter-items/alter-data'; +import { MaybeArray, toArray } from '../../internal.utils'; /** * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep */ -export const pickData = (...fieldNames: string[]) => - alterData((item: any) => { +export const pickData = (fieldNames: MaybeArray) => { + const fieldNamesArr = toArray(fieldNames); + return alterData((item: any) => { if (typeof item !== 'object' || item === null) return item; - return _pick(item, fieldNames); + return _pick(item, fieldNamesArr); }); - -// alias -export { pickData as keepData }; +}; diff --git a/src/hooks/pick/pick-result.ts b/src/hooks/pick/pick-result.ts index c3cf6949..0a8152bb 100755 --- a/src/hooks/pick/pick-result.ts +++ b/src/hooks/pick/pick-result.ts @@ -2,7 +2,7 @@ import _pick from 'lodash/pick.js'; import { alterResult } from '../alter-items/alter-result'; import { DispatchOption } from '../../types'; -import { MaybeArray } from '../../internal.utils'; +import { MaybeArray, toArray } from '../../internal.utils'; export type PickResultOptions = { dispatch?: DispatchOption; @@ -12,15 +12,14 @@ export type PickResultOptions = { * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep */ -export const pickResult = (fieldNames: MaybeArray, options?: PickResultOptions) => +export const pickResult = (fieldNames: MaybeArray, options?: PickResultOptions) => { + const fieldNamesArr = toArray(fieldNames); alterResult( (item: any) => { if (typeof item !== 'object' || item === null) return item; - return _pick(item, fieldNames); + return _pick(item, fieldNamesArr); }, { dispatch: options?.dispatch }, ); - -// alias -export { pickResult as keepResult }; +}; diff --git a/src/hooks/pick/pick.test.ts b/src/hooks/pick/pick.test.ts deleted file mode 100755 index 7939776f..00000000 --- a/src/hooks/pick/pick.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { assert } from 'vitest'; -import { pick } from './pick'; - -let hookBefore: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; - -describe('pick', () => { - describe('removes fields', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane', last: 'Doe' }, - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('updates hook before::create', () => { - pick('last')(hookBefore); - assert.deepEqual(hookBefore.data, { last: 'Doe' }); - }); - - it('updates hook after::find with pagination', () => { - pick('first')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after::find with no pagination', () => { - pick('first')(hookFind); - assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); - }); - - it('updates hook after', () => { - pick('first')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - - it('updates when called internally on server', () => { - hookAfter.params.provider = ''; - pick('first')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - - it('does not throw if field is missing', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - pick('last', 'xx')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); - - it('keeps undefined values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: undefined, last: 'Doe' }, - }; - pick('first')(hook); - assert.deepEqual(hook.data, { first: undefined }); - }); - - it('keeps null values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: null, last: 'Doe' }, - }; - pick('first')(hook); - assert.deepEqual(hook.data, { first: null }); - }); - - it('keeps false values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: false, last: 'Doe' }, - }; - pick('first')(hook); - assert.deepEqual(hook.data, { first: false }); - }); - - it('keeps 0 values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 0, last: 'Doe' }, - }; - pick('first')(hook); - assert.deepEqual(hook.data, { first: 0 }); - }); - - it('keeps empty string values', () => { - const hook: any = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: '', last: 'Doe' }, - }; - pick('first')(hook); - assert.deepEqual(hook.data, { first: '' }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); - - it('prop with no dots', () => { - pick('empl')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); - - it('prop with 1 dot', () => { - pick('empl.name', 'dept')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' } }, - dept: 'Acct', - }); - }); - - it('prop with 2 dots', () => { - pick('empl.name.last', 'empl.status', 'dept')(hookBefore); - assert.deepEqual(hookBefore.data, { - empl: { name: { last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('ignores bad or missing paths', () => { - pick('empl.name.first', 'empl.name.surname')(hookBefore); - assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John' } } }); - }); - - it('ignores bad or missing no dot path', () => { - pick('xx')(hookBefore); - assert.deepEqual(hookBefore.data, {}); - }); - }); - - describe('ignore non-object records', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - null, - undefined, - Infinity, - ], - }; - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: [{ first: 'Jane', last: 'Doe' }, null, undefined, Infinity], - }; - }); - - it('before', () => { - pick('empl')(hookBefore); - assert.deepEqual(hookBefore.data, [ - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, - null, - undefined, - Infinity, - ]); - }); - - it('after', () => { - pick('first')(hookAfter); - assert.deepEqual(hookAfter.result, [{ first: 'Jane' }, null, undefined, Infinity]); - }); - }); -}); diff --git a/src/hooks/pick/pick.ts b/src/hooks/pick/pick.ts deleted file mode 100755 index 96da648b..00000000 --- a/src/hooks/pick/pick.ts +++ /dev/null @@ -1,36 +0,0 @@ -import _pick from 'lodash/pick.js'; - -import { checkContextIf, getItems, replaceItems } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; - -/** - * Keep certain fields in the record(s), deleting the rest. - * @see https://hooks-common.feathersjs.com/hooks.html#keep - * - * @deprecated Use `pickData` or `pickResult` instead. - */ -export function pick(...fieldNames: string[]) { - return (context: H) => { - checkContextIf(context, 'before', ['create', 'update', 'patch'], 'keep'); - const items = getItems(context); - - if (Array.isArray(items)) { - replaceItems( - context, - items.map(item => replaceItem(item, fieldNames)), - ); - } else { - replaceItems(context, replaceItem(items, fieldNames)); - } - - return context; - }; -} - -export { pick as keep }; - -function replaceItem(item: any, fields: any) { - if (typeof item !== 'object' || item === null) return item; - - return _pick(item, fields); -} diff --git a/src/hooks/populate/populate-1deep-1child.test.ts b/src/hooks/populate/populate-1deep-1child.test.ts deleted file mode 100755 index ca5c8d69..00000000 --- a/src/hooks/populate/populate-1deep-1child.test.ts +++ /dev/null @@ -1,668 +0,0 @@ -import { assert } from 'vitest'; -import _set from 'lodash/set.js'; - -import configApp from './test/config-app'; -import getInitDb from './test/get-init-db'; -import { populate } from './populate'; -import { clone } from '../../common'; - -let provider: any; - -['array', 'obj'].forEach(type => { - describe(`services populate - include 1:1 - ${type}`, () => { - let hookAfter: any; - let hookAfterArray: any; - - let app: any; - let recommendation; - - beforeEach(() => { - app = configApp(['posts', 'recommendation']); - recommendation = clone(getInitDb('recommendation').store); - - app.service('posts').hooks({ - before: { - all: [ - (hook: any) => { - provider = hook.params.provider; - }, - ], - }, - }); - - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: recommendation['1'], - }; - hookAfterArray = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: [recommendation['1'], recommendation['2'], recommendation['3']], - }; - }); - - describe('root is one item', () => { - it('saves in nameAs without dot notation', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', // we have no test for dot notation 'cause no such data - childField: 'id', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('post'); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('saves in nameAs using dot notation', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post.items', - parentField: 'postId', // we have no test for dot notation 'cause no such data - childField: 'id', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('post.items'); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('saves in service as default', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('ignores undefined parentField', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - delete hook.result.postId; - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - - delete expected.postId; - delete expected.posts; - expected._include = []; - - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('uses asArray', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - asArray: true, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts', true); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('Stores null when no joined records and !asArray', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - hook.result.postId = '999'; - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - - expected.postId = '999'; - expected.posts = null; - - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('Stores [] when no joined records and asArray', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - hook.result.postId = '999'; - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - asArray: true, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - - expected.postId = '999'; - expected.posts = []; - - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('query overridden by childField', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('Provider in joins defaults to method call', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - assert.equal(provider, 'rest'); // Feathers default if not from WebSocket - }) - ); - }); - - it('Provider in joins can be overridden', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - provider: undefined, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - assert.equal(provider, undefined); - }) - ); - }); - - it('Provider can be passed down from top level', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - provider: 'global', - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - assert.equal(provider, 'global'); - }) - ); - }); - - it('Global provider can be overwritten at schema level', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - provider: 'global', - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - provider: 'socketio', - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - assert.equal(provider, 'socketio'); - }) - ); - }); - - it('Falsy providers override default provider', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - hook.params.provider = 'rest'; // Set up default provider - - const schema: any = { - provider: undefined, - include: makeInclude(type, { - service: 'posts', - parentField: 'postId', - childField: 'id', - query: { id: 'aaaaaa' }, - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - assert.equal(provider, undefined); - }) - ); - }); - - it('childField overridden by select', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - parentField: 'updatedAt', - childField: 'id', - select: (_hook: any, parent: any) => ({ - id: parent.postId, - }), - }), - }; - - return ( - populate({ schema })(hook) - // @ts-ignore - .then((hook1: any) => { - const expected = recommendationPosts('posts'); - assert.deepEqual(hook1.result, expected); - }) - ); - }); - - it('checks permissions', () => { - const spy: any = []; - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const checkPermissions = (_hook: any, service: any, permissions: any, depth: any) => { - spy.push({ service, permissions, depth }); - return true; - }; - - const schema = { - permissions: 'for root', - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - permissions: 'for posts', - }), - }; - - // @ts-ignore - return ( - populate({ schema, checkPermissions })(hook) - // @ts-ignore - .then((hook1: any) => { - let expected = recommendationPosts('post'); - assert.deepEqual(hook1.result, expected); - - expected = [ - { service: 'recommendations', permissions: 'for root', depth: 0 }, - { service: 'posts', permissions: 'for posts', depth: 1 }, - ]; - assert.deepEqual(spy, expected); - }) - ); - }); - - it('throws on invalid permissions', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const checkPermissions = (_hook: any, _service: any, _permissions: any, depth: any) => { - return depth === 0; - }; - - const schema = { - permissions: 'for root', - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - permissions: 'for posts', - }), - }; - - // @ts-ignore - return ( - populate({ schema, checkPermissions })(hook) - // @ts-ignore - .then(() => { - throw new Error('was not supposed to succeed'); - }) - .catch((err: any) => { - assert.notEqual(err, undefined); - }) - ); - }); - - it('stores elapsed time', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then((hook1: any) => { - const elapsed = hook1.result._elapsed; - assert.deepEqual(Object.keys(elapsed), ['post', 'total']); - assert.isAbove(elapsed.total, 999); - assert.isAtLeast(elapsed.total, elapsed.post); - }) - ); - }); - - it('allow non related field joins if query', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - query: { id: hookAfter.result.postId }, - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then((hook1: any) => { - const elapsed = hook1.result._elapsed; - assert.deepEqual(Object.keys(elapsed), ['post', 'total']); - assert.isAbove(elapsed.total, 999); - assert.isAtLeast(elapsed.total, elapsed.post); - }) - ); - }); - - it('allow non related field joins if select', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - select: (_hook: any, parentItem: any) => ({ - id: parentItem.postId, - }), - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then((hook1: any) => { - const elapsed = hook1.result._elapsed; - assert.deepEqual(Object.keys(elapsed), ['post', 'total']); - assert.isAbove(elapsed.total, 999); - assert.isAtLeast(elapsed.total, elapsed.post); - }) - ); - }); - - it.skip('throws if no parentField option in related field join', async () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - childField: 'id', - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then(() => { - assert.fail('unexpectedly succeeeded'); - }) - .catch((err: any) => { - assert.isObject(err, 'no error object'); - }) - ); - }); - - it.skip('throws if no parentField defined in related field join', () => { - const hook = { - ...clone(hookAfter), - app, - }; - - delete hook.result.postId; - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then(() => { - assert.fail('unexpectedly succeeded'); - }) - .catch((err: any) => { - assert.isObject(err, 'no error object'); - }) - ); - }); - }); - - describe('root is item array', () => { - it('populates each item', () => { - const hook = clone(hookAfterArray); - hook.app = app; // app is a func and wouldn't be cloned - - const schema = { - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - }), - }; - - return ( - populate({ schema, profile: true })(hook) - // @ts-ignore - .then((hook1: any) => { - assert.equal(hook1.result.length, 3); - }) - ); - }); - }); - - describe('populate does not change original schema object', () => { - it('check include field', () => { - const hook = clone(hookAfterArray); - hook.app = app; - - const includeOptions = () => ({ - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - }); - - const include = makeInclude(type, includeOptions()); - const expected = makeInclude(type, includeOptions()); - - return ( - populate({ schema: { include }, profile: true })(hook) - // @ts-ignore - .then((hook1: any) => { - assert.deepEqual(include, expected); - }) - ); - }); - }); - }); -}); - -// Helpers - -function makeInclude(type: any, obj: any) { - return type === 'obj' ? obj : [obj]; -} - -function recommendationPosts(nameAs: any, asArray?: any, recommendation?: any, posts?: any) { - recommendation = recommendation || clone(getInitDb('recommendation').store['1']); - posts = posts || clone(getInitDb('posts').store['1']); - - const expected = clone(recommendation); - expected._include = [nameAs]; - - // expected[nameAs] = asArray ? [clone(posts)] : clone(posts); - _set(expected, nameAs, asArray ? [clone(posts)] : clone(posts)); - - return expected; -} diff --git a/src/hooks/populate/populate-basics.test.ts b/src/hooks/populate/populate-basics.test.ts deleted file mode 100755 index 4b794a84..00000000 --- a/src/hooks/populate/populate-basics.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { assert } from 'vitest'; -import { populate } from './populate'; -import { clone } from '../../common'; - -describe('services populate - finds items in hook', () => { - let hookAfter: any; - let hookAfterArray: any; - let hookFindPaginate: any; - - beforeEach(() => { - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane2', last: 'Doe2' }, - }; - hookAfterArray = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: [ - { first: 'John2', last: 'Doe2' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - result: { - total: 2, - data: [ - { first: 'John3', last: 'Doe3' }, - { first: 'Jane3', last: 'Doe3' }, - ], - }, - }; - }); - - it('one item', () => { - const hook = clone(hookAfter); - return ( - populate({ schema: {} })(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - }) - ); - }); - - it('item array', () => { - const hook = clone(hookAfterArray); - return ( - populate({ schema: {} })(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfterArray); - }) - ); - }); - - it('find paginated', () => { - const hook = clone(hookFindPaginate); - return ( - populate({ schema: {} })(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookFindPaginate); - }) - ); - }); -}); - -describe('services populate - throws on bad params', () => { - // run to increase code climate score - let hookAfter: any; - - beforeEach(() => { - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - result: { first: 'Jane2', last: 'Doe2' }, - }; - }); - - it('schema', () => { - assert.throws(() => { - // @ts-ignore - populate({}); - }); - assert.throws(() => { - // @ts-ignore - populate({ schema: 1 }); - }); - }); - - it('permissions not func', () => { - const hook = clone(hookAfter); - // @ts-ignore - return ( - // @ts-ignore - populate({ schema: {}, checkPermissions: 1 })(hook) - // @ts-ignore - .then(() => { - throw new Error('was not supposed to succeed'); - }) - .catch((err: any) => { - assert.notEqual(err, undefined); - }) - ); - }); - - it('throws on invalid permissions', () => { - const hook = clone(hookAfter); - // @ts-ignore - return ( - populate({ schema: {}, checkPermissions: () => false })(hook) - // @ts-ignore - .then(() => { - throw new Error('was not supposed to succeed'); - }) - .catch((err: any) => { - assert.notEqual(err, undefined); - }) - ); - }); -}); diff --git a/src/hooks/populate/populate-misc.test.ts b/src/hooks/populate/populate-misc.test.ts deleted file mode 100755 index 9006849e..00000000 --- a/src/hooks/populate/populate-misc.test.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { assert } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { populate } from './populate'; -import { iff } from '../'; -import { clone } from '../../common'; - -const userId = 6; -const userInit = { - 0: { name: 'Jane Doe', key: 'a', id: 0 }, - 1: { name: 'Jack Doe', key: 'a', id: 1 }, - 2: { name: 'Jack Doe', key: 'a', id: 2, deleted: true }, - 3: { name: 'Rick Doe', key: 'b', id: 3 }, - 4: { name: 'Dick Doe', key: 'b', id: 4 }, - 5: { name: 'Dick Doe', key: 'b', id: 5, deleted: true }, -}; -const teamId = 2; -const teamInit = { - 0: { team: 'Does', memberIds: [0, 1, 2], id: 0 }, - 1: { team: 'Dragons', memberIds: [3, 4, 5], id: 1 }, -}; - -const schemaDefault = { - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - }, - ], -}; - -const resultDefault = [ - { - team: 'Does', - memberIds: [0, 1, 2], - id: 0, - _include: ['members'], - members: [ - { name: 'Jane Doe', key: 'a', id: 0 }, - { name: 'Jack Doe', key: 'a', id: 1 }, - { name: 'Jack Doe', key: 'a', id: 2, deleted: true }, - ], - }, -]; - -const schemaDefaultTeams = { - service: 'teams', - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - }, - ], -}; - -const schemaDefaultXteams = { - service: 'xteams', - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - }, - ], -}; - -const schemaFalse = { - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - paginate: false, - }, - ], -}; - -const schemaTrue = { - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - paginate: true, - }, - ], -}; - -const resultTrue = [ - { - team: 'Does', - memberIds: [0, 1, 2], - id: 0, - _include: ['members'], - members: [ - { name: 'Jane Doe', key: 'a', id: 0 }, - { name: 'Jack Doe', key: 'a', id: 1 }, - ], - }, -]; - -const schema1 = { - include: [ - { - service: 'users', - nameAs: 'members', - parentField: 'memberIds', - childField: 'id', - paginate: 1, - }, - ], -}; - -const result1 = [ - { - team: 'Does', - memberIds: [0, 1, 2], - id: 0, - _include: ['members'], - members: { name: 'Jane Doe', key: 'a', id: 0 }, - }, -]; - -let whichSchema: any; -let userHookFlag1: any; -let teamHookFlag1: any; -let fcnOptions: any; - -function schemaFcn(_hook: any, options: any) { - fcnOptions = options; - return schemaDefault; -} - -function services(app: any) { - app.configure(user); - app.configure(team); -} - -function user(app: any) { - app.use( - '/users', - new MemoryService({ - store: clone(userInit), - startId: userId, - paginate: { - default: 2, - max: 2, - }, - }), - ); - - app.service('users').hooks({ - before: { - all: [ - (hook: any) => { - userHookFlag1 = hook.params.userHookFlag1; - }, - ], - }, - }); -} - -function team(app: any) { - app.use( - '/teams', - new MemoryService({ - store: clone(teamInit), - startId: teamId, - }), - ); - - app.service('teams').hooks({ - after: { - all: [ - (hook: any) => { - teamHookFlag1 = hook.params.teamHookFlag1; - }, - iff(() => whichSchema === 'schemaDefault', populate({ schema: schemaDefault })), - iff(() => whichSchema === 'schemaFalse', populate({ schema: schemaFalse })), - iff(() => whichSchema === 'schemaTrue', populate({ schema: schemaTrue })), - iff(() => whichSchema === 'schema1', populate({ schema: schema1 })), - iff(() => whichSchema === 'schemaDefaultTeams', populate({ schema: schemaDefaultTeams })), - iff(() => whichSchema === 'schemaDefaultXteams', populate({ schema: schemaDefaultXteams })), - iff(() => whichSchema === 'schemaDefaultFcn', populate({ schema: schemaFcn })), - ], - }, - }); -} - -describe('services populate - hook.params passed to includes', () => { - let app; - let teams: any; - - beforeEach(() => { - app = feathers().configure(services); - teams = app.service('teams'); - userHookFlag1 = null; - }); - - it('hook.params passed to includes', () => { - whichSchema = 'schemaDefault'; - return teams.find({ query: { id: 0 }, userHookFlag1: 'userHookFlag1' }).then((result: any) => { - assert.equal(userHookFlag1, 'userHookFlag1'); - assert.deepEqual(result, resultDefault); - }); - }); - - it('ignores pagination by default', () => { - whichSchema = 'schemaDefault'; - return teams.find({ query: { id: 0 } }).then((result: any) => { - assert.deepEqual(result, resultDefault); - }); - }); - - it('ignores pagination when paginate:false', () => { - whichSchema = 'schemaFalse'; - return teams.find({ query: { id: 0 } }).then((result: any) => { - assert.deepEqual(result, resultDefault); - }); - }); - - it('uses configuration when paginate:true', () => { - whichSchema = 'schemaTrue'; - return teams.find({ query: { id: 0 } }).then((result: any) => { - assert.deepEqual(result, resultTrue); - }); - }); - - it('can specify number of results to return', () => { - whichSchema = 'schema1'; - return teams.find({ query: { id: 0 } }).then((result: any) => { - assert.deepEqual(result, result1); - }); - }); - - it('passes on correct base service', () => { - whichSchema = 'schemaDefaultTeams'; - return teams.find({ query: { id: 0 } }).then((result: any) => { - assert.deepEqual(result, resultDefault); - }); - }); - - it('throws on incorrect base service', () => { - whichSchema = 'schemaDefaultXteams'; - return teams - .find({ query: { id: 0 } }) - .then(() => { - assert.fail('unexpected succeeded'); - }) - .catch((err: any) => { - assert.equal(err.className, 'bad-request'); - }); - }); -}); - -describe('services populate - schema may be a function', () => { - let app; - let teams: any; - - beforeEach(() => { - app = feathers().configure(services); - teams = app.service('teams'); - userHookFlag1 = null; - fcnOptions = null; - }); - - it('calls the function', () => { - whichSchema = 'schemaDefaultFcn'; - return teams.find({ query: { id: 0 }, userHookFlag1: 'userHookFlag1' }).then((result: any) => { - assert.equal(userHookFlag1, 'userHookFlag1'); - assert.deepEqual(result, resultDefault); - }); - }); - - it('function gets hook and options', () => { - whichSchema = 'schemaDefaultFcn'; - return teams - .find({ query: { id: 0 }, userHookFlag1: 'userHookFlag1', teamHookFlag1: 'teamHookFlag1' }) - .then((result: any) => { - assert.equal(teamHookFlag1, 'teamHookFlag1'); - assert.strictEqual(fcnOptions.schema, schemaFcn); - - assert.equal(userHookFlag1, 'userHookFlag1'); - assert.deepEqual(result, resultDefault); - }); - }); -}); diff --git a/src/hooks/populate/populate-relations.test.ts b/src/hooks/populate/populate-relations.test.ts deleted file mode 100755 index f3ba5e1d..00000000 --- a/src/hooks/populate/populate-relations.test.ts +++ /dev/null @@ -1,326 +0,0 @@ -import { assert } from 'vitest'; -import configApp from './test/config-app'; -import getInitDb from './test/get-init-db'; -import { populate } from './populate'; -import { clone } from '../../common'; - -['array', 'obj'].forEach(type => { - describe(`services populate - 1:1 & 1:m & m:1 - ${type}`, () => { - let hookAfter: any; - let hookAfterArray: any; - let schema: any; - - let app: any; - let recommendation; - - beforeEach(() => { - app = configApp(['recommendation', 'posts', 'users', 'comments']); - recommendation = clone(getInitDb('recommendation').store); - - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: recommendation['1'], - }; - hookAfterArray = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: [recommendation['1'], recommendation['2'], recommendation['3']], - }; - - schema = { - permissions: '', - include: makeInclude(type, { - service: 'posts', - nameAs: 'post', - parentField: 'postId', - childField: 'id', - include: [ - { - // 1:1 - service: 'users', - permissions: '', - nameAs: 'authorInfo', - parentField: 'author', - childField: 'id', - }, - { - // 1:m - service: 'comments', - permissions: '', - nameAs: 'commentsInfo', - parentField: 'id', - childField: 'postId', - select: (_hook: any, _parent: any) => ({ - $limit: 6, - }), - asArray: true, - query: { - $limit: 5, - $select: ['title', 'content', 'postId'], - $sort: { createdAt: -1 }, - }, - }, - { - // m:1 - service: 'users', - permissions: '', - nameAs: 'readersInfo', - parentField: 'readers', - childField: 'id', - }, - ], - }), - }; - }); - - it('for one item', () => { - const hook = clone(hookAfter); - hook.app = app; // app is a func and wouldn't be cloned - - // @ts-ignore - return ( - // @ts-ignore - populate({ schema, checkPermissions: () => true, profile: 'test' })(hook) - // @ts-ignore - .then((hook1: any) => { - assert.deepEqual(hook1.result, { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - commentsInfo: [ - { - id: 1, - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - postId: 1, - }, - { - id: 3, - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - postId: 1, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }); - }) - ); - }); - - it('for an item array', () => { - const hook = clone(hookAfterArray); - hook.app = app; // app is a func and wouldn't be cloned - - return ( - // @ts-ignore - populate({ schema, checkPermissions: () => true, profile: 'test' })(hook) - // @ts-ignore - .then((hook1: any) => { - assert.deepEqual(hook1.result, [ - { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - commentsInfo: [ - { - id: 1, - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - postId: 1, - }, - { - id: 3, - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - postId: 1, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }, - { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 2, - title: 'Post 2', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - commentsInfo: [ - { - id: 2, - title: 'Comment 2', - content: 'Lorem ipsum dolor sit amet 2', - postId: 2, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }, - { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - commentsInfo: [ - { - id: 1, - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - postId: 1, - }, - { - id: 3, - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - postId: 1, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }, - ]); - }) - ); - }); - }); -}); - -// Helpers - -function makeInclude(type: any, obj: any) { - return type === 'obj' ? obj : [obj]; -} diff --git a/src/hooks/populate/populate-scaffolding.test.ts b/src/hooks/populate/populate-scaffolding.test.ts deleted file mode 100755 index 36ae0bc5..00000000 --- a/src/hooks/populate/populate-scaffolding.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { assert } from 'vitest'; -import configApp from './test/config-app'; - -describe('services populate - test scaffolding', () => { - it('can reinitialize database', async () => { - const app = configApp(['users', 'comments', 'posts', 'recommendation']); - const users = app.service('users'); - - await users - .find({ query: {} }) - .then((data: any) => { - assert.equal(data.length, 2); - }) - .then(() => { - return users.remove(0); - }) - .then(() => { - return users.find({ query: {} }); - }) - .then((data: any) => { - assert.equal(data.length, 1); - }) - .then(() => { - const app1 = configApp(['users', 'comments', 'posts', 'recommendation']); - const users1 = app1.service('users'); - - return users1.find({ query: {} }); - }) - .then((data: any) => { - assert.equal(data.length, 2); - }); - }); -}); diff --git a/src/hooks/populate/populate.ts b/src/hooks/populate/populate.ts deleted file mode 100755 index 9f540801..00000000 --- a/src/hooks/populate/populate.ts +++ /dev/null @@ -1,350 +0,0 @@ -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import { BadRequest } from '@feathersjs/errors'; - -import { getItems, replaceItems } from '../../utils'; -import type { HookContext } from '@feathersjs/feathers'; - -export interface PopulateOptions { - schema: - | Partial - | ((context: H, options: PopulateOptions) => Partial); - checkPermissions?: (context: H, path: string, permissions: any, depth: number) => boolean; - profile?: boolean; -} - -export interface PopulateSchema { - /** - * The name of the service providing the items, actually its path. - */ - service: string; - /** - * Where to place the items from the join - * dot notation - */ - nameAs: string; - /** - * The name of the field in the parent item for the relation. - * dot notation - */ - parentField: string; - /** - * The name of the field in the child item for the relation. - * Dot notation is allowed and will result in a query like { 'name.first': 'John' } which is not suitable for all DBs. - * You may use query or select to create a query suitable for your DB. - */ - childField: string; - - /** - * Who is allowed to perform this join. See checkPermissions above. - */ - permissions: any; - - /** - * An object to inject into context.params.query. - */ - query: any; - - /** - * A function whose result is injected into the query. - */ - select: (context: HookContext, parentItem: any, depth: number) => any; - - /** - * Force a single joined item to be stored as an array. - */ - asArray: boolean; - - /** - * Controls pagination for this service. - */ - paginate: boolean | number; - - /** - * Perform any populate or fastJoin registered on this service. - */ - useInnerPopulate: boolean; - /** - * Call the service as the server, not with the client’s transport. - */ - provider: string; - include: Partial | Partial[]; -} - -export function populate(options: PopulateOptions) { - // options.schema is like { service: '...', permissions: '...', include: [ ... ] } - - const typeofSchema = typeof options.schema; - if ((typeofSchema !== 'object' || options.schema === null) && typeofSchema !== 'function') { - throw new Error('Options.schema is not an object. (populate)'); - } - - return function (context: H) { - const optionsDefault: PopulateOptions = { - schema: {}, - checkPermissions: () => true, - profile: false, - }; - - if (context.params._populate === 'skip') { - // this service call made from another populate - return context; - } - - return Promise.resolve() - .then(() => { - // 'options.schema' resolves to { permissions: '...', include: [ ... ] } - - const items = getItems(context); - const options1 = Object.assign({}, optionsDefault, options); - const { schema, checkPermissions } = options1; - - const schema1 = typeof schema === 'function' ? schema(context, options1) : schema; - const permissions = schema1.permissions || null; - const baseService = schema1.service; - const provider = 'provider' in schema1 ? schema1.provider : context.params.provider; - - if (typeof checkPermissions !== 'function') { - throw new BadRequest('Permissions param is not a function. (populate)'); - } - - if (baseService && context.path && baseService !== context.path) { - throw new BadRequest(`Schema is for ${baseService} not ${context.path}. (populate)`); - } - - if (permissions && !checkPermissions(context, context.path, permissions, 0)) { - throw new BadRequest('Permissions do not allow this populate. (populate)'); - } - - if (typeof schema1 !== 'object') { - throw new BadRequest('Schema does not resolve to an object. (populate)'); - } - - const include = [].concat((schema1.include || []) as any).map(schema => { - if ('provider' in schema) { - return schema; - } else { - return Object.assign({}, schema, { provider }); - } - }); - - return !include.length ? items : populateItemArray(options1, context, items, include, 0); - }) - .then(items => { - replaceItems(context, items); - return context; - }); - }; -} - -function populateItemArray( - options: any, - context: HookContext, - items: any, - includeSchema: any, - depth: number, -): any { - // 'items' is an item or an array of items - // 'includeSchema' is like [ { nameAs: 'author', ... }, { nameAs: 'readers', ... } ] - - if (items.toJSON || items.toObject) { - throw new BadRequest('Populate requires results to be plain JavaScript objects. (populate)'); - } - - if (!Array.isArray(items)) { - return populateItem(options, context, items, includeSchema, depth + 1); - } - - return Promise.all( - items.map(item => populateItem(options, context, item, includeSchema, depth + 1)), - ); -} - -function populateItem( - options: any, - context: HookContext, - item: any, - includeSchema: any, - depth: number, -): any { - // 'item' is one item - // 'includeSchema' is like [ { nameAs: 'author', ... }, { nameAs: 'readers', ... } ] - - const elapsed: any = {}; - const startAtAllIncludes = new Date().getTime(); - const include = [].concat(includeSchema || []) as any; - if (!Object.prototype.hasOwnProperty.call(item, '_include')) item._include = []; - - return Promise.all( - include.map((childSchema: any) => { - const { query, select, parentField } = childSchema; - - // A related column join is required if neither the query nor select options are provided. - // That requires item[parentField] exist. (The DB handles child[childField] existence.) - if (!query && !select && (!parentField || _get(item, parentField) === undefined)) { - return undefined; - } - - const startAtThisInclude = new Date().getTime(); - return populateAddChild(options, context, item, childSchema, depth).then((result: any) => { - const nameAs = childSchema.nameAs || childSchema.service; - elapsed[nameAs] = getElapsed(options, startAtThisInclude, depth); - - return result; - }); - }), - ).then(children => { - // 'children' is like - // [{ nameAs: 'authorInfo', items: {...} }, { nameAs: readersInfo, items: [{...}, {...}] }] - if (options.profile !== false) { - elapsed.total = getElapsed(options, startAtAllIncludes, depth); - item._elapsed = elapsed; - } - - children.forEach(child => { - if (child) { - _set(item, child.nameAs, child.items); - } - }); - - return item; - }); -} - -function populateAddChild( - options: any, - context: HookContext, - parentItem: any, - childSchema: any, - depth: any, -): any { - /* - @params - 'parentItem' is the item we are adding children to - 'childSchema' is like - { service: 'comments', - permissions: '...', - nameAs: 'comments', - asArray: true, - parentField: 'id', - childField: 'postId', - query: { $limit: 5, $select: ['title', 'content', 'postId'], $sort: { createdAt: -1 } }, - select: (context, parent, depth) => ({ something: { $exists: false }}), - paginate: false, - provider: context.provider, - useInnerPopulate: false, - include: [ ... ] } - @returns { nameAs: string, items: array } - */ - - const { - childField, - paginate, - parentField, - permissions, - query, - select, - service, - useInnerPopulate, - provider, - } = childSchema; - - if (!service) { - throw new BadRequest('Child schema is missing the service property. (populate)'); - } - - // A related column join is required if neither the query nor select options are provided. - if (!query && !select && !(parentField && childField)) { - throw new BadRequest('Child schema is missing parentField or childField property. (populate)'); - } - - if (permissions && !options.checkPermissions(context, service, permissions, depth)) { - throw new BadRequest(`Permissions for ${service} do not allow include. (populate)`); - } - - const nameAs = childSchema.nameAs || service; - if (parentItem._include.indexOf(nameAs) === -1) parentItem._include.push(nameAs); - - return Promise.resolve() - .then(() => (select ? select(context, parentItem, depth) : {})) - .then(selectQuery => { - let sqlQuery = {}; - - if (parentField) { - const parentVal = _get(parentItem, parentField); // will not be undefined - sqlQuery = { [childField]: Array.isArray(parentVal) ? { $in: parentVal } : parentVal }; - } - - const queryObj = Object.assign( - {}, - query, - sqlQuery, - selectQuery, // dynamic options override static ones - ); - - const serviceHandle = context.app.service(service); - - if (!serviceHandle) { - throw new BadRequest(`Service ${service} is not configured. (populate)`); - } - - let paginateObj: any = { paginate: false }; - const paginateOption = paginate; - if (paginateOption === true) { - paginateObj = null; - } - if (typeof paginateOption === 'number') { - paginateObj = { paginate: { default: paginateOption } }; - } - - const params = Object.assign( - {}, - context.params, - paginateObj, - { query: queryObj }, - useInnerPopulate ? {} : { _populate: 'skip' }, - 'provider' in childSchema ? { provider: childSchema.provider } : {}, - ); - - return serviceHandle.find(params); - }) - .then(result => { - result = result.data || result; - - if (result.length === 0) { - return childSchema.asArray ? [] : null; - } - - if (result.length === 1 && !childSchema.asArray) { - result = result[0]; - } - - const include = [].concat(childSchema.include || []).map(schema => { - if ('provider' in schema) { - return schema; - } else { - return Object.assign({}, schema, { provider }); - } - }); - - return childSchema.include && result - ? populateItemArray(options, context, result, include, depth) - : result; - }) - .then(items => ({ nameAs, items })); -} - -// Helpers - -// used process.hrTime before -function milliToNano(num: number) { - return num * 1000000; -} - -function getElapsed(options: PopulateOptions, startTime: number, depth: number) { - if (options.profile === true) { - return milliToNano(new Date().getTime() - startTime + 0.001); - } - - return depth; // for testing _elapsed -} diff --git a/src/hooks/populate/test/config-app.ts b/src/hooks/populate/test/config-app.ts deleted file mode 100755 index 679bbae6..00000000 --- a/src/hooks/populate/test/config-app.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import getInitDb from './get-init-db'; - -export default function (dbNames: any) { - dbNames = typeof dbNames === 'string' ? [dbNames] : dbNames; - const serviceConfigs: any = { - users, - comments, - posts, - recommendation, - }; - - return feathers().configure(services); - - function services(app: any) { - dbNames.forEach((name: any) => { - // console.log(`configure service ${name}`); - app.configure(serviceConfigs[name]); - }); - } - - function users(app: any) { - app.use('users', new MemoryService(getInitDb('users'))); - } - - function comments(app: any) { - app.use('comments', new MemoryService(getInitDb('comments'))); - } - - function posts(app: any) { - app.use('posts', new MemoryService(getInitDb('posts'))); - } - - function recommendation(app: any) { - app.use('recommendation', new MemoryService(getInitDb('recommendation'))); - } -} diff --git a/src/hooks/populate/test/get-init-db.ts b/src/hooks/populate/test/get-init-db.ts deleted file mode 100755 index d686dcf1..00000000 --- a/src/hooks/populate/test/get-init-db.ts +++ /dev/null @@ -1,111 +0,0 @@ -export default function (name: any) { - const users: any = { - 0: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - 1: { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - }; - - const comments: any = { - 1: { - id: 1, - postId: 1, - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - author: 'as61389dadhga62343hads6712', - createdAt: 1480793101559, - }, - 2: { - id: 2, - postId: 2, - title: 'Comment 2', - content: 'Lorem ipsum dolor sit amet 2', - author: 'as61389dadhga62343hads6712', - createdAt: 1480793101559, - }, - 3: { - id: 3, - postId: 1, - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - author: '167asdf3689348sdad7312131s', - createdAt: 1480793101559, - }, - }; - - const posts: any = { - 1: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - 2: { - id: 2, - title: 'Post 2', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - 3: { - id: 3, - title: 'Post 3', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - }, - 4: { - id: 4, - title: 'Post 4', - content: 'Lorem ipsum dolor sit amet 5', - author: '167asdf3689348sdad7312131s', - readers: [], - createdAt: 1480793101559, - }, - }; - - const recommendation: any = { - 1: { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - }, - 2: { - userId: 'as61389dadhga62343hads6712', - postId: 2, - updatedAt: 1480793101475, - }, - 3: { - userId: '167asdf3689348sdad7312131s', - postId: 1, - updatedAt: 1480793101475, - }, - }; - - const dbs: any = { - users, - comments, - posts, - recommendation, - }; - - // console.log(`returning db for ${name}`); - return { - store: dbs[name], - idField: '_id', - }; -} diff --git a/src/hooks/prevent-changes/prevent-changes.ts b/src/hooks/prevent-changes/prevent-changes.ts index b4741f56..e383a49b 100755 --- a/src/hooks/prevent-changes/prevent-changes.ts +++ b/src/hooks/prevent-changes/prevent-changes.ts @@ -1,25 +1,38 @@ import _has from 'lodash/has.js'; import _omit from 'lodash/omit.js'; -import { BadRequest } from '@feathersjs/errors'; +import { BadRequest, FeathersError } from '@feathersjs/errors'; import { alterData } from '../alter-items/alter-data'; +import { MaybeArray, toArray } from '../../internal.utils'; + +export type PreventChangesOptions = { + error?: boolean | ((item: any, name: string) => FeathersError); +}; /** * Prevent patch service calls from changing certain fields. * @see https://hooks-common.feathersjs.com/hooks.html#preventchanges */ -export const preventChanges = (ifThrow: boolean, ...fieldNames: string[]) => - alterData(item => { - for (let i = 0; i < fieldNames.length; i++) { - const name = fieldNames[i]; +export const preventChanges = (fieldNames: MaybeArray, options?: PreventChangesOptions) => { + const fieldNamesArr = toArray(fieldNames); - if (_has(item, name)) { - if (ifThrow) { - throw new BadRequest(`Field ${name} may not be patched. (preventChanges)`); - } + return alterData(item => { + if (options?.error) { + for (let i = 0; i < fieldNamesArr.length; i++) { + const name = fieldNamesArr[i]; + + if (_has(item, name)) { + const error = + typeof options.error === 'function' + ? options.error(item, name) + : new BadRequest(`Field ${name} may not be patched. (preventChanges)`); - item = _omit(item, name); + throw error; + } } + + item = _omit(item, fieldNamesArr); } return item; }); +}; diff --git a/src/hooks/resolvers/resolve-data.ts b/src/hooks/resolvers/resolve-data.ts new file mode 100644 index 00000000..d980895e --- /dev/null +++ b/src/hooks/resolvers/resolve-data.ts @@ -0,0 +1,28 @@ +import { HookContext, NextFunction } from '@feathersjs/feathers'; +import { Resolver, runResolvers } from './resolvers.internal'; + +export const resolveData = + , H extends HookContext = HookContext>( + ...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(); + } + }; diff --git a/src/hooks/resolvers/resolve-query.ts b/src/hooks/resolvers/resolve-query.ts new file mode 100644 index 00000000..357e0e7f --- /dev/null +++ b/src/hooks/resolvers/resolve-query.ts @@ -0,0 +1,18 @@ +import { HookContext, NextFunction } from '@feathersjs/feathers'; +import { type Resolver, runResolvers } from './resolvers.internal'; + +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(); + } + }; diff --git a/src/hooks/resolvers/resolve-result.ts b/src/hooks/resolvers/resolve-result.ts new file mode 100644 index 00000000..4d14056d --- /dev/null +++ b/src/hooks/resolvers/resolve-result.ts @@ -0,0 +1,43 @@ +import { HookContext, NextFunction } from '@feathersjs/feathers'; +import { getResult, Resolver, runResolvers } from './resolvers.internal'; + +export const resolveResult = (...resolvers: Resolver[]) => { + 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 resolve = { + originalContext: context, + ...context.params.resolve, + properties: $resolve || $select, + }; + + context.params = { + ...context.params, + resolve, + query: { + ...query, + }, + }; + + 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; + } + }; +}; diff --git a/src/hooks/resolvers/resolver.test.ts b/src/hooks/resolvers/resolver.test.ts new file mode 100644 index 00000000..e225f108 --- /dev/null +++ b/src/hooks/resolvers/resolver.test.ts @@ -0,0 +1,108 @@ +import assert from 'assert'; +import { BadRequest } from '@feathersjs/errors'; +import { resolveData } from './resolve-data'; +import { HookContext } from '@feathersjs/feathers'; + +type User = { + firstName: string; + lastName: string; + password: string; +}; + +describe('resolve', () => { + it('simple resolver', async () => { + const context = { + data: { + firstName: 'Dave', + lastName: 'L.', + }, + } as unknown as HookContext; + + const resolver = resolveData({ + 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 await resolver(context); + + assert.deepStrictEqual(u.data, { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }); + }); + + 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/src/hooks/resolvers/resolvers.internal.ts b/src/hooks/resolvers/resolvers.internal.ts new file mode 100644 index 00000000..e424a94a --- /dev/null +++ b/src/hooks/resolvers/resolvers.internal.ts @@ -0,0 +1,135 @@ +import { BadRequest } from '@feathersjs/errors'; +import { HookContext } from '@feathersjs/feathers'; +import { Promisable } from '../../internal.utils'; + +export type ResolverProperty = ( + value: V | undefined, + obj: T, + context: C, + status: ResolverStatus, +) => Promisable; + +export type Resolver = { + [key in string]: ResolverProperty< + T, + key extends keyof T ? T[key] : undefined, + C, + key extends keyof T ? T[key] : any + >; +}; + +export type ResolverConverter = ( + obj: any, + context: C, + status: ResolverStatus, +) => Promisable; + +export interface ResolverStatus { + path: string[]; + originalContext?: C; + properties?: (keyof T)[]; + stack: ResolverProperty[]; +} + +const resolveProperty = async ( + resolver: ResolverProperty, + name: K, + data: D, + context: C, + status: Partial> = {}, +): Promise => { + const value = (data as any)[name]; + const { path = [], stack = [] } = status || {}; + + // This prevents circular dependencies + if (stack.includes(resolver)) { + return undefined as any; + } + + const resolverStatus = { + ...status, + path: [...path, name as string], + stack: [...stack, resolver], + }; + + return await resolver(value, data as any, context, resolverStatus); +}; + +const resolve = async , C>( + resolver: Resolver, + data: D, + context: C, + status?: Partial>, +): Promise => { + const propertyNames = Object.keys(resolver) as any as (keyof T)[]; + + 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(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 (name in resolver) { + const resolverProperty = resolver[name]; + try { + const resolved = await resolveProperty(resolverProperty, 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 result; +}; + +export const runResolvers = async ( + resolvers: Resolver[], + data: any, + ctx: H, + status?: Partial>, +) => { + let current: any = data; + + for (const resolver of resolvers) { + current = await resolve(resolver, current, ctx, status); + } + + return current as T; +}; + +export const getResult = (context: H) => { + const isPaginated = context.method === 'find' && context.result.data; + const data = isPaginated ? context.result.data : context.result; + + return { isPaginated, data }; +}; diff --git a/src/hooks/sequelize-convert/sequelize-convert.test.ts b/src/hooks/sequelize-convert/sequelize-convert.test.ts deleted file mode 100755 index 680777c0..00000000 --- a/src/hooks/sequelize-convert/sequelize-convert.test.ts +++ /dev/null @@ -1,428 +0,0 @@ -import { assert } from 'vitest'; -import { sequelizeConvert } from './sequelize-convert'; - -const converts: any = { - isInvitation: 'boolean', - isVerified: 'boolean', - verifyExpires: 'date', - verifyChanges: 'json', - resetExpires: 'date', - mfaExpires: 'date', - passwordHistory: 'json', -}; - -const convertDatetime = { - sql: (dateNow: any) => new Date(dateNow).toISOString(), - js: (sqlDate: any) => new Date(sqlDate).valueOf(), -}; - -describe('sequelize-convert.test.ts', function () { - describe('as before hook', () => { - let context: any; - let contextArray: any; - - beforeEach(() => { - context = { - type: 'before', - method: 'create', - data: { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - }; - - contextArray = { - type: 'before', - method: 'create', - data: [ - { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: true, - isVerified: false, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ], - }; - }); - - it('converts single object', () => { - const newContext: any = sequelizeConvert(converts)(context); - - assert.deepEqual(newContext.data, { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - - it('converts array of objects', () => { - const newContext: any = sequelizeConvert(converts)(contextArray); - - assert.deepEqual(newContext.data, [ - { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: 1, - isVerified: 0, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ]); - }); - - it('uses datetime converter', () => { - const newContext: any = sequelizeConvert(converts, null, { date: convertDatetime })(context); - - assert.deepEqual(newContext.data, { - isInvitation: 0, - isVerified: 1, - verifyExpires: '1970-01-01T00:00:11.111Z', - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: '1970-01-01T00:00:22.222Z', - resetToken: '99999', - resetShortToken: '99', - mfaExpires: '1970-01-01T00:00:33.333Z', - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - - it('respects fields to ignore', () => { - const newContext: any = sequelizeConvert(converts, [ - 'isInvitation', - 'isVerified', - 'verifyChanges', - ])(context); - - assert.deepEqual(newContext.data, { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - }); - - describe('as after hook', () => { - let context: any; - let contextISO: any; - let contextArray: any; - let contextPaginated: any; - - beforeEach(() => { - context = { - type: 'after', - method: 'create', - result: { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - }; - - contextISO = { - type: 'after', - method: 'create', - result: { - isInvitation: 0, - isVerified: 1, - verifyExpires: '1970-01-01T00:00:11.111Z', - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: '1970-01-01T00:00:22.222Z', - resetToken: '99999', - resetShortToken: '99', - mfaExpires: '1970-01-01T00:00:33.333Z', - mfaShortToken: '77777', - mfaType: '2fa', - }, - }; - - contextArray = { - type: 'after', - method: 'create', - result: [ - { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: 1, - isVerified: 0, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ], - }; - - contextPaginated = { - type: 'after', - method: 'find', - result: { - data: [ - { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: 1, - isVerified: 0, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ], - }, - }; - }); - - it('converts single object', () => { - const newContext: any = sequelizeConvert(converts)(context); - - assert.deepEqual(newContext.result, { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - - it('uses datetime converter', () => { - const newContext: any = sequelizeConvert(converts, null, { date: convertDatetime })( - contextISO, - ); - - assert.deepEqual(newContext.result, { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - - it('converts array of objects, not paginated', () => { - const newContext: any = sequelizeConvert(converts)(contextArray); - - assert.deepEqual(newContext.result, [ - { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: true, - isVerified: false, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ]); - }); - - it('converts array of objects, paginated', () => { - const newContext: any = sequelizeConvert(converts)(contextPaginated); - - assert.deepEqual(newContext.result.data, [ - { - isInvitation: false, - isVerified: true, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - { - isInvitation: true, - isVerified: false, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: { foo: 'bar', baz: 'bas' }, - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }, - ]); - }); - - it('respects fields to ignore', () => { - const newContext: any = sequelizeConvert(converts, [ - 'isInvitation', - 'isVerified', - 'verifyChanges', - ])(context); - - assert.deepEqual(newContext.result, { - isInvitation: 0, - isVerified: 1, - verifyExpires: 11111, - verifyToken: '00000', - verifyShortToken: '00', - verifyChanges: '{"foo":"bar","baz":"bas"}', - resetExpires: 22222, - resetToken: '99999', - resetShortToken: '99', - mfaExpires: 33333, - mfaShortToken: '77777', - mfaType: '2fa', - }); - }); - }); -}); diff --git a/src/hooks/sequelize-convert/sequelize-convert.ts b/src/hooks/sequelize-convert/sequelize-convert.ts deleted file mode 100755 index 336c2ba6..00000000 --- a/src/hooks/sequelize-convert/sequelize-convert.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { getItems, replaceItems } from '../../utils'; - -export interface SequelizeConversion { - js: (sqlValue: any) => any; - sql: (jsValue: any) => any; -} - -export interface SequelizeConverts { - [name: string]: keyof C | 'boolean' | 'date' | 'json'; -} - -const methodsWithBeforeData = ['create', 'update', 'patch']; -const defaultConversions = { - boolean: { - sql: (boolean: any) => (boolean ? 1 : 0), - js: (numb: any) => !!numb, - }, - date: { - sql: (dateNow: any) => dateNow, - js: (sqlDate: any) => new Date(sqlDate).valueOf() || null, - }, - json: { - sql: (obj: any) => JSON.stringify(obj), - js: (str: any) => JSON.parse(str), - }, -}; - -/** - * @see https://hooks-common.feathersjs.com/hooks.html#sequelizeconvert - */ -export function sequelizeConvert< - C extends { [name: string]: SequelizeConversion }, - H extends HookContext = HookContext, ->( - converts: SequelizeConverts | null | undefined | false, - ignores?: string[] | null | undefined | false, - conversions?: C, -) { - const converter = sequelizeConversion(converts, ignores, conversions); - - return (context: H) => { - if (context.type === 'before' && !methodsWithBeforeData.includes(context.method)) - return context; - - const items = getItems(context); - converter(context.type === 'before' ? 'sql' : 'js', items); - replaceItems(context, items); - - return context; - }; -} - -function sequelizeConversion(converts: any, ignores: any, conversions: Record = {}) { - converts = converts || {}; - ignores = ignores || []; - conversions.boolean = conversions.boolean || defaultConversions.boolean; - conversions.date = conversions.date || defaultConversions.date; - conversions.json = conversions.json || defaultConversions.json; - - const props = Object.keys(converts).filter(name => !ignores.includes(name)); - - return (sqlJs: any, recs: any) => { - recs = Array.isArray(recs) ? recs : [recs]; - - recs.forEach((rec: any) => { - props.forEach(name => { - if (name in rec) { - rec[name] = conversions[converts[name].toLowerCase()][sqlJs](rec[name]); - } - }); - }); - }; -} diff --git a/src/hooks/serialize/serialize.test.ts b/src/hooks/serialize/serialize.test.ts deleted file mode 100755 index d1a97ff4..00000000 --- a/src/hooks/serialize/serialize.test.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { assert } from 'vitest'; -import { serialize } from './serialize'; -import { clone } from '../../common'; - -describe('services serialize', () => { - let hookAfter: any; - let schema: any; - - beforeEach(() => { - hookAfter = { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: {}, - }; - - schema = { - only: ['updatedAt'], - computed: { - commentsCount: (recommendation: any, _hook: any) => recommendation.post.commentsInfo.length, - }, - post: { - exclude: ['id', 'createdAt', 'author', 'readers', '_id'], - authorInfo: { - exclude: ['id', 'password', '_id', 'age'], - computed: { - isUnder18: (authorInfo: any, _hook: any) => authorInfo.age < 18, - }, - }, - readersInfo: { - exclude: 'id', - }, - commentsInfo: { - only: ['title', 'content'], - exclude: 'content', - }, - }, - }; - }); - - it('for one item', () => { - const hook = clone(hookAfter); - hook.result = { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - commentsInfo: [ - { - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - postId: 1, - }, - { - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - postId: 1, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }; - - const hook1 = serialize(schema)(hook); - - assert.deepEqual(hook1, { - type: 'after', - method: 'create', - params: { provider: 'rest' }, - path: 'recommendations', - result: { - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - name: 'Author 1', - email: 'author1@posties.com', - isUnder18: false, - _computed: ['isUnder18'], - }, - commentsInfo: [{ title: 'Comment 1' }, { title: 'Comment 3' }], - readersInfo: [ - { - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - commentsCount: 2, - _computed: ['commentsCount'], - }, - } as any); - }); - - it('schema param is not changed', () => { - const schema1 = (_hook: any) => { - return {}; - }; - - const hook = clone(hookAfter); - hook.result = { - userId: 'as61389dadhga62343hads6712', - postId: 1, - updatedAt: 1480793101475, - _include: ['post'], - _elapsed: { post: 1, total: 1 }, - post: { - id: 1, - title: 'Post 1', - content: 'Lorem ipsum dolor sit amet 4', - author: 'as61389dadhga62343hads6712', - readers: ['as61389dadhga62343hads6712', '167asdf3689348sdad7312131s'], - createdAt: 1480793101559, - _include: ['authorInfo', 'commentsInfo', 'readersInfo'], - _elapsed: { authorInfo: 2, commentsInfo: 2, readersInfo: 2, total: 2 }, - authorInfo: { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - commentsInfo: [ - { - title: 'Comment 1', - content: 'Lorem ipsum dolor sit amet 1', - postId: 1, - }, - { - title: 'Comment 3', - content: 'Lorem ipsum dolor sit amet 3', - postId: 1, - }, - ], - readersInfo: [ - { - id: 'as61389dadhga62343hads6712', - name: 'Author 1', - email: 'author1@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 55, - }, - { - id: '167asdf3689348sdad7312131s', - name: 'Author 2', - email: 'author2@posties.com', - password: '2347wjkadhad8y7t2eeiudhd98eu2rygr', - age: 16, - }, - ], - }, - }; - - assert.equal(typeof schema1, 'function'); - - for (let i = 1; i < 3; i++) { - serialize(schema1)(hook); - assert.equal(typeof schema1, 'function'); - } - - serialize(schema1)(hook); - assert.equal(typeof schema1, 'function'); - }); -}); diff --git a/src/hooks/serialize/serialize.ts b/src/hooks/serialize/serialize.ts deleted file mode 100755 index 66a2ceb2..00000000 --- a/src/hooks/serialize/serialize.ts +++ /dev/null @@ -1,84 +0,0 @@ -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import _omit from 'lodash/omit.js'; - -import { getItems, replaceItems } from '../../utils'; -import type { SyncContextFunction } from '../../types'; -import type { HookContext } from '@feathersjs/feathers'; - -export interface SerializeSchema { - only?: string | string[]; - exclude?: string | string[]; - computed?: { - [propName: string]: (record: any, context: H) => any; - }; - - [key: string]: - | SerializeSchema - | SerializeSchema['computed'] - | string - | string[] - | undefined; -} - -/** - * Prune values from related records. Calculate new values. - * @see https://hooks-common.feathersjs.com/hooks.html#serialize - */ -export function serialize( - schema1: SerializeSchema | SyncContextFunction, -) { - return (context: H) => { - const schema = typeof schema1 === 'function' ? schema1(context) : schema1; - const schemaDirectives = ['computed', 'exclude', 'only']; - - replaceItems(context, serializeItems(getItems(context), schema)); - return context; - - function serializeItems(items: any, schema: any) { - if (!Array.isArray(items)) { - return serializeItem(items, schema); - } - - return items.map(item => serializeItem(item, schema)); - } - - function serializeItem(item: any, schema: any) { - const computed: Record = {}; - Object.keys(schema.computed || {}).forEach(name => { - computed[name] = schema.computed[name](item, context); // needs closure - }); - - let only = schema.only; - only = typeof only === 'string' ? [only] : only; - if (only) { - const newItem = {}; - only.concat('_include', '_elapsed', item._include || []).forEach((key: any) => { - const value = _get(item, key); - if (value !== undefined) { - _set(newItem, key, value); - } - }); - item = newItem; - } - - let exclude = schema.exclude; - exclude = typeof exclude === 'string' ? [exclude] : exclude; - if (exclude) { - item = _omit(item, exclude); - } - - const _computed = Object.keys(computed); - item = Object.assign({}, item, computed, _computed.length ? { _computed } : {}); - - Object.keys(schema).forEach(key => { - if (!schemaDirectives.includes(key) && typeof item[key] === 'object') { - // needs closure - item[key] = serializeItems(item[key], schema[key]); - } - }); - - return item; - } - }; -} diff --git a/src/hooks/set-field/set-field.ts b/src/hooks/set-field/set-field.ts index 3131eabc..e889af82 100644 --- a/src/hooks/set-field/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -3,7 +3,7 @@ import _setWith from 'lodash/setWith.js'; import _clone from 'lodash/clone.js'; import { checkContext } from '../../utils'; import { Forbidden } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; export interface SetFieldOptions { as: string; @@ -17,10 +17,10 @@ export interface SetFieldOptions { */ export const setField = ({ as, from, allowUndefined = false }: SetFieldOptions) => - (context: H) => { + (context: H, next?: NextFunction) => { const { params } = context; - checkContext(context, 'before', null, 'setField'); + checkContext(context, ['before', 'around'], null, 'setField'); const value = _get(context, from); @@ -32,5 +32,9 @@ export const setField = throw new Forbidden(`Expected field ${as} not available`); } - return _setWith(context, as, value, _clone); + context = _setWith(context, as, value, _clone); + + if (next) return next().then(() => context); + + return context; }; diff --git a/src/hooks/set-now/set-now.test.ts b/src/hooks/set-now/set-now.test.ts deleted file mode 100755 index e98b2917..00000000 --- a/src/hooks/set-now/set-now.test.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { assert } from 'vitest'; -import { setNow } from './set-now'; - -let hookBefore: any; -let hookBefore2: any; -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; - -describe('services setNow', () => { - describe('updated fields', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - result: { - total: 2, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }, - }; - hookFind = { - type: 'after', - method: 'find', - result: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - ], - }; - }); - - it('updates hook before::create', () => { - setNow('createdAt')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt'); - }); - - it('updates hook after::find with pagination', () => { - setNow('createdAt')(hookFindPaginate); - - checkHook(hookFindPaginate.result.data[0], { first: 'John', last: 'Doe' }, 'createdAt'); - checkHook(hookFindPaginate.result.data[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); - - it('updates hook after::find with no pagination', () => { - setNow('createdAt')(hookFind); - checkHook(hookFind.result[0], { first: 'John', last: 'Doe' }, 'createdAt'); - checkHook(hookFind.result[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); - - it('updates hook after', () => { - setNow('createdAt')(hookAfter); - checkHook(hookAfter.result, { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); - - it('supports field name', () => { - setNow('createdAt2')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt2'); - }); - - it('supports multiple field names', () => { - setNow('createdAt1', 'createdAt2')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, ['createdAt1', 'createdAt2']); - }); - - it('requires field name', () => { - assert.throws(() => { - setNow()(hookBefore); - }); - }); - }); - - describe('handles dot notation', () => { - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - hookBefore2 = { - type: 'before', - method: 'create', - data: { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - created: { where: 'NYC' }, - }, - }; - }); - - it('prop with no dots', () => { - setNow('madeAt')(hookBefore); - checkHook( - hookBefore.data, - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - 'madeAt', - ); - }); - - it('props with no dots', () => { - setNow('madeAt', 'builtAt')(hookBefore); - checkHook( - hookBefore.data, - { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - ['madeAt', 'builtAt'], - ); - }); - - it('prop with 1 dot', () => { - setNow('created.at')(hookBefore); - assert.instanceOf(hookBefore.data.created.at, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore.data.created).length, 1); - delete hookBefore.data.created; - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - - it('prop with 1 dot in existing obj', () => { - setNow('created.at')(hookBefore2); - assert.instanceOf(hookBefore2.data.created.at, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore2.data.created).length, 2); - delete hookBefore2.data.created.at; - assert.deepEqual(hookBefore2.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - created: { where: 'NYC' }, - }); - }); - - it('prop with 2 dots', () => { - setNow('created.at.time')(hookBefore); - assert.instanceOf(hookBefore.data.created.at.time, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore.data.created.at).length, 1); - assert.equal(Object.keys(hookBefore.data.created).length, 1); - delete hookBefore.data.created; - assert.deepEqual(hookBefore.data, { - empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - dept: 'Acct', - }); - }); - }); - - describe('time advances', () => { - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - }); - - it('for 2 hooks', () => - new Promise(resolve => { - setNow('createdAt')(hookBefore); - const firstTime = hookBefore.data.createdAt; - - setTimeout(() => { - setNow('createdAt')(hookBefore); - assert.isAbove(hookBefore.data.createdAt.getTime(), firstTime.getTime()); - resolve(); - }, 50); - })); - }); -}); - -// Helpers - -function checkHook(item: any, template: any, dateFields: any) { - const item1 = structuredClone(item); - if (typeof dateFields === 'string') { - dateFields = [dateFields]; - } - - dateFields.forEach((dateField: any) => { - assert.instanceOf(item[dateField], Date, 'not instance of Date'); - item1[dateField] = undefined; - delete item1[dateField]; - }); - - assert.deepEqual(item1, template, 'objects differ'); -} diff --git a/src/hooks/set-now/set-now.ts b/src/hooks/set-now/set-now.ts deleted file mode 100755 index d67126dd..00000000 --- a/src/hooks/set-now/set-now.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import { setFields } from '../../common'; -import { getItems } from '../../utils'; - -/** - * Create/update certain fields to the current date-time. - * - * @see https://hooks-common.feathersjs.com/hooks.html#setnow - * - * @deprecated Use `setNowData` or `setNowResult` instead. - */ -export function setNow(...fieldNames: string[]) { - if (!fieldNames.length) { - throw new BadRequest('Field name is required. (setNow)'); - } - - return (context: H) => { - setFields(getItems(context), () => new Date(), fieldNames, 'setNow'); - return context; - }; -} diff --git a/src/hooks/set-slug/set-slug.ts b/src/hooks/set-slug/set-slug.ts index caeeff61..b31d81a7 100755 --- a/src/hooks/set-slug/set-slug.ts +++ b/src/hooks/set-slug/set-slug.ts @@ -1,5 +1,5 @@ import _set from 'lodash/set.js'; -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; /** * Fix slugs in URL, e.g. /stores/:storeId. @@ -8,7 +8,7 @@ import type { HookContext } from '@feathersjs/feathers'; */ export const setSlug = (slug: string, fieldName?: string) => - (context: H) => { + (context: H, next?: NextFunction) => { if (typeof fieldName !== 'string') { fieldName = `query.${slug}`; } @@ -19,4 +19,8 @@ export const setSlug = _set(context.params, fieldName, value); } } + + if (next) return next().then(() => context); + + return context; }; diff --git a/src/hooks/sifter/sifter.ts b/src/hooks/sifter/sifter.ts index e75712af..fb4634bb 100755 --- a/src/hooks/sifter/sifter.ts +++ b/src/hooks/sifter/sifter.ts @@ -1,15 +1,14 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import type { SyncContextFunction } from '../../types'; import { replaceResult } from '../../utils/replace-items/replace-result'; export const sifter = (siftFunc: SyncContextFunction<(item: any) => boolean, H>) => - (context: H) => { + async (context: H, next?: NextFunction) => { const sifter = siftFunc(context); - if (typeof sifter !== 'function') { - throw new BadRequest('The result of calling the sifter param must be a function. (sifter)'); + if (next) { + await next(); } return replaceResult(context, item => item, { diff --git a/src/hooks/soft-delete/soft-delete.ts b/src/hooks/soft-delete/soft-delete.ts index 49bbfaec..42ad3437 100755 --- a/src/hooks/soft-delete/soft-delete.ts +++ b/src/hooks/soft-delete/soft-delete.ts @@ -10,11 +10,11 @@ export type SoftDeleteOptionFunction = ( export interface SoftDeleteOptions { /** - * @default { deleted: { $ne: true } } + * @default { deletedAt: { $ne: true } } */ deletedQuery?: { [key: string]: any } | SoftDeleteOptionFunction; /** - * @default { deleted: true } + * @default { deletedAt: new Date() } */ removeData?: { [key: string]: any } | SoftDeleteOptionFunction; /** @@ -28,8 +28,8 @@ export interface SoftDeleteOptions { disableSoftDeleteKey?: string; } -const defaultQuery = { deleted: { $ne: true } }; -const defaultData = { deleted: true }; +const defaultQuery = () => ({ deletedAt: { $ne: true } }); +const defaultData = () => ({ deletedAt: new Date() }); /** * Allow to mark items as deleted instead of removing them. diff --git a/src/hooks/stash-before/stash-before.ts b/src/hooks/stash-before/stash-before.ts index 2cd8a626..ee6411ec 100755 --- a/src/hooks/stash-before/stash-before.ts +++ b/src/hooks/stash-before/stash-before.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers'; import { checkContext } from '../../utils'; /** @@ -8,7 +8,7 @@ import { checkContext } from '../../utils'; export function stashBefore(fieldName?: string) { const beforeField = fieldName || 'before'; - return (context: H) => { + return async (context: H, next?: NextFunction) => { if (context.params.disableStashBefore) { return context; } @@ -23,7 +23,7 @@ export function stashBefore(fieldName?: str ...(isMulti ? { paginate: false } : {}), }; - return (!isMulti ? context.service.get(context.id, params) : context.service.find(params)) + await (!isMulti ? context.service.get(context.id, params) : context.service.find(params)) .then((result: any) => { context.params[beforeField] = result; return context; @@ -31,5 +31,11 @@ export function stashBefore(fieldName?: str .catch(() => { return context; }); + + if (next) { + return await next(); + } + + return context; }; } diff --git a/src/hooks/throw-if/throw-if-is-multi.ts b/src/hooks/throw-if/throw-if-is-multi.ts index d9323d85..15e0edce 100644 --- a/src/hooks/throw-if/throw-if-is-multi.ts +++ b/src/hooks/throw-if/throw-if-is-multi.ts @@ -1,7 +1,8 @@ -import { HookContext } from '@feathersjs/feathers'; -import { checkContext, isMulti } from '../../utils'; +import { HookContext, NextFunction } from '@feathersjs/feathers'; +import { checkContext } from '../../utils'; import { PredicateFn } from '../../types'; import { BadRequest, type FeathersError } from '@feathersjs/errors'; +import { isMulti } from '../../predicates'; export type ThrowIfIsMultiOptions = { filter?: PredicateFn; @@ -11,8 +12,8 @@ export type ThrowIfIsMultiOptions = { export const throwIfIsMulti = ( options?: ThrowIfIsMultiOptions, ) => { - return async (context: H) => { - checkContext(context, 'before', ['create', 'patch', 'remove'], 'throwIfIsMulti'); + return async (context: H, next?: NextFunction) => { + checkContext(context, ['before', 'around'], ['create', 'patch', 'remove'], 'throwIfIsMulti'); if (!isMulti(context)) { return context; @@ -21,5 +22,11 @@ export const throwIfIsMulti = ( if (!options?.filter || (await options.filter(context))) { throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); } + + if (next) { + await next(); + } + + return context; }; }; diff --git a/src/hooks/throw-if/throw-if.ts b/src/hooks/throw-if/throw-if.ts index 0d52a3ee..5e4756f9 100644 --- a/src/hooks/throw-if/throw-if.ts +++ b/src/hooks/throw-if/throw-if.ts @@ -1,4 +1,4 @@ -import { HookContext } from '@feathersjs/feathers'; +import { HookContext, NextFunction } from '@feathersjs/feathers'; import { PredicateFn } from '../../types'; import { BadRequest } from '@feathersjs/errors'; import type { FeathersError } from '@feathersjs/errors'; @@ -11,11 +11,17 @@ export const throwIf = ( predicate: PredicateFn, options?: ThrowIfOptions, ) => { - return async (context: H) => { + return async (context: H, next?: NextFunction) => { const result = await predicate(context); if (result) { throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); } + + if (next) { + await next(); + } + + return context; }; }; diff --git a/src/hooks/validate-schema/validate-schema.test.ts b/src/hooks/validate-schema/validate-schema.test.ts deleted file mode 100755 index 8471a2fa..00000000 --- a/src/hooks/validate-schema/validate-schema.test.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { assert, expect } from 'vitest'; - -import { validateSchema } from './validate-schema'; - -import Ajv from 'ajv'; - -const ajv = new Ajv({ allErrors: true }); -ajv.addFormat('startWithJo', '^Jo'); -ajv.addSchema({ - $id: 'syncSchema', - properties: { - first: { type: 'string', format: 'startWithJo' }, - last: { type: 'string' }, - nested: { - type: 'object', - additionalProperties: false, - }, - }, - required: ['first', 'last'], -}); - -describe('services validateSchema', () => { - let hookBefore: any; - let hookBeforeArray: any; - let hookBeforeArrayForAjvInstance: any; - let schema: any; - let schemaForAjvInstance: any; - let asyncSchema: any; - let ajvAsync: any; - - beforeEach(() => { - hookBefore = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: { first: 'John', last: 'Doe' }, - }; - hookBeforeArray = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Jane', last: 'Doe' }, - { first: 'Joe', last: 'Doe' }, - ], - }; - hookBeforeArrayForAjvInstance = { - type: 'before', - method: 'create', - params: { provider: 'rest' }, - data: [ - { first: 'John', last: 'Doe' }, - { first: 'Josh', last: 'Doe' }, - { first: 'Joe', last: 'Doe' }, - ], - }; - schema = { - properties: { - first: { type: 'string' }, - last: { type: 'string' }, - nested: { - additionalProperties: false, - }, - }, - required: ['first', 'last'], - }; - schemaForAjvInstance = { - properties: { - first: { type: 'string', format: 'startWithJo' }, - last: { type: 'string' }, - nested: { - additionalProperties: false, - }, - }, - required: ['first', 'last'], - }; - }); - - describe('Sync validation', () => { - beforeEach(() => { - schema = { - properties: { - first: { type: 'string' }, - last: { type: 'string' }, - }, - required: ['first', 'last'], - }; - }); - - it('works with valid single item', () => { - validateSchema(schema, Ajv)(hookBefore); - }); - - it('works with array of valid items', () => { - validateSchema(schema, Ajv)(hookBeforeArray); - }); - - it('works with valid single item when ajv instance is passed', () => { - validateSchema(schemaForAjvInstance, ajv)(hookBefore); - }); - - it('works with array of valid items when ajv instance is passed', () => { - validateSchema(schemaForAjvInstance, ajv)(hookBeforeArrayForAjvInstance); - }); - - it('works with valid single item with existing schema in ajv instance', () => { - validateSchema('syncSchema', ajv)(hookBefore); - }); - - it('works with array of valid items with existing schema in ajv instance', () => { - validateSchema('syncSchema', ajv)(hookBeforeArrayForAjvInstance); - }); - - it('fails with in valid single item', () => { - hookBefore.data = { first: 1 }; - - try { - validateSchema(schema, Ajv)(hookBefore); - assert.fail('test succeeds unexpectedly'); - } catch (err: any) { - assert.deepEqual(err.errors, [ - "'first' should be string", - "should have required property 'last'", - ]); - } - }); - - it('fails with array of invalid items', () => { - hookBeforeArray.data[0] = { first: 1 }; - delete hookBeforeArray.data[2].last; - - try { - validateSchema(schema, Ajv)(hookBeforeArray); - assert.fail('test succeeds unexpectedly'); - } catch (err: any) { - assert.deepEqual(err.errors, [ - "'in row 1 of 3, first' should be string", - "in row 1 of 3, should have required property 'last'", - "in row 3 of 3, should have required property 'last'", - ]); - } - }); - it('fails with invalid single item when ajv instance is passed', () => { - hookBefore.data = { first: 'Jane' }; - - try { - validateSchema(schemaForAjvInstance, ajv)(hookBefore); - assert.fail('test succeeds unexpectedly'); - } catch (err: any) { - assert.deepEqual(err.errors, [ - '\'first\' should match format "startWithJo"', - "should have required property 'last'", - ]); - } - }); - - it('fails with array of invalid items when ajv instance is passed', () => { - hookBeforeArray.data[0] = { first: 'Jane' }; - delete hookBeforeArray.data[2].last; - - try { - validateSchema(schemaForAjvInstance, ajv)(hookBeforeArray); - assert.fail('test succeeds unexpectedly'); - } catch (err: any) { - assert.deepEqual(err.errors, [ - '\'in row 1 of 3, first\' should match format "startWithJo"', - "in row 1 of 3, should have required property 'last'", - '\'in row 2 of 3, first\' should match format "startWithJo"', - "in row 3 of 3, should have required property 'last'", - ]); - } - }); - - it('properly displays incorrect additional properties in nested objects', () => { - hookBefore.data.nested = { foo: 'bar' }; - - try { - validateSchema(schemaForAjvInstance, ajv)(hookBefore); - assert.fail('test succeeds unexpectedly'); - } catch (err: any) { - assert.deepEqual(err.errors, ["'nested' should NOT have additional properties: 'foo'"]); - } - }); - }); - - describe('Async validation', () => { - beforeAll(() => { - ajvAsync = new Ajv({ allErrors: true }); - - ajvAsync.addKeyword('equalsDoe', { - async: true, - schema: false, - validate: (item: any) => - new Promise((resolve, reject) => { - setTimeout(() => { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - item === 'Doe' - ? resolve(true) - : // @ts-ignore - reject(new Ajv.ValidationError([{ message: 'should be Doe' }])); - }, 50); - }), - }); - - ajvAsync.addFormat('3or4chars', { - async: true, - validate: (item: any) => - new Promise((resolve, _reject) => { - setTimeout(() => { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - item.length === 3 || item.length === 4 ? resolve(true) : resolve(false); - }, 50); - }), - }); - - ajvAsync.addSchema({ - $id: 'asyncSchema', - $async: true, - properties: { - first: { - type: 'string', - format: '3or4chars', - }, - last: { - type: 'string', - equalsDoe: true, - }, - }, - required: ['first', 'last'], - }); - }); - - beforeEach(() => { - asyncSchema = { - $async: true, - properties: { - first: { - type: 'string', - format: '3or4chars', - }, - last: { - type: 'string', - equalsDoe: true, - }, - }, - required: ['first', 'last'], - }; - }); - - it('works with string schema id', async () => { - await validateSchema('asyncSchema', ajvAsync)(hookBefore); - }); - - it('works with valid single item', async () => { - await validateSchema(asyncSchema, ajvAsync)(hookBefore); - }); - - it('works with array of valid items', async () => { - await validateSchema(asyncSchema, ajvAsync)(hookBeforeArray); - }); - - it('fails with in valid single item', async () => { - hookBefore.data = { first: '1' }; - - await expect(validateSchema(asyncSchema, ajvAsync)(hookBefore)).rejects.toSatisfy( - (err: any) => { - assert.deepEqual(err.errors, [ - '\'first\' should match format "3or4chars"', - "should have required property 'last'", - ]); - return true; - }, - ); - }); - - it('fails with array of invalid items', async () => { - hookBeforeArray.data[0].last = 'not Doe'; - delete hookBeforeArray.data[2].last; - - await expect(validateSchema(asyncSchema, ajvAsync)(hookBeforeArray)).rejects.toSatisfy( - (err: any) => { - assert.deepEqual(err.errors, [ - "in row 3 of 3, should have required property 'last'", - "'in row 1 of 3, last' should be Doe", - ]); - return true; - }, - ); - }); - }); -}); diff --git a/src/hooks/validate-schema/validate-schema.ts b/src/hooks/validate-schema/validate-schema.ts deleted file mode 100755 index 54297cc0..00000000 --- a/src/hooks/validate-schema/validate-schema.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import type { AjvOrNewable, ValidateSchemaOptions } from '../validate/validate'; -import { getItems } from '../../utils'; - -/** - * Validate data using JSON-Schema. - * @see https://hooks-common.feathersjs.com/hooks.html#validateschema - */ -export function validateSchema( - schema: object | string, - ajvOrAjv: AjvOrNewable, - // @ts-expect-error TODO - options: ValidateSchemaOptions = { allErrors: true }, -) { - const addNewError = options?.addNewError || addNewErrorDflt; - // delete options.addNewError; - // TODO: Any better way to tell if ajvOrAjv is an instance or a constructor? - let ajv: any; - let Ajv; - // @ts-expect-error TODO - if (typeof ajvOrAjv.addKeyword !== 'function') { - Ajv = ajvOrAjv; - // @ts-expect-error TODO - ajv = new Ajv(options); - } else { - ajv = ajvOrAjv; - } - const validate = typeof schema === 'string' ? ajv.getSchema(schema) : ajv.compile(schema); // for fastest execution - - return (context: H) => { - const items = getItems(context); - const itemsArray = Array.isArray(items) ? items : [items]; - const itemsLen = itemsArray.length; - let errorMessages: any = null; - let invalid = false; - - if (validate.schema.$async) { - return Promise.all( - itemsArray.map((item, index) => { - return validate(item).catch((err: any) => { - if (!(err instanceof ajv.constructor.ValidationError)) throw err; - - invalid = true; - - addErrors(err.errors, index); - }); - }), - ).then(() => { - if (invalid) { - throw new BadRequest('Data does not match schema', { errors: errorMessages }); - } - }); - } - - itemsArray.forEach((item, index) => { - if (!validate(item)) { - invalid = true; - - addErrors(validate.errors, index); - } - }); - - if (invalid) { - throw new BadRequest('Data does not match schema', { errors: errorMessages }); - } - - function addErrors(errors: any, index: any) { - errors.forEach((ajvError: any) => { - errorMessages = addNewError(errorMessages, ajvError, itemsLen, index); - }); - } - - return context; - }; -} - -function addNewErrorDflt(errorMessages: any, ajvError: any, itemsLen: any, index: any) { - const leader = itemsLen === 1 ? '' : `in row ${index + 1} of ${itemsLen}, `; - let message; - - if (ajvError.dataPath) { - message = `'${leader}${ajvError.dataPath.substring(1)}' ${ajvError.message}`; - } else { - message = `${leader}${ajvError.message}`; - } - - if (ajvError.params && ajvError.params.additionalProperty) { - message += `: '${ajvError.params.additionalProperty}'`; - } - - return (errorMessages || []).concat(message); -} diff --git a/src/hooks/validate/validate.test.ts b/src/hooks/validate/validate.test.ts deleted file mode 100755 index 4b5e8557..00000000 --- a/src/hooks/validate/validate.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { assert, expect } from 'vitest'; -import { validate } from './validate'; -import { BadRequest } from '@feathersjs/errors'; -import { clone } from '../../common'; - -let fcnSync: any; -let fcnPromise: any; -let fcnPromiseSanitize: any; -let origHookOk: any; -let origHookBad: any; -let hookOk: any; -let hookBad: any; -let fcnHook: any; - -describe('services validate', () => { - origHookOk = { type: 'before', method: 'create', data: { email: ' a@a.com ' } }; - origHookBad = { type: 'before', method: 'create', data: { email: '' } }; - - describe('Sync function', () => { - beforeEach(() => { - hookOk = clone(origHookOk); - hookBad = clone(origHookBad); - fcnHook = {}; - - fcnSync = (values: any, hook: any) => { - fcnHook = hook; - - return values.email.trim() ? null : { email: 'Email is invalid' }; - }; - }); - - it('test passes on correct data', () => { - const hook = validate(fcnSync)(hookOk); - assert.deepEqual(hook, origHookOk); - assert.deepEqual(fcnHook, origHookOk); - }); - - it('test fails on errors', () => { - assert.throws(() => validate(fcnSync)(hookBad)); - }); - }); - - describe('Promise function', () => { - beforeEach(() => { - hookOk = clone(origHookOk); - hookBad = clone(origHookBad); - fcnHook = {}; - - fcnPromise = (values: any, hook: any) => { - fcnHook = hook; - - return new Promise((resolve, reject) => { - setTimeout(() => { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - values.email.trim() - ? resolve() - : // @ts-ignore - reject(new BadRequest({ email: 'Email is invalid' })); - }, 100); - }); - }; - - fcnPromiseSanitize = (values: any) => - new Promise((resolve, reject) => { - setTimeout(() => { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - values.email.trim() - ? resolve(Object.assign(values, { email: values.email.trim() })) - : // @ts-ignore - reject(new BadRequest({ email: 'Email is invalid' })); - }, 100); - }); - }); - - it('test passes on correct data', async () => { - const result = await validate(fcnPromise)(hookOk); - - assert.deepEqual(result, origHookOk); - assert.deepEqual(fcnHook, origHookOk); - }); - - it('test can sanitize correct data', async () => { - const result = await validate(fcnPromiseSanitize)(hookOk); - - assert.equal(result.data.email, 'a@a.com'); - }); - - it('test fails on errors', async () => { - await expect(validate(fcnPromiseSanitize)(hookBad)).rejects.toThrow(); - }); - }); -}); diff --git a/src/hooks/validate/validate.ts b/src/hooks/validate/validate.ts deleted file mode 100755 index 89628044..00000000 --- a/src/hooks/validate/validate.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import type { Ajv, ErrorObject as ajvErrorObject, Options as AjvOptions } from 'ajv'; -import { isPromise } from '../../common'; -import { checkContext, getItems, replaceItems } from '../../utils'; - -export type SyncValidatorFn = ( - values: any, - context: H, -) => { [key: string]: string } | null; -export type AsyncValidatorFn = ( - values: any, - context: H, -) => Promise; -export type ValidatorFn = - | SyncValidatorFn - | AsyncValidatorFn; - -export type AjvOrNewable = Ajv | (new (options?: AjvOptions) => Ajv); - -export interface ValidateSchemaOptions extends AjvOptions { - /** - * The hook will throw if the data does not match the JSON-Schema. error.errors will, by default, contain an array - * of error messages. You may change this with a custom formatting function. Its a reducing function which works - * similarly to Array.reduce(). - */ - addNewError: ( - currentFormattedMessages: any, - ajvErrorObject: ajvErrorObject, - itemsLen: number, - itemIndex: number, - ) => any; -} - -/** - * Validate data using a validation function. - * @see https://hooks-common.feathersjs.com/hooks.html#validate - */ -export function validate(validator: ValidatorFn) { - return (context: H) => { - checkContext(context, 'before', ['create', 'update', 'patch'], 'validate'); - - if (typeof validator !== 'function') { - throw new BadRequest('Expected validator function. (validate)'); - } - - const results = validator(getItems(context), context); - - if (isPromise(results)) { - return results.then((convertedValues: any) => { - if (convertedValues) { - // if values have been sanitized - replaceItems(context, convertedValues); - } - - return context; - }); - } - - // Sync function returns errors. It cannot sanitize. - if (results && Object.keys(results).length) { - throw new BadRequest({ errors: results }); - } - - return context; - }; -} diff --git a/src/predicates/not/not.ts b/src/predicates/not/not.ts index 6de6a03f..785fbca7 100755 --- a/src/predicates/not/not.ts +++ b/src/predicates/not/not.ts @@ -18,6 +18,3 @@ export const not = return result.then(result1 => !result1); }; - -// alias -export { not as isNot }; diff --git a/src/utils/get-exposed-methods/get-exposed-methods.ts b/src/utils/get-exposed-methods/get-exposed-methods.ts new file mode 100644 index 00000000..17ac30db --- /dev/null +++ b/src/utils/get-exposed-methods/get-exposed-methods.ts @@ -0,0 +1,11 @@ +import { Service, SERVICE } from '@feathersjs/feathers'; + +export function getExposedMethods(service: Service) { + const result = (service as any)[SERVICE].methods; + + if (!result || !Array.isArray(result)) { + throw new Error(`Service does not have exposed methods`); + } + + return result; +} From ad7e49bdd272724f6ef8c0d630e721993ab7bee4 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:29:49 +0200 Subject: [PATCH 07/15] WIP --- .nvmrc | 2 +- .nycrc | 21 - LICENSE | 2 +- README.md | 12 +- docs/.vitepress/config.mts | 16 +- docs/.vitepress/meta.ts | 8 +- docs/.vitepress/theme/index.ts | 6 +- docs/guides.md | 267 +- docs/hooks.md | 424 +- docs/utilities.md | 77 +- eslint.config.mjs | 53 +- package-lock.json | 6082 +++++++++-------- package.json | 22 +- src/common/clone.ts | 2 +- src/common/index.ts | 10 +- src/common/set-fields.ts | 15 +- src/common/transform-items.ts | 10 +- src/common/traverse.ts | 8 +- src/hooks/cache/cache.test.ts | 368 +- src/hooks/cache/cache.ts | 78 +- .../check-required/check-required.test.ts | 34 +- src/hooks/check-required/check-required.ts | 33 +- .../create-related/create-related.test.ts | 118 +- src/hooks/create-related/create-related.ts | 36 +- src/hooks/debug/debug.test.ts | 16 +- src/hooks/debug/debug.ts | 32 +- .../disable-pagination.test.ts | 44 +- .../disable-pagination/disable-pagination.ts | 18 +- src/hooks/disallow/disallow.test.ts | 174 +- src/hooks/disallow/disallow.ts | 29 +- src/hooks/iff/iff-else.test.ts | 339 +- src/hooks/iff/iff-else.ts | 30 +- src/hooks/iff/iff.test.ts | 466 +- src/hooks/iff/iff.ts | 20 +- src/hooks/iff/unless.test.ts | 460 +- src/hooks/iff/unless.ts | 8 +- src/hooks/index.ts | 90 +- src/hooks/lowercase/lowercase-data.test.ts | 88 +- src/hooks/lowercase/lowercase-data.ts | 29 +- src/hooks/lowercase/lowercase-result.test.ts | 32 +- src/hooks/lowercase/lowercase-result.ts | 37 +- src/hooks/omit/omit-data-1.test.ts | 46 +- src/hooks/omit/omit-data.test.ts | 72 +- src/hooks/omit/omit-data.ts | 9 +- .../{omit-query => omit}/omit-query.test.ts | 72 +- src/hooks/{omit-query => omit}/omit-query.ts | 15 +- src/hooks/omit/omit-result-1.test.ts | 44 +- src/hooks/omit/omit-result-2.test.ts | 44 +- src/hooks/omit/omit-result.test.ts | 66 +- src/hooks/omit/omit-result.ts | 15 +- src/hooks/on-delete/on-delete.test.ts | 278 +- src/hooks/on-delete/on-delete.ts | 60 +- .../params-for-server.test.ts | 14 +- .../params-for-server/params-for-server.ts | 37 +- .../params-from-client.test.ts | 14 +- .../params-from-client/params-from-client.ts | 37 +- src/hooks/pick/pick-data.test.ts | 110 +- src/hooks/pick/pick-data.ts | 19 +- .../{pick-query => pick}/pick-query.test.ts | 78 +- src/hooks/{pick-query => pick}/pick-query.ts | 21 +- src/hooks/pick/pick-result.test.ts | 60 +- src/hooks/pick/pick-result.ts | 25 +- .../prevent-changes/prevent-changes.test.ts | 84 +- src/hooks/prevent-changes/prevent-changes.ts | 34 +- src/hooks/run-parallel/run-parallel.test.ts | 64 +- src/hooks/run-parallel/run-parallel.ts | 14 +- src/hooks/set-field/set-field.test.ts | 74 +- src/hooks/set-field/set-field.ts | 36 +- src/hooks/set-now/set-now-data.test.ts | 126 +- src/hooks/set-now/set-now-data.ts | 12 +- src/hooks/set-now/set-now-result.test.ts | 58 +- src/hooks/set-now/set-now-result.ts | 25 +- src/hooks/set-slug/set-slug.test.ts | 68 +- src/hooks/set-slug/set-slug.ts | 16 +- src/hooks/sifter/sifter.test.ts | 48 +- src/hooks/sifter/sifter.ts | 14 +- src/hooks/soft-delete/soft-delete.test.ts | 156 +- src/hooks/soft-delete/soft-delete.ts | 56 +- src/hooks/stash-before/stash-before.test.ts | 107 +- src/hooks/stash-before/stash-before.ts | 28 +- src/hooks/throw-if/throw-if-is-multi.ts | 30 +- src/hooks/throw-if/throw-if-is-provider.ts | 21 +- src/hooks/throw-if/throw-if.ts | 24 +- .../transform-data.test.ts} | 100 +- .../transform-data.ts} | 20 +- .../transform-result.test.ts} | 178 +- .../transform-result.ts} | 26 +- src/hooks/traverse/traverse.test.ts | 109 +- src/hooks/traverse/traverse.ts | 16 +- src/index.ts | 8 +- src/internal.utils.ts | 12 +- src/predicates/every/every.test.ts | 107 +- src/predicates/every/every.ts | 22 +- src/predicates/index.ts | 14 +- src/predicates/is-context/is-context.ts | 31 +- src/predicates/is-multi/is-multi.test.ts | 54 +- src/predicates/is-multi/is-multi.ts | 16 +- .../is-paginated/is-paginated.test.ts | 38 +- src/predicates/is-paginated/is-paginated.ts | 12 +- .../is-provider/is-provider.test.ts | 148 +- src/predicates/is-provider/is-provider.ts | 14 +- src/predicates/not/not.test.ts | 138 +- src/predicates/not/not.ts | 14 +- src/predicates/some/some.test.ts | 42 +- src/predicates/some/some.ts | 24 +- src/resolvers/index.ts | 3 + src/{hooks => }/resolvers/resolve-data.ts | 17 +- src/{hooks => }/resolvers/resolve-query.ts | 14 +- src/{hooks => }/resolvers/resolve-result.ts | 29 +- src/{hooks => }/resolvers/resolver.test.ts | 70 +- .../resolvers/resolvers.internal.ts | 86 +- src/types.ts | 34 +- .../calling-params/calling-params-1.test.ts | 174 +- .../calling-params/calling-params-2.test.ts | 64 +- src/utils/calling-params/calling-params.ts | 72 +- src/utils/check-context-if.ts | 10 +- src/utils/check-context/check-context.test.ts | 72 +- src/utils/check-context/check-context.ts | 8 +- src/utils/combine/combine.test.ts | 120 +- src/utils/combine/combine.ts | 38 +- .../get-data-is-array.test.ts | 22 +- .../get-data-is-array/get-data-is-array.ts | 8 +- .../get-exposed-methods.ts | 9 +- src/utils/get-items/get-items.test.ts | 38 +- src/utils/get-items/get-items.ts | 8 +- src/utils/get-paginate/get-paginate.test.ts | 38 +- src/utils/get-paginate/get-paginate.ts | 18 +- .../get-result-is-array.test.ts | 84 +- .../get-result-is-array.ts | 22 +- src/utils/index.ts | 28 +- .../params-for-server.test.ts | 42 +- .../params-for-server/params-for-server.ts | 18 +- src/utils/replace-items/replace-data.ts | 32 +- src/utils/replace-items/replace-items.test.ts | 137 +- src/utils/replace-items/replace-items.ts | 14 +- .../replace-items/replace-result.test.ts | 120 +- src/utils/replace-items/replace-result.ts | 56 +- src/utils/run-hook/run-hook.test.ts | 121 - src/utils/run-hook/run-hook.ts | 38 - src/utils/skip-result/skip-result.test.ts | 152 +- src/utils/skip-result/skip-result.ts | 18 +- .../transform-params/transform-params.ts | 12 +- test/index.test.ts | 17 +- tsconfig.eslint.json | 12 + tsconfig.json | 14 +- tsdown.config.ts | 35 + vite.config.ts | 4 +- 147 files changed, 7512 insertions(+), 7406 deletions(-) delete mode 100644 .nycrc rename src/hooks/{omit-query => omit}/omit-query.test.ts (72%) rename src/hooks/{omit-query => omit}/omit-query.ts (57%) rename src/hooks/{pick-query => pick}/pick-query.test.ts (65%) rename src/hooks/{pick-query => pick}/pick-query.ts (60%) rename src/hooks/{alter-items/alter-data.test.ts => transform/transform-data.test.ts} (53%) rename src/hooks/{alter-items/alter-data.ts => transform/transform-data.ts} (67%) rename src/hooks/{alter-items/alter-result.test.ts => transform/transform-result.test.ts} (64%) rename src/hooks/{alter-items/alter-result.ts => transform/transform-result.ts} (59%) create mode 100644 src/resolvers/index.ts rename src/{hooks => }/resolvers/resolve-data.ts (68%) rename src/{hooks => }/resolvers/resolve-query.ts (59%) rename src/{hooks => }/resolvers/resolve-result.ts (61%) rename src/{hooks => }/resolvers/resolver.test.ts (61%) rename src/{hooks => }/resolvers/resolvers.internal.ts (68%) delete mode 100755 src/utils/run-hook/run-hook.test.ts delete mode 100755 src/utils/run-hook/run-hook.ts create mode 100644 tsconfig.eslint.json create mode 100644 tsdown.config.ts diff --git a/.nvmrc b/.nvmrc index 1efe0ac6..517f3866 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.15.1 +v22.14.0 diff --git a/.nycrc b/.nycrc deleted file mode 100644 index 2e76e8e8..00000000 --- a/.nycrc +++ /dev/null @@ -1,21 +0,0 @@ -{ - "all": true, - "include": [ - "src/**/*.js", - "src/**/*.ts" - ], - "exclude": [ - "coverage/**", - "node_modules/**", - "**/*.d.ts", - "**/*.test.ts" - ], - "sourceMap": true, - "reporter": ["text", "html", "lcov"], - "watermarks": { - "statements": [50, 80], - "lines": [50, 80], - "functions": [50, 80], - "branches": [50, 80] - } -} diff --git a/LICENSE b/LICENSE index b8be257c..9d988b48 100755 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2022 Feathers +Copyright (c) 2025 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 diff --git a/README.md b/README.md index df2ff069..dfad3a09 100755 --- a/README.md +++ b/README.md @@ -2,20 +2,27 @@ #### hooks -- added alterData, alterResult, rm alterItems +- added transformData, transformResult, rm alterItems - added discardData, discardResult, rm discard - moved to omitData, omitResult, rm omit + - MaybeArray - added keepData, keepResult, rm keep - moved to pickData, pickResult, rm pick + - MaybeArray - added lowercaseData, lowercaseResult, rm lowercase + - MaybeArray - added setNowData, setNowResult, rm setNow - removed several checks that are handled by typescript - removed check for `preventChanges(true, ...fieldNames)` + - switch `true` to second argument + - renamed 'keepQuery' to 'pickQuery', added alias - renamed 'required' to 'checkRequired', added alias +- removed 'actOn', 'actOnDefault', 'actOnDispatch' + - added throwIf - added throwIfIsProvider - added throwIfIsMulti @@ -27,6 +34,8 @@ - softDelete: added 'transformParams' & added 'key' option +- disallow: MaybeArray + - rm support for spread argument - rm 'actOnDispatch' & 'actOnDefault' @@ -44,6 +53,7 @@ - added replaceData, replaceResult, deprecated replaceItems - added util getPaginate - added util skipResult +- rm 'runHook' ### Hooks to discuss diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 616d2571..1483ae05 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,9 +1,9 @@ -import { defineConfig } from 'vitepress'; -import { name, description, ogUrl, ogImage } from './meta'; -import { version } from '../../package.json'; +import { defineConfig } from 'vitepress' +import { name, description, ogUrl, ogImage } from './meta' +import { version } from '../../package.json' export default defineConfig({ - title: 'feathers-hooks-common', + title: 'feathers-hooks-common/index.js', lastUpdated: true, description: '', head: [ @@ -19,7 +19,7 @@ export default defineConfig({ ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ], themeConfig: { - siteTitle: 'feathers-hooks-common', + siteTitle: 'feathers-hooks-common/index.js', editLink: { pattern: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/edit/master/docs/:path', @@ -36,7 +36,7 @@ export default defineConfig({ }, { icon: 'github', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common', + link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/index.js', }, ], logo: '/feathers-hooks-common-logo.png', @@ -45,7 +45,7 @@ export default defineConfig({ text: 'Guide', items: [ { text: 'Overview', link: '/overview' }, - { text: 'Hooks', link: '/hooks' }, + { text: 'Hooks', link: '/hooks/index.js' }, { text: 'Utilities', link: '/utilities' }, { text: 'Migrating', link: '/migrating' }, { text: 'Guides', link: '/guides' }, @@ -77,4 +77,4 @@ export default defineConfig({ indexName: 'feathers-hooks', }, }, -}); +}) diff --git a/docs/.vitepress/meta.ts b/docs/.vitepress/meta.ts index fede0649..e17e20ad 100644 --- a/docs/.vitepress/meta.ts +++ b/docs/.vitepress/meta.ts @@ -1,5 +1,5 @@ -export const name = 'feathers-hooks-common'; -export const description = 'Common hooks and utils for FeathersJS apps'; +export const name = 'feathers-hooks-common/index.js' +export const description = 'Common hooks and utils for FeathersJS apps' -export const ogUrl = 'https://hooks-common.feathersjs.com/'; -export const ogImage = 'https://hooks-common.feathersjs.com/feathers-hooks-common-logo.png'; +export const ogUrl = 'https://hooks-common.feathersjs.com/' +export const ogImage = 'https://hooks-common.feathersjs.com/feathers-hooks-common-logo.png' diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index e4a88672..5b9ffcab 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,6 +1,6 @@ -import Theme from 'vitepress/theme'; -import '../style/main.css'; +import Theme from 'vitepress/theme' +import '../style/main.css' export default { ...Theme, -}; +} diff --git a/docs/guides.md b/docs/guides.md index d9b6527c..926637a7 100755 --- a/docs/guides.md +++ b/docs/guides.md @@ -9,11 +9,7 @@ function disallowWhat() { return someVariableCircumstance() ? 'rest' : 'external'; } // ... -module.exports = { - before: { - all: disallow(disallowWhat()) - } -}; +module.exports = { before: { all: disallow(disallowWhat()) } }; ``` This code will also **not do**, as most parameters do not permit functions, and `disallowWhat` will not be called for each service call. @@ -23,11 +19,7 @@ function disallowWhat() { return someVariableCircumstance() ? 'rest' : 'external'; } // ... -module.exports = { - before: { - all: disallow(disallowWhat) - } -}; +module.exports = { before: { all: disallow(disallowWhat) } }; ``` You are able to call `disallowWhat` for each service call as follows. @@ -37,11 +29,7 @@ function disallowWhat() { return someVariableCircumstance() ? 'rest' : 'external'; } // ... -module.exports = { - before: { - all: context => disallow(disallowWhat())(context) - } -}; +module.exports = { before: { all: context => disallow(disallowWhat())(context) } }; ``` `disallowWhat` is called each time the hook is run. `disallow(disallowWhat())` creates a new hook with the value returned by `disallowWhat()`, and then that hook is invoked with `(context)`. @@ -49,11 +37,7 @@ module.exports = { Let's look at another example. The `user` record identifies information the user permits to be public, in its `public` field. We can write a hook retaining only the fields allowed to be exposed. ```js -module.exports = { - after: { - get: context => keep(...context.params.user.public)(context) - } -}; +module.exports = { after: { get: context => keep(...context.params.user.public)(context) } }; ``` ## fastJoin @@ -101,40 +85,27 @@ It also takes an optional query with which you can customise the current operati ```js // project/src/services/posts/posts.hooks.js -const { fastJoin } = require('feathers-hooks-common'); +const { fastJoin } = require('feathers-hooks-common/index.js'); const postResolvers = { joins: { author: (...args) => async (post, { app }) => { - post.author = ( - await app.service('users').find({ - query: { - id: post.userId - } - }) - )[0]; + post.author = (await app.service('users').find({ query: { id: post.userId } }))[0]; }, starers: $select => async (post, { app }) => { - post.starers = await app.service('users').find({ - query: { - id: { $in: post.starIds }, - $select: $select || ['name'] - } - }); - } - } + post.starers = await app + .service('users') + .find({ query: { id: { $in: post.starIds }, $select: $select || ['name'] } }); + }, + }, }; -module.exports = { - after: { - all: [fastJoin(postResolvers)] - } -}; +module.exports = { after: { all: [fastJoin(postResolvers)] } }; ``` The above example has two resolvers. Let's focus on `author`. @@ -161,7 +132,7 @@ The result would look like: userId: 101, starIds: [102, 103, 104], author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }] + starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], } ]; ``` @@ -169,15 +140,9 @@ The result would look like: ### Shaping the Result ```js -const query = { - author: true -}; +const query = { author: true }; -module.exports = { - after: { - all: [fastJoin(postResolvers, query)] - } -}; +module.exports = { after: { all: [fastJoin(postResolvers, query)] } }; ``` The above query requests the author resolver be run, but not the starers resolver. This is a GraphQL concept which _shapes_ the result. The result will not contain the `starers` field which the starers resolver would have otherwise added. @@ -192,8 +157,8 @@ The above query requests the author resolver be run, but not the starers resolve body: 'John post', userId: 101, starIds: [102, 103, 104], - author: { id: 101, name: 'John' } - } + author: { id: 101, name: 'John' }, + }, ]; ``` @@ -241,9 +206,9 @@ The `paginate:false` suppress pagination for this call, ensuring all the matchin starers: [ { id: 102, name: 'Marshall' }, { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' } - ] - } + { id: 104, name: 'Aubree' }, + ], + }, ]; ``` @@ -272,8 +237,8 @@ Here, the starerCount resolver adds the field `starerCount` containing a count o starIds: [102, 103, 104], starerCount: 3, author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }] - } + starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], + }, ]; ``` @@ -348,23 +313,23 @@ const query = { text: 'John post Marshall comment 11', postId: 1, userId: 102, - author: { id: 102, name: 'Marshall' } + author: { id: 102, name: 'Marshall' }, }, { id: 12, text: 'John post Marshall comment 12', postId: 1, userId: 102, - author: { id: 102, name: 'Marshall' } + author: { id: 102, name: 'Marshall' }, }, { id: 13, text: 'John post Marshall comment 13', postId: 1, userId: 102, - author: { id: 102, name: 'Marshall' } - } - ] + author: { id: 102, name: 'Marshall' }, + }, + ], } ]; ``` @@ -382,11 +347,11 @@ const commentResolvers = { comment.author = ( await users.find({ query: { id: comment.userId, $select: $select || ['name'] }, - paginate: false + paginate: false, }) )[0]; - } - } + }, + }, }; const postResolvers = { @@ -398,16 +363,16 @@ const postResolvers = { postId: post.id, $select: $select, $limit: $limit || 5, - [$sort]: { createdAt: -1 } + [$sort]: { createdAt: -1 }, }, - paginate: false + paginate: false, }); return post.comments; }, - joins: commentResolvers - } - } + joins: commentResolvers, + }, + }, }; ``` @@ -424,16 +389,14 @@ You need to understand batch-loaders before we proceed, so [read about them now. ### Using a Simple Batch-Loader ```js -const { fastJoin } = require('feathers-hooks-common'); +const { fastJoin } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const { loaderFactory } = BatchLoader; const postResolvers = { before: context => { context._loaders = { user: {} }; - context._loaders.user.id = loaderFactory(users, 'id', false, { - paginate: false - })(context); + context._loaders.user.id = loaderFactory(users, 'id', false, { paginate: false })(context); }, joins: { @@ -441,8 +404,8 @@ const postResolvers = { (post.author = await context._loaders.user.id.load(post.userId)), starers: () => async (post, context) => - !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)) - } + !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), + }, }; ``` @@ -471,8 +434,8 @@ Let's look at the code in this example: starers: [ { id: 102, name: 'Marshall' }, { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' } - ] + { id: 104, name: 'Aubree' }, + ], } ]; ``` @@ -484,7 +447,7 @@ Let's look at the code in this example: The `loaderFactory(users, 'id', false)` above is just a convenience wrapper for building a BatchLoader. We can create our batch loaders directly should we need them to do more. ```js -const { fastJoin, makeCallingParams } = require('feathers-hooks-common'); +const { fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -496,12 +459,12 @@ const postResolvers = { async (keys, context) => { const result = await users.find( makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }, undefined, { - paginate: false - }) + paginate: false, + }), ); return getResultsByKey(keys, result, user => user.id, '!'); }, - { context } + { context }, ); }, @@ -510,8 +473,8 @@ const postResolvers = { (post.author = await context._loaders.user.id.load(post.userId)), starers: () => async (post, context) => - !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)) - } + !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), + }, }; ``` @@ -525,7 +488,7 @@ Let's also add a `reputation` array of objects to `posts`. This will show the in ```js // project/src/services/posts/posts.hooks.js -const { fastJoin, makeCallingParams } = require('feathers-hooks-common'); +const { fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -534,8 +497,8 @@ const commentResolvers = { author: () => async (comment, context) => !comment.userId ? null - : (comment.userRecord = await context._loaders.user.id.load(comment.userId)) - } + : (comment.userRecord = await context._loaders.user.id.load(comment.userId)), + }, }; const postResolvers = { @@ -546,24 +509,24 @@ const postResolvers = { async (keys, context) => { const result = await users.find( makeCallingParams(context, { id: { $in: getUniqueKeys(keys) } }, undefined, { - paginate: false - }) + paginate: false, + }), ); return getResultsByKey(keys, result, user => user.id, '!'); }, - { context } + { context }, ); context._loaders.comments.postId = new BatchLoader( async (keys, context) => { const result = await comments.find( makeCallingParams(context, { postId: { $in: getUniqueKeys(keys) } }, undefined, { - paginate: false - }) + paginate: false, + }), ); return getResultsByKey(keys, result, comment => comment.postId, '[!]'); }, - { context } + { context }, ); }, @@ -579,7 +542,7 @@ const postResolvers = { reputation_author: () => async (post, context) => { if (!post.reputation) return null; const authors = await context._loaders.user.id.loadMany( - post.reputation.map(rep => rep.userId) + post.reputation.map(rep => rep.userId), ); post.reputation.forEach((rep, i) => { rep.author = authors[i].name; @@ -591,25 +554,18 @@ const postResolvers = { (...args) => async (post, context) => (post.commentRecords = await context._loaders.comments.postId.load(post.id)), - joins: commentResolvers - } - } + joins: commentResolvers, + }, + }, }; const query = { author: true, starers: [['id', 'name']], - comments: { - args: null, - author: [['id', 'name']] - } + comments: { args: null, author: [['id', 'name']] }, }; -module.exports = { - after: { - all: [fastJoin(postResolvers, context => query)] - } -}; +module.exports = { after: { all: [fastJoin(postResolvers, context => query)] } }; ``` We are using 2 batch-loaders, one for single user records, the other for arrays of comment records. @@ -721,7 +677,7 @@ We can improve the situation by using persistent caches with the BatchLoaders. A Let's see how we can use the [cache hook](./index.html#cache) as it maintains a persistent cache for the service its registered on. ```js -const { cache, fastJoin, makeCallingParams } = require('feathers-hooks-common'); +const { cache, fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const CacheMap = require('@feathers-plus/cache'); const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -733,13 +689,11 @@ const cacheMapUsers = CacheMap({ max: 100 }); const userBatchLoader = new BatchLoader( async keys => { const result = await users.find( - makeCallingParams({}, { id: { $in: getUniqueKeys(keys) } }, undefined, { - paginate: false - }) + makeCallingParams({}, { id: { $in: getUniqueKeys(keys) } }, undefined, { paginate: false }), ); return getResultsByKey(keys, result, user => user.id, '!'); }, - { cacheMap: cacheMapUsers } + { cacheMap: cacheMapUsers }, ); const postResolvers = { @@ -753,26 +707,19 @@ const postResolvers = { (post.author = await context._loaders.user.id.load(post.userId)), starers: () => async (post, context) => - !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)) - } + !post.starIds ? null : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), + }, }; const query = { author: true, starers: [['id', 'name']], - comments: { - args: null, - author: [['id', 'name']] - } + comments: { args: null, author: [['id', 'name']] }, }; module.exports = { - before: { - all: cache(cacheMapUsers) - }, - after: { - all: [cache(cacheMapUsers), fastJoin(postResolvers, () => query)] - } + before: { all: cache(cacheMapUsers) }, + after: { all: [cache(cacheMapUsers), fastJoin(postResolvers, () => query)] }, }; ``` @@ -807,22 +754,13 @@ Populates items _recursively_ to any depth. Supports 1:1, 1:n and n:1 relationsh ```javascript // users like { _id: '111', name: 'John', roleId: '555' } // roles like { _id: '555', permissions: ['foo', bar'] } -import { populate } from 'feathers-hooks-common'; +import { populate } from 'feathers-hooks-common/index.js'; const userRoleSchema = { - include: { - service: 'roles', - nameAs: 'role', - parentField: 'roleId', - childField: '_id' - } + include: { service: 'roles', nameAs: 'role', parentField: 'roleId', childField: '_id' }, }; -app.service('users').hooks({ - after: { - all: populate({ schema: userRoleSchema }) - } -}); +app.service('users').hooks({ after: { all: populate({ schema: userRoleSchema }) } }); // result like // { _id: '111', name: 'John', roleId: '555', @@ -835,19 +773,10 @@ app.service('users').hooks({ // users like { _id: '111', name: 'John', roleIds: ['555', '666'] } // roles like { _id: '555', permissions: ['foo', 'bar'] } const userRolesSchema = { - include: { - service: 'roles', - nameAs: 'roles', - parentField: 'roleIds', - childField: '_id' - } + include: { service: 'roles', nameAs: 'roles', parentField: 'roleIds', childField: '_id' }, }; -usersService.hooks({ - after: { - all: populate({ schema: userRolesSchema }) - } -}); +usersService.hooks({ after: { all: populate({ schema: userRolesSchema }) } }); // result like // { _id: '111', name: 'John', roleIds: ['555', '666'], roles: [ @@ -862,19 +791,10 @@ usersService.hooks({ // posts like { _id: '111', body: '...' } // comments like { _id: '555', text: '...', postId: '111' } const postCommentsSchema = { - include: { - service: 'comments', - nameAs: 'comments', - parentField: '_id', - childField: 'postId' - } + include: { service: 'comments', nameAs: 'comments', parentField: '_id', childField: 'postId' }, }; -postService.hooks({ - after: { - all: populate({ schema: postCommentsSchema }) - } -}); +postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); // result like // { _id: '111', body: '...' }, comments: [ @@ -934,15 +854,11 @@ const postCommentsSchema = { include: { service: 'comments', nameAs: 'comments', - select: (hook, parentItem) => ({ postId: parentItem._id }) - } + select: (hook, parentItem) => ({ postId: parentItem._id }), + }, }; -postService.hooks({ - after: { - all: populate({ schema: postCommentsSchema }) - } -}); +postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); // result like // { _id: '111', body: '...' }, comments: [ @@ -1109,7 +1025,7 @@ The following example shows how the client can ask for the type of schema it nee ```javascript // on client -import { paramsForServer } from 'feathers-hooks-common'; +import { paramsForServer } from 'feathers-hooks-common/index.js'; purchaseOrders.get(id, paramsForServer({ schema: 'po-acct' })); // pass schema name to server // or purchaseOrders.get(id, paramsForServer({ schema: 'po-rec' })); @@ -1117,7 +1033,7 @@ purchaseOrders.get(id, paramsForServer({ schema: 'po-rec' })); ```javascript // on server -import { paramsFromClient } from 'feathers-hooks-common'; +import { paramsFromClient } from 'feathers-hooks-common/index.js'; const poSchemas = { 'po-acct': /* populate schema for Accounting oriented PO e.g. { include: ... } */, 'po-rec': /* populate schema for Receiving oriented PO */ @@ -1181,7 +1097,7 @@ A full featured example of such a process appears below. It validates and saniti ```javascript // file /server/services/users/users.hooks.js const auth = require('feathers-authentication').hooks; -const { callbackToPromise, remove, validate } = require('feathers-hooks-common'); +const { callbackToPromise, remove, validate } = require('feathers-hooks-common/index.js'); const validateSchema = require('feathers-hooks-validate-joi'); const clientValidations = require('/common/usersClientValidations'); @@ -1197,8 +1113,8 @@ exports.before = { validate(values => clientValidations.signupAsync(values, 'someMoreParams')), // re-run form async validate(serverValidationsSignup), // run server validation remove('confirmPassword'), - auth.hashPassword() - ] + auth.hashPassword(), + ], }; ``` @@ -1263,19 +1179,14 @@ const password = Joi.string() const email = Joi.string().trim().email().required(); module.exports = { - options: { - abortEarly: false, - convert: true, - allowUnknown: false, - stripUnknown: true - }, + options: { abortEarly: false, convert: true, allowUnknown: false, stripUnknown: true }, signup: Joi.object().keys({ name: Joi.string().trim().min(8).max(30).required(), username, password, confirmPassword: password.label('Confirm password'), - email - }) + email, + }), }; ``` @@ -1294,7 +1205,7 @@ module.exports = { }); cb(Object.keys(formErrors).length > 0 ? formErrors : null, sanitized); - } + }, }; ``` diff --git a/docs/hooks.md b/docs/hooks.md index b6f34ffe..c6286b02 100644 --- a/docs/hooks.md +++ b/docs/hooks.md @@ -21,12 +21,10 @@ Runs a series of hooks which mutate context.data or content.result (the Feathers - **Example** ```js - const { actOnDefault, actOnDispatch } = require('feathers-hooks-common'); + const { actOnDefault, actOnDispatch } = require('feathers-hooks-common/index.js'); module.exports = { - after: { - find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] - } + after: { find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] }, }; ``` @@ -56,12 +54,10 @@ Runs a series of hooks which mutate context.dispatch. - **Example** ```js - const { actOnDefault, actOnDispatch } = require('feathers-hooks-common'); + const { actOnDefault, actOnDispatch } = require('feathers-hooks-common/index.js'); module.exports = { - after: { - find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] - } + after: { find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] }, }; ``` @@ -94,7 +90,7 @@ The mutated `item`. Returning `undefined` means the `item` in the parameters was - **Example** ```js - const { alterItems } = require('feathers-hooks-common'); + const { alterItems } = require('feathers-hooks-common/index.js'); module.exports = { before: { all: [ @@ -179,50 +175,32 @@ Persistent, least-recently-used record cache for services. ```js const CacheMap = require('@feathers-plus/cache'); - const { cache } = require('feathers-hooks-common'); + const { cache } = require('feathers-hooks-common/index.js'); const cacheMap = CacheMap({ max: 100 }); // Keep the 100 most recently used. - module.exports = { - before: { - all: cache(cacheMap) - }, - after: { - all: cache(cacheMap) - } - }; + module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; ``` ```js - const { cache } = require('feathers-hooks-common'); + const { cache } = require('feathers-hooks-common/index.js'); const cacheMap = new Map(); - module.exports = { - before: { - all: cache(cacheMap) - }, - after: { - all: cache(cacheMap) - } - }; + module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; ``` ```js const CacheMap = require('@feathers-plus/cache'); const mongoose = require('mongoose'); - const { cache } = require('feathers-hooks-common'); + const { cache } = require('feathers-hooks-common/index.js'); const cacheMap = CacheMap({ max: 100 }); const makeCacheKey = key => (key instanceof mongoose.Types.ObjectId ? key.toString() : key); module.exports = { - before: { - all: cache(cacheMap, undefined, { makeCacheKey }) - }, - after: { - all: cache(cacheMap, undefined, { makeCacheKey }) - } + before: { all: cache(cacheMap, undefined, { makeCacheKey }) }, + after: { all: cache(cacheMap, undefined, { makeCacheKey }) }, }; ``` @@ -277,7 +255,7 @@ Display the current hook context for debugging. - **Example** ```js - const { debug } = require('feathers-hooks-common'); + const { debug } = require('feathers-hooks-common/index.js'); module.exports = { before: { all: [ debug('step 1'), setNow('updatedAt'), debug(' step 2') ], @@ -320,13 +298,9 @@ Remove records and properties created by the populate hook. - **Example** ```js - const { dePopulate } = require('feathers-hooks-common'); + const { dePopulate } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - all: [depopulate()] - } - }; + module.exports = { before: { all: [depopulate()] } }; ``` - **Details** @@ -344,13 +318,9 @@ Disables pagination when query.$limit is -1 or '-1'. - **Example** ```js - const { disablePagination } = require('feathers-hooks-common'); + const { disablePagination } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - find: disablePagination() - } - }; + module.exports = { before: { find: disablePagination() } }; ``` - **Details** @@ -381,7 +351,7 @@ Prevents access to a service method completely or for specific transports. - **Example** ```js - const { disallow, iff } = require('feathers-hooks-common'); + const { disallow, iff } = require('feathers-hooks-common/index.js'); module.exports = { before: { @@ -392,8 +362,8 @@ Prevents access to a service method completely or for specific transports. // disallow calling `update` completely (e.g. to allow only `patch`) update: disallow(), // disallow the remove hook if the user is not an admin - remove: iff(context => !context.params.user.isAdmin, disallow()) - } + remove: iff(context => !context.params.user.isAdmin, disallow()), + }, }; ``` @@ -419,12 +389,10 @@ Delete certain fields from the record(s). - **Example** ```js - const { discard, iff, isProvider } = require('feathers-hooks-common'); + const { discard, iff, isProvider } = require('feathers-hooks-common/index.js'); module.exports = { - after: { - all: iff(isProvider('external'), discard('password', 'address.city')) - } + after: { all: iff(isProvider('external'), discard('password', 'address.city')) }, }; ``` @@ -451,13 +419,9 @@ Delete certain fields from the query object. - **Example** ```js - const { discardQuery, iff, isProvider } = require('feathers-hooks-common'); + const { discardQuery, iff, isProvider } = require('feathers-hooks-common/index.js'); - module.exports = { - after: { - all: iff(isProvider('external'), discardQuery('secret')) - } - }; + module.exports = { after: { all: iff(isProvider('external'), discardQuery('secret')) } }; ``` - **Details** @@ -501,38 +465,26 @@ Join related records. ```js // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common'); + const { fastJoin } = require('feathers-hooks-common/index.js'); const postResolvers = { joins: { author: (...args) => async post => - (post.author = ( - await users.find({ - query: { id: post.userId }, - paginate: false - }) - )[0]), + (post.author = (await users.find({ query: { id: post.userId }, paginate: false }))[0]), starers: $select => async post => (post.starers = await users.find({ query: { id: { $in: post.starIds }, $select: $select || ['name'] }, - paginate: false - })) - } + paginate: false, + })), + }, }; - const query = { - author: true, - starers: [['id', 'name']] - }; + const query = { author: true, starers: [['id', 'name']] }; - module.exports = { - after: { - all: [fastJoin(postResolvers, query)] - } - }; + module.exports = { after: { all: [fastJoin(postResolvers, query)] } }; // Original record [{ id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] }][ @@ -543,7 +495,7 @@ Join related records. userId: 101, starIds: [102, 103, 104], author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }] + starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], } ]; ``` @@ -552,7 +504,7 @@ Join related records. ```js // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common'); + const { fastJoin } = require('feathers-hooks-common/index.js'); const postResolvers = { joins: { @@ -614,16 +566,14 @@ Join related records. ```js // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common'); + const { fastJoin } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const { loaderFactory } = BatchLoader; const postResolvers = { before: context => { context._loaders = { user: {} }; - context._loaders.user.id = loaderFactory(users, 'id', false, { - paginate: false - })(context); + context._loaders.user.id = loaderFactory(users, 'id', false, { paginate: false })(context); }, joins: { author: () => async (post, context) => @@ -632,15 +582,11 @@ Join related records. starers: () => async (post, context) => !post.starIds ? null - : (post.starers = await context._loaders.user.id.loadMany(post.starIds)) - } + : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), + }, }; - module.exports = { - after: { - all: [fastJoin(postResolvers)] - } - }; + module.exports = { after: { all: [fastJoin(postResolvers)] } }; // Original record [{ id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] }][ @@ -654,8 +600,8 @@ Join related records. starers: [ { id: 102, name: 'Marshall' }, { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' } - ] + { id: 104, name: 'Aubree' }, + ], } ]; ``` @@ -664,7 +610,7 @@ Join related records. ```js // project/src/services/posts/posts.hooks.js - const { fastJoin, makeCallingParams } = require('feathers-hooks-common'); + const { fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -774,7 +720,7 @@ Join related records. - **Example Using a Persistent Cache** ```js - const { cache, fastJoin, makeCallingParams } = require('feathers-hooks-common'); + const { cache, fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); const BatchLoader = require('@feathers-plus/batch-loader'); const CacheMap = require('@feathers-plus/cache'); const { getResultsByKey, getUniqueKeys } = BatchLoader; @@ -786,13 +732,11 @@ Join related records. const userBatchLoader = new BatchLoader( async keys => { const result = await users.find( - makeCallingParams({}, { id: { $in: getUniqueKeys(keys) } }, undefined, { - paginate: false - }) + makeCallingParams({}, { id: { $in: getUniqueKeys(keys) } }, undefined, { paginate: false }), ); return getResultsByKey(keys, result, user => user.id, '!'); }, - { cacheMap: cacheMapUsers } + { cacheMap: cacheMapUsers }, ); const postResolvers = { @@ -808,26 +752,19 @@ Join related records. starers: () => async (post, context) => !post.starIds ? null - : (post.starers = await context._loaders.user.id.loadMany(post.starIds)) - } + : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), + }, }; const query = { author: true, starers: [['id', 'name']], - comments: { - args: null, - author: [['id', 'name']] - } + comments: { args: null, author: [['id', 'name']] }, }; module.exports = { - before: { - all: cache(cacheMapUsers) - }, - after: { - all: [cache(cacheMapUsers), fastJoin(postResolvers, () => query)] - } + before: { all: cache(cacheMapUsers) }, + after: { all: [cache(cacheMapUsers), fastJoin(postResolvers, () => query)] }, }; ``` @@ -873,7 +810,7 @@ Execute one or another series of hooks depending on a sync or async predicate. - **Example** ```js - const { discard, iff, isProvider, populate } = require('feathers-hooks-common'); + const { discard, iff, isProvider, populate } = require('feathers-hooks-common/index.js'); const isNotAdmin = adminRole => context => context.params.user.roles.indexOf(adminRole || 'admin') === -1; module.exports = { before: { @@ -923,7 +860,7 @@ Execute one array of hooks or another based on a sync or async predicate. - **Example** ```js - const { iffElse, populate, serialize } = require('feathers-hooks-common'); + const { iffElse, populate, serialize } = require('feathers-hooks-common/index.js'); module.exports = { after: { create: iffElse(() => { ... }, @@ -957,13 +894,9 @@ Keep certain fields in the record(s), deleting the rest. - **Example** ```js - const { keep } = require('feathers-hooks-common'); + const { keep } = require('feathers-hooks-common/index.js'); - module.exports = { - after: { - create: keep('name', 'dept', 'address.city') - } - }; + module.exports = { after: { create: keep('name', 'dept', 'address.city') } }; ``` - **Details** @@ -991,13 +924,13 @@ Keep certain fields in a nested array inside the record(s), deleting the rest. - **Example** ```js - const { keepInArray } = require('feathers-hooks-common'); + const { keepInArray } = require('feathers-hooks-common/index.js'); module.exports = { after: { create: keepInArray('users', ['name', 'dept', 'address.city']), - find: keepInArray('account.users', ['name', 'dept', 'address.city']) - } + find: keepInArray('account.users', ['name', 'dept', 'address.city']), + }, }; ``` @@ -1024,13 +957,9 @@ Keep certain fields in the query object, deleting the rest. - **Example** ```js - const { keepQuery } = require('feathers-hooks-common'); + const { keepQuery } = require('feathers-hooks-common/index.js'); - module.exports = { - after: { - create: keepQuery('name', 'address.city') - } - }; + module.exports = { after: { create: keepQuery('name', 'address.city') } }; ``` - **Details** @@ -1064,13 +993,9 @@ Keep certain fields in a nested array inside the query object, deleting the rest - **Example** ```js - const { keepQueryInArray } = require('feathers-hooks-common'); + const { keepQueryInArray } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - find: keepQueryInArray('$or', ['name', 'dept', 'address.city']) - } - }; + module.exports = { before: { find: keepQueryInArray('$or', ['name', 'dept', 'address.city']) } }; ``` - **Details** @@ -1094,13 +1019,9 @@ Convert certain field values to lower case. - **Example** ```js - const { lowerCase } = require('feathers-hooks-common'); + const { lowerCase } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - create: lowerCase('email', 'username', 'div.dept') - } - }; + module.exports = { before: { create: lowerCase('email', 'username', 'div.dept') } }; ``` - **Details** @@ -1127,7 +1048,7 @@ Wrap MongoDB foreign keys in ObjectID. ```js const { ObjectID } = require('mongodb'); - const { mongoKeys } = require('feathers-hooks-common'); + const { mongoKeys } = require('feathers-hooks-common/index.js'); /* Comment Schema { @@ -1180,25 +1101,19 @@ Pass `context.params` from client to server. Server hook. ```js // client - const { paramsForServer } = require('feathers-hooks-common'); + const { paramsForServer } = require('feathers-hooks-common/index.js'); service.update( id, data, - paramsForServer({ - query: { dept: 'a' }, - populate: 'po-1', - serialize: 'po-mgr' - }) + paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), ); // server - const { paramsFromClient } = require('feathers-hooks-common'); + const { paramsFromClient } = require('feathers-hooks-common/index.js'); module.exports = { - before: { - all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] - } + before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, }; // myHook's `context.params` will now be @@ -1278,22 +1193,13 @@ Join related records. ```javascript // users like { _id: '111', name: 'John', roleId: '555' } // roles like { _id: '555', permissions: ['foo', bar'] } - import { populate } from 'feathers-hooks-common'; + import { populate } from 'feathers-hooks-common/index.js'; const userRoleSchema = { - include: { - service: 'roles', - nameAs: 'role', - parentField: 'roleId', - childField: '_id' - } + include: { service: 'roles', nameAs: 'role', parentField: 'roleId', childField: '_id' }, }; - app.service('users').hooks({ - after: { - all: populate({ schema: userRoleSchema }) - } - }); + app.service('users').hooks({ after: { all: populate({ schema: userRoleSchema }) } }); // result like // { _id: '111', name: 'John', roleId: '555', @@ -1306,19 +1212,10 @@ Join related records. // users like { _id: '111', name: 'John', roleIds: ['555', '666'] } // roles like { _id: '555', permissions: ['foo', 'bar'] } const userRolesSchema = { - include: { - service: 'roles', - nameAs: 'roles', - parentField: 'roleIds', - childField: '_id' - } + include: { service: 'roles', nameAs: 'roles', parentField: 'roleIds', childField: '_id' }, }; - usersService.hooks({ - after: { - all: populate({ schema: userRolesSchema }) - } - }); + usersService.hooks({ after: { all: populate({ schema: userRolesSchema }) } }); // result like // { _id: '111', name: 'John', roleIds: ['555', '666'], roles: [ @@ -1333,19 +1230,10 @@ Join related records. // posts like { _id: '111', body: '...' } // comments like { _id: '555', text: '...', postId: '111' } const postCommentsSchema = { - include: { - service: 'comments', - nameAs: 'comments', - parentField: '_id', - childField: 'postId' - } + include: { service: 'comments', nameAs: 'comments', parentField: '_id', childField: 'postId' }, }; - postService.hooks({ - after: { - all: populate({ schema: postCommentsSchema }) - } - }); + postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); // result like // { _id: '111', body: '...' }, comments: [ @@ -1405,15 +1293,11 @@ Join related records. include: { service: 'comments', nameAs: 'comments', - select: (hook, parentItem) => ({ postId: parentItem._id }) - } + select: (hook, parentItem) => ({ postId: parentItem._id }), + }, }; - postService.hooks({ - after: { - all: populate({ schema: postCommentsSchema }) - } - }); + postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); // result like // { _id: '111', body: '...' }, comments: [ @@ -1447,13 +1331,9 @@ Prevent patch service calls from changing certain fields. - **Example** ```js - const { preventChanges } = require('feathers-hooks-common'); + const { preventChanges } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - patch: preventChanges(true, 'security.badge') - } - }; + module.exports = { before: { patch: preventChanges(true, 'security.badge') } }; ``` - **Details** @@ -1476,13 +1356,9 @@ Check selected fields exist and are not falsey. Numeric 0 is acceptable. - **Example** ```js - const { required } = require('feathers-hooks-common'); + const { required } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - all: required('email', 'password') - } - }; + module.exports = { before: { all: required('email', 'password') } }; ``` ## runParallel @@ -1506,7 +1382,7 @@ Run a hook in parallel to the other hooks and the service call. - **Example** ```js - const { runParallel } = require('feathers-hooks-common'); + const { runParallel } = require('feathers-hooks-common/index.js'); const clone = require('clone'); function sendEmail(...) { @@ -1618,45 +1494,40 @@ Limit all external access of the `users` service to the authenticated user: ```js const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common'); +const { setField } = require('feathers-hooks-common/index.js'); -app.service('users').hooks({ - before: { - all: [ - authenticate('jwt'), - setField({ - from: 'params.user.id', - as: 'params.query.id' - }) - ] - } -}); +app + .service('users') + .hooks({ + before: { + all: [authenticate('jwt'), setField({ from: 'params.user.id', as: 'params.query.id' })], + }, + }); ``` Only allow access to invoices for the users organization: ```js const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common'); +const { setField } = require('feathers-hooks-common/index.js'); -app.service('invoices').hooks({ - before: { - all: [ - authenticate('jwt'), - setField({ - from: 'params.user.organizationId', - as: 'params.query.organizationId' - }) - ] - } -}); +app + .service('invoices') + .hooks({ + before: { + all: [ + authenticate('jwt'), + setField({ from: 'params.user.organizationId', as: 'params.query.organizationId' }), + ], + }, + }); ``` Set the current user id as `userId` when creating a message and only allow users to edit and remove their own messages: ```js const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common'); +const { setField } = require('feathers-hooks-common/index.js'); const setUserId = setField({ from: 'params.user.id', @@ -1704,13 +1575,9 @@ Create/update certain fields to the current date-time. - **Example** ```js - const { setNow } = require('feathers-hooks-common'); + const { setNow } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - create: setNow('createdAt', 'updatedAt') - } - }; + module.exports = { before: { create: setNow('createdAt', 'updatedAt') } }; ``` - **Details** @@ -1735,13 +1602,9 @@ Set slugs in URL, e.g. /stores/:storeId. - **Example** ```js - const { setSlug } = require('feathers-hooks-common'); + const { setSlug } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - all: [hooks.setSlug('storeId')] - } - }; + module.exports = { before: { all: [hooks.setSlug('storeId')] } }; // `context.params.query` will always be normalized, // e.g. `{ size: 'large', storeId: '123' }` @@ -1777,28 +1640,20 @@ Filter data or result records using a MongoDB-like selection syntax. ```js const sift = require('sift'); - const { sifter } = require('feathers-hooks-common'); + const { sifter } = require('feathers-hooks-common/index.js'); const selectCountry = hook => sift({ 'address.country': hook.params.country }); - module.exports = { - before: { - find: sifter(selectCountry) - } - }; + module.exports = { before: { find: sifter(selectCountry) } }; ``` ```js const sift = require('sift'); - const { sifter } = require('feathers-hooks-common'); + const { sifter } = require('feathers-hooks-common/index.js'); const selectCountry = country => () => sift({ address: { country: country } }); - module.exports = { - before: { - find: sifter(selectCountry('Canada')) - } - }; + module.exports = { before: { find: sifter(selectCountry('Canada')) } }; ``` - **Details** @@ -1831,14 +1686,10 @@ Setting `params.disableSoftDelete` to `true` allows to skip the `softDelete` hoo Basic usage: ```js - const { softDelete } = require('feathers-hooks-common'); + const { softDelete } = require('feathers-hooks-common/index.js'); // Use standard softDelete which uses `deleted: true` - app.service('people').hooks({ - before: { - all: [softDelete()] - } - }); + app.service('people').hooks({ before: { all: [softDelete()] } }); // will set `deleted: true` for entry with id 1 app.service('people').remove(1); @@ -1864,15 +1715,15 @@ Setting `params.disableSoftDelete` to `true` allows to skip the `softDelete` hoo }, removeData: async context => { return { deletedAt: new Date() }; - } - }) + }, + }), ], create: [ context => { context.data.deletedAt = null; - } - ] - } + }, + ], + }, }); ``` @@ -1892,13 +1743,9 @@ Stash current value of record, usually before mutating it. Performs a get call. - **Example** ```js - const { stashBefore } = require('feathers-hooks-common'); + const { stashBefore } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { - patch: stashBefore() - } - }; + module.exports = { before: { patch: stashBefore() } }; ``` - **Details** @@ -1931,7 +1778,7 @@ Transform fields & objects in place in the record(s) using a recursive walk. Pow - **Example** ```js - const { traverse } = require('feathers-hooks-common'); + const { traverse } = require('feathers-hooks-common/index.js'); // Trim strings const trimmer = function (node) { @@ -1949,10 +1796,7 @@ Transform fields & objects in place in the record(s) using a recursive walk. Pow }; module.exports = { - before: { - create: traverse(trimmer), - find: traverse(nuller, context => context.params.query) - } + before: { create: traverse(trimmer), find: traverse(nuller, context => context.params.query) }, }; ``` @@ -1980,7 +1824,7 @@ Execute a series of hooks if a sync or async predicate is falsey. - **Example** ```js - const { isProvider, unless } = require('feathers-hooks-common'); + const { isProvider, unless } = require('feathers-hooks-common/index.js'); module.exports = { before: { @@ -1988,9 +1832,9 @@ Execute a series of hooks if a sync or async predicate is falsey. isProvider('server'), hookA, unless(isProvider('rest'), hook1, hook2, hook3), - hookB - ) - } + hookB, + ), + }, }; ``` @@ -2017,17 +1861,13 @@ Validate data using a validation function. - **Example** ```js - const { validate } = require('feathers-hooks-common'); + const { validate } = require('feathers-hooks-common/index.js'); const { promisify } = require('util'); // function myCallbackValidator(values, cb) { ... } const myValidator = promisify(myCallbackValidator); - module.exports = { - before: { - create: validate(myValidator) - } - }; + module.exports = { before: { create: validate(myValidator) } }; ``` - **Details** @@ -2087,9 +1927,7 @@ Validate data using JSON-Schema. /* JSON-Schema */ }; - module.before({ - create: validateSchema(createSchema, Ajv) - }); + module.before({ create: validateSchema(createSchema, Ajv) }); ``` ```js @@ -2101,9 +1939,7 @@ Validate data using JSON-Schema. /* JSON-Schema */ }; - module.before({ - create: validateSchema(createSchema, ajv) - }); + module.before({ create: validateSchema(createSchema, ajv) }); ``` - **Details** @@ -2140,7 +1976,7 @@ Validate data using JSON-Schema. '\'in row 1 of 3, first\' should match format "startWithJo"', "in row 1 of 3, should have required property 'last'", '\'in row 2 of 3, first\' should match format "startWithJo"', - "in row 3 of 3, should have required property 'last'" + "in row 3 of 3, should have required property 'last'", ]; ``` diff --git a/docs/utilities.md b/docs/utilities.md index ce4609ba..97d95b3f 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -47,7 +47,7 @@ Build `params` for a service call. - **Example** ```js - const { callingParams, callingParamsDefaults } = require('feathers-hooks-common'); + const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); // Authentication props to always copy. Suitable for feathers-authentication-management. callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified']); @@ -88,7 +88,7 @@ Set defaults for building `params` for service calls with callingParams. - **Example** ```js - const { callingParams, callingParamsDefaults } = require('feathers-hooks-common'); + const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); // Authentication props to always copy. Suitable for feathers-authentication-management. // Only hooks will be calling `callingParams`. Set a flag so other hooks recognize such a call. callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified'], { _calledByHook: true }); @@ -133,7 +133,7 @@ Restrict a hook to run for certain methods and method types. - **Example** ```js - const { checkContext } = require('feathers-hooks-common'); + const { checkContext } = require('feathers-hooks-common/index.js'); function myHook(context) { checkContext(context, 'after', ['create', 'remove']); @@ -170,7 +170,7 @@ Sequentially execute multiple sync or async hooks. - **Example** ```js - const { combine, createdAt, updatedAt } = require('feathers-hooks-common'); + const { combine, createdAt, updatedAt } = require('feathers-hooks-common/index.js'); async function myCustomHook(context) { const newContext = await combine(setNow('createdAt'), setNow('updatedAt')).call(this, context); @@ -217,7 +217,7 @@ Return the and of a series of sync or async predicate functions. - **Example** ```js - const { iff, every } = require('feathers-hooks-common'); + const { iff, every } = require('feathers-hooks-common/index.js'); module.exports = { before: { create: iff(every(hook1, hook2, ...), hookA, hookB, ...) @@ -250,7 +250,7 @@ Get the records in `context.data` or `context.result` - **Example** ```js - const { getItems, replaceItems } = require('feathers-hooks-common'); + const { getItems, replaceItems } = require('feathers-hooks-common/index.js'); const insertCode = code => context => { const items = getItems(context); @@ -264,11 +264,7 @@ Get the records in `context.data` or `context.result` replaceItems(context, items); }; - module.exports = { - before: { - create: insertCode('a') - } - }; + module.exports = { before: { create: insertCode('a') } }; ``` - **Details** @@ -300,7 +296,7 @@ Negate a sync or async predicate function. - **Example** ```js - const { iff, isNot, isProvider, discard } = require('feathers-hooks-common'); + const { iff, isNot, isProvider, discard } = require('feathers-hooks-common/index.js'); const isRequestor = () => context => new Promise(resolve, reject) => ... ); module.exports = { after: { @@ -343,13 +339,9 @@ Check which transport provided the service call. - **Example** ```js - const { iff, isProvider, discard } = require('feathers-hooks-common'); + const { iff, isProvider, discard } = require('feathers-hooks-common/index.js'); - module.exports = { - after: { - create: iff(isProvider('external'), discard('password')) - } - }; + module.exports = { after: { create: iff(isProvider('external'), discard('password')) } }; ``` - **Details** @@ -387,7 +379,7 @@ Build context.params for service calls. - **Example** ```js - const { makeCallingParams } = require('feathers-hooks-common'); + const { makeCallingParams } = require('feathers-hooks-common/index.js'); async function myCustomHook(context) { // ... @@ -422,25 +414,19 @@ Pass an explicit context.params from client to server. Client-side. ```js // client - const { paramsForServer } = require('feathers-hooks-common'); + const { paramsForServer } = require('feathers-hooks-common/index.js'); service.update( id, data, - paramsForServer({ - query: { dept: 'a' }, - populate: 'po-1', - serialize: 'po-mgr' - }) + paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), ); // server - const { paramsFromClient } = require('feathers-hooks-common'); + const { paramsFromClient } = require('feathers-hooks-common/index.js'); module.exports = { - before: { - all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] - } + before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, }; // myHook's `context.params` will now be @@ -472,7 +458,7 @@ Replace the records in context.data or context.result[.data]. - **Example** ```js - const { getItems, replaceItems } = require('feathers-hooks-common'); + const { getItems, replaceItems } = require('feathers-hooks-common/index.js'); const insertCode = code => context { const items = getItems(context); @@ -509,7 +495,7 @@ Let's you call a hook right after the service call. - **Example** ```js - const { keep, runHook } = require('feathers-hooks-common'); + const { keep, runHook } = require('feathers-hooks-common/index.js'); user.get(...) .then( runHook()(keep('name', 'address.state')) ) @@ -520,7 +506,7 @@ Let's you call a hook right after the service call. ``` ```js - const { fastJoin, runHook } = require('feathers-hooks-common'); + const { fastJoin, runHook } = require('feathers-hooks-common/index.js'); const runHookFinds = runHook({ app: app, method: 'find' }); const paymentsRecords = [ @@ -529,29 +515,23 @@ Let's you call a hook right after the service call. { _id: 103, amount: 110, patientId: 1 }, { _id: 104, amount: 115, patientId: 2 }, { _id: 105, amount: 120, patientId: 3 }, - { _id: 106, amount: 125, patientId: 3 } + { _id: 106, amount: 125, patientId: 3 }, ]; await payments.create(paymentsRecords); const patientsRecords = [ { _id: 1, name: 'John' }, { _id: 2, name: 'Marshall' }, - { _id: 3, name: 'David' } + { _id: 3, name: 'David' }, ]; await patients.create(patientsRecords); const paymentResolvers = { joins: { patient: () => async payment => { - payment.patient = ( - await patients.find({ - query: { - id: payment.patientId - } - }) - )[0]; - } - } + payment.patient = (await patients.find({ query: { id: payment.patientId } }))[0]; + }, + }, }; await payments @@ -564,14 +544,9 @@ Let's you call a hook right after the service call. { _id: 101, amount: 100, patientId: 1, patient: { _id: 1, name: 'John' } }, { _id: 102, amount: 105, patientId: 1, patient: { _id: 1, name: 'John' } }, { _id: 103, amount: 110, patientId: 1, patient: { _id: 1, name: 'John' } }, - { - _id: 104, - amount: 115, - patientId: 2, - patient: { _id: 2, name: 'Marshall' } - }, + { _id: 104, amount: 115, patientId: 2, patient: { _id: 2, name: 'Marshall' } }, { _id: 105, amount: 120, patientId: 3, patient: { _id: 3, name: 'David' } }, - { _id: 106, amount: 125, patientId: 3, patient: { _id: 3, name: 'David' } } + { _id: 106, amount: 125, patientId: 3, patient: { _id: 3, name: 'David' } }, ]; ``` @@ -610,7 +585,7 @@ Return the or of a series of sync or async predicate functions. - **Example** ```js - const { iff, some } = require('feathers-hooks-common'); + const { iff, some } = require('feathers-hooks-common/index.js'); module.exports = { before: { create: iff(some(hook1, hook2, ...), hookA, hookB, ...) diff --git a/eslint.config.mjs b/eslint.config.mjs index 42c7b388..87ee06fb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,52 +1,3 @@ -import eslint from '@eslint/js'; -import tseslint from 'typescript-eslint'; -import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; -import eslintPluginImportX from 'eslint-plugin-import-x'; -import tsParser from '@typescript-eslint/parser'; +import config from '@feathers-community/eslint-config' -export default tseslint.config( - { - ignores: [ - '**/node_modules', - '**/dist', - '**/coverage', - 'docs/.vitepress/cache', - 'docs/.vitepress/dist', - ], - }, - eslint.configs.recommended, - // eslint-disable-next-line import-x/no-named-as-default-member - tseslint.configs.recommended, - { - rules: { - // unset js rules - 'no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, - }, - eslintPluginImportX.flatConfigs.recommended, - eslintPluginImportX.flatConfigs.typescript, - { - files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'], - ignores: ['eslint.config.js'], - languageOptions: { - parser: tsParser, - ecmaVersion: 'latest', - sourceType: 'module', - }, - rules: { - 'import-x/no-dynamic-require': 'warn', - 'import-x/no-nodejs-modules': 'error', - }, - }, - { - files: ['**/*.test.ts'], - rules: { - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/no-unused-vars': 'off', - 'import-x/no-nodejs-modules': 'off', - }, - }, - eslintPluginPrettierRecommended, -); +export default config({ tsconfig: { path: './tsconfig.eslint.json' } }) diff --git a/package-lock.json b/package-lock.json index c545ac3b..76594c30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,17 +10,13 @@ "license": "MIT", "dependencies": { "@feathersjs/errors": "^5.0.31", - "ajv": "^6.12.6", "fast-copy": "^3.0.2", - "graphql": "^16.10.0", "lodash": "^4.17.21", "neotraverse": "^0.6.18" }, "devDependencies": { - "@eslint/js": "^9.18.0", - "@feathers-plus/batch-loader": "^0.3.6", + "@feathers-community/eslint-config": "^0.0.7", "@feathers-plus/cache": "^1.4.0", - "@feathers-plus/graphql": "^1.10.0", "@feathersjs/authentication": "^5.0.31", "@feathersjs/authentication-local": "^5.0.31", "@feathersjs/client": "^5.0.31", @@ -28,25 +24,18 @@ "@feathersjs/memory": "^5.0.31", "@feathersjs/socketio": "^5.0.31", "@feathersjs/socketio-client": "^5.0.31", - "@types/debug": "^4.1.12", + "@tsconfig/node22": "^22.0.2", "@types/lodash": "^4.17.14", "@types/node": "^22.10.7", - "@typescript-eslint/eslint-plugin": "^8.21.0", - "@typescript-eslint/parser": "^8.21.0", "@vitest/coverage-v8": "^3.0.3", "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "eslint-import-resolver-typescript": "^3.7.0", - "eslint-plugin-import-x": "^4.6.1", - "eslint-plugin-prettier": "^5.2.3", - "mongodb": "^5.9.2", "npm-check-updates": "^17.1.14", "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsup": "^8.3.5", + "tsdown": "^0.12.6", "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0", + "unplugin-unused": "^0.5.0", "vitepress": "^1.6.2", "vitest": "^3.0.3" }, @@ -54,46 +43,38 @@ "@feathersjs/feathers": "^5.0.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@algolia/autocomplete-core": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", - "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", + "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.9", - "@algolia/autocomplete-shared": "1.17.9" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", - "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", + "version": "1.17.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.9" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", - "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", + "version": "1.17.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.9" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -101,9 +82,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", - "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", + "version": "1.17.7", + "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": { @@ -112,41 +93,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.19.0.tgz", - "integrity": "sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.27.0.tgz", + "integrity": "sha512-SITU5umoknxETtw67TxJu9njyMkWiH8pM+Bvw4dzfuIrIAT6Y1rmwV4y0A0didWoT+6xVuammIykbtBMolBcmg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.19.0.tgz", - "integrity": "sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.27.0.tgz", + "integrity": "sha512-go1b9qIZK5vYEQ7jD2bsfhhhVsoh9cFxQ5xF8TzTsg2WOCZR3O92oXCkq15SOK0ngJfqDU6a/k0oZ4KuEnih1Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.19.0.tgz", - "integrity": "sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.27.0.tgz", + "integrity": "sha512-tnFOzdNuMzsz93kOClj3fKfuYoF3oYaEB5bggULSj075GJ7HUNedBEm7a6ScrjtnOaOtipbnT7veUpHA4o4wEQ==", "dev": true, "license": "MIT", "engines": { @@ -154,156 +135,163 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.19.0.tgz", - "integrity": "sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.27.0.tgz", + "integrity": "sha512-y1qgw39qZijjQBXrqZTiwK1cWgWGRiLpJNWBv9w36nVMKfl9kInrfsYmdBAfmlhVgF/+Woe0y1jQ7pa4HyShAw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.19.0.tgz", - "integrity": "sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.27.0.tgz", + "integrity": "sha512-XluG9qPZKEbiLoIfXTKbABsWDNOMPx0t6T2ImJTTeuX+U/zBdmfcqqgcgkqXp+vbXof/XX/4of9Eqo1JaqEmKw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.19.0.tgz", - "integrity": "sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.27.0.tgz", + "integrity": "sha512-V8/To+SsAl2sdw2AAjeLJuCW1L+xpz+LAGerJK7HKqHzE5yQhWmIWZTzqYQcojkii4iBMYn0y3+uReWqT8XVSQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.19.0.tgz", - "integrity": "sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.27.0.tgz", + "integrity": "sha512-EJJ7WmvmUXZdchueKFCK8UZFyLqy4Hz64snNp0cTc7c0MKaSeDGYEDxVsIJKp15r7ORaoGxSyS4y6BGZMXYuCg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.19.0.tgz", - "integrity": "sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.27.0.tgz", + "integrity": "sha512-xNCyWeqpmEo4EdmpG57Fs1fJIQcPwt5NnJ6MBdXnUdMVXF4f5PHgza+HQWQQcYpCsune96jfmR0v7us6gRIlCw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.19.0.tgz", - "integrity": "sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.27.0.tgz", + "integrity": "sha512-P0NDiEFyt9UYQLBI0IQocIT7xHpjMpoFN3UDeerbztlkH9HdqT0GGh1SHYmNWpbMWIGWhSJTtz6kSIWvFu4+pw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.19.0.tgz", - "integrity": "sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.27.0.tgz", + "integrity": "sha512-cqfTMF1d1cc7hg0vITNAFxJZas7MJ4Obc36WwkKpY23NOtGb+4tH9X7UKlQa2PmTgbXIANoJ/DAQTeiVlD2I4Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" + "@algolia/client-common": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.19.0.tgz", - "integrity": "sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.27.0.tgz", + "integrity": "sha512-ErenYTcXl16wYXtf0pxLl9KLVxIztuehqXHfW9nNsD8mz9OX42HbXuPzT7y6JcPiWJpc/UU/LY5wBTB65vsEUg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.19.0.tgz", - "integrity": "sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.27.0.tgz", + "integrity": "sha512-CNOvmXsVi+IvT7z1d+6X7FveVkgEQwTNgipjQCHTIbF9KSMfZR7tUsJC+NpELrm10ALdOMauah84ybs9rw1cKQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.19.0.tgz", - "integrity": "sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.27.0.tgz", + "integrity": "sha512-Nx9EdLYZDsaYFTthqmc0XcVvsx6jqeEX8fNiYOB5i2HboQwl8pJPj1jFhGqoGd0KG7KFR+sdPO5/e0EDDAru2Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.19.0" + "@algolia/client-common": "5.27.0" }, "engines": { "node": ">= 14.0.0" } }, + "node_modules/@altano/repository-tools": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@altano/repository-tools/-/repository-tools-0.1.1.tgz", + "integrity": "sha512-5vbUs2A98CC3g1AlOBdkBE0BMukkLjLIsMHAtuxg6Pt9dQXxYWdLKOf66v6c/vIqtNcgTMv0oGtddLdMuH9X6w==", + "dev": true, + "license": "ISC" + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -318,10 +306,27 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -329,9 +334,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "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==", "dev": true, "license": "MIT", "engines": { @@ -339,13 +344,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -355,27 +360,24 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "dev": true, "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -392,33 +394,33 @@ } }, "node_modules/@docsearch/css": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.3.tgz", - "integrity": "sha512-1nELpMV40JDLJ6rpVVFX48R1jsBFIQ6RnEQDsLFGmzOjPWTOMlZqUcXcvRx8VmYV/TqnS1l784Ofz+ZEb+wEOQ==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", "dev": true, "license": "MIT" }, "node_modules/@docsearch/js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.3.tgz", - "integrity": "sha512-CQsX1zeoPJIWxN3IGoDSWOqzRc0JsOE9Bclegf9llwjYN2rzzJF93zagGcT3uI3tF31oCqTuUOVGW/mVFb7arw==", + "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.3", + "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.3.tgz", - "integrity": "sha512-6UNrg88K7lJWmuS6zFPL/xgL+n326qXqZ7Ybyy4E8P/6Rcblk3GE8RXxeol4Pd5pFpKMhOhBhzABKKwHtbJCIg==", + "version": "3.8.2", + "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.9", - "@algolia/autocomplete-preset-algolia": "1.17.9", - "@docsearch/css": "3.8.3", + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { @@ -442,10 +444,44 @@ } } }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "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" ], @@ -456,13 +492,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "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" ], @@ -473,13 +509,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "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" ], @@ -490,13 +526,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -507,11 +543,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "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" ], @@ -526,9 +564,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "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" ], @@ -539,13 +577,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "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" ], @@ -556,13 +594,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "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" ], @@ -573,13 +611,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -590,13 +628,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "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" ], @@ -607,13 +645,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -624,13 +662,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "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" ], @@ -641,13 +679,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -658,13 +696,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "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" ], @@ -675,13 +713,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "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" ], @@ -692,13 +730,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -709,13 +747,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "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" ], @@ -726,30 +764,13 @@ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -760,30 +781,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -794,13 +798,13 @@ "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "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" ], @@ -811,13 +815,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -828,13 +832,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "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" ], @@ -845,13 +849,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "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" ], @@ -862,19 +866,24 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -890,13 +899,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -904,10 +913,44 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -918,9 +961,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -941,221 +984,161 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "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==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.10.0", - "levn": "^0.4.1" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@feathers-plus/batch-loader": { - "version": "0.3.6", + "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": ">= 6.0.0" + "node": ">= 4" } }, - "node_modules/@feathers-plus/cache": { - "version": "1.4.0", + "node_modules/@eslint/eslintrc/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, - "license": "MIT", - "dependencies": { - "lru-cache": "4.1.1" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@feathers-plus/common": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "short-hash": "1.0.0", - "sort-keys": "2.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } + "license": "MIT" }, - "node_modules/@feathers-plus/graphql": { - "version": "1.10.0", + "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": "MIT", + "license": "ISC", "dependencies": { - "@feathers-plus/batch-loader": "0.3.0", - "@feathers-plus/cache": "1.3.1", - "@feathers-plus/common": "0.1.0", - "@feathersjs/errors": "3.2.0", - "debug": "3.1.0", - "feathers-hooks-common": "4.5.6", - "graphql": "0.11.7", - "graphql-resolvers-ast": "1.4.0", - "graphql-tools": "2.0.0", - "graphql-type-json": "0.1.4", - "join-monster": "2.0.15", - "join-monster-graphql-tools-adapter": "0.0.2", - "lodash.merge": "4.6.1", - "mongo-sql": "4.0.2", - "traverse": "0.6.6" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 8.0.0" + "node": "*" } }, - "node_modules/@feathers-plus/graphql/node_modules/@feathers-plus/batch-loader": { - "version": "0.3.0", + "node_modules/@eslint/js": { + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@feathers-plus/graphql/node_modules/@feathers-plus/cache": { - "version": "1.3.1", + "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": "MIT", - "dependencies": { - "lru-cache": "4.1.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@feathers-plus/graphql/node_modules/@feathersjs/errors": { - "version": "3.2.0", + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "debug": "^3.1.0" + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@feathers-plus/graphql/node_modules/debug": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@feathers-plus/graphql/node_modules/graphql": { - "version": "0.11.7", - "dev": true, - "license": "MIT", - "dependencies": { - "iterall": "1.1.3" - } - }, - "node_modules/@feathers-plus/graphql/node_modules/graphql-relay": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "graphql": "^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@feathers-plus/graphql/node_modules/graphql-tools": { - "version": "2.0.0", + "node_modules/@feathers-community/eslint-config": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@feathers-community/eslint-config/-/eslint-config-0.0.7.tgz", + "integrity": "sha512-HhZ08KT5SKzRvDQ3ZCoepc5ZOhrYTBbAsjnq1oBQ8qe4jWwGlfT8AFMFzQsqE/7mJq0dVYfLnj8Jx0+Tntee2Q==", "dev": true, "license": "MIT", "dependencies": { - "deprecated-decorator": "^0.1.6", - "uuid": "^3.1.0" - }, - "optionalDependencies": { - "@types/graphql": "^0.11.4" + "@eslint/js": "^9.28.0", + "@typescript-eslint/eslint-plugin": "^8.33.1", + "@typescript-eslint/parser": "^8.33.1", + "eslint-config-prettier": "^10.1.5", + "eslint-import-resolver-typescript": "^4.4.2", + "eslint-plugin-import-x": "^4.15.1", + "eslint-plugin-package-json": "^0.33.2", + "eslint-plugin-prettier": "^5.4.1", + "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unused-imports": "^4.1.4", + "globals": "^16.2.0", + "typescript-eslint": "^8.33.1" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0" + "eslint": "^9.0.0" } }, - "node_modules/@feathers-plus/graphql/node_modules/join-monster": { - "version": "2.0.15", + "node_modules/@feathers-plus/cache": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@feathers-plus/cache/-/cache-1.4.0.tgz", + "integrity": "sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==", "dev": true, "license": "MIT", "dependencies": { - "@stem/nesthydrationjs": "0.4.0", - "debug": "^3.0.1", - "deprecate": "^1.0.0", - "generatorics": "^1.0.8", - "graphql-relay": "^0.5.0", - "lodash": "^4.13.1" + "lru-cache": "4.1.1" }, "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "graphql": "0.6 || 0.7 || 0.8 || 0.9 || 0.10 || 0.11" - } - }, - "node_modules/@feathers-plus/graphql/node_modules/join-monster-graphql-tools-adapter": { - "version": "0.0.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "graphql-tools": "^0.4.0", - "join-monster": "*" - } - }, - "node_modules/@feathers-plus/graphql/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@feathers-plus/graphql/node_modules/traverse": { - "version": "0.6.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@feathers-plus/graphql/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" + "node": ">= 6.0.0" } }, "node_modules/@feathersjs/adapter-commons": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.31.tgz", - "integrity": "sha512-x+RfY1H25ZGOmv/1p6Ob81AO/2KC+N2iJCVUFLItsHaGuMRn+s692GNYAl4Vk/kL3HzoPmfunSrCUxCXZ6MV5Q==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.34.tgz", + "integrity": "sha512-wc0HAZ0uov68p1ytBR5npyAePdNbFrRqr1fINSpLvIkrUkKDEcC6I/lOpk1TBpoI8so5IO/seZhkl25pqKM43A==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31" + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", + "@feathersjs/feathers": "^5.0.34" }, "engines": { "node": ">= 12" @@ -1166,23 +1149,23 @@ } }, "node_modules/@feathersjs/authentication": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.31.tgz", - "integrity": "sha512-mIu9v5UnQl6KnMUyrS+NNwBc5F8aM0DfsuIBn6/tYRi+r0KOFx08zwqo6Ai7/0b+uaMrUB8YM54295GLxM4o9A==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.34.tgz", + "integrity": "sha512-JnOoYJKx60SQDCj/JJAH9wzAL0EFFMaOjBN5Vh8JVTj1L4IrxUfy7uGathBumQc5vB2BqtyCy4BG8+/L49oQbA==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", + "@feathersjs/feathers": "^5.0.34", "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.31", - "@feathersjs/transport-commons": "^5.0.31", - "@types/jsonwebtoken": "^9.0.7", + "@feathersjs/schema": "^5.0.34", + "@feathersjs/transport-commons": "^5.0.34", + "@types/jsonwebtoken": "^9.0.9", "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", "long-timeout": "^0.1.1", - "uuid": "^11.0.2" + "uuid": "^11.1.0" }, "engines": { "node": ">= 12" @@ -1193,16 +1176,16 @@ } }, "node_modules/@feathersjs/authentication-client": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.31.tgz", - "integrity": "sha512-SzAtQ8QK49HbYIokzLUEnv7MfvKAobZoCi5tVkssgfVP0L9fiYcR6fXdtfJ7UkaoR55IbLGUctkPpz0zExCr6Q==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.34.tgz", + "integrity": "sha512-j+p88bnyZmOHelpiL3AbTee0gsEDF5G3/vyJm0x157Q3Y3vXsI4LU7n7Go3cbrjNkCpdqV0pn8CiaxFgQ2lteA==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.31", - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31" + "@feathersjs/authentication": "^5.0.34", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", + "@feathersjs/feathers": "^5.0.34" }, "engines": { "node": ">= 12" @@ -1213,17 +1196,17 @@ } }, "node_modules/@feathersjs/authentication-local": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-5.0.31.tgz", - "integrity": "sha512-2pChJJnP4UW2TnhsOaj4spTWrCsjy5dXlG9bE9jSaJlGUXuex8iKiofInsu8GxWdd8vNhP1ArPLvrZOw6knIPA==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-local/-/authentication-local-5.0.34.tgz", + "integrity": "sha512-3swHyoz/kW3lTAoGRNT1Y49PXy+wx1/bgw5AQpExLanLuXipevuKHapLvlDUh914bz8vw6FmC/5TnFwxrx8OOQ==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.31", - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", - "bcryptjs": "^2.4.3", + "@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" }, "engines": { @@ -1235,17 +1218,17 @@ } }, "node_modules/@feathersjs/client": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-5.0.31.tgz", - "integrity": "sha512-d7516ANfv3HUmBFoPY17kTh7pU++Jim9i/PwjbUBJzUWCp2Ilup+txaVrT9wna0NKdgMB/IB4Fr4e2zOmTkGuw==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/client/-/client-5.0.34.tgz", + "integrity": "sha512-6ZFnETydjXH4wHwSB6TwiYUQ2qHhKhcw8finyA7A845yVSbQQYns5pTPNCHFG2GPpZpb43I6RZuP//HRfN5AIw==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication-client": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", - "@feathersjs/rest-client": "^5.0.31", - "@feathersjs/socketio-client": "^5.0.31" + "@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" }, "engines": { "node": ">= 12" @@ -1256,9 +1239,9 @@ } }, "node_modules/@feathersjs/commons": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.31.tgz", - "integrity": "sha512-Kp8euV0ARSxQMCSH+em0opQBK2QkuWf+gPs+pnWK16H8kDciQ0tOz1st11X/5CYMbhy5Ccp2LSclpMQ7xNcrdA==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.34.tgz", + "integrity": "sha512-UfHzq7taVJx++TXxX5pmDSR72xRp+h5nler4xcUlcJWLLykCOYo8YCeW03S7T1p1NuFdy0qBmU+B+G89bjyGmg==", "license": "MIT", "engines": { "node": ">= 12" @@ -1269,33 +1252,33 @@ } }, "node_modules/@feathersjs/errors": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-5.0.31.tgz", - "integrity": "sha512-+ar4aq8Ka1EtTGH1+BBIDW12nfNJKnnzGdevoCmSmfHVAdb66se5fWv3I4rShvnguYyeUg8rkICJYf7AEcrPiw==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-5.0.34.tgz", + "integrity": "sha512-C0t+pONnMvwlDW6iczcYmxaHzGvaGn3+BLhwlySEVYRciWOURIO8Eo5JVdN7cSM3Z7AxS3Dpk4DEhyFU/D2w6w==", "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/@feathersjs/express": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.31.tgz", - "integrity": "sha512-LL9BiI9EDrFt31/3vn1Z0qgeBjM/JXFeZNKqNqxxbCiIZS/d09m/bdrC8b1pBcPRT4Q4KUrLbnxAUNmOShYm/w==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.34.tgz", + "integrity": "sha512-TNy8vEIYnjB9eEwancP07C5wYnv5i1vXctKH9HhtIfa1xJ7KnGgIDT9LNO4gX0OeURzDcE+zFEB9Xnto6zKh4g==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.31", - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", - "@feathersjs/transport-commons": "^5.0.31", + "@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.7.5", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.19.5", - "compression": "^1.7.4", + "compression": "^1.8.0", "cors": "^2.8.5", - "express": "^4.21.1" + "express": "^4.21.2" }, "engines": { "node": ">= 12" @@ -1306,12 +1289,12 @@ } }, "node_modules/@feathersjs/feathers": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.31.tgz", - "integrity": "sha512-QCGyemcRGnKMLMJ0XssAwaaGwydhE4KG8QwUVgMQdrJ1yOjx4NvXbOgsWeJ0kJ971KkxzNt1AKN1WJc398qyhw==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.34.tgz", + "integrity": "sha512-jgeqKq/Uhsfeld42F8uimqzPv/uhtohkenpaWeD+NudJp2YZNYfA6gDZAL5UTpAvrTJFmK3QR1q1CnuL1mJdHg==", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", + "@feathersjs/commons": "^5.0.34", "@feathersjs/hooks": "^0.9.0", "events": "^3.3.0" }, @@ -1325,21 +1308,23 @@ }, "node_modules/@feathersjs/hooks": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@feathersjs/hooks/-/hooks-0.9.0.tgz", + "integrity": "sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@feathersjs/memory": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.31.tgz", - "integrity": "sha512-fyju2ktjeuIpLLW0pJNuJranVt+bfmiUkQXZj3W5RfMPw1p3lF7vJ+mQUjp4i5qyNS8qUQ/2OsW9zp5m96LAQQ==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.34.tgz", + "integrity": "sha512-VU9cMdUPNL89FogvkiVPH70cHnDwIBU8mJWz0HMxeehycN3iUIjqmVIUO8Qg6HH4O17oiU/nKqvXgEOdr+L9AQ==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.31", - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", + "@feathersjs/adapter-commons": "^5.0.34", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", "sift": "^17.1.3" }, "engines": { @@ -1347,17 +1332,17 @@ } }, "node_modules/@feathersjs/rest-client": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-5.0.31.tgz", - "integrity": "sha512-djnj+AzwikQa2PjWgrsP3YdxouZpRJFOLbuw/5dnieKnrvGkvQi2kacJ5nHO0KYHQJUDioC64NwV+CDx4NjGuA==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/rest-client/-/rest-client-5.0.34.tgz", + "integrity": "sha512-rWn47ZVLJ6igqbJeKyy6QleZceEjfPtmjR/DI+S1Ph7CAep0Ax2rqkwhSIWIoRnp4A7jFay1M3Jy3tA3Eyk7MQ==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", + "@feathersjs/feathers": "^5.0.34", "@types/superagent": "^8.1.9", - "qs": "^6.13.0" + "qs": "^6.14.0" }, "engines": { "node": ">= 12" @@ -1368,16 +1353,16 @@ } }, "node_modules/@feathersjs/schema": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.31.tgz", - "integrity": "sha512-F09M6+SwoKw0L7iqCU31eCzZOPgXWW0g66C1AjNOvchT06JDVYhzx0RaCxRLtI1xaXwd5MnlvVb4RB6uVc4wmw==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.34.tgz", + "integrity": "sha512-BpQxp46Vp0tH7l9jW4HIAGQerql7aJBeRXRggCVhBuqK48KoD1UhvYCWBmWwEouaYUnZ77HjQIMn9c1fK+dF2w==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.31", - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", + "@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", @@ -1392,43 +1377,19 @@ "url": "https://github.com/sponsors/daffl" }, "peerDependencies": { - "typescript": ">=5.6" - } - }, - "node_modules/@feathersjs/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==", - "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" + "typescript": ">=5.8" } }, - "node_modules/@feathersjs/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==", - "dev": true, - "license": "MIT" - }, "node_modules/@feathersjs/socketio": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.31.tgz", - "integrity": "sha512-ZTucvK9dWJenVjULH4xIDgXo4mPnIr/xxBviXbd/ILCqFtx/oGMsl0gOY4MWEciTWUErsDjy6YGblSJX5/a5cA==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.34.tgz", + "integrity": "sha512-uT94CeSRcnhOIThjiFg/wU30koVPoPrJUHyiQia3Q9sSB5wcaoWaJAIUcOEIZmGrgW2FNLPRw9THpAUTIgd4/w==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", - "@feathersjs/transport-commons": "^5.0.31", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/feathers": "^5.0.34", + "@feathersjs/transport-commons": "^5.0.34", "socket.io": "^4.8.1" }, "engines": { @@ -1440,14 +1401,14 @@ } }, "node_modules/@feathersjs/socketio-client": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.31.tgz", - "integrity": "sha512-Ig1ZyBDUbbLRG8d4jV6bvIlgRspvDXNtAyc5hKc57UyU1uGAV8dFTk2xH0micz+rzky+PIds4ZqGMb/n+b0D6w==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.34.tgz", + "integrity": "sha512-7mejzCX/lotsKFZaRrL1KA/lIuI/m1iPxy+5I7Fb+PLpRQUWAdNcCJPk/TutyXm+ksFNliPe2hB6qiXpKeqg3Q==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/feathers": "^5.0.31", - "@feathersjs/transport-commons": "^5.0.31" + "@feathersjs/feathers": "^5.0.34", + "@feathersjs/transport-commons": "^5.0.34" }, "engines": { "node": ">= 12" @@ -1458,15 +1419,15 @@ } }, "node_modules/@feathersjs/transport-commons": { - "version": "5.0.31", - "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-5.0.31.tgz", - "integrity": "sha512-md3dhUm47vh6aqPwb0T0Kj+LZI2JkRwMRTSx/X6w0n2evOB1x3/wspI4QY4JeUnPN0ab+IHlZVEF10FL0UQPQw==", + "version": "5.0.34", + "resolved": "https://registry.npmjs.org/@feathersjs/transport-commons/-/transport-commons-5.0.34.tgz", + "integrity": "sha512-l+oQm1oIvfrxNUlidcqCtKfdWdKn1zHXGhEa13xIKiU5m2LFz1EYeMuq5vh/1pU0iECq3Oi+KdW53YnGl446cw==", "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.31", - "@feathersjs/errors": "^5.0.31", - "@feathersjs/feathers": "^5.0.31", + "@feathersjs/commons": "^5.0.34", + "@feathersjs/errors": "^5.0.34", + "@feathersjs/feathers": "^5.0.34", "encodeurl": "^2.0.0", "lodash": "^4.17.21" }, @@ -1518,6 +1479,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1529,9 +1492,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "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": { @@ -1543,9 +1506,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.21.tgz", - "integrity": "sha512-aqbIuVshMZ2fNEhm25//9DoKudboXF3CpoEQJJlHl9gVSVNOTr4cgaCIZvgSEYmys2HHEfmhcpoZIhoEFZS8SQ==", + "version": "1.2.37", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.37.tgz", + "integrity": "sha512-jZwTBznpYVDYKWyAuRpepPpCiHScVrX6f8WRX8ReX6pdii99LYVHwJywKcH2excWQrWmBomC9nkxGlEKzXZ/wQ==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -1561,6 +1524,8 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -1576,7 +1541,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -1586,13 +1553,30 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@isaacs/cliui/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, "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": { @@ -1609,6 +1593,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1621,6 +1607,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/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, + "license": "MIT", + "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/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1647,7 +1651,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "version": "3.1.2", + "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": { @@ -1673,6 +1679,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1680,13 +1688,17 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.0", + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz", + "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "sparse-bitfield": "^3.0.3" + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1727,18 +1739,30 @@ "node": ">= 8" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "node_modules/@oxc-project/runtime": { + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.72.2.tgz", + "integrity": "sha512-J2lsPDen2mFs3cOA1gIBd0wsHEhum2vTnuKIRwmj3HJJcIz/XgeNdzvgSOioIXOJgURIpcDaK05jwaDG1rhDwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.4.0" + "node": ">=6.9.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.72.2", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.72.2.tgz", + "integrity": "sha512-il5RF8AP85XC0CMjHF4cnVT9nT/v/ocm6qlZQpSiAR9qBbQMGkFKloBZwm7PcnOdiUX97yHgsKM7uDCCWCu3tg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "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, "license": "MIT", "optional": true, @@ -1747,48 +1771,38 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", + "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz", - "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz", - "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==", - "cpu": [ - "arm64" - ], + "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", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "quansync": "^0.2.10" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz", - "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-Hlt/h+lOJ+ksC2wED2M9Hku/9CA2Hr17ENK82gNMmi3OqwcZLdZFqJDpASTli65wIOeT4p9rIUMdkfshCoJpYA==", "cpu": [ "arm64" ], @@ -1799,10 +1813,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz", - "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-Bnst+HBwhW2YrNybEiNf9TJkI1myDgXmiPBVIOS0apzrLCmByzei6PilTClOpTpNFYB+UviL3Ox2gKUmcgUjGw==", "cpu": [ "x64" ], @@ -1813,24 +1827,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz", - "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz", - "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-3jAxVmYDPc8vMZZOfZI1aokGB9cP6VNeU9XNCx0UJ6ShlSPK3qkAa0sWgueMhaQkgBVf8MOfGpjo47ohGd7QrA==", "cpu": [ "x64" ], @@ -1841,10 +1841,10 @@ "freebsd" ] }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz", - "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-TpUltUdvcsAf2WvXXD8AVc3BozvhgazJ2gJLXp4DVV2V82m26QelI373Bzx8d/4hB167EEIg4wWW/7GXB/ltoQ==", "cpu": [ "arm" ], @@ -1855,12 +1855,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz", - "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-eGvHnYQSdbdhsTdjdp/+83LrN81/7X9HD6y3jg7mEmdsicxEMEIt6CsP7tvYS/jn4489jgO/6mLxW/7Vg+B8pw==", "cpu": [ - "arm" + "arm64" ], "dev": true, "license": "MIT", @@ -1869,10 +1869,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz", - "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-0NJZWXJls83FpBRzkTbGBsXXstaQLsfodnyeOghxbnNdsjn+B4dcNPpMK5V3QDsjC0pNjDLaDdzB2jWKlZbP/Q==", "cpu": [ "arm64" ], @@ -1883,12 +1883,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz", - "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-9vXnu27r4zgS/BHP6RCLBOrJoV2xxtLYHT68IVpSOdCkBHGpf1oOJt6blv1y5NRRJBEfAFCvj5NmwSMhETF96w==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", @@ -1897,12 +1897,12 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz", - "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-e6tvsZbtHt4kzl82oCajOUxwIN8uMfjhuQ0qxIVRzPekRRjKEzyH9agYPW6toN0cnHpkhPsu51tyZKJOdUl7jg==", "cpu": [ - "loong64" + "x64" ], "dev": true, "license": "MIT", @@ -1911,52 +1911,55 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz", - "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-nBQVizPoUQiViANhWrOyihXNf2booP2iq3S396bI1tmHftdgUXWKa6yAoleJBgP0oF0idXpTPU82ciaROUcjpg==", "cpu": [ - "ppc64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.21.3" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz", - "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-Rey/ECXKI/UEykrKfJX3oVAPXDH2k1p2BKzYGza0z3S2X5I3sTDOeBn2I0IQgyyf7U3+DCBhYjkDFnmSePrU/A==", "cpu": [ - "riscv64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz", - "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==", + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-LtuMKJe6iFH4iV55dy+gDwZ9v23Tfxx5cd7ZAxvhYFGoVNSvarxAgl844BvFGReERCnLTGRvo85FUR6fDHQX+A==", "cpu": [ - "s390x" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz", - "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-YY8UYfBm4dbWa4psgEPPD9T9X0nAvlYu0BOsQC5vDfCwzzU7IHT4jAfetvlQq+4+M6qWHSTr6v+/WX5EmlM1WA==", "cpu": [ "x64" ], @@ -1964,27 +1967,34 @@ "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ] }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz", - "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-TAqMYehvpauLKz7v4TZOTUQNjxa5bUQWw2+51/+Zk3ItclBxgoSWhnZ31sXjdoX6le6OXdK2vZfV3KoyW/O/GA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "android" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz", - "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -1992,27 +2002,27 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "android" ] }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz", - "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz", - "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -2020,93 +2030,317 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" ] }, "node_modules/@shikijs/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.1.0.tgz", - "integrity": "sha512-v795KDmvs+4oV0XD05YLzfDMe9ISBgNjtFxP4PAEv5DqyeghO1/TwDqs9ca5/E6fuO95IcAcWqR6cCX9TnqLZA==", + "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": { - "@shikijs/engine-javascript": "2.1.0", - "@shikijs/engine-oniguruma": "2.1.0", - "@shikijs/types": "2.1.0", - "@shikijs/vscode-textmate": "^10.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/@shikijs/engine-javascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.1.0.tgz", - "integrity": "sha512-cgIUdAliOsoaa0rJz/z+jvhrpRd+fVAoixVFEVxUq5FA+tHgBZAIfVJSgJNVRj2hs/wZ1+4hMe82eKAThVh0nQ==", + "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": { - "@shikijs/types": "2.1.0", - "@shikijs/vscode-textmate": "^10.0.1", - "oniguruma-to-es": "^2.3.0" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.1.0.tgz", - "integrity": "sha512-Ujik33wEDqgqY2WpjRDUBECGcKPv3eGGkoXPujIXvokLaRmGky8NisSk8lHUGeSFxo/Cz5sgFej9sJmA9yeepg==", + "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": { - "@shikijs/types": "2.1.0", - "@shikijs/vscode-textmate": "^10.0.1" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.1.0.tgz", - "integrity": "sha512-Jn0gS4rPgerMDPj1ydjgFzZr5fAIoMYz4k7ZT3LJxWWBWA6lokK0pumUwVtb+MzXtlpjxOaQejLprmLbvMZyww==", + "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, "license": "MIT", "dependencies": { - "@shikijs/types": "2.1.0" + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/themes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.1.0.tgz", - "integrity": "sha512-oS2mU6+bz+8TKutsjBxBA7Z3vrQk21RCmADLpnu8cy3tZD6Rw0FKqDyXNtwX52BuIDKHxZNmRlTdG3vtcYv3NQ==", + "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": { - "@shikijs/types": "2.1.0" + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/transformers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.1.0.tgz", - "integrity": "sha512-3sfvh6OKUVkT5wZFU1xxiq1qqNIuCwUY3yOb9ZGm19y80UZ/eoroLE2orGNzfivyTxR93GfXXZC/ghPR0/SBow==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "2.1.0", - "@shikijs/types": "2.1.0" + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" } }, "node_modules/@shikijs/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.1.0.tgz", - "integrity": "sha512-OFOdHA6VEVbiQvepJ8yqicC6VmBrKxFFhM2EsHHrZESqLVAXOSeRDiuSYV185lIgp15TVic5vYBYNhTsk1xHLg==", + "version": "2.5.0", + "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.1", + "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", - "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, @@ -2117,21 +2351,28 @@ "dev": true, "license": "MIT" }, - "node_modules/@stem/nesthydrationjs": { - "version": "0.4.0", + "node_modules/@tsconfig/node22": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.2.tgz", + "integrity": "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==", "dev": true, - "license": "ISC", - "dependencies": { - "lodash": "4.13.1" - } + "license": "MIT" }, - "node_modules/@stem/nesthydrationjs/node_modules/lodash": { - "version": "4.13.1", + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2139,29 +2380,37 @@ "@types/node": "*" } }, + "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, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, "node_modules/@types/compression": { - "version": "1.7.5", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-g4vmPIwbTii9dX1HVioHbOolubEaf4re4vDxuzpKrzz9uI7uarBExi9begX0cXyIB85jXZ5X2A/v8rsHZxSAPw==", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "@types/express": "*", + "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/cookiejar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", @@ -2170,37 +2419,33 @@ "license": "MIT" }, "node_modules/@types/cors": { - "version": "2.8.17", + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/doctrine": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "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/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "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/express": { - "version": "4.17.21", + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", "dev": true, "license": "MIT", "dependencies": { @@ -2211,7 +2456,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2221,12 +2468,6 @@ "@types/send": "*" } }, - "node_modules/@types/graphql": { - "version": "0.11.8", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -2239,6 +2480,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -2250,12 +2493,13 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", "dev": true, "license": "MIT", "dependencies": { + "@types/ms": "*", "@types/node": "*" } }, @@ -2267,9 +2511,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==", + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", + "integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==", "dev": true, "license": "MIT" }, @@ -2310,36 +2554,46 @@ }, "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/ms": { - "version": "0.7.31", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.15.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", + "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { - "version": "6.9.11", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "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==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "license": "MIT", "dependencies": { @@ -2348,13 +2602,15 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/superagent": { @@ -2378,42 +2634,28 @@ "license": "MIT" }, "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "dev": true, "license": "MIT" }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", - "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", + "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/type-utils": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/type-utils": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2423,22 +2665,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.33.1", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", - "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", + "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", "debug": "^4.3.4" }, "engines": { @@ -2450,18 +2692,19 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", + "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" + "@typescript-eslint/tsconfig-utils": "^8.33.1", + "@typescript-eslint/types": "^8.33.1", + "debug": "^4.3.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2469,19 +2712,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", - "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", + "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2489,16 +2733,12 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", + "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", "dev": true, "license": "MIT", "engines": { @@ -2507,23 +2747,22 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", + "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/utils": "8.33.1", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2533,46 +2772,64 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/typescript-estree/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==", + "node_modules/@typescript-eslint/types": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", + "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.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/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", + "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/project-service": "8.33.1", + "@typescript-eslint/tsconfig-utils": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", + "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2583,17 +2840,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", + "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/types": "8.33.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2618,16 +2875,257 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.11.tgz", + "integrity": "sha512-i3/wlWjQJXMh1uiGtiv7k1EYvrrS3L1hdwmWJJiz1D8jWy726YFYPIxQWbEIVPVAgrfRR0XNlLrTQwq17cuCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.11.tgz", + "integrity": "sha512-8XXyFvc6w6kmMmi6VYchZhjd5CDcp+Lv6Cn1YmUme0ypsZ/0Kzd+9ESrWtDrWibKPTgSteDTxp75cvBOY64FQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.11.tgz", + "integrity": "sha512-0qJBYzP8Qk24CZ05RSWDQUjdiQUeIJGfqMMzbtXgCKl/a5xa6thfC0MQkGIr55LCLd6YmMyO640ifYUa53lybQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.11.tgz", + "integrity": "sha512-1sGwpgvx+WZf0GFT6vkkOm6UJ+mlsVnjw+Yv9esK71idWeRAG3bbpkf3AoY8KIqKqmnzJExi0uKxXpakQ5Pcbg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.11.tgz", + "integrity": "sha512-D/1F/2lTe+XAl3ohkYj51NjniVly8sIqkA/n1aOND3ZMO418nl2JNU95iVa1/RtpzaKcWEsNTtHRogykrUflJg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.11.tgz", + "integrity": "sha512-7vFWHLCCNFLEQlmwKQfVy066ohLLArZl+AV/AdmrD1/pD1FlmqM+FKbtnONnIwbHtgetFUCV/SRi1q4D49aTlw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.11.tgz", + "integrity": "sha512-tYkGIx8hjWPh4zcn17jLEHU8YMmdP2obRTGkdaB3BguGHh31VCS3ywqC4QjTODjmhhNyZYkj/1Dz/+0kKvg9YA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.11.tgz", + "integrity": "sha512-6F328QIUev29vcZeRX6v6oqKxfUoGwIIAhWGD8wSysnBYFY0nivp25jdWmAb1GildbCCaQvOKEhCok7YfWkj4Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.11.tgz", + "integrity": "sha512-NqhWmiGJGdzbZbeucPZIG9Iav4lyYLCarEnxAceguMx9qlpeEF7ENqYKOwB8Zqk7/CeuYMEcLYMaW2li6HyDzQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.11.tgz", + "integrity": "sha512-J2RPIFKMdTrLtBdfR1cUMKl8Gcy05nlQ+bEs/6al7EdWLk9cs3tnDREHZ7mV9uGbeghpjo4i8neNZNx3PYUY9w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.11.tgz", + "integrity": "sha512-bDpGRerHvvHdhun7MmFUNDpMiYcJSqWckwAVVRTJf8F+RyqYJOp/mx04PDc7DhpNPeWdnTMu91oZRMV+gGaVcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.11.tgz", + "integrity": "sha512-G9U7bVmylzRLma3cK39RBm3guoD1HOvY4o0NS4JNm37AD0lS7/xyMt7kn0JejYyc0Im8J+rH69/dXGM9DAJcSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.11.tgz", + "integrity": "sha512-7qL20SBKomekSunm7M9Fe5L93bFbn+FbHiGJbfTlp0RKhPVoJDP73vOxf1QrmJHyDPECsGWPFnKa/f8fO2FsHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.11.tgz", + "integrity": "sha512-jisvIva8MidjI+B1lFRZZMfCPaCISePgTyR60wNT1MeQvIh5Ksa0G3gvI+Iqyj3jqYbvOHByenpa5eDGcSdoSg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.11.tgz", + "integrity": "sha512-G+H5nQZ8sRZ8ebMY6mRGBBvTEzMYEcgVauLsNHpvTUavZoCCRVP1zWkCZgOju2dW3O22+8seTHniTdl1/uLz3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.11.tgz", + "integrity": "sha512-Hfy46DBfFzyv0wgR0MMOwFFib2W2+Btc8oE5h4XlPhpelnSyA6nFxkVIyTgIXYGTdFaLoZFNn62fmqx3rjEg3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.11.tgz", + "integrity": "sha512-7L8NdsQlCJ8T106Gbz/AjzM4QKWVsoQbKpB9bMBGcIZswUuAnJMHpvbqGW3RBqLHCIwX4XZ5fxSBHEFcK2h9wA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "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": { @@ -2639,22 +3137,23 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.3.tgz", - "integrity": "sha512-uVbJ/xhImdNtzPnLyxCZJMTeTIYdgcC2nWtBBBpR1H6z0w8m7D+9/zrDIx2nNxgMg9r+X8+RY2qVpUDeW2b3nw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.2.tgz", + "integrity": "sha512-RVAi5xnqedSKvaoQyCTWvncMk8eYZcTTOsLK7XmnfOEvdGP/O/upA0/MA8Ss+Qs++mj0GcSRi/whR0S5iBPpTQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", + "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.8.0", + "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, @@ -2662,8 +3161,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.3", - "vitest": "3.0.3" + "@vitest/browser": "3.2.2", + "vitest": "3.2.2" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -2672,15 +3171,16 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.3.tgz", - "integrity": "sha512-SbRCHU4qr91xguu+dH3RUdI5dC86zm8aZWydbp961aIR7G8OYNN6ZiayFuf9WAngRbFOfdrLHCGgXTj3GtoMRQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.2.tgz", + "integrity": "sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.3", - "@vitest/utils": "3.0.3", - "chai": "^5.1.2", + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.2", + "@vitest/utils": "3.2.2", + "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, "funding": { @@ -2688,13 +3188,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.3.tgz", - "integrity": "sha512-XT2XBc4AN9UdaxJAeIlcSZ0ILi/GzmG5G8XSly4gaiqIvPV3HMTSIDZWJVX6QRJ0PX1m+W8Cy0K9ByXNb/bPIA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.2.tgz", + "integrity": "sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.3", + "@vitest/spy": "3.2.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -2703,7 +3203,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -2715,9 +3215,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.3.tgz", - "integrity": "sha512-gCrM9F7STYdsDoNjGgYXKPq4SkSxwwIU5nkaQvdUxiQ0EcNlez+PdKOVIsUJvh9P9IeIFmjn4IIREWblOBpP2Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.2.tgz", + "integrity": "sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2728,56 +3228,56 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.3.tgz", - "integrity": "sha512-Rgi2kOAk5ZxWZlwPguRJFOBmWs6uvvyAAR9k3MvjRvYrG7xYvKChZcmnnpJCS98311CBDMqsW9MzzRFsj2gX3g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.2.tgz", + "integrity": "sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.3", - "pathe": "^2.0.1" + "@vitest/utils": "3.2.2", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.3.tgz", - "integrity": "sha512-kNRcHlI4txBGztuJfPEJ68VezlPAXLRT1u5UCx219TU3kOG2DplNxhWLwDf2h6emwmTPogzLnGVwP6epDaJN6Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.2.tgz", + "integrity": "sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.3", + "@vitest/pretty-format": "3.2.2", "magic-string": "^0.30.17", - "pathe": "^2.0.1" + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.3.tgz", - "integrity": "sha512-7/dgux8ZBbF7lEIKNnEqQlyRaER9nkAL9eTmdKJkDO3hS8p59ATGwKOCUDHcBLKr7h/oi/6hP+7djQk8049T2A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.2.tgz", + "integrity": "sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.2" + "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.3.tgz", - "integrity": "sha512-f+s8CvyzPtMFY1eZKkIHGhPsQgYo5qCm6O8KZoim9qm1/jT64qBgGpO5tHscNH6BzRHM+edLNOP+3vO8+8pE/A==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.2.tgz", + "integrity": "sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.3", - "loupe": "^3.1.2", + "@vitest/pretty-format": "3.2.2", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -2785,17 +3285,17 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-core/node_modules/estree-walker": { @@ -2806,32 +3306,32 @@ "license": "MIT" }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { @@ -2842,46 +3342,46 @@ "license": "MIT" }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/devtools-api": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.0.tgz", - "integrity": "sha512-bHEv6kT85BHtyGgDhE07bAUMAy7zpv6nnR004nSTd0wWMrAOtcrYoXO5iyr20Hkf5jR8obQOfS3byW+I3l2CCA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.0" + "@vue/devtools-kit": "^7.7.6" } }, "node_modules/@vue/devtools-kit": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.0.tgz", - "integrity": "sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==", + "version": "7.7.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.0", - "birpc": "^0.2.19", + "@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.1" + "superjson": "^2.2.2" } }, "node_modules/@vue/devtools-shared": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.0.tgz", - "integrity": "sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2889,70 +3389,70 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.16" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", "dev": true, "license": "MIT" }, "node_modules/@vueuse/core": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.4.0.tgz", - "integrity": "sha512-XnjQYcJwCsyXyIafyA6SvyN/OBtfPnjvJmbxNxQjCcyWD198urwm5TYvIUUyAxEAN0K7HJggOgT15cOlWFyLeA==", + "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.20", - "@vueuse/metadata": "12.4.0", - "@vueuse/shared": "12.4.0", + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "funding": { @@ -2960,14 +3460,14 @@ } }, "node_modules/@vueuse/integrations": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.4.0.tgz", - "integrity": "sha512-EZm+TLoZMeEwDnccnEqB54CvvcVKbVnJubOF380HqdyZAxWfQ8egnFCESdlXWEIbxFgjfhcGfZUvQx5Nqw9Ofw==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", "dev": true, "license": "MIT", "dependencies": { - "@vueuse/core": "12.4.0", - "@vueuse/shared": "12.4.0", + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "funding": { @@ -3027,9 +3527,9 @@ } }, "node_modules/@vueuse/metadata": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.4.0.tgz", - "integrity": "sha512-AhPuHs/qtYrKHUlEoNO6zCXufu8OgbR8S/n2oMw1OQuBQJ3+HOLQ+EpvXs+feOlZMa0p8QVvDWNlmcJJY8rW2g==", + "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": { @@ -3037,9 +3537,9 @@ } }, "node_modules/@vueuse/shared": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.4.0.tgz", - "integrity": "sha512-9yLgbHVIF12OSCojnjTIoZL1+UA10+O4E1aD6Hpfo/DKVm5o3SZIwz6CupqGy3+IcKI8d6Jnl26EQj/YucnW0Q==", + "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": { @@ -3051,6 +3551,8 @@ }, "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": { @@ -3061,10 +3563,20 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -3085,13 +3597,16 @@ } }, "node_modules/ajv": { - "version": "6.12.6", + "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, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "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", @@ -3116,57 +3631,35 @@ } } }, - "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.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.27.0.tgz", + "integrity": "sha512-2PvAgvxxJzA3+dB+ERfS2JPdvUsxNf89Cc2GF5iCcFupTULOwmbfinvqrC4Qj9nHJJDNf494NqEN/1f9177ZTQ==", "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" + "@algolia/client-abtesting": "5.27.0", + "@algolia/client-analytics": "5.27.0", + "@algolia/client-common": "5.27.0", + "@algolia/client-insights": "5.27.0", + "@algolia/client-personalization": "5.27.0", + "@algolia/client-query-suggestions": "5.27.0", + "@algolia/client-search": "5.27.0", + "@algolia/ingestion": "1.27.0", + "@algolia/monitoring": "1.27.0", + "@algolia/recommend": "5.27.0", + "@algolia/requester-browser-xhr": "5.27.0", + "@algolia/requester-fetch": "5.27.0", + "@algolia/requester-node-http": "5.27.0" }, - "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, - "license": "MIT" - }, - "node_modules/algoliasearch": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.19.0.tgz", - "integrity": "sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@algolia/client-abtesting": "5.19.0", - "@algolia/client-analytics": "5.19.0", - "@algolia/client-common": "5.19.0", - "@algolia/client-insights": "5.19.0", - "@algolia/client-personalization": "5.19.0", - "@algolia/client-query-suggestions": "5.19.0", - "@algolia/client-search": "5.19.0", - "@algolia/ingestion": "1.19.0", - "@algolia/monitoring": "1.19.0", - "@algolia/recommend": "5.19.0", - "@algolia/requester-browser-xhr": "5.19.0", - "@algolia/requester-fetch": "5.19.0", - "@algolia/requester-node-http": "5.19.0" - }, - "engines": { - "node": ">= 14.0.0" + "engines": { + "node": ">= 14.0.0" } }, "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==", "dev": true, "license": "MIT", "engines": { @@ -3175,6 +3668,8 @@ }, "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": { @@ -3187,10 +3682,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", + "node_modules/ansis": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=14" + } }, "node_modules/argparse": { "version": "2.0.1", @@ -3216,6 +3716,35 @@ "node": ">=12" } }, + "node_modules/ast-kit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.1.0.tgz", + "integrity": "sha512-ROM2LlXbZBZVk97crfw8PGDOBzzsJvN2uJCmwswvPUNyfH14eg90mSN3xNqsri1JS1G9cz0VzeDUhxJkTrr4Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.3", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", + "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3225,6 +3754,8 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, @@ -3239,14 +3770,19 @@ } }, "node_modules/bcryptjs": { - "version": "2.4.3", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } }, "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", "dev": true, "license": "MIT", "funding": { @@ -3278,16 +3814,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3322,12 +3848,13 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -3343,35 +3870,63 @@ "node": ">=8" } }, - "node_modules/bson": { - "version": "5.5.1", + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, - "license": "Apache-2.0", + "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.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">=14.20.1" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "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==", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/bundle-require": { + "node_modules/builtin-modules": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", "dev": true, "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18.20" }, - "peerDependencies": { - "esbuild": ">=0.18" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes": { - "version": "3.0.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -3380,6 +3935,8 @@ }, "node_modules/cac": { "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3387,9 +3944,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -3401,14 +3958,14 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3427,6 +3984,27 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3439,9 +4017,9 @@ } }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", "dependencies": { @@ -3457,6 +4035,8 @@ }, "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": { @@ -3518,17 +4098,64 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/co": { - "version": "4.6.0", + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">=0.8.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "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", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -3540,6 +4167,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -3567,8 +4196,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "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": { @@ -3579,16 +4220,18 @@ } }, "node_modules/compression": { - "version": "1.7.4", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -3597,6 +4240,8 @@ }, "node_modules/compression/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": { @@ -3605,26 +4250,24 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "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, "license": "MIT" }, - "node_modules/consola": { - "version": "3.2.3", + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", @@ -3682,8 +4325,24 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-js-compat": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "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": { @@ -3717,9 +4376,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3734,13 +4393,6 @@ } } }, - "node_modules/debug/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==", - "dev": true, - "license": "MIT" - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -3753,6 +4405,15 @@ }, "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, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", "dev": true, "license": "MIT" }, @@ -3776,16 +4437,6 @@ "node": ">= 0.8" } }, - "node_modules/deprecate": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/deprecated-decorator": { - "version": "0.1.6", - "dev": true, - "license": "MIT" - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3807,6 +4458,26 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -3821,17 +4492,35 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=6.0.0" + "node": ">=0.3.1" + } + }, + "node_modules/dts-resolver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-2.1.1.tgz", + "integrity": "sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } } }, "node_modules/dunder-proto": { @@ -3851,11 +4540,15 @@ }, "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, "license": "MIT" }, "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==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3869,8 +4562,17 @@ "dev": true, "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", + "dev": true, + "license": "ISC" + }, "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==", "dev": true, "license": "MIT" }, @@ -3881,6 +4583,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-1.1.0.tgz", + "integrity": "sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -3892,13 +4604,12 @@ } }, "node_modules/engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dev": true, "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", @@ -3951,27 +4662,6 @@ } } }, - "node_modules/engine.io/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3997,6 +4687,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -4004,9 +4696,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "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, "license": "MIT" }, @@ -4023,415 +4715,69 @@ "node": ">= 0.4" } }, - "node_modules/esbuild": { - "version": "0.21.5", + "node_modules/es-set-tostringtag": { + "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, - "hasInstallScript": true, "license": "MIT", - "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/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/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": ">=12" - } - }, - "node_modules/esbuild/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" - ], + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "node_modules/esbuild": { "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" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "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/esbuild/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" - ], + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, "node_modules/escape-html": { @@ -4443,6 +4789,8 @@ }, "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": { @@ -4453,22 +4801,23 @@ } }, "node_modules/eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -4476,7 +4825,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -4513,57 +4862,85 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", - "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, "license": "MIT", "bin": { - "eslint-config-prettier": "build/bin/cli.js" + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" }, "peerDependencies": { "eslint": ">=7.0.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", + "node_modules/eslint-fix-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/eslint-fix-utils/-/eslint-fix-utils-0.2.1.tgz", + "integrity": "sha512-vHvLGmqdgPhZgH+cymlAlAqVuV22auB+uk/mgFdg5zotEtMHAHcOzNzhr5XOrDzyKGEQY2uQHoT+tS8P36/2CQ==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "engines": { + "node": ">=18.3.0" + }, + "peerDependencies": { + "@types/estree": ">=1", + "eslint": ">=8" + }, + "peerDependenciesMeta": { + "@types/estree": { + "optional": true + } } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", + "node_modules/eslint-import-context": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz", + "integrity": "sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.1.1" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", - "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.3.tgz", + "integrity": "sha512-elVDn1eWKFrWlzxlWl9xMt8LltjKl161Ix50JFC50tHXI5/TRP32SNEqlJ/bo/HV+g7Rou/tlPQU2AcRtIhrOg==", "dev": true, "license": "ISC", "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.7", - "enhanced-resolve": "^5.15.0", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3", - "stable-hash": "^0.0.4" + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.1.1", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^16.17.0 || >=18.6.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", @@ -4580,68 +4957,76 @@ } }, "node_modules/eslint-plugin-import-x": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.6.1.tgz", - "integrity": "sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.15.1.tgz", + "integrity": "sha512-JfVpNg1qMkPD66iaSgmMoSYeUCGS8UFSm3GwHV0IbuV3Knar/SyK5qqCct9+AxoMIzaM+KSO7KK5pOeOkC/3GQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/doctrine": "^0.0.9", - "@typescript-eslint/scope-manager": "^8.1.0", - "@typescript-eslint/utils": "^8.1.0", - "debug": "^4.3.4", - "doctrine": "^3.0.0", - "enhanced-resolve": "^5.17.1", - "eslint-import-resolver-node": "^0.3.9", - "get-tsconfig": "^4.7.3", + "@typescript-eslint/types": "^8.33.1", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.7", "is-glob": "^4.0.3", - "minimatch": "^9.0.3", - "semver": "^7.6.3", - "stable-hash": "^0.0.4", - "tslib": "^2.6.3" + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.1.1", + "unrs-resolver": "^1.7.10" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } } }, - "node_modules/eslint-plugin-import-x/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==", + "node_modules/eslint-plugin-package-json": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-package-json/-/eslint-plugin-package-json-0.33.2.tgz", + "integrity": "sha512-YhWRNeiR44jLCLHDsG2W0mcuHflF9lKG2fSSaN+UDt4lYPCWUzTkQrrKxapabUIobMN+OnM4zsgnPKX97l/N0g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eslint-plugin-import-x/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" + "@altano/repository-tools": "^0.1.1", + "detect-indent": "6.1.0", + "detect-newline": "3.1.0", + "eslint-fix-utils": "^0.2.0", + "package-json-validator": "^0.10.0", + "semver": "^7.5.4", + "sort-object-keys": "^1.1.3", + "sort-package-json": "^3.0.0", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "eslint": ">=8.0.0", + "jsonc-eslint-parser": "^2.0.0" } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", - "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", + "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -4652,7 +5037,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -4664,10 +5049,88 @@ } } }, + "node_modules/eslint-plugin-unicorn": { + "version": "59.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", + "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "@eslint-community/eslint-utils": "^4.5.1", + "@eslint/plugin-kit": "^0.2.7", + "ci-info": "^4.2.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.41.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.0.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.22.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4683,6 +5146,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "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": { @@ -4692,6 +5157,34 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "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", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", @@ -4705,11 +5198,36 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/lodash.merge": { - "version": "4.6.2", + "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/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, "license": "MIT" }, + "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -4789,6 +5307,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4807,15 +5327,17 @@ }, "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" } }, "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4902,6 +5424,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "license": "MIT" + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -4910,10 +5439,15 @@ }, "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==", + "dev": true, "license": "MIT" }, "node_modules/fast-diff": { - "version": "1.2.0", + "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, "license": "Apache-2.0" }, @@ -4949,10 +5483,15 @@ }, "node_modules/fast-json-stable-stringify": { "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, "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, "license": "MIT" }, @@ -4970,108 +5509,19 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/feathers-hooks-common": { - "version": "4.5.6", - "dev": true, - "license": "Modified MIT", - "dependencies": { - "@feathers-plus/batch-loader": "0.3.0", - "@feathersjs/commons": "^1.2.0", - "@feathersjs/errors": "^3.0.0", - "ajv": "^5.2.0", - "debug": "^3.0.0", - "process": "0.11.10", - "traverse": "^0.6.6" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathers-plus/batch-loader": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/commons": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors": { - "version": "3.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/feathers-hooks-common/node_modules/@feathersjs/errors/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/feathers-hooks-common/node_modules/ajv": { - "version": "5.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } + ], + "license": "BSD-3-Clause" }, - "node_modules/feathers-hooks-common/node_modules/debug": { - "version": "3.2.7", + "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": "MIT", + "license": "ISC", "dependencies": { - "ms": "^2.1.1" + "reusify": "^1.0.4" } }, - "node_modules/feathers-hooks-common/node_modules/fast-deep-equal": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/feathers-hooks-common/node_modules/json-schema-traverse": { - "version": "0.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5136,6 +5586,8 @@ }, "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": { @@ -5149,6 +5601,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -5164,16 +5629,16 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "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, "license": "ISC" }, "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": { @@ -5181,11 +5646,13 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.1", + "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.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -5195,26 +5662,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -5243,12 +5701,17 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "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==", "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -5260,33 +5723,37 @@ }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generatorics": { - "version": "1.1.0", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6.0.0" + "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -5314,9 +5781,9 @@ } }, "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.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5326,15 +5793,28 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/git-hooks-list": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", + "integrity": "sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/glob": { - "version": "7.2.0", + "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, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -5347,6 +5827,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -5356,10 +5838,34 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/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/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -5382,45 +5888,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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, - "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, "license": "MIT" }, - "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-resolvers-ast": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/graphql-type-json": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "peerDependencies": { - "graphql": ">=0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5440,10 +5918,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-string": { - "version": "1.0.0", + "node_modules/has-tostringtag": { + "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": "ISC" + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/hasown": { "version": "2.0.2", @@ -5459,9 +5948,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", - "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5472,7 +5961,7 @@ "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" @@ -5552,9 +6041,9 @@ } }, "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": { @@ -5562,9 +6051,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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": { @@ -5580,14 +6069,32 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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": { @@ -5597,22 +6104,21 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/interpret": { "version": "1.4.0", + "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": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5623,22 +6129,43 @@ "node": ">= 0.10" } }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-bun-module": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", - "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.6.3" + "semver": "^7.7.1" } }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.16.1", + "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.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5646,6 +6173,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -5654,6 +6183,8 @@ }, "node_modules/is-fullwidth-code-point": { "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==", "dev": true, "license": "MIT", "engines": { @@ -5662,6 +6193,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -5682,11 +6215,16 @@ } }, "node_modules/is-plain-obj": { - "version": "1.1.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-what": { @@ -5704,11 +6242,15 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "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": { @@ -5732,6 +6274,8 @@ }, "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": { @@ -5757,11 +6301,6 @@ "node": ">=8" } }, - "node_modules/iterall": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -5778,14 +6317,23 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/joycon": { - "version": "3.1.1", + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, + "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, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5799,6 +6347,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "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" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -5821,16 +6382,62 @@ } }, "node_modules/json-schema-traverse": { - "version": "0.4.1", + "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/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, "license": "MIT" }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/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==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5851,17 +6458,21 @@ } }, "node_modules/jwa": { - "version": "1.4.1", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "dev": true, "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5881,6 +6492,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5891,32 +6504,10 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -5931,67 +6522,84 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "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.1", + "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, "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "license": "ISC", "dependencies": { @@ -6039,6 +6647,8 @@ }, "node_modules/mark.js": { "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, "license": "MIT" }, @@ -6084,12 +6694,6 @@ "node": ">= 0.6" } }, - "node_modules/memory-pager": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -6198,9 +6802,9 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { @@ -6242,7 +6846,9 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -6251,6 +6857,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -6260,21 +6868,51 @@ "node": ">= 0.6" } }, + "node_modules/mime-types/node_modules/mime-db": { + "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" + } + }, + "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" + } + }, "node_modules/minimatch": { - "version": "3.1.2", + "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": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { - "version": "1.2.6", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "7.1.2", @@ -6287,9 +6925,9 @@ } }, "node_modules/minisearch": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.1.tgz", - "integrity": "sha512-b3YZEYCEH4EdCAtYP7OlDyx7FdPwNzuNwLQ34SfJpM9dlbBZzeXndGavTrC+VCiRWomL21SWfMc6SCKO/U2ZNw==", + "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, "license": "MIT" }, @@ -6300,79 +6938,17 @@ "dev": true, "license": "MIT" }, - "node_modules/mongo-sql": { - "version": "4.0.2", - "dev": true, - "license": "BSD" - }, - "node_modules/mongodb": { - "version": "5.9.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bson": "^5.5.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "@mongodb-js/saslprep": "^1.1.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.0.0", - "kerberos": "^1.0.0 || ^2.0.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -6388,13 +6964,33 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "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, "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, "license": "MIT", "engines": { @@ -6410,10 +7006,17 @@ "node": ">= 10" } }, + "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, + "license": "MIT" + }, "node_modules/npm-check-updates": { - "version": "17.1.14", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.14.tgz", - "integrity": "sha512-dr4bXIxETubLI1tFGeock5hN8yVjahvaVpx+lPO4/O2md3zJuxB7FgH3MIoTvQSCgsgkIRpe0skti01IEAA5tA==", + "version": "17.1.18", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.18.tgz", + "integrity": "sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6427,6 +7030,8 @@ }, "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, "license": "MIT", "engines": { @@ -6434,9 +7039,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -6461,6 +7066,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, "license": "MIT", "engines": { @@ -6469,6 +7076,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==", "dev": true, "license": "ISC", "dependencies": { @@ -6476,28 +7085,30 @@ } }, "node_modules/oniguruma-to-es": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", - "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "version": "3.1.1", + "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": "^5.1.1", - "regex-recursion": "^5.1.1" + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -6505,6 +7116,8 @@ }, "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": { @@ -6519,6 +7132,8 @@ }, "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": { @@ -6532,10 +7147,28 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", + "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, "license": "BlueOak-1.0.0" }, + "node_modules/package-json-validator": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/package-json-validator/-/package-json-validator-0.10.2.tgz", + "integrity": "sha512-i8qx/xfHdkzOzP39bNOtK6VauRrLdJoQf7L1lVRG2/evpLAd3vrj3EGNlzB9QiztBerxWAx5QXZh5z+Jfi0IvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yargs": "~17.7.2" + }, + "bin": { + "pjv": "lib/bin/pjv.mjs" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6561,6 +7194,8 @@ }, "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": { @@ -6569,6 +7204,8 @@ }, "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, "license": "MIT", "engines": { @@ -6577,6 +7214,8 @@ }, "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, "license": "MIT", "engines": { @@ -6585,11 +7224,15 @@ }, "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": { @@ -6605,6 +7248,8 @@ }, "node_modules/path-scurry/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, "license": "ISC" }, @@ -6616,9 +7261,9 @@ "license": "MIT" }, "node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -6659,18 +7304,32 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.6", + "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, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=4" } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "dev": true, "funding": [ { @@ -6688,7 +7347,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6696,51 +7355,10 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/preact": { - "version": "10.25.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", - "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", + "version": "10.26.8", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.8.tgz", + "integrity": "sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==", "dev": true, "license": "MIT", "funding": { @@ -6750,6 +7368,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==", "dev": true, "license": "MIT", "engines": { @@ -6757,9 +7377,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -6774,6 +7394,8 @@ }, "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": { @@ -6783,18 +7405,10 @@ "node": ">=6.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, "license": "MIT", "funding": { @@ -6818,11 +7432,16 @@ }, "node_modules/pseudomap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true, "license": "ISC" }, "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, "license": "MIT", "engines": { "node": ">=6" @@ -6844,6 +7463,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6891,20 +7527,10 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "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": { @@ -6917,6 +7543,8 @@ }, "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, "dependencies": { "resolve": "^1.1.6" @@ -6925,17 +7553,10 @@ "node": ">= 0.10" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, "node_modules/regex": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", - "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", "dev": true, "license": "MIT", "dependencies": { @@ -6943,13 +7564,12 @@ } }, "node_modules/regex-recursion": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", - "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "dev": true, "license": "MIT", "dependencies": { - "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, @@ -6960,6 +7580,52 @@ "dev": true, "license": "MIT" }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -6971,17 +7637,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", + "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": { - "is-core-module": "^2.13.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.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7007,9 +7678,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -7024,14 +7695,84 @@ "dev": true, "license": "MIT" }, + "node_modules/rolldown": { + "version": "1.0.0-beta.11-commit.f051675", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.11-commit.f051675.tgz", + "integrity": "sha512-g8MCVkvg2GnrrG+j+WplOTx1nAmjSwYOMSOQI0qfxf8D4NmYZqJuG3f85yWK64XXQv6pKcXZsfMkOPs9B6B52A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/runtime": "=0.72.2", + "@oxc-project/types": "=0.72.2", + "@rolldown/pluginutils": "1.0.0-beta.11-commit.f051675", + "ansis": "^4.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "optionalDependencies": { + "@rolldown/binding-darwin-arm64": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-darwin-x64": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.11-commit.f051675", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.11-commit.f051675" + } + }, + "node_modules/rolldown-plugin-dts": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.13.8.tgz", + "integrity": "sha512-jib3ui3rgADoAXwyuCRid74yoi0ZGTLD0P/bQQXFeaVIdhh4ZXwU2RJ0eUmSFJX1fQVc+a3lfccrPEuV7vvRJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "ast-kit": "^2.1.0", + "birpc": "^2.3.0", + "debug": "^4.4.1", + "dts-resolver": "^2.1.1", + "get-tsconfig": "^4.10.1" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": ">=7.0.0-dev.20250601.1", + "rolldown": "^1.0.0-beta.9", + "typescript": "^5.0.0", + "vue-tsc": "~2.2.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, "node_modules/rollup": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz", - "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -7041,28 +7782,36 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.31.0", - "@rollup/rollup-android-arm64": "4.31.0", - "@rollup/rollup-darwin-arm64": "4.31.0", - "@rollup/rollup-darwin-x64": "4.31.0", - "@rollup/rollup-freebsd-arm64": "4.31.0", - "@rollup/rollup-freebsd-x64": "4.31.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.31.0", - "@rollup/rollup-linux-arm-musleabihf": "4.31.0", - "@rollup/rollup-linux-arm64-gnu": "4.31.0", - "@rollup/rollup-linux-arm64-musl": "4.31.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.31.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0", - "@rollup/rollup-linux-riscv64-gnu": "4.31.0", - "@rollup/rollup-linux-s390x-gnu": "4.31.0", - "@rollup/rollup-linux-x64-gnu": "4.31.0", - "@rollup/rollup-linux-x64-musl": "4.31.0", - "@rollup/rollup-win32-arm64-msvc": "4.31.0", - "@rollup/rollup-win32-ia32-msvc": "4.31.0", - "@rollup/rollup-win32-x64-msvc": "4.31.0", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, + "node_modules/rollup/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, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7089,6 +7838,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==", "dev": true, "funding": [ { @@ -7122,9 +7873,9 @@ "peer": true }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -7186,13 +7937,6 @@ "node": ">= 0.8" } }, - "node_modules/send/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==", - "dev": true, - "license": "MIT" - }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -7218,6 +7962,8 @@ }, "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": { @@ -7229,6 +7975,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==", "dev": true, "license": "MIT", "engines": { @@ -7237,6 +7985,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7252,32 +8002,26 @@ } }, "node_modules/shiki": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.1.0.tgz", - "integrity": "sha512-yvKPdNGLXZv7WC4bl7JBbU3CEcUxnBanvMez8MG3gZXKpClGL4bHqFyLhTx+2zUvbjClUANs/S22HXb7aeOgmA==", + "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": { - "@shikijs/core": "2.1.0", - "@shikijs/engine-javascript": "2.1.0", - "@shikijs/engine-oniguruma": "2.1.0", - "@shikijs/langs": "2.1.0", - "@shikijs/themes": "2.1.0", - "@shikijs/types": "2.1.0", - "@shikijs/vscode-textmate": "^10.0.1", + "@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/short-hash": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-string": "^1.0.0" - } - }, "node_modules/shx": { "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", "dev": true, "license": "MIT", "dependencies": { @@ -7369,6 +8113,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -7379,13 +8125,17 @@ "dev": true, "license": "ISC" }, - "node_modules/smart-buffer": { - "version": "4.2.0", + "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": "MIT", + "license": "ISC", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/socket.io": { @@ -7436,13 +8186,6 @@ } } }, - "node_modules/socket.io-adapter/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==", - "dev": true, - "license": "MIT" - }, "node_modules/socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -7473,14 +8216,7 @@ "supports-color": { "optional": true } - } - }, - "node_modules/socket.io-parser/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==", - "dev": true, - "license": "MIT" + } }, "node_modules/socket.io/node_modules/debug": { "version": "4.3.7", @@ -7500,35 +8236,53 @@ } } }, - "node_modules/socket.io/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/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", "dev": true, "license": "MIT" }, - "node_modules/socks": { - "version": "2.7.1", + "node_modules/sort-package-json": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.2.1.tgz", + "integrity": "sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==", "dev": true, "license": "MIT", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.0.0", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.1", + "sort-object-keys": "^1.1.3", + "tinyglobby": "^0.2.12" }, + "bin": { + "sort-package-json": "cli.js" + } + }, + "node_modules/sort-package-json/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=12.20" } }, - "node_modules/sort-keys": { - "version": "2.0.0", + "node_modules/sort-package-json/node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, "license": "MIT", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/source-map-js": { @@ -7552,15 +8306,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, "node_modules/speakingurl": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", @@ -7571,12 +8316,15 @@ "node": ">=0.10.0" } }, - "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "node_modules/stable-hash-x": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", + "integrity": "sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } }, "node_modules/stackback": { "version": "0.0.2", @@ -7596,14 +8344,16 @@ } }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "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/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": { @@ -7618,6 +8368,8 @@ "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": { @@ -7646,6 +8398,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7658,6 +8412,8 @@ "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": { @@ -7667,87 +8423,33 @@ "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", + "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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/superjson": { @@ -7765,6 +8467,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7776,6 +8480,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -7786,18 +8492,19 @@ } }, "node_modules/synckit": { - "version": "0.9.1", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", + "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.4" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/tabbable": { @@ -7807,16 +8514,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -7832,16 +8529,6 @@ "node": ">=18" } }, - "node_modules/test-exclude/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/test-exclude/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -7863,41 +8550,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude/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" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -7906,30 +8558,33 @@ "license": "MIT" }, "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==", + "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.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.2", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", + "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -7955,9 +8610,9 @@ } }, "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz", + "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==", "dev": true, "license": "MIT", "engines": { @@ -7975,9 +8630,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", "dev": true, "license": "MIT", "engines": { @@ -8007,36 +8662,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/traverse": { - "version": "0.6.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -8045,193 +8670,96 @@ "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.6.3", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.5.tgz", - "integrity": "sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-require": "^5.0.0", - "cac": "^6.7.14", - "chokidar": "^4.0.1", - "consola": "^3.2.3", - "debug": "^4.3.7", - "esbuild": "^0.24.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.24.0", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.1", - "tinyglobby": "^0.2.9", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/tsup/node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsup/node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.8.0-beta.0", + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/tsup/node_modules/tr46": { - "version": "1.0.1", + "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", - "dependencies": { - "punycode": "^2.1.0" + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/tsup/node_modules/webidl-conversions": { - "version": "4.0.2", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/tsup/node_modules/whatwg-url": { - "version": "7.1.0", + "node_modules/tsdown": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.12.7.tgz", + "integrity": "sha512-VJjVaqJfIQuQwtOoeuEJMOJUf3MPDrfX0X7OUNx3nq5pQeuIl3h58tmdbM1IZcu8Dn2j8NQjLh+5TXa0yPb9zg==", "dev": true, "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "ansis": "^4.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "debug": "^4.4.1", + "diff": "^8.0.2", + "empathic": "^1.1.0", + "hookable": "^5.5.3", + "rolldown": "1.0.0-beta.11-commit.f051675", + "rolldown-plugin-dts": "^0.13.8", + "semver": "^7.7.2", + "tinyexec": "^1.0.1", + "tinyglobby": "^0.2.14", + "unconfig": "^7.3.2" + }, + "bin": { + "tsdown": "dist/run.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "publint": "^0.3.0", + "typescript": "^5.0.0", + "unplugin-lightningcss": "^0.4.0", + "unplugin-unused": "^0.5.0" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "publint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-lightningcss": { + "optional": true + }, + "unplugin-unused": { + "optional": true + } } }, + "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==", + "dev": true, + "license": "0BSD", + "optional": true + }, "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": { @@ -8256,9 +8784,9 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8270,15 +8798,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.21.0.tgz", - "integrity": "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.1.tgz", + "integrity": "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.21.0", - "@typescript-eslint/parser": "8.21.0", - "@typescript-eslint/utils": "8.21.0" + "@typescript-eslint/eslint-plugin": "8.33.1", + "@typescript-eslint/parser": "8.33.1", + "@typescript-eslint/utils": "8.33.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8289,13 +8817,29 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "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": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, @@ -8382,8 +8926,122 @@ "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-unused": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/unplugin-unused/-/unplugin-unused-0.5.0.tgz", + "integrity": "sha512-czXny3h/P/Tl5ZOnV5tSf6kswAniHjgJF0slpzBPLkq0zGGKDYa1jgWMAdbWJNu7B1YSmBJY4zf3Q/v9w0+/cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1", + "picocolors": "^1.1.1", + "pkg-types": "^2.1.0", + "unplugin": "^2.3.2" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.11.tgz", + "integrity": "sha512-OhuAzBImFPjKNgZ2JwHMfGFUA6NSbRegd1+BPjC1Y0E6X9Y/vJ4zKeGmIMqmlYboj6cMNEwKI+xQisrg4J0HaQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.11", + "@unrs/resolver-binding-darwin-x64": "1.7.11", + "@unrs/resolver-binding-freebsd-x64": "1.7.11", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.11", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.11", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.11", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.11", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.11", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-x64-musl": "1.7.11", + "@unrs/resolver-binding-wasm32-wasi": "1.7.11", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.11", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.11", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.11" + } + }, + "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": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "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": { "punycode": "^2.1.0" @@ -8400,9 +9058,9 @@ } }, "node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "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==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -8413,8 +9071,20 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/validate-npm-package-name": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.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==", "dev": true, "license": "MIT", "engines": { @@ -8452,9 +9122,9 @@ } }, "node_modules/vite": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", - "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", "dependencies": { @@ -8512,17 +9182,17 @@ } }, "node_modules/vite-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.3.tgz", - "integrity": "sha512-0sQcwhwAEw/UJGojbhOrnq3HtiZ3tC7BzpAa0lx3QaTX0S3YX70iGcik25UBdB96pmdwjyY2uyKNYruxCDmiEg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.2.tgz", + "integrity": "sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.1", - "vite": "^5.0.0 || ^6.0.0" + "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" @@ -8535,14 +9205,14 @@ } }, "node_modules/vitepress": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.2.tgz", - "integrity": "sha512-pKAgner8wqetwyL6VyjhJnrw/Kwc8hNlwaS/efUlEBhQsRiCvjIsKqjWyjyUMa6u39ktMle16nYAUOcZ6MhV6Q==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz", + "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==", "dev": true, "license": "MIT", "dependencies": { - "@docsearch/css": "^3.8.3", - "@docsearch/js": "^3.8.3", + "@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", @@ -8577,31 +9247,34 @@ } }, "node_modules/vitest": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.3.tgz", - "integrity": "sha512-dWdwTFUW9rcnL0LyF2F+IfvNQWB0w9DERySCk8VMG75F8k25C7LsZoh6XfCjPvcR8Nb+Lqi9JKr6vnzH7HSrpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.0.3", - "@vitest/mocker": "3.0.3", - "@vitest/pretty-format": "^3.0.3", - "@vitest/runner": "3.0.3", - "@vitest/snapshot": "3.0.3", - "@vitest/spy": "3.0.3", - "@vitest/utils": "3.0.3", - "chai": "^5.1.2", - "debug": "^4.4.0", - "expect-type": "^1.1.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.2.tgz", + "integrity": "sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.2", + "@vitest/mocker": "3.2.2", + "@vitest/pretty-format": "^3.2.2", + "@vitest/runner": "3.2.2", + "@vitest/snapshot": "3.2.2", + "@vitest/spy": "3.2.2", + "@vitest/utils": "3.2.2", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", - "pathe": "^2.0.1", - "std-env": "^3.8.0", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.0", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.2", "why-is-node-running": "^2.3.0" }, "bin": { @@ -8615,9 +9288,10 @@ }, "peerDependencies": { "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.3", - "@vitest/ui": "3.0.3", + "@vitest/browser": "3.2.2", + "@vitest/ui": "3.2.2", "happy-dom": "*", "jsdom": "*" }, @@ -8625,6 +9299,9 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, @@ -8642,18 +9319,38 @@ } } }, + "node_modules/vitest/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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest/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, + "license": "MIT" + }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { "typescript": "*" @@ -8664,28 +9361,17 @@ } } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.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, - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } + "license": "MIT" }, "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": { @@ -8715,25 +9401,20 @@ "node": ">=8" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", + "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, "license": "MIT", - "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": ">=0.10.0" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", + "node_modules/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": { @@ -8748,65 +9429,29 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "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/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", + "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": { - "ansi-regex": "^6.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "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" }, @@ -8832,13 +9477,56 @@ } } }, + "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": ">=10" + } + }, "node_modules/yallist": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true, "license": "ISC" }, + "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": { + "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" + } + }, + "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" + } + }, "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", "engines": { diff --git a/package.json b/package.json index d142d735..c0be922f 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -13,10 +14,10 @@ } }, "scripts": { - "compile": "shx rm -rf dist/ && tsup src/index.ts --format cjs,esm --dts --treeshake", + "build": "tsc --noEmit && tsdown", "docs": "vitepress dev docs", "docs:build": "vitepress build docs", - "prepublishOnly": "npm run compile", + "prepublishOnly": "npm run build", "publish": "git push origin --tags && npm run changelog && git push origin", "release:prerelease": "npm version prerelease --preid pre && npm publish --tag pre", "release:premajor": "npm version premajor --preid pre && npm publish --tag pre", @@ -69,10 +70,8 @@ "neotraverse": "^0.6.18" }, "devDependencies": { - "@eslint/js": "^9.18.0", - "@feathers-plus/batch-loader": "^0.3.6", + "@feathers-community/eslint-config": "^0.0.7", "@feathers-plus/cache": "^1.4.0", - "@feathers-plus/graphql": "^1.10.0", "@feathersjs/authentication": "^5.0.31", "@feathersjs/authentication-local": "^5.0.31", "@feathersjs/client": "^5.0.31", @@ -80,25 +79,18 @@ "@feathersjs/memory": "^5.0.31", "@feathersjs/socketio": "^5.0.31", "@feathersjs/socketio-client": "^5.0.31", - "@types/debug": "^4.1.12", + "@tsconfig/node22": "^22.0.2", "@types/lodash": "^4.17.14", "@types/node": "^22.10.7", - "@typescript-eslint/eslint-plugin": "^8.21.0", - "@typescript-eslint/parser": "^8.21.0", "@vitest/coverage-v8": "^3.0.3", "eslint": "^9.18.0", - "eslint-config-prettier": "^10.0.1", - "eslint-import-resolver-typescript": "^3.7.0", - "eslint-plugin-import-x": "^4.6.1", - "eslint-plugin-prettier": "^5.2.3", - "mongodb": "^5.9.2", "npm-check-updates": "^17.1.14", "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsup": "^8.3.5", + "tsdown": "^0.12.6", "typescript": "^5.7.3", - "typescript-eslint": "^8.21.0", + "unplugin-unused": "^0.5.0", "vitepress": "^1.6.2", "vitest": "^3.0.3" }, diff --git a/src/common/clone.ts b/src/common/clone.ts index 825ce060..4f35d9b0 100644 --- a/src/common/clone.ts +++ b/src/common/clone.ts @@ -1,3 +1,3 @@ export function clone(obj: any) { - return JSON.parse(JSON.stringify(obj)); + return JSON.parse(JSON.stringify(obj)) } diff --git a/src/common/index.ts b/src/common/index.ts index ccd73a42..45b71372 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,8 +1,8 @@ export function isPromise(p: any): p is Promise { - return p instanceof Promise; + return p instanceof Promise } -export { setFields } from './set-fields'; -export { transformItems } from './transform-items'; -export { traverse } from './traverse'; -export { clone } from './clone'; +export { setFields } from './set-fields.js' +export { transformItems } from './transform-items.js' +export { traverse } from './traverse.js' +export { clone } from './clone.js' diff --git a/src/common/set-fields.ts b/src/common/set-fields.ts index 8ae66905..94058dae 100755 --- a/src/common/set-fields.ts +++ b/src/common/set-fields.ts @@ -1,4 +1,4 @@ -import _set from 'lodash/set.js'; +import _set from 'lodash/set.js' export function setFields>( items: T | T[], @@ -6,13 +6,12 @@ export function setFields>( fieldNames: string[], defaultFieldName: string, ): void { - const value = typeof fieldValue === 'function' ? fieldValue() : fieldValue; + const value = typeof fieldValue === 'function' ? fieldValue() : fieldValue - if (!fieldNames.length) fieldNames = [defaultFieldName]; - - (Array.isArray(items) ? items : [items]).forEach(item => { + if (!fieldNames.length) fieldNames = [defaultFieldName] + ;(Array.isArray(items) ? items : [items]).forEach(item => { fieldNames.forEach((fieldName: any) => { - _set(item, fieldName, value); - }); - }); + _set(item, fieldName, value) + }) + }) } diff --git a/src/common/transform-items.ts b/src/common/transform-items.ts index 091e94ce..3ea81a58 100755 --- a/src/common/transform-items.ts +++ b/src/common/transform-items.ts @@ -1,13 +1,13 @@ -import _get from 'lodash/get.js'; +import _get from 'lodash/get.js' export function transformItems>( items: T | T[], fieldNames: string[], transformer: (item: T, fieldName: string, val: any) => void, ): void { - (Array.isArray(items) ? items : [items]).forEach(item => { + ;(Array.isArray(items) ? items : [items]).forEach(item => { fieldNames.forEach((fieldName: any) => { - transformer(item, fieldName, _get(item, fieldName)); - }); - }); + transformer(item, fieldName, _get(item, fieldName)) + }) + }) } diff --git a/src/common/traverse.ts b/src/common/traverse.ts index 58212a04..b8337f1d 100755 --- a/src/common/traverse.ts +++ b/src/common/traverse.ts @@ -1,10 +1,10 @@ -import traverser from 'neotraverse/legacy'; +import traverser from 'neotraverse/legacy' export function traverse>( items: T | T[], converter: (item: T) => void, ) { - (Array.isArray(items) ? items : [items]).forEach(item => { - traverser(item).forEach(converter); // replacement is in place - }); + ;(Array.isArray(items) ? items : [items]).forEach(item => { + traverser(item).forEach(converter) // replacement is in place + }) } diff --git a/src/hooks/cache/cache.test.ts b/src/hooks/cache/cache.test.ts index 9e05c523..b39b8d1f 100755 --- a/src/hooks/cache/cache.test.ts +++ b/src/hooks/cache/cache.test.ts @@ -1,30 +1,30 @@ -import { assert } from 'vitest'; -import { cache } from './cache'; - -// @ts-ignore -import CacheMap from '@feathers-plus/cache'; - -let cacheMap: any; -let hookBeforeSingle: any; -let hookBeforeMulti: any; -let hookAfterSingle: any; -let hookAfterSingleNormalize: any; -let hookAfterMulti: any; -let hookAfterPaginated: any; -let hookBeforeUuid: any; -let hookAfterUuid: any; -let hookBeforeMultiMixed: any; -let hookAfterMultiMixed: any; -let map: any; -let cloneCount: any; - -const makeCacheKey = (key: any) => -key; +import { assert } from 'vitest' +import { cache } from './cache.js' + +// @ts-expect-error old +import CacheMap from '@feathers-plus/cache' + +let cacheMap: any +let hookBeforeSingle: any +let hookBeforeMulti: any +let hookAfterSingle: any +let hookAfterSingleNormalize: any +let hookAfterMulti: any +let hookAfterPaginated: any +let hookBeforeUuid: any +let hookAfterUuid: any +let hookBeforeMultiMixed: any +let hookAfterMultiMixed: any +let map: any +let cloneCount: any + +const makeCacheKey = (key: any) => -key describe('service cache', () => { beforeEach(() => { - cacheMap = CacheMap({ max: 3 }); - map = new Map(); - cloneCount = 0; + cacheMap = CacheMap({ max: 3 }) + map = new Map() + cloneCount = 0 hookBeforeSingle = { type: 'before', @@ -32,7 +32,7 @@ describe('service cache', () => { method: undefined, params: { provider: 'rest' }, data: { id: 1, first: 'John', last: 'Doe' }, - }; + } hookBeforeMulti = { type: 'before', id: undefined, @@ -42,21 +42,21 @@ describe('service cache', () => { { id: 1, first: 'John', last: 'Doe' }, { id: 2, first: 'Jane', last: 'Doe' }, ], - }; + } hookAfterSingle = { type: 'after', id: undefined, method: undefined, params: { provider: 'rest' }, result: { id: 1, first: 'Jane', last: 'Doe' }, - }; + } hookAfterSingleNormalize = { type: 'after', id: undefined, method: undefined, params: { provider: 'rest' }, result: { id: -1, first: 'Jane', last: 'Doe' }, - }; + } hookAfterMulti = { type: 'after', id: undefined, @@ -66,7 +66,7 @@ describe('service cache', () => { { id: 1, first: 'John', last: 'Doe' }, { id: 2, first: 'Jane', last: 'Doe' }, ], - }; + } hookAfterPaginated = { type: 'after', method: 'find', @@ -78,7 +78,7 @@ describe('service cache', () => { { id: 2, first: 'Jane', last: 'Doe' }, ], }, - }; + } hookBeforeUuid = { type: 'before', id: undefined, @@ -86,7 +86,7 @@ describe('service cache', () => { params: { provider: 'rest' }, data: { uuid: 1, first: 'John', last: 'Doe' }, service: { id: 'uuid' }, - }; + } hookAfterUuid = { type: 'after', id: undefined, @@ -94,7 +94,7 @@ describe('service cache', () => { params: { provider: 'rest' }, result: { uuid: 1, first: 'Jane', last: 'Doe' }, service: { id: 'uuid' }, - }; + } hookBeforeMultiMixed = { type: 'before', id: undefined, @@ -104,7 +104,7 @@ describe('service cache', () => { { _id: 1, first: 'John', last: 'Doe' }, { id: 2, first: 'Jane', last: 'Doe' }, ], - }; + } hookAfterMultiMixed = { type: 'after', id: undefined, @@ -114,263 +114,251 @@ describe('service cache', () => { { id: 1, first: 'John', last: 'Doe' }, { _id: 2, first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) describe('Can build a cache', () => { it('Can build a cache', () => { - cacheMap.set('a', 'aa'); - assert.equal(cacheMap.get('a'), 'aa', 'bad get after set'); + cacheMap.set('a', 'aa') + assert.equal(cacheMap.get('a'), 'aa', 'bad get after set') - cacheMap.delete('a'); - assert.equal(cacheMap.get('a'), undefined, 'bad get after delete'); + cacheMap.delete('a') + assert.equal(cacheMap.get('a'), undefined, 'bad get after delete') - cacheMap.set('a', 'aa'); - cacheMap.clear(); - assert.equal(cacheMap.get('a'), undefined, 'bad get after clear'); - }); - }); + cacheMap.set('a', 'aa') + cacheMap.clear() + assert.equal(cacheMap.get('a'), undefined, 'bad get after clear') + }) + }) describe('Clears cache', () => { it('Before one-record update', () => { - hookBeforeSingle.method = 'update'; + hookBeforeSingle.method = 'update' - cacheMap.set(1, 123); + cacheMap.set(1, 123) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeSingle); - assert.deepEqual(cacheMap.get(1), undefined); - }); + cache(cacheMap, 'id')(hookBeforeSingle) + assert.deepEqual(cacheMap.get(1), undefined) + }) it('Before multi-record update', () => { - hookBeforeMulti.method = 'update'; + hookBeforeMulti.method = 'update' - cacheMap.set(1, 123); - cacheMap.set(2, 124); + cacheMap.set(1, 123) + cacheMap.set(2, 124) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeMulti); + cache(cacheMap, 'id')(hookBeforeMulti) - assert.deepEqual(cacheMap.get(1), undefined); - assert.deepEqual(cacheMap.get(2), undefined); - }); + assert.deepEqual(cacheMap.get(1), undefined) + assert.deepEqual(cacheMap.get(2), undefined) + }) it('Before one-record patch', () => { - hookBeforeSingle.method = 'patch'; + hookBeforeSingle.method = 'patch' - cacheMap.set(1, 123); + cacheMap.set(1, 123) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeSingle); + cache(cacheMap, 'id')(hookBeforeSingle) - assert.deepEqual(cacheMap.get(1), undefined); - }); + assert.deepEqual(cacheMap.get(1), undefined) + }) it('Before multi-record patch', () => { - hookBeforeMulti.method = 'patch'; + hookBeforeMulti.method = 'patch' - cacheMap.set(1, 123); - cacheMap.set(2, 789); + cacheMap.set(1, 123) + cacheMap.set(2, 789) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeMulti); - assert.deepEqual(cacheMap.get(1), undefined, 'id 1'); - assert.deepEqual(cacheMap.get(2), undefined, 'id 2'); - }); + cache(cacheMap, 'id')(hookBeforeMulti) + assert.deepEqual(cacheMap.get(1), undefined, 'id 1') + assert.deepEqual(cacheMap.get(2), undefined, 'id 2') + }) it('NOT before one-record create', () => { - hookBeforeSingle.method = 'create'; + hookBeforeSingle.method = 'create' - cacheMap.set(1, 123); + cacheMap.set(1, 123) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeSingle); - assert.deepEqual(cacheMap.get(1), 123); - }); + cache(cacheMap, 'id')(hookBeforeSingle) + assert.deepEqual(cacheMap.get(1), 123) + }) it('NOT before multi-record remove', () => { - hookBeforeMulti.method = 'remove'; + hookBeforeMulti.method = 'remove' - cacheMap.set(1, 123); - cacheMap.set(2, 321); + cacheMap.set(1, 123) + cacheMap.set(2, 321) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeMulti); - assert.deepEqual(cacheMap.get(1), 123); - assert.deepEqual(cacheMap.get(2), 321); - }); + cache(cacheMap, 'id')(hookBeforeMulti) + assert.deepEqual(cacheMap.get(1), 123) + assert.deepEqual(cacheMap.get(2), 321) + }) it('After multi-record remove', () => { - hookAfterMulti.method = 'remove'; + hookAfterMulti.method = 'remove' - cacheMap.set(1, 123); - cacheMap.set(2, 321); + cacheMap.set(1, 123) + cacheMap.set(2, 321) - // @ts-ignore - cache(cacheMap, 'id')(hookAfterMulti); + cache(cacheMap, 'id')(hookAfterMulti) - assert.deepEqual(cacheMap.get(1), undefined, 'id 1'); - assert.deepEqual(cacheMap.get(2), undefined, 'id 2'); - }); - }); + assert.deepEqual(cacheMap.get(1), undefined, 'id 1') + assert.deepEqual(cacheMap.get(2), undefined, 'id 2') + }) + }) describe('Loads cache', () => { it('After one-record create', () => { - hookAfterSingle.method = 'create'; + hookAfterSingle.method = 'create' - // @ts-ignore - cache(cacheMap, 'id')(hookAfterSingle); - assert.deepEqual(cacheMap.get(1), { id: 1, first: 'Jane', last: 'Doe' }); - }); + cache(cacheMap, 'id')(hookAfterSingle) + assert.deepEqual(cacheMap.get(1), { id: 1, first: 'Jane', last: 'Doe' }) + }) it('After multi-record patch', () => { - hookAfterMulti.method = 'patch'; + hookAfterMulti.method = 'patch' - // @ts-ignore - cache(cacheMap, 'id')(hookAfterMulti); + cache(cacheMap, 'id')(hookAfterMulti) - assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1'); - assert.deepEqual(cacheMap.get(2), { id: 2, first: 'Jane', last: 'Doe' }, 'id 2'); - }); + assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1') + assert.deepEqual(cacheMap.get(2), { id: 2, first: 'Jane', last: 'Doe' }, 'id 2') + }) it('After paginated find', () => { - // @ts-ignore - cache(cacheMap, 'id')(hookAfterPaginated); + cache(cacheMap, 'id')(hookAfterPaginated) - assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1'); - assert.deepEqual(cacheMap.get(2), { id: 2, first: 'Jane', last: 'Doe' }, 'id 2'); - }); + assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1') + assert.deepEqual(cacheMap.get(2), { id: 2, first: 'Jane', last: 'Doe' }, 'id 2') + }) it('NOT after remove', () => { - hookAfterMulti.method = 'remove'; + hookAfterMulti.method = 'remove' - // @ts-ignore - cache(cacheMap, 'id')(hookAfterMulti); + cache(cacheMap, 'id')(hookAfterMulti) - assert.deepEqual(cacheMap.get(1), undefined, 'id 1'); - assert.deepEqual(cacheMap.get(2), undefined, 'id 2'); - }); + assert.deepEqual(cacheMap.get(1), undefined, 'id 1') + assert.deepEqual(cacheMap.get(2), undefined, 'id 2') + }) it('Normalizes record', () => { - hookAfterSingleNormalize.method = 'create'; + hookAfterSingleNormalize.method = 'create' - // @ts-ignore - cache(cacheMap, 'id', { makeCacheKey })(hookAfterSingleNormalize); - assert.deepEqual(cacheMap.get(1), { id: -1, first: 'Jane', last: 'Doe' }); - }); - }); + // @ts-expect-error TODO + cache(cacheMap, 'id', { makeCacheKey })(hookAfterSingleNormalize) + assert.deepEqual(cacheMap.get(1), { id: -1, first: 'Jane', last: 'Doe' }) + }) + }) describe('Gets from cache', () => { it('Before one-record get', () => { - hookBeforeSingle.method = 'get'; - hookBeforeSingle.id = 1; + hookBeforeSingle.method = 'get' + hookBeforeSingle.id = 1 - cacheMap.set(1, { foo: 'bar' }); + cacheMap.set(1, { foo: 'bar' }) - // @ts-ignore - cache(cacheMap, 'id')(hookBeforeSingle); + cache(cacheMap, 'id')(hookBeforeSingle) - assert.deepEqual(cacheMap.get(1), { foo: 'bar' }, 'cache'); - assert.deepEqual(hookBeforeSingle.result, { foo: 'bar' }); - }); + assert.deepEqual(cacheMap.get(1), { foo: 'bar' }, 'cache') + assert.deepEqual(hookBeforeSingle.result, { foo: 'bar' }) + }) it('Normalizes record', () => { - hookBeforeSingle.method = 'get'; - hookBeforeSingle.id = -1; + hookBeforeSingle.method = 'get' + hookBeforeSingle.id = -1 - cacheMap.set(1, { id: -1, foo: 'bar' }); + cacheMap.set(1, { id: -1, foo: 'bar' }) - // @ts-ignore - cache(cacheMap, 'id', { makeCacheKey })(hookBeforeSingle); + // @ts-expect-error TODO + cache(cacheMap, 'id', { makeCacheKey })(hookBeforeSingle) - assert.deepEqual(cacheMap.get(1), { id: -1, foo: 'bar' }, 'cache'); - assert.deepEqual(hookBeforeSingle.result, { id: -1, foo: 'bar' }); - }); - }); + assert.deepEqual(cacheMap.get(1), { id: -1, foo: 'bar' }, 'cache') + assert.deepEqual(hookBeforeSingle.result, { id: -1, foo: 'bar' }) + }) + }) describe('Uses context.service.id', () => { it('Clears cache before one-record update', () => { - hookBeforeUuid.method = 'update'; + hookBeforeUuid.method = 'update' - cacheMap.set(1, 123); + cacheMap.set(1, 123) - cache(cacheMap)(hookBeforeUuid); - assert.deepEqual(cacheMap.get(1), undefined); - }); + cache(cacheMap)(hookBeforeUuid) + assert.deepEqual(cacheMap.get(1), undefined) + }) it('Loads cache after one-record create', () => { - hookAfterUuid.method = 'create'; + hookAfterUuid.method = 'create' - cache(cacheMap)(hookAfterUuid); - assert.deepEqual(cacheMap.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }); - }); + cache(cacheMap)(hookAfterUuid) + assert.deepEqual(cacheMap.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }) + }) it('Before one-record get', () => { - hookBeforeUuid.method = 'get'; - hookBeforeUuid.id = 1; + hookBeforeUuid.method = 'get' + hookBeforeUuid.id = 1 - cacheMap.set(1, { foo: 'bar' }); + cacheMap.set(1, { foo: 'bar' }) - cache(cacheMap)(hookBeforeUuid); + cache(cacheMap)(hookBeforeUuid) - assert.deepEqual(cacheMap.get(1), { foo: 'bar' }, 'cache'); - assert.deepEqual(hookBeforeUuid.result, { foo: 'bar' }); - }); - }); + assert.deepEqual(cacheMap.get(1), { foo: 'bar' }, 'cache') + assert.deepEqual(hookBeforeUuid.result, { foo: 'bar' }) + }) + }) describe('Uses item._id || item.id', () => { it('Clears cache before multi-record patch', () => { - hookBeforeMultiMixed.method = 'patch'; + hookBeforeMultiMixed.method = 'patch' - cacheMap.set(1, 123); - cacheMap.set(2, 789); + cacheMap.set(1, 123) + cacheMap.set(2, 789) - cache(cacheMap)(hookBeforeMultiMixed); - assert.deepEqual(cacheMap.get(1), undefined, 'id 1'); - assert.deepEqual(cacheMap.get(2), undefined, 'id 2'); - }); + cache(cacheMap)(hookBeforeMultiMixed) + assert.deepEqual(cacheMap.get(1), undefined, 'id 1') + assert.deepEqual(cacheMap.get(2), undefined, 'id 2') + }) it('Loads cache after multi-record patch', () => { - hookAfterMultiMixed.method = 'patch'; + hookAfterMultiMixed.method = 'patch' - cache(cacheMap)(hookAfterMultiMixed); + cache(cacheMap)(hookAfterMultiMixed) - assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1'); - assert.deepEqual(cacheMap.get(2), { _id: 2, first: 'Jane', last: 'Doe' }, 'id 2'); - }); - }); + assert.deepEqual(cacheMap.get(1), { id: 1, first: 'John', last: 'Doe' }, 'id 1') + assert.deepEqual(cacheMap.get(2), { _id: 2, first: 'Jane', last: 'Doe' }, 'id 2') + }) + }) describe('Works with an ES6 Map', () => { it('Clears cache before one-record update', () => { - hookBeforeUuid.method = 'update'; + hookBeforeUuid.method = 'update' - map.set(1, 123); + map.set(1, 123) - cache(map)(hookBeforeUuid); - assert.deepEqual(map.get(1), undefined); - }); + cache(map)(hookBeforeUuid) + assert.deepEqual(map.get(1), undefined) + }) it('Loads cache after one-record create', () => { - hookAfterUuid.method = 'create'; + hookAfterUuid.method = 'create' - cache(map)(hookAfterUuid); - assert.deepEqual(map.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }); - }); - }); + cache(map)(hookAfterUuid) + assert.deepEqual(map.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }) + }) + }) describe('Misc', () => { it('Uses option.clone', () => { - hookAfterUuid.method = 'create'; + hookAfterUuid.method = 'create' - // @ts-ignore - cache(cacheMap, null, { clone })(hookAfterUuid); - assert.deepEqual(cacheMap.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }, 'get'); - assert.equal(cloneCount, 1, 'count'); - }); - }); -}); + // @ts-expect-error TODO + cache(cacheMap, null, { clone })(hookAfterUuid) + assert.deepEqual(cacheMap.get(1), { uuid: 1, first: 'Jane', last: 'Doe' }, 'get') + assert.equal(cloneCount, 1, 'count') + }) + }) +}) function clone(obj: any) { - cloneCount += 1; - return Object.assign({}, obj); + cloneCount += 1 + return Object.assign({}, obj) } diff --git a/src/hooks/cache/cache.ts b/src/hooks/cache/cache.ts index 8b895735..b82bf4a7 100755 --- a/src/hooks/cache/cache.ts +++ b/src/hooks/cache/cache.ts @@ -1,15 +1,15 @@ -import type { HookContext, Id } from '@feathersjs/feathers'; -import { getItems } from '../../utils'; -import { clone as defaultClone } from '../../common'; +import type { HookContext, Id } from '@feathersjs/feathers' +import { getItems } from '../../utils/index.js' +import { clone as defaultClone } from '../../common/index.js' -export type CacheMap = Map; +export type CacheMap = Map export interface CacheOptions { - clone?(item: T): T; - makeCacheKey?(id: Id): string; + clone?(item: T): T + makeCacheKey?(id: Id): string } -const defaultMakeCacheKey = (key: any) => key; +const defaultMakeCacheKey = (key: any) => key /** * TODO: rm 'getItems' & migrate to around hook @@ -23,69 +23,69 @@ export function cache( keyField?: string, options?: CacheOptions, ) { - const clone = options?.clone || defaultClone; - const makeCacheKey = options?.makeCacheKey || defaultMakeCacheKey; + const clone = options?.clone || defaultClone + const makeCacheKey = options?.makeCacheKey || defaultMakeCacheKey return (context: H) => { - keyField = keyField || context.service?.id; // Will be undefined on client + keyField = keyField || context.service?.id // Will be undefined on client - let items = getItems(context); - items = Array.isArray(items) ? items : [items]; + let items = getItems(context) + items = Array.isArray(items) ? items : [items] - const query = context.params.query || {}; + const query = context.params.query || {} if (context.type === 'after') { if (context.method === 'remove') { items.forEach((item: any) => { - const idName = getIdName(keyField, item); - const key = makeCacheKey(item[idName]); - cacheMap.delete(key); - }); - return context; + const idName = getIdName(keyField, item) + const key = makeCacheKey(item[idName]) + cacheMap.delete(key) + }) + return context } - if (query.$select) return context; + if (query.$select) return context items.forEach((item: any) => { - const idName = getIdName(keyField, item); - const key = makeCacheKey(item[idName]); - cacheMap.set(key, clone(item)); - }); + const idName = getIdName(keyField, item) + const key = makeCacheKey(item[idName]) + cacheMap.set(key, clone(item)) + }) - return context; + return context } switch (context.method) { case 'find': // fall through case 'remove': // skip remove in before remove case 'create': - return context; + return context case 'get': { if (!Object.keys(query).length) { - const key = makeCacheKey(context.id!); - const value = cacheMap.get(key); - if (value) context.result = value; + const key = makeCacheKey(context.id!) + const value = cacheMap.get(key) + if (value) context.result = value } - return context; + return context } default: // update, patch, remove if (context.id) { - cacheMap.delete(context.id); - return context; + cacheMap.delete(context.id) + return context } items.forEach((item: any) => { - const idName = getIdName(keyField, item); - const key = makeCacheKey(item[idName]); - cacheMap.delete(key); - }); + const idName = getIdName(keyField, item) + const key = makeCacheKey(item[idName]) + cacheMap.delete(key) + }) } - return context; - }; + return context + } } function getIdName(keyField: any, item: any) { - if (keyField) return keyField; - return '_id' in item ? '_id' : 'id'; + if (keyField) return keyField + return '_id' in item ? '_id' : 'id' } diff --git a/src/hooks/check-required/check-required.test.ts b/src/hooks/check-required/check-required.test.ts index 0a1b5bc0..85c6d935 100755 --- a/src/hooks/check-required/check-required.test.ts +++ b/src/hooks/check-required/check-required.test.ts @@ -1,8 +1,8 @@ -import { assert } from 'vitest'; -import { checkRequired } from './check-required'; -import { HookContext } from '@feathersjs/feathers'; +import { assert } from 'vitest' +import { checkRequired } from './check-required.js' +import type { HookContext } from '@feathersjs/feathers' -let hookBefore: HookContext; +let hookBefore: HookContext describe('checkRequired', () => { beforeEach(() => { @@ -11,26 +11,26 @@ describe('checkRequired', () => { method: 'create', params: { provider: 'rest' }, data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - } as HookContext; - }); + } as HookContext + }) it('does 1 prop with no dots', () => { - checkRequired('empl')(hookBefore); - }); + checkRequired('empl')(hookBefore) + }) it('does multi props with 1 dot', () => { - checkRequired(['empl.name', 'dept'])(hookBefore); - }); + checkRequired(['empl.name', 'dept'])(hookBefore) + }) it('does multi props with 2 dots', () => { - checkRequired(['empl.name.last', 'empl.status', 'dept'])(hookBefore); - }); + checkRequired(['empl.name.last', 'empl.status', 'dept'])(hookBefore) + }) it('throws on bad or missing paths', () => { - assert.throws(() => checkRequired(['empl.name.first', 'empl.name.surname'])(hookBefore)); - }); + assert.throws(() => checkRequired(['empl.name.first', 'empl.name.surname'])(hookBefore)) + }) it('ignores bad or missing no dot path', () => { - assert.throws(() => checkRequired('xx')(hookBefore)); - }); -}); + assert.throws(() => checkRequired('xx')(hookBefore)) + }) +}) diff --git a/src/hooks/check-required/check-required.ts b/src/hooks/check-required/check-required.ts index 60f4aeb3..a9240adf 100755 --- a/src/hooks/check-required/check-required.ts +++ b/src/hooks/check-required/check-required.ts @@ -1,40 +1,41 @@ -import _get from 'lodash/get.js'; -import _has from 'lodash/has.js'; -import { BadRequest } from '@feathersjs/errors'; +import _get from 'lodash/get.js' +import _has from 'lodash/has.js' +import { BadRequest } from '@feathersjs/errors' -import { checkContext, getDataIsArray } from '../../utils'; -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { MaybeArray, toArray } from '../../internal.utils'; +import { checkContext, getDataIsArray } from '../../utils/index.js' +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Check selected fields exist and are not falsey. Numeric 0 is acceptable. * @see https://hooks-common.feathersjs.com/hooks.html#required */ export function checkRequired(fieldNames: MaybeArray) { - const fieldNamesArray = toArray(fieldNames); + const fieldNamesArray = toArray(fieldNames) return (context: H, next?: NextFunction) => { - checkContext(context, ['before', 'around'], ['create', 'update', 'patch'], 'required'); + checkContext(context, ['before', 'around'], ['create', 'update', 'patch'], 'required') - const { data } = getDataIsArray(context); + const { data } = getDataIsArray(context) for (let i = 0; i < data.length; i++) { - const item = data[i]; + const item = data[i] for (let j = 0; j < fieldNamesArray.length; j++) { - const name = fieldNamesArray[j]; + const name = fieldNamesArray[j] if (!_has(item, name)) { - throw new BadRequest(`Field ${name} does not exist. (required)`); + throw new BadRequest(`Field ${name} does not exist. (required)`) } - const value = _get(item, name); + const value = _get(item, name) if (!value && value !== 0 && value !== false) { - throw new BadRequest(`Field ${name} is null. (required)`); + throw new BadRequest(`Field ${name} is null. (required)`) } } } - if (next) return next().then(() => context); - }; + if (next) return next().then(() => context) + } } diff --git a/src/hooks/create-related/create-related.test.ts b/src/hooks/create-related/create-related.test.ts index 21555782..94641c34 100644 --- a/src/hooks/create-related/create-related.test.ts +++ b/src/hooks/create-related/create-related.test.ts @@ -1,36 +1,36 @@ -import assert from 'assert'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { createRelated } from './create-related'; +import assert from 'node:assert' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { createRelated } from './create-related.js' type MockAppOptions = { - multi?: boolean; -}; + multi?: boolean +} const defaultOptions = { multi: true, -}; +} const mockApp = (_options?: MockAppOptions) => { - const options = Object.assign({}, defaultOptions, _options); - const app = feathers(); + const options = Object.assign({}, defaultOptions, _options) + const app = feathers() - app.use('users', new MemoryService({ startId: 1, multi: true })); - app.use('todos', new MemoryService({ startId: 1, multi: options.multi })); + app.use('users', new MemoryService({ startId: 1, multi: true })) + app.use('todos', new MemoryService({ startId: 1, multi: options.multi })) - const usersService = app.service('users'); - const todosService = app.service('todos'); + const usersService = app.service('users') + const todosService = app.service('todos') return { app, todosService, usersService, - }; -}; + } +} describe('hook - createRelated', function () { it('creates single item for single item', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -44,19 +44,19 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) const user = await app.service('users').create({ name: 'John Doe', - }); + }) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, [{ id: 1, title: 'First issue', userId: 1 }]); - }); + assert.deepStrictEqual(todos, [{ id: 1, title: 'First issue', userId: 1 }]) + }) it('can use context in data function', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -70,19 +70,19 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) const user = await app.service('users').create({ name: 'John Doe', - }); + }) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, [{ id: 1, title: 'users', userId: 1 }]); - }); + assert.deepStrictEqual(todos, [{ id: 1, title: 'users', userId: 1 }]) + }) it('creates multiple items for multiple items', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -96,23 +96,23 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) const users = await app .service('users') - .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]); + .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]) - const todos = await todosService.find({ query: { $sort: { userId: 1 } } }); + const todos = await todosService.find({ query: { $sort: { userId: 1 } } }) assert.deepStrictEqual(todos, [ { id: 1, title: 'user1', userId: 1 }, { id: 2, title: 'user2', userId: 2 }, { id: 3, title: 'user3', userId: 3 }, - ]); - }); + ]) + }) it('creates multple items for multiple items with multi: false', async function () { - const { app, todosService } = mockApp({ multi: false }); + const { app, todosService } = mockApp({ multi: false }) app.service('users').hooks({ after: { @@ -127,26 +127,26 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) // @ts-expect-error - does not have options - assert.strictEqual(todosService.options.multi, false); + assert.strictEqual(todosService.options.multi, false) const users = await app .service('users') - .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]); + .create([{ name: 'user1' }, { name: 'user2' }, { name: 'user3' }]) - const todos = await todosService.find({ query: { $sort: { userId: 1 } } }); + const todos = await todosService.find({ query: { $sort: { userId: 1 } } }) assert.deepStrictEqual(todos, [ { id: 1, title: 'user1', userId: 1 }, { id: 2, title: 'user2', userId: 2 }, { id: 3, title: 'user3', userId: 3 }, - ]); - }); + ]) + }) it('can create multiple data for one record', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -166,22 +166,22 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) const user = await app.service('users').create({ name: 'John Doe', - }); + }) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 1, userId: 1 }, { id: 2, title: 2, userId: 1 }, - ]); - }); + ]) + }) it('can pass an array', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -208,22 +208,22 @@ describe('hook - createRelated', function () { ]), ], }, - }); + }) const user = await app.service('users').create({ name: 'John Doe', - }); + }) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 1, userId: 1 }, { id: 2, title: 2, userId: 1 }, - ]); - }); + ]) + }) it('does not create items if falsey', async function () { - const { app, todosService } = mockApp(); + const { app, todosService } = mockApp() app.service('users').hooks({ after: { @@ -234,14 +234,14 @@ describe('hook - createRelated', function () { }), ], }, - }); + }) const user = await app.service('users').create({ name: 'John Doe', - }); + }) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, []); - }); -}); + assert.deepStrictEqual(todos, []) + }) +}) diff --git a/src/hooks/create-related/create-related.ts b/src/hooks/create-related/create-related.ts index bd8862a0..d128de8b 100644 --- a/src/hooks/create-related/create-related.ts +++ b/src/hooks/create-related/create-related.ts @@ -1,11 +1,11 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext, getResultIsArray } from '../../utils'; -import { MaybeArray, Promisable } from '../../internal.utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext, getResultIsArray } from '../../utils/index.js' +import type { MaybeArray, Promisable } from '../../internal.utils.js' export interface CreateRelatedOptions> { - service: keyof S; - multi?: boolean; - data: (item: any, context: HookContext) => Promisable>; + service: keyof S + multi?: boolean + data: (item: any, context: HookContext) => Promisable> } /** @@ -15,40 +15,40 @@ export function createRelated, H extends HookContext = H options: MaybeArray>, ) { return async (context: H, next?: NextFunction) => { - checkContext(context, ['after', 'around'], undefined, 'createRelated'); + checkContext(context, ['after', 'around'], undefined, 'createRelated') if (next) { - await next(); + await next() } - const { result } = getResultIsArray(context); + const { result } = getResultIsArray(context) - const entries = Array.isArray(options) ? options : [options]; + const entries = Array.isArray(options) ? options : [options] await Promise.all( entries.map(async entry => { - const { data, service, multi } = entry; + const { data, service, multi } = entry const dataToCreate = ( await Promise.all(result.map(async item => data(item, context))) - ).filter(x => !!x); + ).filter(x => !!x) if (!dataToCreate || dataToCreate.length <= 0) { - return context; + return context } if (multi || dataToCreate.length === 1) { await context.app .service(service as string) - .create(dataToCreate.length === 1 ? dataToCreate[0] : dataToCreate); + .create(dataToCreate.length === 1 ? dataToCreate[0] : dataToCreate) } else { await Promise.all( dataToCreate.map(async item => context.app.service(service as string).create(item)), - ); + ) } }), - ); + ) - return context; - }; + return context + } } diff --git a/src/hooks/debug/debug.test.ts b/src/hooks/debug/debug.test.ts index bf4287be..7b1ca49f 100755 --- a/src/hooks/debug/debug.test.ts +++ b/src/hooks/debug/debug.test.ts @@ -1,4 +1,4 @@ -import { debug } from './debug'; +import { debug } from './debug.js' describe('services debug', () => { it('does not crash', () => { @@ -8,9 +8,9 @@ describe('services debug', () => { data: { a: 'a' }, params: { query: { b: 'b' } }, result: { c: 'c' }, - }; - debug('my message')(hook); - }); + } + debug('my message')(hook) + }) it('display params props', () => { const hook: any = { @@ -19,7 +19,7 @@ describe('services debug', () => { data: { a: 'a' }, params: { query: { b: 'b' }, foo: 'bar' }, result: { c: 'c' }, - }; - debug('my message', 'query', 'foo')(hook); - }); -}); + } + debug('my message', 'query', 'foo')(hook) + }) +}) diff --git a/src/hooks/debug/debug.ts b/src/hooks/debug/debug.ts index c6244d77..5e9a79fe 100755 --- a/src/hooks/debug/debug.ts +++ b/src/hooks/debug/debug.ts @@ -1,4 +1,4 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' /** * Display the current hook context for debugging. @@ -8,50 +8,50 @@ export const debug = (msg: string, ...fieldNames: string[]) => async (context: H, next?: NextFunction) => { if (next) { - await next(); + await next() } // display timestamp - const now = new Date(); + const now = new Date() console.log( `${now.getFullYear()}-${ now.getMonth() + 1 }-${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`, - ); + ) if (msg) { - console.log(msg); + console.log(msg) } // display service, method & type of hook (before/after/error) - console.log(`${context.type} service('${context.path}').${context.method}()`); + console.log(`${context.type} service('${context.path}').${context.method}()`) // display id for get, patch, update & remove if (!['find', 'create'].includes(context.method) && 'id' in context) { - console.log('id:', context.id); + console.log('id:', context.id) } if (context.data) { - console.log('data:', context.data); + console.log('data:', context.data) } if (context.params?.query) { - console.log('query:', context.params.query); + console.log('query:', context.params.query) } if (context.result) { - console.log('result:', context.result); + console.log('result:', context.result) } // display additional params - const params = context.params || {}; - console.log('params props:', Object.keys(params).sort()); + const params = context.params || {} + console.log('params props:', Object.keys(params).sort()) fieldNames.forEach(name => { - console.log(`params.${name}:`, params[name]); - }); + console.log(`params.${name}:`, params[name]) + }) if (context.error) { - console.log('error', context.error); + console.log('error', context.error) } - }; + } diff --git a/src/hooks/disable-pagination/disable-pagination.test.ts b/src/hooks/disable-pagination/disable-pagination.test.ts index 279ff520..d8ba22ae 100755 --- a/src/hooks/disable-pagination/disable-pagination.test.ts +++ b/src/hooks/disable-pagination/disable-pagination.test.ts @@ -1,7 +1,7 @@ -import { assert } from 'vitest'; -import { disablePagination } from './disable-pagination'; +import { assert } from 'vitest' +import { disablePagination } from './disable-pagination.js' -let hookBefore: any; +let hookBefore: any describe('services disablePagination', () => { beforeEach(() => { @@ -9,36 +9,36 @@ describe('services disablePagination', () => { type: 'before', method: 'find', params: { query: { id: 1, $limit: -1 } }, - }; - }); + } + }) it('disables on $limit = -1', () => { - hookBefore.params.query.$limit = -1; + hookBefore.params.query.$limit = -1 - const result: any = disablePagination()(hookBefore); - assert.deepEqual(result.params, { paginate: false, query: { id: 1 } }); - }); + const result: any = disablePagination()(hookBefore) + assert.deepEqual(result.params, { paginate: false, query: { id: 1 } }) + }) it('disables on $limit = "-1"', () => { - hookBefore.params.query.$limit = '-1'; + hookBefore.params.query.$limit = '-1' - const result: any = disablePagination()(hookBefore); - assert.deepEqual(result.params, { paginate: false, query: { id: 1 } }); - }); + const result: any = disablePagination()(hookBefore) + assert.deepEqual(result.params, { paginate: false, query: { id: 1 } }) + }) it('throws if after hook', () => { - hookBefore.type = 'after'; + hookBefore.type = 'after' assert.throws(() => { - disablePagination()(hookBefore); - }); - }); + disablePagination()(hookBefore) + }) + }) it('throws if not find', () => { - hookBefore.method = 'get'; + hookBefore.method = 'get' assert.throws(() => { - disablePagination()(hookBefore); - }); - }); -}); + disablePagination()(hookBefore) + }) + }) +}) diff --git a/src/hooks/disable-pagination/disable-pagination.ts b/src/hooks/disable-pagination/disable-pagination.ts index 6aa520fc..2b6ac88a 100755 --- a/src/hooks/disable-pagination/disable-pagination.ts +++ b/src/hooks/disable-pagination/disable-pagination.ts @@ -1,5 +1,5 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext } from '../../utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext } from '../../utils/index.js' /** * Disables pagination when query.$limit is -1 or '-1'. @@ -8,15 +8,15 @@ import { checkContext } from '../../utils'; export const disablePagination = () => (context: H, next?: NextFunction) => { - checkContext(context, 'before', ['find'], 'disablePagination'); - const $limit = context.params?.query?.$limit; + checkContext(context, 'before', ['find'], 'disablePagination') + const $limit = context.params?.query?.$limit if ($limit === '-1' || $limit === -1) { - context.params.paginate = false; - delete context.params.query.$limit; + context.params.paginate = false + delete context.params.query.$limit } - if (next) return next().then(() => context); + if (next) return next().then(() => context) - return context; - }; + return context + } diff --git a/src/hooks/disallow/disallow.test.ts b/src/hooks/disallow/disallow.test.ts index 7093a938..7a226ed2 100755 --- a/src/hooks/disallow/disallow.test.ts +++ b/src/hooks/disallow/disallow.test.ts @@ -1,151 +1,151 @@ -import { assert } from 'vitest'; -import { disallow } from './disallow'; +import { assert } from 'vitest' +import { disallow } from './disallow.js' describe('services disallow', () => { describe('disallow is compatible with .disable (without predicate)', () => { - let hookRest: any; - let hookSocketio: any; - let hookServer: any; + let hookRest: any + let hookSocketio: any + let hookServer: any beforeEach(() => { - hookRest = { method: 'create', params: { provider: 'rest' } }; - hookSocketio = { method: 'create', params: { provider: 'socketio' } }; - hookServer = { method: 'create', params: { provider: '' } }; - }); + hookRest = { method: 'create', params: { provider: 'rest' } } + hookSocketio = { method: 'create', params: { provider: 'socketio' } } + hookServer = { method: 'create', params: { provider: '' } } + }) it('disables all providers with no param', () => { assert.throws(() => { - disallow()(hookSocketio); - }); + disallow()(hookSocketio) + }) assert.throws(() => { - disallow()(hookServer); - }); - }); + disallow()(hookServer) + }) + }) it('disables a provider', () => { assert.throws(() => { - disallow('socketio')(hookSocketio); - }); - }); + disallow('socketio')(hookSocketio) + }) + }) it('does not disable the server', () => { - disallow('socketio')(hookServer); + disallow('socketio')(hookServer) assert.throws(() => { - disallow('socketio')(hookSocketio); - }); - }); + disallow('socketio')(hookSocketio) + }) + }) it('does not disable another provider', () => { - disallow('socketio')(hookRest); + disallow('socketio')(hookRest) assert.throws(() => { - disallow('socketio')(hookSocketio); - }); - }); + disallow('socketio')(hookSocketio) + }) + }) it('disables multiple providers', () => { - disallow('socketio', 'rest')(hookServer); + disallow(['socketio', 'rest'])(hookServer) assert.throws(() => { - disallow('socketio', 'rest')(hookSocketio); - }); + disallow(['socketio', 'rest'])(hookSocketio) + }) assert.throws(() => { - disallow('socketio', 'rest')(hookRest); - }); - }); + disallow(['socketio', 'rest'])(hookRest) + }) + }) it('"external" disables all external providers', () => { - disallow('socketio', 'rest')(hookServer); + disallow(['socketio', 'rest'])(hookServer) assert.throws(() => { - disallow('socketio', 'rest')(hookSocketio); - }); + disallow(['socketio', 'rest'])(hookSocketio) + }) assert.throws(() => { - disallow('socketio', 'rest')(hookRest); - }); - }); - }); + disallow(['socketio', 'rest'])(hookRest) + }) + }) + }) describe('disallow functionality is like isProvider', () => { - let hookServer: any; - let hookSocketio: any; - let hook: any; + let hookServer: any + let hookSocketio: any + let hook: any beforeEach(() => { - hookServer = { type: 'before', method: 'create', params: { provider: '' } }; - hookSocketio = { type: 'before', method: 'create', params: { provider: 'socketio' } }; - }); + hookServer = { type: 'before', method: 'create', params: { provider: '' } } + hookSocketio = { type: 'before', method: 'create', params: { provider: 'socketio' } } + }) it('returns a function', () => { - const fcn = disallow('server'); + const fcn = disallow('server') - assert.isFunction(fcn); - }); + assert.isFunction(fcn) + }) it('throws on no args', () => { - assert.throws(() => disallow()(hook)); - }); + assert.throws(() => disallow()(hook)) + }) it('finds provider with 1 arg', () => { - const hook = structuredClone(hookSocketio); + const hook = structuredClone(hookSocketio) - const result = disallow('rest')(hook); - assert.equal(result, undefined); + const result = disallow('rest')(hook) + assert.equal(result, undefined) assert.throws(() => { - disallow('socketio')(hook); - }); - }); + disallow('socketio')(hook) + }) + }) it('finds provider with 2 args', () => { - const hook = structuredClone(hookSocketio); + const hook = structuredClone(hookSocketio) - const result = disallow('rest', 'server')(hook); - assert.equal(result, undefined); + const result = disallow(['rest', 'server'])(hook) + assert.equal(result, undefined) assert.throws(() => { - disallow('rest', 'socketio')(hook); - }); - }); + disallow(['rest', 'socketio'])(hook) + }) + }) it('finds server', () => { - const hook = structuredClone(hookServer); + const hook = structuredClone(hookServer) - const result = disallow('rest', 'socketio', 'external')(hook); - assert.equal(result, undefined); + const result = disallow(['rest', 'socketio', 'external'])(hook) + assert.equal(result, undefined) assert.throws(() => { - disallow('rest', 'socketio', 'server')(hook); - }); - }); + disallow(['rest', 'socketio', 'server'])(hook) + }) + }) it('finds external', () => { - const hook = structuredClone(hookSocketio); + const hook = structuredClone(hookSocketio) - const result = disallow('rest', 'server')(hook); - assert.equal(result, undefined); + const result = disallow(['rest', 'server'])(hook) + assert.equal(result, undefined) assert.throws(() => { - disallow('rest', 'server', 'external')(hook); - }); - }); + disallow(['rest', 'server', 'external'])(hook) + }) + }) it('succeeds if not provider', () => { - const hook = structuredClone(hookServer); + const hook = structuredClone(hookServer) - const result = disallow('socketio')(hook); - assert.equal(result, undefined); - }); + const result = disallow('socketio')(hook) + assert.equal(result, undefined) + }) it('succeeds if not external', () => { - const hook = structuredClone(hookServer); + const hook = structuredClone(hookServer) - const result = disallow('external')(hook); - assert.equal(result, undefined); - }); + const result = disallow('external')(hook) + assert.equal(result, undefined) + }) it('succeeds if not server', () => { - const hook = structuredClone(hookSocketio); + const hook = structuredClone(hookSocketio) - const result = disallow('server')(hook); - assert.equal(result, undefined); - }); - }); -}); + const result = disallow('server')(hook) + assert.equal(result, undefined) + }) + }) +}) diff --git a/src/hooks/disallow/disallow.ts b/src/hooks/disallow/disallow.ts index 7298ea23..bc353a1e 100755 --- a/src/hooks/disallow/disallow.ts +++ b/src/hooks/disallow/disallow.ts @@ -1,28 +1,29 @@ -import { MethodNotAllowed } from '@feathersjs/errors'; -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import type { TransportName } from '../../types'; -import { isProvider } from '../../predicates'; -import { MaybeArray, toArray } from '../../internal.utils'; +import { MethodNotAllowed } from '@feathersjs/errors' +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { TransportName } from '../../types.js' +import { isProvider } from '../../predicates/index.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Prevents access to a service method completely or for specific transports. * @see https://hooks-common.feathersjs.com/hooks.html#disallow */ export const disallow = ( - transports: MaybeArray, + transports?: MaybeArray, ) => { - const transportsArr = toArray(transports); + const transportsArr = toArray(transports) return (context: H, next?: NextFunction) => { - if (transportsArr.length === 0) { - throw new MethodNotAllowed('Method not allowed'); + if (!transports) { + throw new MethodNotAllowed('Method not allowed') } - if (isProvider(...transportsArr)(context)) { + if (isProvider(...(transportsArr as TransportName[]))(context)) { throw new MethodNotAllowed( `Provider '${context.params.provider}' can not call '${context.method}'. (disallow)`, - ); + ) } - if (next) return next().then(() => context); - }; -}; + if (next) return next().then(() => context) + } +} diff --git a/src/hooks/iff/iff-else.test.ts b/src/hooks/iff/iff-else.test.ts index d2b29f98..74d49c12 100755 --- a/src/hooks/iff/iff-else.test.ts +++ b/src/hooks/iff/iff-else.test.ts @@ -1,231 +1,206 @@ /* eslint-disable @typescript-eslint/no-this-alias */ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { iffElse, some, every } from '../..'; -import { clone } from '../../common'; - -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let hookFcnAsyncCalls: any; -let hookFcnCalls: any; -let predicateParam1: any; -let predicateParam2: any; -let predicateParam3: any; -let predicateParam4: any; -let context: any; -let predicateTrueContext: any; -let hookFcnSyncContext: any; -let hookFcnAsyncContext: any; -let hookFcnContext: any; +import type { HookContext } from '@feathersjs/feathers' +import { assert } from 'vitest' +import { iffElse } from './iff-else.js' +import { some } from '../../predicates/some/some.js' +import { every } from '../../predicates/every/every.js' +import { clone } from '../../common/index.js' + +let hook: any +let hookBefore: any +let hookAfter: any +let hookFcnSyncCalls: any +let hookFcnAsyncCalls: any +let hookFcnCalls: any +let predicateParam1: any +let predicateParam2: any +let predicateParam3: any +let predicateParam4: any +let context: any +let predicateTrueContext: any +let hookFcnSyncContext: any +let hookFcnAsyncContext: any +let hookFcnContext: any const hookFcnSync = function (this: any, hook: any) { - hookFcnSyncContext = this; + hookFcnSyncContext = this - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnSyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - return hook; -}; + return hook +} const hookFcnAsync = function (this: any, hook: any) { - hookFcnAsyncContext = this; + hookFcnAsyncContext = this return new Promise(resolve => { - hookFcnAsyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnAsyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - resolve(hook); - }); -}; + resolve(hook) + }) +} const hookFcn = function (this: any, hook: any, _cb: any) { - hookFcnContext = this; + hookFcnContext = this - hookFcnCalls = +1; + hookFcnCalls = +1 - return hook; -}; + return hook +} const predicateTrue = function (this: any, hook: any, more2: any, more3: any, more4: any): true { - predicateTrueContext = this; + predicateTrueContext = this - predicateParam1 = hook; - predicateParam2 = more2; - predicateParam3 = more3; - predicateParam4 = more4; + predicateParam1 = hook + predicateParam2 = more2 + predicateParam3 = more3 + predicateParam4 = more4 - return true; -}; + return true +} describe('services iffElse', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) describe('runs single hook', () => { it('when true', () => { - return ( - iffElse( - true, - hookFcnSync, - hookFcnAsync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookAfter); - }) - ); - }); + return iffElse( + true, + hookFcnSync, + hookFcnAsync, + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 0) + assert.deepEqual(hook, hookAfter) + }) + }) it('when false', () => { - return ( - iffElse( - false, - hookFcnSync, - hookFcnAsync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 0); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - }); + return iffElse( + false, + hookFcnSync, + hookFcnAsync, + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 0) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) + }) describe('runs multiple hooks', () => { it('when true', () => { - return ( - iffElse( - true, - // @ts-ignore - [hookFcnSync, hookFcnAsync, hookFcn], - null, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); + return iffElse( + true, + // @ts-expect-error TODO + [hookFcnSync, hookFcnAsync, hookFcn], + null, + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 1) + assert.equal(hookFcnCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('when false', () => { return ( - // @ts-ignore - iffElse(false, null, [hookFcnSync, hookFcnAsync, hookFcn])(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - assert.deepEqual(hook, hookAfter); - }) - ); - }); - }); + // @ts-expect-error TODO + iffElse(false, null, [hookFcnSync, hookFcnAsync, hookFcn])(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 1) + assert.equal(hookFcnCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + ) + }) + }) describe('predicate gets right params', () => { it('when true', () => { - return ( - iffElse( - // @ts-ignore - predicateTrue, - [hookFcnSync, hookFcnAsync, hookFcn], - null, - )(hook) - // @ts-ignore - .then(() => { - assert.deepEqual(predicateParam1, hook, 'param1'); - assert.strictEqual(predicateParam2, undefined, 'param2'); - assert.strictEqual(predicateParam3, undefined, 'param3'); - assert.strictEqual(predicateParam4, undefined, 'param4'); - }) - ); - }); + return iffElse( + // @ts-expect-error TODO + predicateTrue, + [hookFcnSync, hookFcnAsync, hookFcn], + null, + )(hook).then(() => { + assert.deepEqual(predicateParam1, hook, 'param1') + assert.strictEqual(predicateParam2, undefined, 'param2') + assert.strictEqual(predicateParam3, undefined, 'param3') + assert.strictEqual(predicateParam4, undefined, 'param4') + }) + }) it('every passes on correct params', () => { - return ( - iffElse( - // @ts-ignore - every(predicateTrue), - // @ts-ignore - [hookFcnSync, hookFcnAsync, hookFcn], - null, - )(hook) - // @ts-ignore - .then(() => { - assert.deepEqual(predicateParam1, hook, 'param1'); - assert.strictEqual(predicateParam2, undefined, 'param2'); - assert.strictEqual(predicateParam3, undefined, 'param3'); - assert.strictEqual(predicateParam4, undefined, 'param4'); - }) - ); - }); + return iffElse( + // @ts-expect-error TODO + every(predicateTrue), + // @ts-expect-error TODO + [hookFcnSync, hookFcnAsync, hookFcn], + null, + )(hook).then(() => { + assert.deepEqual(predicateParam1, hook, 'param1') + assert.strictEqual(predicateParam2, undefined, 'param2') + assert.strictEqual(predicateParam3, undefined, 'param3') + assert.strictEqual(predicateParam4, undefined, 'param4') + }) + }) it('some passes on correct params', () => { - return ( - iffElse( - // @ts-ignore - some(predicateTrue), - // @ts-ignore - [hookFcnSync, hookFcnAsync, hookFcn], - null, - )(hook) - // @ts-ignore - .then(() => { - assert.deepEqual(predicateParam1, hook, 'param1'); - assert.strictEqual(predicateParam2, undefined, 'param2'); - assert.strictEqual(predicateParam3, undefined, 'param3'); - assert.strictEqual(predicateParam4, undefined, 'param4'); - }) - ); - }); - }); + return iffElse( + // @ts-expect-error TODO + some(predicateTrue), + // @ts-expect-error TODO + [hookFcnSync, hookFcnAsync, hookFcn], + null, + )(hook).then(() => { + assert.deepEqual(predicateParam1, hook, 'param1') + assert.strictEqual(predicateParam2, undefined, 'param2') + assert.strictEqual(predicateParam3, undefined, 'param3') + assert.strictEqual(predicateParam4, undefined, 'param4') + }) + }) + }) describe('predicate and hooks get right context', () => { beforeEach(() => { - context = { service: 'abc' }; - predicateTrueContext = undefined; - hookFcnSyncContext = undefined; - hookFcnAsyncContext = undefined; - hookFcnContext = undefined; - }); + context = { service: 'abc' } + predicateTrueContext = undefined + hookFcnSyncContext = undefined + hookFcnAsyncContext = undefined + hookFcnContext = undefined + }) it('services', () => { return ( - // @ts-ignore + // @ts-expect-error TODO iffElse(predicateTrue, [hookFcnSync, hookFcnAsync, hookFcn], null) .call(context, hook) - // @ts-ignore .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - assert.deepEqual(hook, hookAfter); - - assert.deepEqual(predicateTrueContext, { service: 'abc' }); - assert.deepEqual(hookFcnSyncContext, { service: 'abc' }); - assert.deepEqual(hookFcnAsyncContext, { service: 'abc' }); - assert.deepEqual(hookFcnContext, { service: 'abc' }); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 1) + assert.equal(hookFcnCalls, 1) + assert.deepEqual(hook, hookAfter) + + assert.deepEqual(predicateTrueContext, { service: 'abc' }) + assert.deepEqual(hookFcnSyncContext, { service: 'abc' }) + assert.deepEqual(hookFcnAsyncContext, { service: 'abc' }) + assert.deepEqual(hookFcnContext, { service: 'abc' }) }) - ); - }); - }); -}); + ) + }) + }) +}) diff --git a/src/hooks/iff/iff-else.ts b/src/hooks/iff/iff-else.ts index 581539a2..cf29189a 100755 --- a/src/hooks/iff/iff-else.ts +++ b/src/hooks/iff/iff-else.ts @@ -1,7 +1,7 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../../common'; -import { combine } from '../../utils/combine/combine'; -import type { HookFunction, PredicateFn } from '../../types'; +import type { HookContext } from '@feathersjs/feathers' +import { isPromise } from '../../common/index.js' +import { combine } from '../../utils/combine/combine.js' +import type { HookFunction, PredicateFn } from '../../types.js' /** * Execute one array of hooks or another based on a sync or async predicate. @@ -18,31 +18,31 @@ export function iffElse( ? trueHook : typeof trueHook === 'function' ? [trueHook] - : undefined; + : undefined const falseHooks = Array.isArray(falseHook) ? falseHook : typeof falseHook === 'function' ? [falseHook] - : undefined; + : undefined // eslint-disable-next-line @typescript-eslint/no-this-alias - const that = this; - const check = typeof predicate === 'function' ? predicate.apply(that, [ctx]) : !!predicate; + const that = this + const check = typeof predicate === 'function' ? predicate.apply(that, [ctx]) : !!predicate if (!check) { - return callHooks.call(that, ctx, falseHooks as any); + return callHooks.call(that, ctx, falseHooks as any) } if (!isPromise(check)) { - return callHooks.call(that, ctx, trueHooks as any); + return callHooks.call(that, ctx, trueHooks as any) } return check.then((check1: any) => { - const hooks = check1 ? trueHooks : falseHooks; - return callHooks.call(that, ctx, hooks as any); - }); - }; + const hooks = check1 ? trueHooks : falseHooks + return callHooks.call(that, ctx, hooks as any) + }) + } } function callHooks( @@ -50,5 +50,5 @@ function callHooks( ctx: H, serviceHooks: HookFunction[], ) { - return serviceHooks ? combine(...serviceHooks).call(this, ctx) : ctx; + return serviceHooks ? combine(...serviceHooks).call(this, ctx) : ctx } diff --git a/src/hooks/iff/iff.test.ts b/src/hooks/iff/iff.test.ts index 0d3c4414..93db8320 100755 --- a/src/hooks/iff/iff.test.ts +++ b/src/hooks/iff/iff.test.ts @@ -1,386 +1,386 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { iff } from './iff'; -import { clone, isPromise } from '../../common'; - -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let hookFcnAsyncCalls: any; -let hookFcnCbCalls: any; -let predicateHook: any; -let predicateOptions: any; -let predicateValue: any; +import type { HookContext } from '@feathersjs/feathers' +import { assert } from 'vitest' +import { iff } from './iff.js' +import { clone, isPromise } from '../../common/index.js' + +let hook: any +let hookBefore: any +let hookAfter: any +let hookFcnSyncCalls: any +let hookFcnAsyncCalls: any +let hookFcnCbCalls: any +let predicateHook: any +let predicateOptions: any +let predicateValue: any const predicateSync = (hook: any) => { - predicateHook = clone(hook); - return true; -}; + predicateHook = clone(hook) + return true +} const predicateSync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return true; -}; + predicateOptions = clone(options) + predicateHook = clone(hook) + return true +} const predicateAsync = (hook: any) => { - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; + predicateHook = clone(hook) + return new Promise(resolve => resolve(true)) +} const predicateAsync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return new Promise(resolve => resolve(true)); -}; + predicateOptions = clone(options) + predicateHook = clone(hook) + return new Promise(resolve => resolve(true)) +} const predicateAsyncFunny = (hook: any) => { - predicateHook = clone(hook); + predicateHook = clone(hook) return new Promise(resolve => { - predicateValue = 'abc'; - return resolve(predicateValue); - }); -}; + predicateValue = 'abc' + return resolve(predicateValue) + }) +} const hookFcnSync = (hook: HookContext): HookContext => { - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnSyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - return hook; -}; + return hook +} const hookFcnAsync = (hook: HookContext) => new Promise(resolve => { - hookFcnAsyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnAsyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - resolve(hook); - }); + resolve(hook) + }) const hookFcn = (hook: HookContext): HookContext => { - hookFcnCbCalls = +1; + hookFcnCbCalls = +1 - return hook; -}; + return hook +} describe('services iff - sync predicate, sync hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls sync hook function if truthy non-function', () => { iff( - // @ts-ignore + // @ts-expect-error TODO 'a', hookFcnSync, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if falsey non-function', () => { - // @ts-ignore - const result = iff('', hookFcnSync)(hook); + // @ts-expect-error TODO + const result = iff('', hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); + }) it('calls sync hook function if sync predicate truthy', () => { iff( - // @ts-ignore + // @ts-expect-error TODO () => 'a', hookFcnSync, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if sync predicate falsey', () => { - // @ts-ignore - const result = iff(() => '', hookFcnSync)(hook); + // @ts-expect-error TODO + const result = iff(() => '', hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); -}); + }) +}) describe('services iff - sync predicate, async hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls async hook function if sync predicate truthy', async () => { - const result = iff(true, hookFcnAsync)(hook); + const result = iff(true, hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call async hook function if sync predicate falsey', () => { - const result = iff(false, hookFcnAsync)(hook); + const result = iff(false, hookFcnAsync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnAsyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) it('calls async hook function if sync predicate returns truthy', async () => { - const result = iff(() => true, hookFcnAsync)(hook); + const result = iff(() => true, hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) describe('services iff - async predicate, sync hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls sync hook function if aync predicate truthy', async () => { - const result = iff(() => new Promise(resolve => resolve(true)), hookFcnSync)(hook); + const result = iff(() => new Promise(resolve => resolve(true)), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('does not call sync hook function if async predicate falsey', async () => { - const result = iff(() => new Promise(resolve => resolve(false)), hookFcnSync)(hook); + const result = iff(() => new Promise(resolve => resolve(false)), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); + assert.deepEqual(result1, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) + }) +}) describe('services iff - async predicate, async hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls async hook function if aync predicate truthy', async () => { - const result = iff(() => new Promise(resolve => resolve(true)), hookFcnAsync)(hook); + const result = iff(() => new Promise(resolve => resolve(true)), hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('does not call async hook function if async predicate falsey', async () => { - const result = iff(() => new Promise(resolve => resolve(false)), hookFcnAsync)(hook); + const result = iff(() => new Promise(resolve => resolve(false)), hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); + assert.deepEqual(result1, hookBefore) + assert.equal(hookFcnAsyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) + }) +}) describe('services iff - sync predicate', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + predicateHook = null + predicateOptions = null + }) it('does not need to access hook', () => { iff( - // @ts-ignore + // @ts-expect-error TODO () => 'a', hookFcnSync, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('is passed hook as param', () => { iff( predicateSync, hookFcnSync, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('a higher order predicate can pass more options', () => { iff( predicateSync2({ z: 'z' }), hookFcnSync, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(predicateOptions, { z: 'z' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + assert.deepEqual(predicateOptions, { z: 'z' }) + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) describe('services iff - async predicate', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - predicateValue = null; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + predicateHook = null + predicateOptions = null + predicateValue = null + }) it('is passed hook as param', async () => { - // @ts-ignore - const result = iff(predicateAsync, hookFcnSync)(hook); + // @ts-expect-error TODO + const result = iff(predicateAsync, hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('is resolved', async () => { - // @ts-ignore - const result = iff(predicateAsyncFunny, hookFcnSync)(hook); + // @ts-expect-error TODO + const result = iff(predicateAsyncFunny, hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) - assert.equal(predicateValue, 'abc'); - }); - }); + assert.equal(predicateValue, 'abc') + }) + }) it('a higher order predicate can pass more options', async () => { - // @ts-ignore - const result = iff(predicateAsync2({ y: 'y' }), hookFcnSync)(hook); + // @ts-expect-error TODO + const result = iff(predicateAsync2({ y: 'y' }), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateOptions, { y: 'y' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); -}); + assert.deepEqual(predicateOptions, { y: 'y' }) + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) +}) describe('services iff - runs multiple hooks', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('runs successfully', async () => { await iff( @@ -389,13 +389,13 @@ describe('services iff - runs multiple hooks', () => { hookFcnAsync, hookFcn, )(hook) - // @ts-ignore + // @ts-expect-error TODO .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCbCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 1) + assert.equal(hookFcnCbCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) diff --git a/src/hooks/iff/iff.ts b/src/hooks/iff/iff.ts index 19345c25..c996a5be 100755 --- a/src/hooks/iff/iff.ts +++ b/src/hooks/iff/iff.ts @@ -1,9 +1,9 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { iffElse } from './iff-else'; -import type { HookFunction, PredicateFn } from '../../types'; +import type { HookContext } from '@feathersjs/feathers' +import { iffElse } from './iff-else.js' +import type { HookFunction, PredicateFn } from '../../types.js' export interface IffHook extends HookFunction { - else(...hooks: HookFunction[]): HookFunction; + else(...hooks: HookFunction[]): HookFunction } /** @@ -15,19 +15,19 @@ export function iff( ...hooks: HookFunction[] ): IffHook { if (hooks.length && Array.isArray(hooks[0])) { - hooks = hooks[0]; + hooks = hooks[0] } const iffWithoutElse = function (context: H) { - return iffElse(predicate, hooks.slice())(context); - }; + return iffElse(predicate, hooks.slice())(context) + } iffWithoutElse.else = (...falseHooks: any[]) => (context: H) => - iffElse(predicate, hooks.slice(), falseHooks.slice())(context); + iffElse(predicate, hooks.slice(), falseHooks.slice())(context) - return iffWithoutElse as IffHook; + return iffWithoutElse as IffHook } -export { iff as when }; +export { iff as when } diff --git a/src/hooks/iff/unless.test.ts b/src/hooks/iff/unless.test.ts index cb5e804a..ea4b8c82 100755 --- a/src/hooks/iff/unless.test.ts +++ b/src/hooks/iff/unless.test.ts @@ -1,379 +1,369 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { assert } from 'vitest'; -import { unless } from './unless'; -import { clone, isPromise } from '../../common'; - -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let hookFcnAsyncCalls: any; -let hookFcnCalls: any; -let predicateHook: any; -let predicateOptions: any; -let predicateValue: any; +import type { HookContext } from '@feathersjs/feathers' +import { assert } from 'vitest' +import { unless } from './unless.js' +import { clone, isPromise } from '../../common/index.js' + +let hook: any +let hookBefore: any +let hookAfter: any +let hookFcnSyncCalls: any +let hookFcnAsyncCalls: any +let hookFcnCalls: any +let predicateHook: any +let predicateOptions: any +let predicateValue: any const predicateSync = (hook: any) => { - predicateHook = clone(hook); - return false; -}; + predicateHook = clone(hook) + return false +} const predicateSync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return false; -}; + predicateOptions = clone(options) + predicateHook = clone(hook) + return false +} const predicateAsync = (hook: any) => { - predicateHook = clone(hook); - return new Promise(resolve => resolve(false)); -}; + predicateHook = clone(hook) + return new Promise(resolve => resolve(false)) +} const predicateAsync2 = (options: any) => (hook: any) => { - predicateOptions = clone(options); - predicateHook = clone(hook); - return new Promise(resolve => resolve(false)); -}; + predicateOptions = clone(options) + predicateHook = clone(hook) + return new Promise(resolve => resolve(false)) +} const predicateAsyncFunny = (hook: HookContext) => { - predicateHook = clone(hook); + predicateHook = clone(hook) return new Promise(resolve => { - predicateValue = null; - return resolve(predicateValue); - }); -}; + predicateValue = null + return resolve(predicateValue) + }) +} const hookFcnSync = (hook: HookContext): HookContext => { - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnSyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - return hook; -}; + return hook +} const hookFcnAsync = (hook: HookContext) => new Promise(resolve => { - hookFcnAsyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnAsyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - resolve(hook); - }); + resolve(hook) + }) const hookFcn = (hook: HookContext): HookContext => { - hookFcnCalls = +1; + hookFcnCalls = +1 - return hook; -}; + return hook +} describe('sync predicate, sync hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls sync hook function if falsey non-function', () => { unless( false, hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if truthy non-function', () => { - const result = unless(true, hookFcnSync)(hook); + const result = unless(true, hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); + }) it('calls sync hook function if sync predicate falsey', () => { unless( () => false, hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if sync predicate truthy', () => { - const result = unless(() => true, hookFcnSync)(hook); + const result = unless(() => true, hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); -}); + }) +}) describe('sync predicate, async hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls async hook function if sync predicate falsey', async () => { - const result = unless(false, hookFcnAsync)(hook); + const result = unless(false, hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call async hook function if sync predicate truthy', () => { - const result = unless(true, hookFcnAsync)(hook); + const result = unless(true, hookFcnAsync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnAsyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) it('calls async hook function if sync predicate returns falsey', async () => { - const result = unless(() => false, hookFcnAsync)(hook); + const result = unless(() => false, hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) describe('async predicate, sync hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls sync hook function if aync predicate falsey', async () => { - const result = unless(() => new Promise(resolve => resolve(false)), hookFcnSync)(hook); + const result = unless(() => new Promise(resolve => resolve(false)), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('does not call sync hook function if async predicate truthy', async () => { - const result = unless(() => new Promise(resolve => resolve(true)), hookFcnSync)(hook); + const result = unless(() => new Promise(resolve => resolve(true)), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); + assert.deepEqual(result1, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) + }) +}) describe('async predicate, async hook', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('calls async hook function if aync predicate falsey', async () => { - const result = unless(() => new Promise(resolve => resolve(false)), hookFcnAsync)(hook); + const result = unless(() => new Promise(resolve => resolve(false)), hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnAsyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnAsyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('does not call async hook function if async predicate truthy', async () => { - const result = unless(() => new Promise(resolve => resolve(true)), hookFcnAsync)(hook); + const result = unless(() => new Promise(resolve => resolve(true)), hookFcnAsync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } result.then((result1: any) => { - assert.deepEqual(result1, hookBefore); - assert.equal(hookFcnAsyncCalls, 0); - assert.deepEqual(hook, hookBefore); - }); - }); -}); + assert.deepEqual(result1, hookBefore) + assert.equal(hookFcnAsyncCalls, 0) + assert.deepEqual(hook, hookBefore) + }) + }) +}) describe('sync predicate', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + predicateHook = null + predicateOptions = null + }) it('does not need to access hook', () => { unless( () => false, hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('is passed hook as param', () => { unless( predicateSync, hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('a higher order predicate can pass more options', () => { unless( predicateSync2({ z: 'z' }), hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(predicateOptions, { z: 'z' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + )(hook).then((hook: any) => { + assert.deepEqual(predicateOptions, { z: 'z' }) + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) describe('async predicate', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - predicateHook = null; - predicateOptions = null; - predicateValue = null; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + predicateHook = null + predicateOptions = null + predicateValue = null + }) it('is passed hook as param', async () => { - const result = unless(predicateAsync, hookFcnSync)(hook); + const result = unless(predicateAsync, hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) it('is resolved', async () => { - // @ts-ignore - const result = unless(predicateAsyncFunny, hookFcnSync)(hook); + // @ts-expect-error TODO + const result = unless(predicateAsyncFunny, hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) - assert.equal(predicateValue, null); - }); - }); + assert.equal(predicateValue, null) + }) + }) it('a higher order predicate can pass more options', async () => { - const result = unless(predicateAsync2({ y: 'y' }), hookFcnSync)(hook); + const result = unless(predicateAsync2({ y: 'y' }), hookFcnSync)(hook) if (!isPromise(result)) { - assert.fail('promise unexpectedly not returned'); + assert.fail('promise unexpectedly not returned') } await result.then((result1: any) => { - assert.deepEqual(predicateOptions, { y: 'y' }); - assert.deepEqual(predicateHook, hookBefore); - assert.deepEqual(result1, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(result1, hookAfter); - }); - }); -}); + assert.deepEqual(predicateOptions, { y: 'y' }) + assert.deepEqual(predicateHook, hookBefore) + assert.deepEqual(result1, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(result1, hookAfter) + }) + }) +}) describe('runs multiple hooks', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - hookFcnAsyncCalls = 0; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + hookAfter = { type: 'before', method: 'create', data: { first: 'john', last: 'Doe' } } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + hookFcnAsyncCalls = 0 + }) it('runs successfully', async () => { await unless( @@ -382,11 +372,11 @@ describe('runs multiple hooks', () => { hookFcnAsync, hookFcn, )(hook).then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.equal(hookFcnAsyncCalls, 1); - assert.equal(hookFcnCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); -}); + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.equal(hookFcnAsyncCalls, 1) + assert.equal(hookFcnCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) +}) diff --git a/src/hooks/iff/unless.ts b/src/hooks/iff/unless.ts index ca49ea78..3def32ba 100755 --- a/src/hooks/iff/unless.ts +++ b/src/hooks/iff/unless.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { iffElse } from './iff-else'; -import type { PredicateFn, HookFunction } from '../../types'; +import type { HookContext } from '@feathersjs/feathers' +import { iffElse } from './iff-else.js' +import type { PredicateFn, HookFunction } from '../../types.js' /** * Execute a series of hooks if a sync or async predicate is falsey. @@ -11,5 +11,5 @@ export function unless( predicate: boolean | PredicateFn, ...hooks: HookFunction[] ) { - return iffElse(predicate, undefined, [...hooks]); + return iffElse(predicate, undefined, [...hooks]) } diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 734e7dae..ce3c33b5 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,63 +1,41 @@ -export * from './act-on-dispatch/act-on-dispatch'; +// transform +export * from './transform/transform-data.js' +export * from './transform/transform-result.js' -// alter -export * from './alter-items/alter-items'; -export * from './alter-items/alter-data'; -export * from './alter-items/alter-result'; - -export * from './cache/cache'; -export * from './debug/debug'; -export * from './de-populate/de-populate'; -export * from './disable-pagination/disable-pagination'; -export * from './disallow/disallow'; +export * from './cache/cache.js' +export * from './debug/debug.js' +export * from './disable-pagination/disable-pagination.js' +export * from './disallow/disallow.js' // omit -export * from './omit/omit'; -export * from './omit/omit-data'; -export * from './omit/omit-result'; -export * from './omit-query/omit-query'; - -export * from './fast-join/fast-join'; -export * from './fgraphql/fgraphql'; +export * from './omit/omit-data.js' +export * from './omit/omit-result.js' +export * from './omit/omit-query.js' // iff -export * from './iff/iff'; -export * from './iff/iff-else'; -export * from './iff/unless'; +export * from './iff/iff.js' +export * from './iff/iff-else.js' +export * from './iff/unless.js' // pick -export * from './pick/pick'; -export * from './pick/pick-data'; -export * from './pick/pick-result'; -export * from './pick-query/pick-query'; - -export * from './keep-in-array/keep-in-array'; - -export * from './keep-query-in-array/keep-query-in-array'; - -export * from './lowercase/lowercase'; -export * from './lowercase/lowercase-data'; -export * from './lowercase/lowercase-result'; - -export * from './mongo-keys/mongo-keys'; -export * from './params-from-client/params-from-client'; -export * from './populate/populate'; -export * from './prevent-changes/prevent-changes'; -export * from './check-required/check-required'; -export * from './run-parallel/run-parallel'; -export * from './sequelize-convert/sequelize-convert'; -export * from './serialize/serialize'; -export * from './set-field/set-field'; - -export * from './set-now/set-now'; -export * from './set-now/set-now-data'; -export * from './set-now/set-now-result'; - -export * from './set-slug/set-slug'; -export * from './sifter/sifter'; -export * from './soft-delete/soft-delete'; -export * from './stash-before/stash-before'; -export * from './traverse/traverse'; - -export * from './validate/validate'; -export * from './validate-schema/validate-schema'; +export * from './pick/pick-data.js' +export * from './pick/pick-result.js' +export * from './pick/pick-query.js' + +export * from './lowercase/lowercase-data.js' +export * from './lowercase/lowercase-result.js' + +export * from './params-from-client/params-from-client.js' +export * from './prevent-changes/prevent-changes.js' +export * from './check-required/check-required.js' +export * from './run-parallel/run-parallel.js' +export * from './set-field/set-field.js' + +export * from './set-now/set-now-data.js' +export * from './set-now/set-now-result.js' + +export * from './set-slug/set-slug.js' +export * from './sifter/sifter.js' +export * from './soft-delete/soft-delete.js' +export * from './stash-before/stash-before.js' +export * from './traverse/traverse.js' diff --git a/src/hooks/lowercase/lowercase-data.test.ts b/src/hooks/lowercase/lowercase-data.test.ts index 88cefd8d..24ea6924 100755 --- a/src/hooks/lowercase/lowercase-data.test.ts +++ b/src/hooks/lowercase/lowercase-data.test.ts @@ -1,48 +1,48 @@ -import { assert } from 'vitest'; -import { lowercaseData } from './lowercase-data'; +import { assert } from 'vitest' +import { lowercaseData } from './lowercase-data.js' -let hookBefore: any; +let hookBefore: any describe('lowercaseData', () => { describe('updates data', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + }) it('updates hook before::create', () => { - lowercaseData('first', 'last')(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'john', last: 'doe' }); - }); + lowercaseData(['first', 'last'])(hookBefore) + assert.deepEqual(hookBefore.data, { first: 'john', last: 'doe' }) + }) it('does not throw if field is missing', () => { - const hook: any = { type: 'before', method: 'create', data: { last: 'Doe' } }; - lowercaseData('first', 'last')(hook); - assert.deepEqual(hook.data, { last: 'doe' }); - }); + const hook: any = { type: 'before', method: 'create', data: { last: 'Doe' } } + lowercaseData(['first', 'last'])(hook) + assert.deepEqual(hook.data, { last: 'doe' }) + }) it('does not throw if field is undefined', () => { const hook: any = { type: 'before', method: 'create', data: { first: undefined, last: 'Doe' }, - }; - lowercaseData('first', 'last')(hook); - assert.deepEqual(hook.data, { first: undefined, last: 'doe' }); - }); + } + lowercaseData(['first', 'last'])(hook) + assert.deepEqual(hook.data, { first: undefined, last: 'doe' }) + }) it('does not throw if field is null', () => { - const hook: any = { type: 'before', method: 'create', data: { first: null, last: 'Doe' } }; - lowercaseData('first', 'last')(hook); - assert.deepEqual(hook.data, { first: null, last: 'doe' }); - }); + const hook: any = { type: 'before', method: 'create', data: { first: null, last: 'Doe' } } + lowercaseData(['first', 'last'])(hook) + assert.deepEqual(hook.data, { first: null, last: 'doe' }) + }) it('throws if field is not a string', () => { - const hook: any = { type: 'before', method: 'create', data: { first: 1, last: 'Doe' } }; + const hook: any = { type: 'before', method: 'create', data: { first: 1, last: 'Doe' } } assert.throws(() => { - lowercaseData('first', 'last')(hook); - }); - }); - }); + lowercaseData(['first', 'last'])(hook) + }) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -50,47 +50,47 @@ describe('lowercaseData', () => { type: 'before', method: 'create', data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); + } + }) it('prop with no dots', () => { - lowercaseData('dept')(hookBefore); + lowercaseData('dept')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'acct', - }); - }); + }) + }) it('prop with 1 dot', () => { - lowercaseData('empl.status')(hookBefore); + lowercaseData('empl.status')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'aa' }, dept: 'Acct', - }); - }); + }) + }) it('prop with 2 dots', () => { - lowercaseData('empl.name.first')(hookBefore); + lowercaseData('empl.name.first')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'john', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing paths', () => { - lowercaseData('empl.xx.first')(hookBefore); + lowercaseData('empl.xx.first')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing no dot path', () => { - lowercaseData('xx')(hookBefore); + lowercaseData('xx')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); - }); -}); + }) + }) + }) +}) diff --git a/src/hooks/lowercase/lowercase-data.ts b/src/hooks/lowercase/lowercase-data.ts index 6bc545a4..b49e974a 100755 --- a/src/hooks/lowercase/lowercase-data.ts +++ b/src/hooks/lowercase/lowercase-data.ts @@ -1,29 +1,30 @@ -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import { BadRequest } from '@feathersjs/errors'; -import { alterData } from '../alter-items/alter-data'; -import { MaybeArray, toArray } from '../../internal.utils'; +import _get from 'lodash/get.js' +import _set from 'lodash/set.js' +import { BadRequest } from '@feathersjs/errors' +import { transformData } from '../transform/transform-data.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Convert certain field values to lower case. * @see https://hooks-common.feathersjs.com/hooks.html#lowercase */ export const lowercaseData = (fieldNames: MaybeArray) => { - const fieldNamesArr = toArray(fieldNames); - return alterData(item => { + const fieldNamesArr = toArray(fieldNames) + return transformData(item => { for (let i = 0; i < fieldNamesArr.length; i++) { - const fieldName = fieldNamesArr[i]; - const value = _get(item, fieldName); + const fieldName = fieldNamesArr[i] + const value = _get(item, fieldName) if (value == null) { - continue; + continue } if (typeof value !== 'string') { - throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`) } - _set(item, fieldName, value.toLowerCase()); + _set(item, fieldName, value.toLowerCase()) } - }); -}; + }) +} diff --git a/src/hooks/lowercase/lowercase-result.test.ts b/src/hooks/lowercase/lowercase-result.test.ts index 9a4eaa5d..7f7361ca 100755 --- a/src/hooks/lowercase/lowercase-result.test.ts +++ b/src/hooks/lowercase/lowercase-result.test.ts @@ -1,6 +1,6 @@ -import { assert } from 'vitest'; -import { lowercaseResult } from './lowercase-result'; -import { HookContext } from '@feathersjs/feathers'; +import { assert } from 'vitest' +import { lowercaseResult } from './lowercase-result.js' +import type { HookContext } from '@feathersjs/feathers' describe('lowercaseResult', () => { it('updates hook after::find with pagination', () => { @@ -14,14 +14,14 @@ describe('lowercaseResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - } as HookContext; + } as HookContext - lowercaseResult(['first', 'last'])(context); + lowercaseResult(['first', 'last'])(context) assert.deepEqual(context.result.data, [ { first: 'john', last: 'doe' }, { first: 'jane', last: 'doe' }, - ]); - }); + ]) + }) it('updates hook after::find with no pagination', () => { const context = { @@ -31,22 +31,22 @@ describe('lowercaseResult', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - } as HookContext; - lowercaseResult(['first', 'last'])(context); + } as HookContext + lowercaseResult(['first', 'last'])(context) assert.deepEqual(context.result, [ { first: 'john', last: 'doe' }, { first: 'jane', last: 'doe' }, - ]); - }); + ]) + }) it('updates hook after', () => { const context = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' }, - } as HookContext; - lowercaseResult(['first', 'last'])(context); + } as HookContext + lowercaseResult(['first', 'last'])(context) - assert.deepEqual(context.result, { first: 'jane', last: 'doe' }); - }); -}); + assert.deepEqual(context.result, { first: 'jane', last: 'doe' }) + }) +}) diff --git a/src/hooks/lowercase/lowercase-result.ts b/src/hooks/lowercase/lowercase-result.ts index 9646d671..b1118712 100755 --- a/src/hooks/lowercase/lowercase-result.ts +++ b/src/hooks/lowercase/lowercase-result.ts @@ -1,13 +1,14 @@ -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; -import { BadRequest } from '@feathersjs/errors'; -import { alterResult } from '../alter-items/alter-result'; -import { DispatchOption } from '../../types'; -import { MaybeArray, toArray } from '../../internal.utils'; +import _get from 'lodash/get.js' +import _set from 'lodash/set.js' +import { BadRequest } from '@feathersjs/errors' +import { transformResult } from '../transform/transform-result.js' +import type { DispatchOption } from '../../types.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' export type LowercaseResultOptions = { - dispatch?: DispatchOption; -}; + dispatch?: DispatchOption +} /** * Convert certain field values to lower case. @@ -17,25 +18,25 @@ export const lowercaseResult = ( fieldNames: MaybeArray, options?: LowercaseResultOptions, ) => { - const fieldNamesArray = toArray(fieldNames); + const fieldNamesArray = toArray(fieldNames) - return alterResult( - item => { + return transformResult( + (item: any) => { for (let i = 0; i < fieldNamesArray.length; i++) { - const fieldName = fieldNamesArray[i]; - const value = _get(item, fieldName); + const fieldName = fieldNamesArray[i] + const value = _get(item, fieldName) if (value == null) { - continue; + continue } if (typeof value !== 'string') { - throw new BadRequest(`Expected string data. (lowercase ${fieldName})`); + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`) } - _set(item, fieldName, value.toLowerCase()); + _set(item, fieldName, value.toLowerCase()) } }, { dispatch: options?.dispatch }, - ); -}; + ) +} diff --git a/src/hooks/omit/omit-data-1.test.ts b/src/hooks/omit/omit-data-1.test.ts index ea5c35f4..217cc5c8 100755 --- a/src/hooks/omit/omit-data-1.test.ts +++ b/src/hooks/omit/omit-data-1.test.ts @@ -1,42 +1,44 @@ -import { assert } from 'vitest'; -import { omitData } from './omit-data'; +import { assert } from 'vitest' +import { omitData } from './omit-data.js' +import type { HookContext } from '@feathersjs/feathers' describe('omitData', () => { describe('removes fields', () => { - const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }); - const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }); - const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }); + const beforeJohn = (): any => ({ type: 'before', data: { first: 'John', last: 'Doe' } }) + const beforeUndef = (): any => ({ type: 'before', data: { first: undefined, last: 'Doe' } }) + const beforeNull = (): any => ({ type: 'before', data: { first: null, last: 'Doe' } }) const decisionTable = [ ['before::create', beforeJohn(), 'create', null, ['first'], { last: 'Doe' }], ['not throw field missing', beforeJohn(), 'create', 'rest', ['first', 'xx'], { last: 'Doe' }], ['not throw field undefined', beforeUndef(), 'create', 'rest', ['first'], { last: 'Doe' }], ['not throw field null', beforeNull(), 'create', 'rest', ['first'], { last: 'Doe' }], - ]; + ] as [string, HookContext, string, string, string[], any][] decisionTable.forEach(([desc, context, method, provider, args, result]) => { it(desc, () => { - context.method = method; + // @ts-expect-error readonly + context.method = method if (provider !== null) { - context.params = context.params || {}; - context.params.provider = provider; + context.params = context.params || {} + context.params.provider = provider } - omitData(...args)(context); + omitData(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); + ) + }) + }) + }) describe('handles dot notation', () => { const ctx = (): any => ({ type: 'before', method: 'create', data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }); + }) const decisionTable = [ // desc, context, args, result @@ -76,16 +78,16 @@ describe('omitData', () => { ['empl.status', 'dept'], { empl: { name: { first: 'John', last: 'Doe' } } }, ], - ]; + ] as [string, HookContext, string[], any][] decisionTable.forEach(([desc, context, args, result]) => { it(desc, () => { - omitData(...args)(context); + omitData(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); -}); + ) + }) + }) + }) +}) diff --git a/src/hooks/omit/omit-data.test.ts b/src/hooks/omit/omit-data.test.ts index fa9fdd5e..438fa215 100755 --- a/src/hooks/omit/omit-data.test.ts +++ b/src/hooks/omit/omit-data.test.ts @@ -1,7 +1,7 @@ -import { assert } from 'vitest'; -import { omitData } from './omit-data'; +import { assert } from 'vitest' +import { omitData } from './omit-data.js' -let hookBefore: any; +let hookBefore: any describe('omitData', () => { describe('removes fields', () => { @@ -11,13 +11,13 @@ describe('omitData', () => { method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; - }); + } + }) it('updates hook before::create', () => { - omitData('first')(hookBefore); - assert.deepEqual(hookBefore.data, { last: 'Doe' }); - }); + omitData('first')(hookBefore) + assert.deepEqual(hookBefore.data, { last: 'Doe' }) + }) it('does not throw if field is missing', () => { const hook: any = { @@ -25,10 +25,10 @@ describe('omitData', () => { method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; - omitData('first', 'xx')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); + } + omitData(['first', 'xx'])(hook) + assert.deepEqual(hook.data, { last: 'Doe' }) + }) it('does not throw if field is null', () => { const hook: any = { @@ -36,11 +36,11 @@ describe('omitData', () => { method: 'create', params: { provider: 'rest' }, data: { first: null, last: 'Doe' }, - }; - omitData('first')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); - }); + } + omitData('first')(hook) + assert.deepEqual(hook.data, { last: 'Doe' }) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -49,46 +49,46 @@ describe('omitData', () => { method: 'create', params: { provider: 'rest' }, data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); + } + }) it('prop with no dots', () => { - omitData('dept')(hookBefore); + omitData('dept')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); + }) + }) it('prop with 1 dot', () => { - omitData('empl.status')(hookBefore); + omitData('empl.status')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', - }); - }); + }) + }) it('prop with 2 dots', () => { - omitData('empl.name.first')(hookBefore); + omitData('empl.name.first')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing paths', () => { - omitData('empl.xx.first')(hookBefore); + omitData('empl.xx.first')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing no dot path', () => { - omitData('xx')(hookBefore); + omitData('xx')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); - }); -}); + }) + }) + }) +}) diff --git a/src/hooks/omit/omit-data.ts b/src/hooks/omit/omit-data.ts index cdcf5e40..4ac055db 100755 --- a/src/hooks/omit/omit-data.ts +++ b/src/hooks/omit/omit-data.ts @@ -1,10 +1,11 @@ -import _omit from 'lodash/omit.js'; -import { alterData } from '../alter-items/alter-data'; -import { MaybeArray, toArray } from '../../internal.utils'; +import _omit from 'lodash/omit.js' +import { transformData } from '../transform/transform-data.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Delete certain fields from the record(s). * @see https://hooks-common.feathersjs.com/hooks.html#discard */ export const omitData = (fieldNames: MaybeArray) => - alterData((item: any) => _omit(item, toArray(fieldNames))); + transformData((item: any) => _omit(item, toArray(fieldNames))) diff --git a/src/hooks/omit-query/omit-query.test.ts b/src/hooks/omit/omit-query.test.ts similarity index 72% rename from src/hooks/omit-query/omit-query.test.ts rename to src/hooks/omit/omit-query.test.ts index 249571f1..cd391830 100755 --- a/src/hooks/omit-query/omit-query.test.ts +++ b/src/hooks/omit/omit-query.test.ts @@ -1,8 +1,8 @@ -import { assert } from 'vitest'; -import { omitQuery } from './omit-query'; +import { assert } from 'vitest' +import { omitQuery } from './omit-query.js' -let hookBefore: any; -let hookAfter: any; +let hookBefore: any +let hookAfter: any describe('omitQuery', () => { describe('updates query', () => { @@ -11,26 +11,26 @@ describe('omitQuery', () => { type: 'before', method: 'create', params: { query: { first: 'John', last: 'Doe' } }, - }; - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; - }); + } + hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } } + }) it('updates hook before::create', () => { - omitQuery('last')(hookBefore); - assert.deepEqual(hookBefore.params, { query: { first: 'John' } }); - }); + omitQuery('last')(hookBefore) + assert.deepEqual(hookBefore.params, { query: { first: 'John' } }) + }) it('throws on hook after', () => { assert.throws(() => { - omitQuery('last')(hookAfter); - }); - }); + omitQuery('last')(hookAfter) + }) + }) it('does not throw if field is missing', () => { - omitQuery('x', 'first')(hookBefore); - assert.deepEqual(hookBefore.params.query, { last: 'Doe' }); - }); - }); + omitQuery(['x', 'first'])(hookBefore) + assert.deepEqual(hookBefore.params.query, { last: 'Doe' }) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -40,46 +40,46 @@ describe('omitQuery', () => { params: { query: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, }, - }; - }); + } + }) it('prop with no dots', () => { - omitQuery('dept')(hookBefore); + omitQuery('dept')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); + }) + }) it('prop with 1 dot', () => { - omitQuery('empl.status')(hookBefore); + omitQuery('empl.status')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', - }); - }); + }) + }) it('prop with 2 dots', () => { - omitQuery('empl.name.first')(hookBefore); + omitQuery('empl.name.first')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing paths', () => { - omitQuery('empl.xx.first')(hookBefore); + omitQuery('empl.xx.first')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing no dot path', () => { - omitQuery('xx')(hookBefore); + omitQuery('xx')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); - }); -}); + }) + }) + }) +}) diff --git a/src/hooks/omit-query/omit-query.ts b/src/hooks/omit/omit-query.ts similarity index 57% rename from src/hooks/omit-query/omit-query.ts rename to src/hooks/omit/omit-query.ts index 00b70d3a..061c41b3 100755 --- a/src/hooks/omit-query/omit-query.ts +++ b/src/hooks/omit/omit-query.ts @@ -1,6 +1,7 @@ -import type { HookContext } from '@feathersjs/feathers'; -import _omit from 'lodash/omit.js'; -import { MaybeArray, toArray } from '../../internal.utils'; +import type { HookContext } from '@feathersjs/feathers' +import _omit from 'lodash/omit.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Delete certain fields from the query object. @@ -10,10 +11,10 @@ export const omitQuery = (fieldNames: MaybeArray) => (context: H) => { if (!context.params.query) { - return context; + return context } - context.params.query = _omit(context.params.query, toArray(fieldNames)); + context.params.query = _omit(context.params.query, toArray(fieldNames)) - return context; - }; + return context + } diff --git a/src/hooks/omit/omit-result-1.test.ts b/src/hooks/omit/omit-result-1.test.ts index ae101955..a464253e 100755 --- a/src/hooks/omit/omit-result-1.test.ts +++ b/src/hooks/omit/omit-result-1.test.ts @@ -1,16 +1,16 @@ -import { assert } from 'vitest'; -import { omitResult } from './omit-result'; +import { assert } from 'vitest' +import { omitResult } from './omit-result.js' describe('omitResult', () => { describe('removes fields', () => { - const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); + const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }) const afterBoth = (): any => ({ type: 'after', result: [ { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }); + }) const afterPage = (): any => ({ type: 'after', result: { @@ -21,7 +21,7 @@ describe('omitResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }); + }) const decisionTable = [ [ @@ -42,45 +42,45 @@ describe('omitResult', () => { ], ['after', afterJane(), 'create', null, ['last'], { first: 'Jane' }], ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], - ]; + ] decisionTable.forEach(([desc, context, method, provider, args, result]) => { it(desc, () => { - context.method = method; + context.method = method if (provider !== null) { - context.params = context.params || {}; - context.params.provider = provider; + context.params = context.params || {} + context.params.provider = provider } - omitResult(...args)(context); + omitResult(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); + ) + }) + }) + }) describe('handles dot notation', () => { const ctx2 = (): any => ({ type: 'after', method: 'get', result: { property: null, foo: 'bar' }, - }); + }) const decisionTable = [ // desc, context, args, result ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], - ]; + ] decisionTable.forEach(([desc, context, args, result]) => { it(desc, () => { - omitResult(...args)(context); + omitResult(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); -}); + ) + }) + }) + }) +}) diff --git a/src/hooks/omit/omit-result-2.test.ts b/src/hooks/omit/omit-result-2.test.ts index 8363da65..feaa6bd5 100755 --- a/src/hooks/omit/omit-result-2.test.ts +++ b/src/hooks/omit/omit-result-2.test.ts @@ -1,16 +1,16 @@ -import { assert } from 'vitest'; -import { omitResult } from './omit-result'; +import { assert } from 'vitest' +import { omitResult } from './omit-result.js' describe('omitResult', () => { describe('removes fields', () => { - const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }); + const afterJane = (): any => ({ type: 'after', result: { first: 'Jane', last: 'Doe' } }) const afterBoth = (): any => ({ type: 'after', result: [ { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }); + }) const afterPage = (): any => ({ type: 'after', result: { @@ -21,7 +21,7 @@ describe('omitResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }); + }) const decisionTable = [ // desc, context, method, provider, args, result @@ -77,45 +77,45 @@ describe('omitResult', () => { ['after', afterJane(), 'create', 'rest', ['last'], { first: 'Jane' }], ['after', afterJane(), 'create', 'socketio', ['last'], { first: 'Jane' }], ['call internally on server', afterJane(), 'create', undefined, ['last'], { first: 'Jane' }], - ]; + ] decisionTable.forEach(([desc, context, method, provider, args, result]) => { it(desc, () => { - context.method = method; + context.method = method if (provider !== null) { - context.params = context.params || {}; - context.params.provider = provider; + context.params = context.params || {} + context.params.provider = provider } - omitResult(...args)(context); + omitResult(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); + ) + }) + }) + }) describe('handles dot notation', () => { const ctx2 = (): any => ({ type: 'after', method: 'get', result: { property: null, foo: 'bar' }, - }); + }) const decisionTable = [ // desc, context, args, result ['path not obj', ctx2(), ['property.secret'], { property: null, foo: 'bar' }], - ]; + ] decisionTable.forEach(([desc, context, args, result]) => { it(desc, () => { - omitResult(...args)(context); + omitResult(args)(context) assert.deepEqual( context.data ? context.data : context.result.data || context.result, result, - ); - }); - }); - }); -}); + ) + }) + }) + }) +}) diff --git a/src/hooks/omit/omit-result.test.ts b/src/hooks/omit/omit-result.test.ts index 7dfc0c12..2f101235 100755 --- a/src/hooks/omit/omit-result.test.ts +++ b/src/hooks/omit/omit-result.test.ts @@ -1,9 +1,9 @@ -import { assert } from 'vitest'; -import { omitResult } from './omit-result'; +import { assert } from 'vitest' +import { omitResult } from './omit-result.js' -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; +let hookAfter: any +let hookFindPaginate: any +let hookFind: any describe('omitResult', () => { describe('removes fields', () => { @@ -13,7 +13,7 @@ describe('omitResult', () => { method: 'create', params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, - }; + } hookFindPaginate = { type: 'after', method: 'find', @@ -25,7 +25,7 @@ describe('omitResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }; + } hookFind = { type: 'after', method: 'find', @@ -34,30 +34,30 @@ describe('omitResult', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) it('updates hook after::find with pagination', () => { - omitResult('last')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + omitResult('last')(hookFindPaginate) + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with no pagination', () => { - omitResult('last')(hookFind); - assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); - }); + omitResult('last')(hookFind) + assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after', () => { - omitResult('last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); + omitResult('last')(hookAfter) + assert.deepEqual(hookAfter.result, { first: 'Jane' }) + }) it('updates when called internally on server', () => { - hookAfter.params.provider = ''; - omitResult('last')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - }); + hookAfter.params.provider = '' + omitResult('last')(hookAfter) + assert.deepEqual(hookAfter.result, { first: 'Jane' }) + }) + }) describe('handles dot notation', () => { it('discards multiple fields', () => { @@ -73,9 +73,9 @@ describe('omitResult', () => { id: 'b', }, query: {}, - }; + } - omitResult(['email', 'password'])(hook); + omitResult(['email', 'password'])(hook) assert.deepEqual(hook.result, { roles: ['super'], @@ -84,8 +84,8 @@ describe('omitResult', () => { // password: 'bar', name: 'Rafael', id: 'b', - } as any); - }); + } as any) + }) it('null prop', () => { const hook: any = { @@ -96,14 +96,14 @@ describe('omitResult', () => { other: 'bar', }, query: {}, - }; + } - omitResult('property.secret')(hook); + omitResult('property.secret')(hook) assert.deepEqual(hook.result, { property: null, other: 'bar', - }); - }); - }); -}); + }) + }) + }) +}) diff --git a/src/hooks/omit/omit-result.ts b/src/hooks/omit/omit-result.ts index 262ef378..91b375d5 100755 --- a/src/hooks/omit/omit-result.ts +++ b/src/hooks/omit/omit-result.ts @@ -1,15 +1,16 @@ -import _omit from 'lodash/omit.js'; -import { alterResult } from '../alter-items/alter-result'; -import { MaybeArray, toArray } from '../../internal.utils'; -import { DispatchOption } from '../../types'; +import _omit from 'lodash/omit.js' +import { transformResult } from '../transform/transform-result.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' +import type { DispatchOption } from '../../types.js' export type OmitResultOptions = { - dispatch?: DispatchOption; -}; + dispatch?: DispatchOption +} /** * Delete certain fields from the record(s). * @see https://hooks-common.feathersjs.com/hooks.html#discard */ export const omitResult = (fieldNames: MaybeArray, options?: OmitResultOptions) => - alterResult((item: any) => _omit(item, toArray(fieldNames)), { dispatch: options?.dispatch }); + transformResult((item: any) => _omit(item, toArray(fieldNames)), { dispatch: options?.dispatch }) diff --git a/src/hooks/on-delete/on-delete.test.ts b/src/hooks/on-delete/on-delete.test.ts index b888601f..a12c50ae 100644 --- a/src/hooks/on-delete/on-delete.test.ts +++ b/src/hooks/on-delete/on-delete.test.ts @@ -1,31 +1,31 @@ -import assert from 'assert'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { onDelete } from './on-delete'; +import assert from 'node:assert' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { onDelete } from './on-delete.js' const mockApp = () => { - const app = feathers(); + const app = feathers() - app.use('users', new MemoryService({ startId: 1, multi: true })); - app.use('todos', new MemoryService({ startId: 1, multi: true })); - app.use('tasks', new MemoryService({ startId: 1, multi: true })); + app.use('users', new MemoryService({ startId: 1, multi: true })) + app.use('todos', new MemoryService({ startId: 1, multi: true })) + app.use('tasks', new MemoryService({ startId: 1, multi: true })) - const usersService = app.service('users'); - const todosService = app.service('todos'); - const tasksService = app.service('tasks'); + const usersService = app.service('users') + const todosService = app.service('todos') + const tasksService = app.service('tasks') return { app, todosService, usersService, tasksService, - }; -}; + } +} describe('hook - onDelete', function () { describe('cascade', function () { it('removes single item for single item', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -39,31 +39,31 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) const user = await usersService.create({ name: 'John Doe', - }); + }) const todo = await todosService.create({ title: 'Buy milk', userId: user.id, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) - await usersService.remove(user.id); + await usersService.remove(user.id) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]); - }); + assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]) + }) it('removes multiple items for single item', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -77,36 +77,36 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) const user = await usersService.create({ name: 'John Doe', - }); + }) const todo = await todosService.create({ title: 'Buy milk', userId: user.id, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: user.id, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(user.id); + await usersService.remove(user.id) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]); - }); + assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]) + }) it('removes single item for multiple items', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -120,44 +120,44 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 1, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(1); + await usersService.remove(1) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) assert.deepStrictEqual(users, [ { id: 2, name: 'Jane Doe' }, { id: 3, name: 'Jack Doe' }, - ]); + ]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 2, title: 'Buy eggs', userId: 2 }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); + ]) + }) it('removes multiple items for multiple items', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -171,38 +171,38 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 1, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(null, { query: { id: { $in: [1, 2] } } }); + await usersService.remove(null, { query: { id: { $in: [1, 2] } } }) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) - assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]); + assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) - assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]); - }); + assert.deepStrictEqual(todos, [{ id: 3, title: 'Buy bread', userId: 3 }]) + }) it('does not remove items if not found', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -216,45 +216,45 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 2, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(1); + await usersService.remove(1) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) assert.deepStrictEqual(users, [ { id: 2, name: 'Jane Doe' }, { id: 3, name: 'Jack Doe' }, - ]); + ]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: 2 }, { id: 2, title: 'Buy eggs', userId: 2 }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); + ]) + }) it('can pass an array', async function () { - const { app, usersService, todosService, tasksService } = mockApp(); + const { app, usersService, todosService, tasksService } = mockApp() usersService.hooks({ after: { @@ -277,45 +277,45 @@ describe('hook - onDelete', function () { ]), ], }, - }); + }) const user = await usersService.create({ name: 'John Doe', - }); + }) const todo = await todosService.create({ title: 'Buy milk', userId: user.id, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const task = await tasksService.create({ title: 'Buy milk task', userId: user.id, - }); + }) const task2 = await tasksService.create({ title: 'Buy eggs task', userId: 2, - }); + }) - await usersService.remove(user.id); + await usersService.remove(user.id) - const todos = await todosService.find({ query: {} }); - assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]); + const todos = await todosService.find({ query: {} }) + assert.deepStrictEqual(todos, [{ id: 2, title: 'Buy eggs', userId: 2 }]) - const tasks = await tasksService.find({ query: {} }); - assert.deepStrictEqual(tasks, [{ id: 2, title: 'Buy eggs task', userId: 2 }]); - }); - }); + const tasks = await tasksService.find({ query: {} }) + assert.deepStrictEqual(tasks, [{ id: 2, title: 'Buy eggs task', userId: 2 }]) + }) + }) describe('set null', function () { it('sets null single item for single item', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -329,34 +329,34 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) const user = await usersService.create({ name: 'John Doe', - }); + }) const todo = await todosService.create({ title: 'Buy milk', userId: user.id, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) - await usersService.remove(user.id); + await usersService.remove(user.id) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: null }, { id: 2, title: 'Buy eggs', userId: 2 }, - ]); - }); + ]) + }) it('sets null multiple items for single item', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -370,40 +370,40 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) const user = await usersService.create({ name: 'John Doe', - }); + }) const todo = await todosService.create({ title: 'Buy milk', userId: user.id, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: user.id, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(user.id); + await usersService.remove(user.id) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: null }, { id: 2, title: 'Buy eggs', userId: null }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); + ]) + }) it('sets null single item for multiple items', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -417,45 +417,45 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 1, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(1); + await usersService.remove(1) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) assert.deepStrictEqual(users, [ { id: 2, name: 'Jane Doe' }, { id: 3, name: 'Jack Doe' }, - ]); + ]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: null }, { id: 2, title: 'Buy eggs', userId: 2 }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); + ]) + }) it('sets null multiple items for multiple items', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -469,42 +469,42 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 1, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(null, { query: { id: { $in: [1, 2] } } }); + await usersService.remove(null, { query: { id: { $in: [1, 2] } } }) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) - assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]); + assert.deepStrictEqual(users, [{ id: 3, name: 'Jack Doe' }]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: null }, { id: 2, title: 'Buy eggs', userId: null }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); + ]) + }) it('does not set null for items if not found', async function () { - const { app, usersService, todosService } = mockApp(); + const { app, usersService, todosService } = mockApp() usersService.hooks({ after: { @@ -518,41 +518,41 @@ describe('hook - onDelete', function () { }), ], }, - }); + }) - await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]); + await usersService.create([{ name: 'John Doe' }, { name: 'Jane Doe' }, { name: 'Jack Doe' }]) const todo = await todosService.create({ title: 'Buy milk', userId: 2, - }); + }) const todo2 = await todosService.create({ title: 'Buy eggs', userId: 2, - }); + }) const todo3 = await todosService.create({ title: 'Buy bread', userId: 3, - }); + }) - await usersService.remove(1); + await usersService.remove(1) - const users = await usersService.find({ query: {} }); + const users = await usersService.find({ query: {} }) assert.deepStrictEqual(users, [ { id: 2, name: 'Jane Doe' }, { id: 3, name: 'Jack Doe' }, - ]); + ]) - const todos = await todosService.find({ query: {} }); + const todos = await todosService.find({ query: {} }) assert.deepStrictEqual(todos, [ { id: 1, title: 'Buy milk', userId: 2 }, { id: 2, title: 'Buy eggs', userId: 2 }, { id: 3, title: 'Buy bread', userId: 3 }, - ]); - }); - }); -}); + ]) + }) + }) +}) diff --git a/src/hooks/on-delete/on-delete.ts b/src/hooks/on-delete/on-delete.ts index 3a8c3c4d..d233087b 100644 --- a/src/hooks/on-delete/on-delete.ts +++ b/src/hooks/on-delete/on-delete.ts @@ -1,20 +1,20 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext, getResultIsArray } from '../../utils'; -import { KeyOf, MaybeArray } from '../../internal.utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext, getResultIsArray } from '../../utils/index.js' +import type { KeyOf, MaybeArray } from '../../internal.utils.js' -export type OnDeleteAction = 'cascade' | 'set null'; +export type OnDeleteAction = 'cascade' | 'set null' export interface OnDeleteOptions { - service: Path; - keyThere: string; - keyHere: string; - onDelete: OnDeleteAction; + service: Path + keyThere: string + keyHere: string + onDelete: OnDeleteAction /** * If true, the hook will wait for the service to finish before continuing * * @default false */ - blocking?: boolean; + blocking?: boolean } /** @@ -23,29 +23,29 @@ export interface OnDeleteOptions { export const onDelete = , H extends HookContext = HookContext>( options: MaybeArray>>, ) => { - const optionsMulti = Array.isArray(options) ? options : [options]; + const optionsMulti = Array.isArray(options) ? options : [options] return async (context: H, next?: NextFunction) => { - checkContext(context, ['after', 'around'], 'remove', 'onDelete'); + checkContext(context, ['after', 'around'], 'remove', 'onDelete') if (next) { - await next(); + await next() } - const { result } = getResultIsArray(context); + const { result } = getResultIsArray(context) if (!result.length) { - return context; + return context } - const promises: Promise[] = []; + const promises: Promise[] = [] optionsMulti.forEach(async ({ keyHere, keyThere, onDelete, service, blocking }) => { - let ids = result.map(x => x[keyHere]).filter(x => !!x); - ids = [...new Set(ids)]; + let ids = result.map(x => x[keyHere]).filter(x => !!x) + ids = [...new Set(ids)] if (!ids || ids.length <= 0) { - return context; + return context } const params = { @@ -53,26 +53,26 @@ export const onDelete = , H extends HookContext = HookCo ...(ids.length === 1 ? { [keyThere]: ids[0] } : { [keyThere]: { $in: ids } }), }, paginate: false, - }; + } - let promise: Promise | undefined = undefined; + let promise: Promise | undefined = undefined if (onDelete === 'cascade') { - promise = context.app.service(service as string).remove(null, params); + promise = context.app.service(service as string).remove(null, params) } else if (onDelete === 'set null') { - const data = { [keyThere]: null }; - promise = context.app.service(service as string).patch(null, data, params); + const data = { [keyThere]: null } + promise = context.app.service(service as string).patch(null, data, params) } - if (blocking) { - promises.push(promise); + if (promise && blocking) { + promises.push(promise) } - }); + }) if (promises.length) { - await Promise.all(promises); + await Promise.all(promises) } - return context; - }; -}; + return context + } +} diff --git a/src/hooks/params-for-server/params-for-server.test.ts b/src/hooks/params-for-server/params-for-server.test.ts index 47af45eb..4ee91366 100644 --- a/src/hooks/params-for-server/params-for-server.test.ts +++ b/src/hooks/params-for-server/params-for-server.test.ts @@ -1,5 +1,5 @@ -import { HookContext } from '@feathersjs/feathers'; -import { paramsForServer } from './params-for-server'; +import type { HookContext } from '@feathersjs/feathers' +import { paramsForServer } from './params-for-server.js' describe('paramsForServer', () => { it('should move params to query._$client', () => { @@ -20,8 +20,8 @@ describe('paramsForServer', () => { }, }, }, - }); - }); + }) + }) it('should move params to query._$client and leave remaining', () => { expect( @@ -41,6 +41,6 @@ describe('paramsForServer', () => { }, }, }, - }); - }); -}); + }) + }) +}) diff --git a/src/hooks/params-for-server/params-for-server.ts b/src/hooks/params-for-server/params-for-server.ts index 5537fe4e..62fa33d5 100644 --- a/src/hooks/params-for-server/params-for-server.ts +++ b/src/hooks/params-for-server/params-for-server.ts @@ -1,14 +1,15 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { MaybeArray, toArray } from '../../internal.utils'; +import type { HookContext } from '@feathersjs/feathers' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' -export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const; +export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const export type ParamsForServerOptions = { /** * @default '_$client' */ - keyToHide?: string; -}; + keyToHide?: string +} /** * a hook to move params to query._$client @@ -20,17 +21,17 @@ export const paramsForServer = ( whitelist: MaybeArray, options?: ParamsForServerOptions, ) => { - const whitelistArr = toArray(whitelist); + const whitelistArr = toArray(whitelist) - const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; + const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {} return (context: H) => { // clone params on demand - let clonedParams: any; + let clonedParams: any Object.keys(context.params).forEach(key => { if (key === 'query') { - return; + return } if (whitelistArr.includes(key)) { @@ -40,22 +41,22 @@ export const paramsForServer = ( query: { ...context.params.query, }, - }; + } } if (!clonedParams.query[keyToHide]) { - clonedParams.query[keyToHide] = {}; + clonedParams.query[keyToHide] = {} } - clonedParams.query[keyToHide][key] = clonedParams[key]; - delete clonedParams[key]; + clonedParams.query[keyToHide][key] = clonedParams[key] + delete clonedParams[key] } - }); + }) if (clonedParams) { - context.params = clonedParams; + context.params = clonedParams } - return context; - }; -}; + return context + } +} diff --git a/src/hooks/params-from-client/params-from-client.test.ts b/src/hooks/params-from-client/params-from-client.test.ts index 9b2d0af9..4f0a0252 100644 --- a/src/hooks/params-from-client/params-from-client.test.ts +++ b/src/hooks/params-from-client/params-from-client.test.ts @@ -1,5 +1,5 @@ -import { HookContext } from '@feathersjs/feathers'; -import { paramsFromClient } from './params-from-client'; +import type { HookContext } from '@feathersjs/feathers' +import { paramsFromClient } from './params-from-client.js' describe('paramsFromClient', () => { it('should move params to query._$client', () => { @@ -23,8 +23,8 @@ describe('paramsFromClient', () => { c: 3, }, }, - }); - }); + }) + }) it('should move params to query._$client and leave remaining', () => { expect( @@ -49,6 +49,6 @@ describe('paramsFromClient', () => { c: 3, }, }, - }); - }); -}); + }) + }) +}) diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts index fab0c5d6..fa4ab08b 100644 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -1,26 +1,27 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-server'; -import { MaybeArray, toArray } from '../../internal.utils'; +import type { HookContext } from '@feathersjs/feathers' +import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-server.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' export type paramsFromClientOptions = { /** * @default '_$client' */ - keyToHide?: string; -}; + keyToHide?: string +} export const paramsFromClient = ( whitelist: MaybeArray, options?: paramsFromClientOptions, ): ((context: HookContext) => HookContext) => { - const whitelistArr = toArray(whitelist); - const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}; + const whitelistArr = toArray(whitelist) + const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {} return (context: HookContext): HookContext => { if ( !context.params?.query?.[keyToHide] || typeof context.params.query[keyToHide] !== 'object' ) { - return context; + return context } const params = { @@ -31,23 +32,23 @@ export const paramsFromClient = ( ...context.params.query[keyToHide], }, }, - }; + } - const client = params.query[keyToHide]; + const client = params.query[keyToHide] whitelistArr.forEach(key => { if (key in client) { - params[key] = client[key]; - delete client[key]; + params[key] = client[key] + delete client[key] } - }); + }) if (Object.keys(client).length === 0) { - delete params.query[keyToHide]; + delete params.query[keyToHide] } - context.params = params; + context.params = params - return context; - }; -}; + return context + } +} diff --git a/src/hooks/pick/pick-data.test.ts b/src/hooks/pick/pick-data.test.ts index 5a73908a..5757f491 100755 --- a/src/hooks/pick/pick-data.test.ts +++ b/src/hooks/pick/pick-data.test.ts @@ -1,7 +1,7 @@ -import { assert } from 'vitest'; -import { pickData } from './pick-data'; +import { assert } from 'vitest' +import { pickData } from './pick-data.js' -let hookBefore: any; +let hookBefore: any describe('pickData', () => { describe('removes fields', () => { @@ -11,8 +11,8 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; - }); + } + }) it('does not throw if field is missing', () => { const hook: any = { @@ -20,10 +20,10 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; - pickData('last', 'xx')(hook); - assert.deepEqual(hook.data, { last: 'Doe' }); - }); + } + pickData(['last', 'xx'])(hook) + assert.deepEqual(hook.data, { last: 'Doe' }) + }) it('keeps undefined values', () => { const hook: any = { @@ -31,10 +31,10 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: undefined, last: 'Doe' }, - }; - pickData('first')(hook); - assert.deepEqual(hook.data, { first: undefined }); - }); + } + pickData('first')(hook) + assert.deepEqual(hook.data, { first: undefined }) + }) it('keeps null values', () => { const hook: any = { @@ -42,10 +42,10 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: null, last: 'Doe' }, - }; - pickData('first')(hook); - assert.deepEqual(hook.data, { first: null }); - }); + } + pickData('first')(hook) + assert.deepEqual(hook.data, { first: null }) + }) it('keeps false values', () => { const hook: any = { @@ -53,10 +53,10 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: false, last: 'Doe' }, - }; - pickData('first')(hook); - assert.deepEqual(hook.data, { first: false }); - }); + } + pickData('first')(hook) + assert.deepEqual(hook.data, { first: false }) + }) it('keeps 0 values', () => { const hook: any = { @@ -64,10 +64,10 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: 0, last: 'Doe' }, - }; - pickData('first')(hook); - assert.deepEqual(hook.data, { first: 0 }); - }); + } + pickData('first')(hook) + assert.deepEqual(hook.data, { first: 0 }) + }) it('keeps empty string values', () => { const hook: any = { @@ -75,11 +75,11 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { first: '', last: 'Doe' }, - }; - pickData('first')(hook); - assert.deepEqual(hook.data, { first: '' }); - }); - }); + } + pickData('first')(hook) + assert.deepEqual(hook.data, { first: '' }) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -88,42 +88,42 @@ describe('pickData', () => { method: 'create', params: { provider: 'rest' }, data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; - }); + } + }) it('prop with no dots', () => { - pickData('empl')(hookBefore); + pickData('empl')(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); + }) + }) it('prop with 1 dot', () => { - pickData('empl.name', 'dept')(hookBefore); + pickData(['empl.name', 'dept'])(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', - }); - }); + }) + }) it('prop with 2 dots', () => { - pickData('empl.name.last', 'empl.status', 'dept')(hookBefore); + pickData(['empl.name.last', 'empl.status', 'dept'])(hookBefore) assert.deepEqual(hookBefore.data, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing paths', () => { - pickData('empl.name.first', 'empl.name.surname')(hookBefore); - assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John' } } }); - }); + pickData(['empl.name.first', 'empl.name.surname'])(hookBefore) + assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John' } } }) + }) it('ignores bad or missing no dot path', () => { - pickData('xx')(hookBefore); - assert.deepEqual(hookBefore.data, {}); - }); - }); + pickData('xx')(hookBefore) + assert.deepEqual(hookBefore.data, {}) + }) + }) describe('ignore non-object records', () => { beforeEach(() => { @@ -137,17 +137,17 @@ describe('pickData', () => { undefined, Infinity, ], - }; - }); + } + }) it('before', () => { - pickData('empl')(hookBefore); + pickData('empl')(hookBefore) assert.deepEqual(hookBefore.data, [ { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' } }, null, undefined, Infinity, - ]); - }); - }); -}); + ]) + }) + }) +}) diff --git a/src/hooks/pick/pick-data.ts b/src/hooks/pick/pick-data.ts index 7aa676a7..53b9d112 100755 --- a/src/hooks/pick/pick-data.ts +++ b/src/hooks/pick/pick-data.ts @@ -1,16 +1,17 @@ -import _pick from 'lodash/pick.js'; -import { alterData } from '../alter-items/alter-data'; -import { MaybeArray, toArray } from '../../internal.utils'; +import _pick from 'lodash/pick.js' +import { transformData } from '../transform/transform-data.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep */ export const pickData = (fieldNames: MaybeArray) => { - const fieldNamesArr = toArray(fieldNames); - return alterData((item: any) => { - if (typeof item !== 'object' || item === null) return item; + const fieldNamesArr = toArray(fieldNames) + return transformData((item: any) => { + if (typeof item !== 'object' || item === null) return item - return _pick(item, fieldNamesArr); - }); -}; + return _pick(item, fieldNamesArr) + }) +} diff --git a/src/hooks/pick-query/pick-query.test.ts b/src/hooks/pick/pick-query.test.ts similarity index 65% rename from src/hooks/pick-query/pick-query.test.ts rename to src/hooks/pick/pick-query.test.ts index 9b2c20c8..b92ec5f9 100755 --- a/src/hooks/pick-query/pick-query.test.ts +++ b/src/hooks/pick/pick-query.test.ts @@ -1,8 +1,8 @@ -import { assert } from 'vitest'; -import { pickQuery } from './pick-query'; +import { assert } from 'vitest' +import { pickQuery } from './pick-query.js' -let hookBefore: any; -let hookAfter: any; +let hookBefore: any +let hookAfter: any describe('pickQuery', () => { describe('updates query', () => { @@ -11,31 +11,31 @@ describe('pickQuery', () => { type: 'before', method: 'create', params: { query: { first: 'John', last: 'Doe' } }, - }; - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; - }); + } + hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } } + }) it('updates hook before::create', () => { - pickQuery('first', 'last')(hookBefore); - assert.deepEqual(hookBefore.params, { query: { first: 'John', last: 'Doe' } }); - }); + pickQuery(['first', 'last'])(hookBefore) + assert.deepEqual(hookBefore.params, { query: { first: 'John', last: 'Doe' } }) + }) it('updates hook before::create', () => { - pickQuery('first')(hookBefore); - assert.deepEqual(hookBefore.params, { query: { first: 'John' } }); - }); + pickQuery('first')(hookBefore) + assert.deepEqual(hookBefore.params, { query: { first: 'John' } }) + }) it('throws on hook after', () => { assert.throws(() => { - pickQuery('last')(hookAfter); - }); - }); + pickQuery('last')(hookAfter) + }) + }) it('does not throw if field is missing', () => { - pickQuery('x', 'last')(hookBefore); - assert.deepEqual(hookBefore.params.query, { last: 'Doe' }); - }); - }); + pickQuery(['x', 'last'])(hookBefore) + assert.deepEqual(hookBefore.params.query, { last: 'Doe' }) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -50,42 +50,42 @@ describe('pickQuery', () => { 'owner.admin': false, }, }, - }; - }); + } + }) it('prop with no dots', () => { - pickQuery('empl')(hookBefore); + pickQuery('empl')(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, - }); - }); + }) + }) it('prop with 1 dot', () => { - pickQuery('empl.name', 'dept', 'owner.id', 'owner.admin')(hookBefore); + pickQuery(['empl.name', 'dept', 'owner.id', 'owner.admin'])(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { first: 'John', last: 'Doe' } }, dept: 'Acct', 'owner.id': 1, 'owner.admin': false, - }); - }); + }) + }) it('prop with 2 dots', () => { - pickQuery('empl.name.last', 'empl.status', 'dept')(hookBefore); + pickQuery(['empl.name.last', 'empl.status', 'dept'])(hookBefore) assert.deepEqual(hookBefore.params.query, { empl: { name: { last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('ignores bad or missing paths', () => { - pickQuery('empl.xx.first')(hookBefore); - assert.deepEqual(hookBefore.params.query, {}); - }); + pickQuery('empl.xx.first')(hookBefore) + assert.deepEqual(hookBefore.params.query, {}) + }) it('ignores bad or missing no dot path', () => { - pickQuery('xx')(hookBefore); - assert.deepEqual(hookBefore.params.query, {}); - }); - }); -}); + pickQuery('xx')(hookBefore) + assert.deepEqual(hookBefore.params.query, {}) + }) + }) +}) diff --git a/src/hooks/pick-query/pick-query.ts b/src/hooks/pick/pick-query.ts similarity index 60% rename from src/hooks/pick-query/pick-query.ts rename to src/hooks/pick/pick-query.ts index b0d07900..fec27ba9 100755 --- a/src/hooks/pick-query/pick-query.ts +++ b/src/hooks/pick/pick-query.ts @@ -1,22 +1,23 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import _pick from 'lodash/pick'; -import { MaybeArray, toArray } from '../../internal.utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import _pick from 'lodash/pick.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' /** * Keep certain fields in the query object, deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keepquery */ export const pickQuery = (fieldNames: MaybeArray) => { - const fieldNamesArr = toArray(fieldNames); + const fieldNamesArr = toArray(fieldNames) return (context: H, next?: NextFunction) => { if (!context.params.query) { - return context; + return context } - context.params.query = _pick(context.params.query, fieldNamesArr); + context.params.query = _pick(context.params.query, fieldNamesArr) - if (next) return next().then(() => context); + if (next) return next().then(() => context) - return context; - }; -}; + return context + } +} diff --git a/src/hooks/pick/pick-result.test.ts b/src/hooks/pick/pick-result.test.ts index 5ca098e2..3ea24504 100755 --- a/src/hooks/pick/pick-result.test.ts +++ b/src/hooks/pick/pick-result.test.ts @@ -1,9 +1,9 @@ -import { assert } from 'vitest'; -import { pickResult } from './pick-result'; +import { assert } from 'vitest' +import { pickResult } from './pick-result.js' -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; +let hookAfter: any +let hookFindPaginate: any +let hookFind: any describe('pickResult', () => { describe('removes fields', () => { @@ -13,7 +13,7 @@ describe('pickResult', () => { method: 'create', params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, - }; + } hookFindPaginate = { type: 'after', method: 'find', @@ -25,7 +25,7 @@ describe('pickResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }; + } hookFind = { type: 'after', method: 'find', @@ -34,30 +34,30 @@ describe('pickResult', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) it('updates hook after::find with pagination', () => { - pickResult('first')(hookFindPaginate); - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + pickResult('first')(hookFindPaginate) + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with no pagination', () => { - pickResult('first')(hookFind); - assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]); - }); + pickResult('first')(hookFind) + assert.deepEqual(hookFind.result, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after', () => { - pickResult('first')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); + pickResult('first')(hookAfter) + assert.deepEqual(hookAfter.result, { first: 'Jane' }) + }) it('updates when called internally on server', () => { - hookAfter.params.provider = ''; - pickResult('first')(hookAfter); - assert.deepEqual(hookAfter.result, { first: 'Jane' }); - }); - }); + hookAfter.params.provider = '' + pickResult('first')(hookAfter) + assert.deepEqual(hookAfter.result, { first: 'Jane' }) + }) + }) describe('ignore non-object records', () => { beforeEach(() => { @@ -66,12 +66,12 @@ describe('pickResult', () => { method: 'create', params: { provider: 'rest' }, result: [{ first: 'Jane', last: 'Doe' }, null, undefined, Infinity], - }; - }); + } + }) it('after', () => { - pickResult('first')(hookAfter); - assert.deepEqual(hookAfter.result, [{ first: 'Jane' }, null, undefined, Infinity]); - }); - }); -}); + pickResult('first')(hookAfter) + assert.deepEqual(hookAfter.result, [{ first: 'Jane' }, null, undefined, Infinity]) + }) + }) +}) diff --git a/src/hooks/pick/pick-result.ts b/src/hooks/pick/pick-result.ts index 0a8152bb..58e77a90 100755 --- a/src/hooks/pick/pick-result.ts +++ b/src/hooks/pick/pick-result.ts @@ -1,25 +1,26 @@ -import _pick from 'lodash/pick.js'; +import _pick from 'lodash/pick.js' -import { alterResult } from '../alter-items/alter-result'; -import { DispatchOption } from '../../types'; -import { MaybeArray, toArray } from '../../internal.utils'; +import { transformResult } from '../transform/transform-result.js' +import type { DispatchOption } from '../../types.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' export type PickResultOptions = { - dispatch?: DispatchOption; -}; + dispatch?: DispatchOption +} /** * Keep certain fields in the record(s), deleting the rest. * @see https://hooks-common.feathersjs.com/hooks.html#keep */ export const pickResult = (fieldNames: MaybeArray, options?: PickResultOptions) => { - const fieldNamesArr = toArray(fieldNames); - alterResult( + const fieldNamesArr = toArray(fieldNames) + return transformResult( (item: any) => { - if (typeof item !== 'object' || item === null) return item; + if (typeof item !== 'object' || item === null) return item - return _pick(item, fieldNamesArr); + return _pick(item, fieldNamesArr) }, { dispatch: options?.dispatch }, - ); -}; + ) +} diff --git a/src/hooks/prevent-changes/prevent-changes.test.ts b/src/hooks/prevent-changes/prevent-changes.test.ts index bd7a2256..8491060a 100755 --- a/src/hooks/prevent-changes/prevent-changes.test.ts +++ b/src/hooks/prevent-changes/prevent-changes.test.ts @@ -1,8 +1,8 @@ -import { assert } from 'vitest'; -import { preventChanges } from './prevent-changes'; -import { clone } from '../../common'; +import { assert } from 'vitest' +import { preventChanges } from './prevent-changes.js' +import { clone } from '../../common/index.js' -let hookBefore: any; +let hookBefore: any describe('preventChanges', () => { describe('throws if first param is "true"', () => { @@ -12,22 +12,22 @@ describe('preventChanges', () => { method: 'patch', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe', a: { b: undefined, c: { d: { e: 1 } } } }, - }; - }); + } + }) it('does not throw if props not found', () => { - preventChanges(true, 'name', 'address')(hookBefore); - preventChanges(true, 'name.x', 'x.y.z')(hookBefore); - }); + preventChanges(['name', 'address'], { error: true })(hookBefore) + preventChanges(['name.x', 'x.y.z'], { error: true })(hookBefore) + }) it('throw if props found', () => { - assert.throw(() => preventChanges(true, 'name', 'first')(hookBefore)); - assert.throw(() => preventChanges(true, 'name', 'a')(hookBefore)); - assert.throw(() => preventChanges(true, 'name', 'a.b')(hookBefore)); - assert.throw(() => preventChanges(true, 'name', 'a.c')(hookBefore)); - assert.throw(() => preventChanges(true, 'name', 'a.c.d.e')(hookBefore)); - }); - }); + assert.throw(() => preventChanges(['name', 'first'], { error: true })(hookBefore)) + assert.throw(() => preventChanges(['name', 'a'], { error: true })(hookBefore)) + assert.throw(() => preventChanges(['name', 'a.b'], { error: true })(hookBefore)) + assert.throw(() => preventChanges(['name', 'a.c'], { error: true })(hookBefore)) + assert.throw(() => preventChanges(['name', 'a.c.d.e'], { error: true })(hookBefore)) + }) + }) describe('deletes if first param is "false"', () => { beforeEach(() => { @@ -36,46 +36,42 @@ describe('preventChanges', () => { method: 'patch', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe', a: { b: 'john', c: { d: { e: 1 } } } }, - }; - }); + } + }) it('does not delete if props not found', () => { - let context: any = preventChanges(false, 'name', 'address')(clone(hookBefore)); - assert.deepEqual(context, hookBefore); + let context: any = preventChanges(['name', 'address'], { error: false })(clone(hookBefore)) + assert.deepEqual(context, hookBefore) - context = preventChanges(false, 'name.x', 'x.y.z')(clone(hookBefore)); - assert.deepEqual(context, hookBefore); - }); + context = preventChanges(['name.x', 'x.y.z'], { error: false })(clone(hookBefore)) + assert.deepEqual(context, hookBefore) + }) it('deletes if props found', () => { - let context: any = preventChanges(false, 'name', 'first')(clone(hookBefore)); - assert.deepEqual(context.data, { last: 'Doe', a: { b: 'john', c: { d: { e: 1 } } } }, '1'); + let context: any = preventChanges(['name', 'first'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { last: 'Doe', a: { b: 'john', c: { d: { e: 1 } } } }, '1') - context = preventChanges(false, 'name', 'a')(clone(hookBefore)); - assert.deepEqual(context.data, { first: 'John', last: 'Doe' }, '2'); + context = preventChanges(['name', 'a'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { first: 'John', last: 'Doe' }, '2') - context = preventChanges(false, 'name', 'a.b')(clone(hookBefore)); - assert.deepEqual( - context.data, - { first: 'John', last: 'Doe', a: { c: { d: { e: 1 } } } }, - '3', - ); + context = preventChanges(['name', 'a.b'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { first: 'John', last: 'Doe', a: { c: { d: { e: 1 } } } }, '3') - context = preventChanges(false, 'name', 'a.c')(clone(hookBefore)); - assert.deepEqual(context.data, { first: 'John', last: 'Doe', a: { b: 'john' } }, '4'); + context = preventChanges(['name', 'a.c'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { first: 'John', last: 'Doe', a: { b: 'john' } }, '4') - context = preventChanges(false, 'name', 'a.c.d.e')(clone(hookBefore)); + context = preventChanges(['name', 'a.c.d.e'], { error: false })(clone(hookBefore)) assert.deepEqual( context.data, { first: 'John', last: 'Doe', a: { b: 'john', c: { d: {} } } }, '5', - ); + ) - context = preventChanges(false, 'first', 'last')(clone(hookBefore)); - assert.deepEqual(context.data, { a: { b: 'john', c: { d: { e: 1 } } } }); + context = preventChanges(['first', 'last'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { a: { b: 'john', c: { d: { e: 1 } } } }) - context = preventChanges(false, 'first', 'a.b', 'a.c.d.e')(clone(hookBefore)); - assert.deepEqual(context.data, { last: 'Doe', a: { c: { d: {} } } }); - }); - }); -}); + context = preventChanges(['first', 'a.b', 'a.c.d.e'], { error: false })(clone(hookBefore)) + assert.deepEqual(context.data, { last: 'Doe', a: { c: { d: {} } } }) + }) + }) +}) diff --git a/src/hooks/prevent-changes/prevent-changes.ts b/src/hooks/prevent-changes/prevent-changes.ts index e383a49b..c45ae02f 100755 --- a/src/hooks/prevent-changes/prevent-changes.ts +++ b/src/hooks/prevent-changes/prevent-changes.ts @@ -1,38 +1,40 @@ -import _has from 'lodash/has.js'; -import _omit from 'lodash/omit.js'; -import { BadRequest, FeathersError } from '@feathersjs/errors'; -import { alterData } from '../alter-items/alter-data'; -import { MaybeArray, toArray } from '../../internal.utils'; +import _has from 'lodash/has.js' +import _omit from 'lodash/omit.js' +import type { FeathersError } from '@feathersjs/errors' +import { BadRequest } from '@feathersjs/errors' +import { transformData } from '../transform/transform-data.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' export type PreventChangesOptions = { - error?: boolean | ((item: any, name: string) => FeathersError); -}; + error?: boolean | ((item: any, name: string) => FeathersError) +} /** * Prevent patch service calls from changing certain fields. * @see https://hooks-common.feathersjs.com/hooks.html#preventchanges */ export const preventChanges = (fieldNames: MaybeArray, options?: PreventChangesOptions) => { - const fieldNamesArr = toArray(fieldNames); + const fieldNamesArr = toArray(fieldNames) - return alterData(item => { + return transformData(item => { if (options?.error) { for (let i = 0; i < fieldNamesArr.length; i++) { - const name = fieldNamesArr[i]; + const name = fieldNamesArr[i] if (_has(item, name)) { const error = typeof options.error === 'function' ? options.error(item, name) - : new BadRequest(`Field ${name} may not be patched. (preventChanges)`); + : new BadRequest(`Field ${name} may not be patched. (preventChanges)`) - throw error; + throw error } } - item = _omit(item, fieldNamesArr); + item = _omit(item, fieldNamesArr) } - return item; - }); -}; + return item + }) +} diff --git a/src/hooks/run-parallel/run-parallel.test.ts b/src/hooks/run-parallel/run-parallel.test.ts index ffb24a43..a4640838 100755 --- a/src/hooks/run-parallel/run-parallel.test.ts +++ b/src/hooks/run-parallel/run-parallel.test.ts @@ -1,74 +1,74 @@ -import { assert } from 'vitest'; -import { runParallel } from './run-parallel'; +import { assert } from 'vitest' +import { runParallel } from './run-parallel.js' -let contextBefore: any; -let that: any; +let contextBefore: any +let that: any function test(tester: any) { return function (this: any, contextCloned: any) { // eslint-disable-next-line @typescript-eslint/no-this-alias - that = this; - tester(contextCloned); - }; + that = this + tester(contextCloned) + } } describe('services runParallel', () => { beforeEach(() => { - that = undefined; + that = undefined contextBefore = { type: 'before', method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; - }); + } + }) it('runs the func', () => new Promise(resolve => { - runParallel(test(tester))(contextBefore); + runParallel(test(tester))(contextBefore) function tester() { - resolve(); + resolve() } - })); + })) it('passes this', () => new Promise(resolve => { - runParallel(test(tester)).call({ bar: true }, contextBefore); + runParallel(test(tester)).call({ bar: true }, contextBefore) function tester() { - assert.strictEqual(that.bar, true); - resolve(); + assert.strictEqual(that.bar, true) + resolve() } - })); + })) it('defaults to uncloned context', () => new Promise(resolve => { - runParallel(test(tester))(contextBefore); - contextBefore._foo = true; + runParallel(test(tester))(contextBefore) + contextBefore._foo = true function tester(contextCloned: any) { - assert.property(contextCloned, '_foo'); - resolve(); + assert.property(contextCloned, '_foo') + resolve() } - })); + })) it('clones', () => new Promise(resolve => { - runParallel(test(tester), structuredClone)(contextBefore); - contextBefore._foo = true; + runParallel(test(tester), structuredClone)(contextBefore) + contextBefore._foo = true function tester(contextCloned: any) { - assert.notProperty(contextCloned, '_foo'); - resolve(); + assert.notProperty(contextCloned, '_foo') + resolve() } - })); + })) it('Throws if no func', () => { assert.throws(() => { - // @ts-expect-error - runParallel()(contextBefore); - }); - }); -}); + // @ts-expect-error TODO + runParallel()(contextBefore) + }) + }) +}) diff --git a/src/hooks/run-parallel/run-parallel.ts b/src/hooks/run-parallel/run-parallel.ts index b31ec4e9..ca703f74 100755 --- a/src/hooks/run-parallel/run-parallel.ts +++ b/src/hooks/run-parallel/run-parallel.ts @@ -1,6 +1,6 @@ -import { BadRequest } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../../types'; +import { BadRequest } from '@feathersjs/errors' +import type { HookContext } from '@feathersjs/feathers' +import type { HookFunction } from '../../types.js' /** * Run a hook in parallel to the other hooks and the service call. @@ -12,13 +12,13 @@ export function runParallel( clone?: (item: H) => H, ) { if (typeof hook !== 'function') { - throw new BadRequest('Function not provided. (runParallel)'); + throw new BadRequest('Function not provided. (runParallel)') } return function (this: any, context: H) { // must use function - const copy = clone ? clone(context) : context; + const copy = clone ? clone(context) : context - setTimeout(() => hook.call(this, copy as any)); - }; + setTimeout(() => hook.call(this, copy as any)) + } } diff --git a/src/hooks/set-field/set-field.test.ts b/src/hooks/set-field/set-field.test.ts index 02e0c6ff..e1a42d7e 100644 --- a/src/hooks/set-field/set-field.test.ts +++ b/src/hooks/set-field/set-field.test.ts @@ -1,21 +1,21 @@ -import { assert, expect } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { setField } from './set-field'; +import { assert, expect } from 'vitest' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { setField } from './set-field.js' -import type { Application } from '@feathersjs/feathers'; +import type { Application } from '@feathersjs/feathers' describe('setField', () => { const user = { id: 1, name: 'David', - }; + } - let app: Application; + let app: Application beforeEach(async () => { - app = feathers(); - app.use('/messages', new MemoryService()); + app = feathers() + app.use('/messages', new MemoryService()) app.service('messages').hooks({ before: { all: [ @@ -25,57 +25,57 @@ describe('setField', () => { }), ], }, - }); + }) await app.service('messages').create({ id: 1, text: 'Message 1', userId: 1, - }); + }) await app.service('messages').create({ id: 2, text: 'Message 2', userId: 2, - }); - }); + }) + }) it('find queries with user information, does not modify original objects', async () => { - const query = {}; - // @ts-ignore - const results = await app.service('messages').find({ query, user }); + const query = {} + // @ts-expect-error TODO + const results = await app.service('messages').find({ query, user }) - assert.equal(results.length, 1); - assert.deepEqual(query, {}); - }); + assert.equal(results.length, 1) + assert.deepEqual(query, {}) + }) it('adds user information to get, throws NotFound event if record exists', async () => { await expect(async () => { - // @ts-ignore - await app.service('messages').get(2, { user }); - }).rejects.toThrow(); + // @ts-expect-error TODO + await app.service('messages').get(2, { user }) + }).rejects.toThrow() - // @ts-ignore - const result = await app.service('messages').get(1, { user }); + // @ts-expect-error TODO + const result = await app.service('messages').get(1, { user }) assert.deepEqual(result, { id: 1, text: 'Message 1', userId: 1, - } as any); - }); + } as any) + }) it('does nothing on internal calls if value does not exists', async () => { - const results = await app.service('messages').find(); + const results = await app.service('messages').find() - assert.equal(results.length, 2); - }); + assert.equal(results.length, 2) + }) it('errors on external calls if value does not exists', async () => { await expect(async () => { await app.service('messages').find({ provider: 'rest', - }); - }).rejects.toThrow(); - }); + }) + }).rejects.toThrow() + }) it('errors when not used as a before hook', async () => { app.service('messages').hooks({ @@ -85,10 +85,10 @@ describe('setField', () => { as: 'params.query.userId', }), }, - }); + }) await expect(async () => { - await app.service('messages').get(1); - }).rejects.toThrow(); - }); -}); + await app.service('messages').get(1) + }).rejects.toThrow() + }) +}) diff --git a/src/hooks/set-field/set-field.ts b/src/hooks/set-field/set-field.ts index e889af82..67195f14 100644 --- a/src/hooks/set-field/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -1,14 +1,14 @@ -import _get from 'lodash/get.js'; -import _setWith from 'lodash/setWith.js'; -import _clone from 'lodash/clone.js'; -import { checkContext } from '../../utils'; -import { Forbidden } from '@feathersjs/errors'; -import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import _get from 'lodash/get.js' +import _setWith from 'lodash/setWith.js' +import _clone from 'lodash/clone.js' +import { checkContext } from '../../utils/index.js' +import { Forbidden } from '@feathersjs/errors' +import type { HookContext, NextFunction } from '@feathersjs/feathers' export interface SetFieldOptions { - as: string; - from: string; - allowUndefined?: boolean; + as: string + from: string + allowUndefined?: boolean } /** @@ -18,23 +18,23 @@ export interface SetFieldOptions { export const setField = ({ as, from, allowUndefined = false }: SetFieldOptions) => (context: H, next?: NextFunction) => { - const { params } = context; + const { params } = context - checkContext(context, ['before', 'around'], null, 'setField'); + checkContext(context, ['before', 'around'], null, 'setField') - const value = _get(context, from); + const value = _get(context, from) if (value === undefined) { if (!params.provider || allowUndefined) { - return context; + return context } - throw new Forbidden(`Expected field ${as} not available`); + throw new Forbidden(`Expected field ${as} not available`) } - context = _setWith(context, as, value, _clone); + context = _setWith(context, as, value, _clone) - if (next) return next().then(() => context); + if (next) return next().then(() => context) - return context; - }; + return context + } diff --git a/src/hooks/set-now/set-now-data.test.ts b/src/hooks/set-now/set-now-data.test.ts index b576edf0..1ebd9f92 100755 --- a/src/hooks/set-now/set-now-data.test.ts +++ b/src/hooks/set-now/set-now-data.test.ts @@ -1,30 +1,30 @@ -import { assert } from 'vitest'; -import { setNowData } from './set-now-data'; +import { assert } from 'vitest' +import { setNowData } from './set-now-data.js' -let hookBefore: any; -let hookBefore2: any; +let hookBefore: any +let hookBefore2: any describe('setNowData', () => { describe('updated fields', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + }) it('updates hook before::create', () => { - setNowData('createdAt')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt'); - }); + setNowData('createdAt')(hookBefore) + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt') + }) it('supports field name', () => { - setNowData('createdAt2')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt2'); - }); + setNowData('createdAt2')(hookBefore) + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, 'createdAt2') + }) it('supports multiple field names', () => { - setNowData('createdAt1', 'createdAt2')(hookBefore); - checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, ['createdAt1', 'createdAt2']); - }); - }); + setNowData('createdAt1', 'createdAt2')(hookBefore) + checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, ['createdAt1', 'createdAt2']) + }) + }) describe('handles dot notation', () => { beforeEach(() => { @@ -32,7 +32,7 @@ describe('setNowData', () => { type: 'before', method: 'create', data: { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, - }; + } hookBefore2 = { type: 'before', method: 'create', @@ -41,95 +41,95 @@ describe('setNowData', () => { dept: 'Acct', created: { where: 'NYC' }, }, - }; - }); + } + }) it('prop with no dots', () => { - setNowData('madeAt')(hookBefore); + setNowData('madeAt')(hookBefore) checkHook( hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, 'madeAt', - ); - }); + ) + }) it('props with no dots', () => { - setNowData('madeAt', 'builtAt')(hookBefore); + setNowData('madeAt', 'builtAt')(hookBefore) checkHook( hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, ['madeAt', 'builtAt'], - ); - }); + ) + }) it('prop with 1 dot', () => { - setNowData('created.at')(hookBefore); - assert.instanceOf(hookBefore.data.created.at, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore.data.created).length, 1); - delete hookBefore.data.created; + setNowData('created.at')(hookBefore) + assert.instanceOf(hookBefore.data.created.at, Date, 'not instance of Date') + assert.equal(Object.keys(hookBefore.data.created).length, 1) + delete hookBefore.data.created assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); + }) + }) it('prop with 1 dot in existing obj', () => { - setNowData('created.at')(hookBefore2); - assert.instanceOf(hookBefore2.data.created.at, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore2.data.created).length, 2); - delete hookBefore2.data.created.at; + setNowData('created.at')(hookBefore2) + assert.instanceOf(hookBefore2.data.created.at, Date, 'not instance of Date') + assert.equal(Object.keys(hookBefore2.data.created).length, 2) + delete hookBefore2.data.created.at assert.deepEqual(hookBefore2.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', created: { where: 'NYC' }, - }); - }); + }) + }) it('prop with 2 dots', () => { - setNowData('created.at.time')(hookBefore); - assert.instanceOf(hookBefore.data.created.at.time, Date, 'not instance of Date'); - assert.equal(Object.keys(hookBefore.data.created.at).length, 1); - assert.equal(Object.keys(hookBefore.data.created).length, 1); - delete hookBefore.data.created; + setNowData('created.at.time')(hookBefore) + assert.instanceOf(hookBefore.data.created.at.time, Date, 'not instance of Date') + assert.equal(Object.keys(hookBefore.data.created.at).length, 1) + assert.equal(Object.keys(hookBefore.data.created).length, 1) + delete hookBefore.data.created assert.deepEqual(hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct', - }); - }); - }); + }) + }) + }) describe('time advances', () => { beforeEach(() => { - hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } }; - }); + hookBefore = { type: 'before', method: 'create', data: { first: 'John', last: 'Doe' } } + }) it('for 2 hooks', () => new Promise(resolve => { - setNowData('createdAt')(hookBefore); - const firstTime = hookBefore.data.createdAt; + setNowData('createdAt')(hookBefore) + const firstTime = hookBefore.data.createdAt setTimeout(() => { - setNowData('createdAt')(hookBefore); - assert.isAbove(hookBefore.data.createdAt.getTime(), firstTime.getTime()); - resolve(); - }, 50); - })); - }); -}); + setNowData('createdAt')(hookBefore) + assert.isAbove(hookBefore.data.createdAt.getTime(), firstTime.getTime()) + resolve() + }, 50) + })) + }) +}) // Helpers function checkHook(item: any, template: any, dateFields: any) { - const item1 = structuredClone(item); + const item1 = structuredClone(item) if (typeof dateFields === 'string') { - dateFields = [dateFields]; + dateFields = [dateFields] } dateFields.forEach((dateField: any) => { - assert.instanceOf(item[dateField], Date, 'not instance of Date'); - item1[dateField] = undefined; - delete item1[dateField]; - }); + assert.instanceOf(item[dateField], Date, 'not instance of Date') + item1[dateField] = undefined + delete item1[dateField] + }) - assert.deepEqual(item1, template, 'objects differ'); + assert.deepEqual(item1, template, 'objects differ') } diff --git a/src/hooks/set-now/set-now-data.ts b/src/hooks/set-now/set-now-data.ts index 2a3db3db..d2a7239a 100755 --- a/src/hooks/set-now/set-now-data.ts +++ b/src/hooks/set-now/set-now-data.ts @@ -1,5 +1,5 @@ -import { alterData } from '../alter-items/alter-data'; -import _set from 'lodash/set.js'; +import { transformData } from '../transform/transform-data.js' +import _set from 'lodash/set.js' /** * Create/update certain fields to the current date-time. @@ -7,10 +7,10 @@ import _set from 'lodash/set.js'; * @see https://hooks-common.feathersjs.com/hooks.html#setnow */ export const setNowData = (...fieldNames: string[]) => - alterData(data => { + transformData(data => { for (let i = 0; i < fieldNames.length; i++) { - const key = fieldNames[i]; + const key = fieldNames[i] - _set(data, key, new Date()); + _set(data, key, new Date()) } - }); + }) diff --git a/src/hooks/set-now/set-now-result.test.ts b/src/hooks/set-now/set-now-result.test.ts index bb2801be..3dec829a 100755 --- a/src/hooks/set-now/set-now-result.test.ts +++ b/src/hooks/set-now/set-now-result.test.ts @@ -1,14 +1,14 @@ -import { assert } from 'vitest'; -import { setNowResult } from './set-now-result'; +import { assert } from 'vitest' +import { setNowResult } from './set-now-result.js' -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; +let hookAfter: any +let hookFindPaginate: any +let hookFind: any describe('setNowResult', () => { describe('updated fields', () => { beforeEach(() => { - hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } }; + hookAfter = { type: 'after', method: 'create', result: { first: 'Jane', last: 'Doe' } } hookFindPaginate = { type: 'after', method: 'find', @@ -19,7 +19,7 @@ describe('setNowResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }; + } hookFind = { type: 'after', method: 'find', @@ -27,42 +27,42 @@ describe('setNowResult', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) it('updates hook after::find with pagination', () => { - setNowResult('createdAt')(hookFindPaginate); + setNowResult('createdAt')(hookFindPaginate) - checkHook(hookFindPaginate.result.data[0], { first: 'John', last: 'Doe' }, 'createdAt'); - checkHook(hookFindPaginate.result.data[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); + checkHook(hookFindPaginate.result.data[0], { first: 'John', last: 'Doe' }, 'createdAt') + checkHook(hookFindPaginate.result.data[1], { first: 'Jane', last: 'Doe' }, 'createdAt') + }) it('updates hook after::find with no pagination', () => { - setNowResult('createdAt')(hookFind); - checkHook(hookFind.result[0], { first: 'John', last: 'Doe' }, 'createdAt'); - checkHook(hookFind.result[1], { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); + setNowResult('createdAt')(hookFind) + checkHook(hookFind.result[0], { first: 'John', last: 'Doe' }, 'createdAt') + checkHook(hookFind.result[1], { first: 'Jane', last: 'Doe' }, 'createdAt') + }) it('updates hook after', () => { - setNowResult('createdAt')(hookAfter); - checkHook(hookAfter.result, { first: 'Jane', last: 'Doe' }, 'createdAt'); - }); - }); -}); + setNowResult('createdAt')(hookAfter) + checkHook(hookAfter.result, { first: 'Jane', last: 'Doe' }, 'createdAt') + }) + }) +}) // Helpers function checkHook(item: any, template: any, dateFields: any) { - const item1 = structuredClone(item); + const item1 = structuredClone(item) if (typeof dateFields === 'string') { - dateFields = [dateFields]; + dateFields = [dateFields] } dateFields.forEach((dateField: any) => { - assert.instanceOf(item[dateField], Date, 'not instance of Date'); - item1[dateField] = undefined; - delete item1[dateField]; - }); + assert.instanceOf(item[dateField], Date, 'not instance of Date') + item1[dateField] = undefined + delete item1[dateField] + }) - assert.deepEqual(item1, template, 'objects differ'); + assert.deepEqual(item1, template, 'objects differ') } diff --git a/src/hooks/set-now/set-now-result.ts b/src/hooks/set-now/set-now-result.ts index 08a66a7a..7c2f16c6 100755 --- a/src/hooks/set-now/set-now-result.ts +++ b/src/hooks/set-now/set-now-result.ts @@ -1,11 +1,12 @@ -import _set from 'lodash/set.js'; -import { alterResult } from '../alter-items/alter-result'; -import { MaybeArray, toArray } from '../../internal.utils'; -import { DispatchOption } from '../../types'; +import _set from 'lodash/set.js' +import { transformResult } from '../transform/transform-result.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' +import type { DispatchOption } from '../../types.js' type SetNowResultOptions = { - dispatch?: DispatchOption; -}; + dispatch?: DispatchOption +} /** * Create/update certain fields to the current date-time. @@ -13,16 +14,16 @@ type SetNowResultOptions = { * @see https://hooks-common.feathersjs.com/hooks.html#setnow */ export const setNowResult = (fieldNames: MaybeArray, options?: SetNowResultOptions) => { - const fieldNamesArray = toArray(fieldNames); + const fieldNamesArray = toArray(fieldNames) - return alterResult( + return transformResult( data => { for (let i = 0, n = fieldNamesArray.length; i < n; i++) { - const key = fieldNamesArray[i]; + const key = fieldNamesArray[i] - _set(data, key, new Date()); + _set(data, key, new Date()) } }, { dispatch: options?.dispatch }, - ); -}; + ) +} diff --git a/src/hooks/set-slug/set-slug.test.ts b/src/hooks/set-slug/set-slug.test.ts index e9255031..95b90643 100755 --- a/src/hooks/set-slug/set-slug.test.ts +++ b/src/hooks/set-slug/set-slug.test.ts @@ -1,53 +1,53 @@ -import { assert } from 'vitest'; +import { assert } from 'vitest' -import { setSlug } from './set-slug'; +import { setSlug } from './set-slug.js' -let hook: any; +let hook: any describe('services setSlug', () => { beforeEach(() => { - hook = { type: 'before', method: 'create', params: { provider: 'rest', query: { a: 'a' } } }; - }); + hook = { type: 'before', method: 'create', params: { provider: 'rest', query: { a: 'a' } } } + }) describe('ignore feathers-socketio & feathers-rest clients', () => { it('ignore feathers-socketio', () => { - hook.params.provider = 'socketio'; - setSlug('stockId')(hook); - assert.deepEqual(hook.params.query, { a: 'a' }); - }); + hook.params.provider = 'socketio' + setSlug('stockId')(hook) + assert.deepEqual(hook.params.query, { a: 'a' }) + }) it('ignore feathers-rest', () => { - hook.params.route = {}; - hook.params.route.storeId = ':storeId'; - setSlug('stockId')(hook); - assert.deepEqual(hook.params.query, { a: 'a' }); - }); - }); + hook.params.route = {} + hook.params.route.storeId = ':storeId' + setSlug('stockId')(hook) + assert.deepEqual(hook.params.query, { a: 'a' }) + }) + }) describe('handles raw HTTP clients', () => { it('copies slug to query', () => { - hook.params.route = {}; - hook.params.route.storeId = '123'; - setSlug('storeId')(hook); - assert.deepEqual(hook.params.query, { a: 'a', storeId: '123' }); - }); - }); + hook.params.route = {} + hook.params.route.storeId = '123' + setSlug('storeId')(hook) + assert.deepEqual(hook.params.query, { a: 'a', storeId: '123' }) + }) + }) describe('handles field name', () => { it('copies slug to query', () => { - hook.params.route = {}; - hook.params.route.storeId = '123'; - setSlug('storeId', 'slugger')(hook); - assert.equal(hook.params.slugger, '123'); - }); - }); + hook.params.route = {} + hook.params.route.storeId = '123' + setSlug('storeId', 'slugger')(hook) + assert.equal(hook.params.slugger, '123') + }) + }) describe('handles field name with dot notation', () => { it('copies slug to query', () => { - hook.params.route = {}; - hook.params.route.storeId = '123'; - setSlug('storeId', 'query.slugger')(hook); - assert.deepEqual(hook.params.query, { a: 'a', slugger: '123' }); - }); - }); -}); + hook.params.route = {} + hook.params.route.storeId = '123' + setSlug('storeId', 'query.slugger')(hook) + assert.deepEqual(hook.params.query, { a: 'a', slugger: '123' }) + }) + }) +}) diff --git a/src/hooks/set-slug/set-slug.ts b/src/hooks/set-slug/set-slug.ts index b31d81a7..0b38093b 100755 --- a/src/hooks/set-slug/set-slug.ts +++ b/src/hooks/set-slug/set-slug.ts @@ -1,5 +1,5 @@ -import _set from 'lodash/set.js'; -import type { HookContext, NextFunction } from '@feathersjs/feathers'; +import _set from 'lodash/set.js' +import type { HookContext, NextFunction } from '@feathersjs/feathers' /** * Fix slugs in URL, e.g. /stores/:storeId. @@ -10,17 +10,17 @@ export const setSlug = (slug: string, fieldName?: string) => (context: H, next?: NextFunction) => { if (typeof fieldName !== 'string') { - fieldName = `query.${slug}`; + fieldName = `query.${slug}` } if (context.params && context.params.provider === 'rest') { - const value = context.params.route[slug]; + const value = context.params.route[slug] if (typeof value === 'string' && value[0] !== ':') { - _set(context.params, fieldName, value); + _set(context.params, fieldName, value) } } - if (next) return next().then(() => context); + if (next) return next().then(() => context) - return context; - }; + return context + } diff --git a/src/hooks/sifter/sifter.test.ts b/src/hooks/sifter/sifter.test.ts index be8c7b52..b55b6566 100755 --- a/src/hooks/sifter/sifter.test.ts +++ b/src/hooks/sifter/sifter.test.ts @@ -1,48 +1,50 @@ -import { assert } from 'vitest'; +import { assert } from 'vitest' -import sift from 'sift'; -import { sifter } from './sifter'; -import { clone } from '../../common'; +import sift from 'sift' +import { sifter } from './sifter.js' +import { clone } from '../../common/index.js' const dataCanada = [ { name: 'john', address: { city: 'montreal', country: 'canada' } }, { name: 'david', address: { city: 'vancouver', country: 'canada' } }, -]; +] -const dataUsa = [{ name: 'marshall', address: { city: 'utah', country: 'usa' } }]; +const dataUsa = [{ name: 'marshall', address: { city: 'utah', country: 'usa' } }] -let context: any; -let contextPaginated: any; +let context: any +let contextPaginated: any describe('sifter', () => { beforeEach(() => { - const data = [...dataCanada, ...dataUsa]; + const data = [...dataCanada, ...dataUsa] - context = clone({ type: 'after', method: 'find', result: data }); + context = clone({ type: 'after', method: 'find', result: data }) contextPaginated = clone({ type: 'after', method: 'find', result: { total: 1, limit: 10, skip: 0, data }, - }); - }); + }) + }) it('sifts non-paginated data', async () => { - const hook1: any = await sifter(() => sift({ 'address.country': 'canada' }))(context); - assert.deepEqual(hook1.result, dataCanada); - }); + const hook1: any = await sifter(() => (sift as any)({ 'address.country': 'canada' }))(context) + assert.deepEqual(hook1.result, dataCanada) + }) it('sifts paginated data', async () => { - const hook1: any = await sifter(() => sift({ 'address.country': 'canada' }))(contextPaginated); - assert.deepEqual(hook1.result.data, dataCanada); - }); + const hook1: any = await sifter(() => (sift as any)({ 'address.country': 'canada' }))( + contextPaginated, + ) + assert.deepEqual(hook1.result.data, dataCanada) + }) it('throws if getSifter not a function', async () => { // @ts-expect-error throws if getSifter not a function - assert.throws(() => sifter({})(contextPaginated)); - }); + assert.throws(() => sifter({})(contextPaginated)) + }) it('throws if getSifter does not return a function', () => { // @ts-expect-error throws if getSifter does not return a function - assert.throws(() => sifter((hook: any) => ({}))(contextPaginated)); - }); -}); + assert.throws(() => sifter((hook: any) => ({}))(contextPaginated)) + }) +}) diff --git a/src/hooks/sifter/sifter.ts b/src/hooks/sifter/sifter.ts index fb4634bb..2ce41d01 100755 --- a/src/hooks/sifter/sifter.ts +++ b/src/hooks/sifter/sifter.ts @@ -1,17 +1,17 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import type { SyncContextFunction } from '../../types'; -import { replaceResult } from '../../utils/replace-items/replace-result'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { SyncContextFunction } from '../../types.js' +import { replaceResult } from '../../utils/replace-items/replace-result.js' export const sifter = (siftFunc: SyncContextFunction<(item: any) => boolean, H>) => async (context: H, next?: NextFunction) => { - const sifter = siftFunc(context); + const sifter = siftFunc(context) if (next) { - await next(); + await next() } return replaceResult(context, item => item, { transform: items => items.filter(sifter), - }); - }; + }) + } diff --git a/src/hooks/soft-delete/soft-delete.test.ts b/src/hooks/soft-delete/soft-delete.test.ts index 154a2ab1..571efbf3 100755 --- a/src/hooks/soft-delete/soft-delete.test.ts +++ b/src/hooks/soft-delete/soft-delete.test.ts @@ -1,7 +1,7 @@ -import { assert, expect } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { softDelete } from './soft-delete'; +import { assert, expect } from 'vitest' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { softDelete } from './soft-delete.js' const initialUsers = [ { name: 'Jane Doe', key: 'a' }, @@ -10,10 +10,10 @@ const initialUsers = [ { name: 'Rick Doe', key: 'b' }, { name: 'Mick Doe', key: 'b' }, { name: 'Mick Doe', key: 'b', deleted: true }, -]; +] describe('softDelete', () => { - let userService: any; + let userService: any beforeEach(() => { const app = feathers().use( @@ -21,34 +21,34 @@ describe('softDelete', () => { new MemoryService({ multi: ['create', 'patch', 'remove'], }), - ); + ) - userService = app.service('users'); + userService = app.service('users') userService.hooks({ before: { all: [softDelete()], }, - }); + }) - userService.create(initialUsers); - }); + userService.create(initialUsers) + }) describe('find', () => { it('does not return deleted items', async () => { - const users = await userService.find(); + const users = await userService.find() assert.deepStrictEqual(users, [ { name: 'Jane Doe', key: 'a', id: 0 }, { name: 'Jack Doe', key: 'a', id: 1 }, { name: 'Rick Doe', key: 'b', id: 3 }, { name: 'Mick Doe', key: 'b', id: 4 }, - ]); - }); + ]) + }) it('returns everything with params.disableSoftdelete', async () => { const users = await userService.find({ disableSoftDelete: true, - }); + }) assert.deepStrictEqual(users, [ { name: 'Jane Doe', key: 'a', id: 0 }, @@ -57,127 +57,127 @@ describe('softDelete', () => { { name: 'Rick Doe', key: 'b', id: 3 }, { name: 'Mick Doe', key: 'b', id: 4 }, { name: 'Mick Doe', key: 'b', deleted: true, id: 5 }, - ]); - }); - }); + ]) + }) + }) describe('get', () => { it('returns an undeleted item', async () => { - const user = await userService.get(0); + const user = await userService.get(0) assert.deepStrictEqual(user, { name: 'Jane Doe', key: 'a', id: 0, - }); - }); + }) + }) it('throws on deleted item', async () => { await expect(async () => { - await userService.get(2); - }).rejects.toThrow(); - }); + await userService.get(2) + }).rejects.toThrow() + }) it('returns deleted when params.disableSoftDelete is set', async () => { const user = await userService.get(2, { disableSoftDelete: true, - }); + }) assert.deepStrictEqual(user, { name: 'Jack Doe', key: 'a', deleted: true, id: 2, - }); - }); + }) + }) it('throws on missing item', async () => { await expect(async () => { - await userService.get(99); - }).rejects.toThrow(); - }); - }); + await userService.get(99) + }).rejects.toThrow() + }) + }) describe('update, with id', () => { it('updates an undeleted item', async () => { - const user = await userService.update(0, { y: 'y' }); + const user = await userService.update(0, { y: 'y' }) - assert.deepStrictEqual(user, { y: 'y', id: 0 }); - }); + assert.deepStrictEqual(user, { y: 'y', id: 0 }) + }) it.skip('throws on deleted item', async () => { await expect(async () => { - await userService.update(2, { y: 'y' }); - }).rejects.toThrow(); - }); - }); + await userService.update(2, { y: 'y' }) + }).rejects.toThrow() + }) + }) describe('patch', () => { it('patches an undeleted item', async () => { - const user = await userService.patch(0, { y: 'y' }); + const user = await userService.patch(0, { y: 'y' }) assert.deepStrictEqual(user, { name: 'Jane Doe', key: 'a', id: 0, y: 'y', - }); - }); + }) + }) it('throws on deleted item', async () => { - await expect(() => userService.patch(2, { y: 'y' })).rejects.toThrow(); - }); + await expect(() => userService.patch(2, { y: 'y' })).rejects.toThrow() + }) it('multi updates on undeleted items', async () => { - const patched = await userService.patch(null, { x: 'x' }); + const patched = await userService.patch(null, { x: 'x' }) assert.deepStrictEqual(patched, [ { name: 'Jane Doe', key: 'a', id: 0, x: 'x' }, { name: 'Jack Doe', key: 'a', id: 1, x: 'x' }, { name: 'Rick Doe', key: 'b', id: 3, x: 'x' }, { name: 'Mick Doe', key: 'b', id: 4, x: 'x' }, - ]); - }); - }); + ]) + }) + }) describe('remove, with id', () => { it('marks item as deleted', async () => { - const user = await userService.remove(0); + const user = await userService.remove(0) assert.deepStrictEqual(user, { name: 'Jane Doe', key: 'a', id: 0, deleted: true, - }); + }) - await expect(() => userService.get(0)).rejects.toThrow(); - }); + await expect(() => userService.get(0)).rejects.toThrow() + }) it('throws if item already deleted', async () => { - await expect(() => userService.remove(2)).rejects.toThrow(); - }); - }); + await expect(() => userService.remove(2)).rejects.toThrow() + }) + }) describe('remove, without id', () => { it('marks filtered items as deleted', async () => { - const query = { key: 'a' }; - await userService.remove(null, { query }); + const query = { key: 'a' } + await userService.remove(null, { query }) - const users = await userService.find({ query }); + const users = await userService.find({ query }) - assert.strictEqual(users.length, 0); - }); + assert.strictEqual(users.length, 0) + }) it('handles nothing found', async () => { - const users = await userService.remove(null, { query: { key: 'z' } }); + const users = await userService.remove(null, { query: { key: 'z' } }) - assert.strictEqual(users.length, 0); - }); - }); + assert.strictEqual(users.length, 0) + }) + }) describe('with customization: deletedAt', () => { - let peopleService: any; + let peopleService: any beforeEach(() => { const app = feathers().use( @@ -185,37 +185,37 @@ describe('softDelete', () => { new MemoryService({ multi: ['create', 'patch', 'remove'], }), - ); + ) - peopleService = app.service('people'); + peopleService = app.service('people') peopleService.hooks({ before: { all: [ softDelete({ deletedQuery: async () => { - return { deletedAt: null }; + return { deletedAt: null } }, removeData: async () => { - return { deletedAt: new Date() }; + return { deletedAt: new Date() } }, }), ], create: [ (context: any) => { - context.data.deletedAt = null; + context.data.deletedAt = null }, ], }, - }); - }); + }) + }) it('works with setting deletedAt to date', async () => { - const user = await peopleService.create({ name: 'Jon Doe' }); - const deletedUser = await peopleService.remove(user.id); + const user = await peopleService.create({ name: 'Jon Doe' }) + const deletedUser = await peopleService.remove(user.id) - assert.ok(deletedUser.deletedAt !== null); + assert.ok(deletedUser.deletedAt !== null) - await expect(() => peopleService.get(user.id)).rejects.toThrow(); - }); - }); -}); + await expect(() => peopleService.get(user.id)).rejects.toThrow() + }) + }) +}) diff --git a/src/hooks/soft-delete/soft-delete.ts b/src/hooks/soft-delete/soft-delete.ts index 42ad3437..1de3518b 100755 --- a/src/hooks/soft-delete/soft-delete.ts +++ b/src/hooks/soft-delete/soft-delete.ts @@ -1,35 +1,35 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext } from '../../utils'; -import { TransformParamsFn } from '../../types'; -import { transformParams } from '../../utils/transform-params/transform-params'; -import { Promisable } from '../../internal.utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext } from '../../utils/index.js' +import type { TransformParamsFn } from '../../types.js' +import { transformParams } from '../../utils/transform-params/transform-params.js' +import type { Promisable } from '../../internal.utils.js' export type SoftDeleteOptionFunction = ( context?: H, -) => Promisable<{ [key: string]: any }>; +) => Promisable<{ [key: string]: any }> export interface SoftDeleteOptions { /** * @default { deletedAt: { $ne: true } } */ - deletedQuery?: { [key: string]: any } | SoftDeleteOptionFunction; + deletedQuery?: { [key: string]: any } | SoftDeleteOptionFunction /** * @default { deletedAt: new Date() } */ - removeData?: { [key: string]: any } | SoftDeleteOptionFunction; + removeData?: { [key: string]: any } | SoftDeleteOptionFunction /** * Transform the params before calling the service method. E.g. remove 'params.provider' or add custom params. */ - transformParams?: TransformParamsFn; + transformParams?: TransformParamsFn /** * @default 'disableSoftDelete' */ - disableSoftDeleteKey?: string; + disableSoftDeleteKey?: string } -const defaultQuery = () => ({ deletedAt: { $ne: true } }); -const defaultData = () => ({ deletedAt: new Date() }); +const defaultQuery = () => ({ deletedAt: { $ne: true } }) +const defaultData = () => ({ deletedAt: new Date() }) /** * Allow to mark items as deleted instead of removing them. @@ -37,17 +37,17 @@ const defaultData = () => ({ deletedAt: new Date() }); export const softDelete = (options: SoftDeleteOptions = {}) => async (context: H, next?: NextFunction) => { - checkContext(context, ['before', 'around'], null, 'softDelete'); + checkContext(context, ['before', 'around'], null, 'softDelete') - const { disableSoftDeleteKey = 'disableSoftDelete' } = options; + const { disableSoftDeleteKey = 'disableSoftDelete' } = options if (context.params[disableSoftDeleteKey]) { - return context; + return context } - const { deletedQuery = defaultQuery, removeData = defaultData } = options; + const { deletedQuery = defaultQuery, removeData = defaultData } = options - const deleteQuery = await getValue(deletedQuery, context); + const deleteQuery = await getValue(deletedQuery, context) const params = transformParams( { @@ -58,27 +58,27 @@ export const softDelete = }, }, options.transformParams, - ); + ) - context.params = params; + context.params = params if (context.method === 'remove') { - const data = await getValue(removeData, context); - const result = await context.service.patch(context.id, data, params); + const data = await getValue(removeData, context) + const result = await context.service.patch(context.id, data, params) - context.result = result; + context.result = result } if (next) { - await next(); + await next() } - return context; - }; + return context + } const getValue = (value: any, ...args: any[]) => { if (typeof value === 'function') { - return value(...args); + return value(...args) } - return value; -}; + return value +} diff --git a/src/hooks/stash-before/stash-before.test.ts b/src/hooks/stash-before/stash-before.test.ts index 6a49b18d..db788e99 100755 --- a/src/hooks/stash-before/stash-before.test.ts +++ b/src/hooks/stash-before/stash-before.test.ts @@ -1,10 +1,11 @@ -import { assert, expect } from 'vitest'; -import { Application, feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { stashBefore } from './stash-before'; -import { clone } from '../../common'; - -const startId = 6; +import { assert, expect } from 'vitest' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { stashBefore } from './stash-before.js' +import { clone } from '../../common/index.js' + +const startId = 6 const storeInit = { 0: { name: 'Jane Doe', key: 'a', id: 0 }, 1: { name: 'Jack Doe', key: 'a', id: 1 }, @@ -12,18 +13,18 @@ const storeInit = { 3: { name: 'Rick Doe', key: 'b', id: 3 }, 4: { name: 'Dick Doe', key: 'b', id: 4 }, 5: { name: 'Dork Doe', key: 'b', id: 5 }, -}; +} -let store; -let finalParams: any; -let innerCallParams: any; +let store +let finalParams: any +let innerCallParams: any function services(app: Application) { - app.configure(users); + app.configure(users) } function users(app: Application) { - store = clone(storeInit); + store = clone(storeInit) app.use( 'users', @@ -32,88 +33,88 @@ function users(app: Application) { startId, multi: true, }), - ); + ) app.service('users').hooks({ before: { all: [ (context: any) => { if (context.params.disableStashBefore === true) { - innerCallParams = context.params; + innerCallParams = context.params } }, stashBefore(), (context: any) => { - finalParams = context.params; + finalParams = context.params }, ], }, - }); + }) } describe('stash-before', () => { - let app: Application<{ users: MemoryService }>; - let users: any; + let app: Application<{ users: MemoryService }> + let users: any beforeEach(() => { - innerCallParams = finalParams = null; + innerCallParams = finalParams = null - app = feathers().configure(services); + app = feathers().configure(services) - users = app.service('users'); - }); + users = app.service('users') + }) it(`stashes on 'update'`, async () => { - await users.update(0, {}); + await users.update(0, {}) - assert.deepEqual(finalParams.before, storeInit[0]); - }); + assert.deepEqual(finalParams.before, storeInit[0]) + }) it(`stashes on 'patch'`, async () => { - await users.patch(0, {}); + await users.patch(0, {}) - assert.deepEqual(finalParams.before, storeInit[0]); - }); + assert.deepEqual(finalParams.before, storeInit[0]) + }) it(`stashes on 'remove'`, async () => { - await users.remove(0); + await users.remove(0) - assert.deepEqual(finalParams.before, storeInit[0]); - }); + assert.deepEqual(finalParams.before, storeInit[0]) + }) it("throws on 'create'", async () => { - await expect(users.create({})).rejects.toThrow(); - }); + await expect(users.create({})).rejects.toThrow() + }) it("throws on 'find'", async () => { - await expect(users.find({})).rejects.toThrow(); - }); + await expect(users.find({})).rejects.toThrow() + }) it("throws on 'get'", async () => { - await expect(users.get(0)).rejects.toThrow(); - }); + await expect(users.get(0)).rejects.toThrow() + }) it('stashes on patch with custom params', async () => { - await users.patch(0, {}, { provider: 'socketio', eyecatcher: -1 }); + await users.patch(0, {}, { provider: 'socketio', eyecatcher: -1 }) - assert.equal(finalParams.provider, 'socketio'); - assert.equal(finalParams.eyecatcher, -1); + assert.equal(finalParams.provider, 'socketio') + assert.equal(finalParams.eyecatcher, -1) - assert.equal(innerCallParams.provider, 'socketio'); - assert.property(innerCallParams, 'eyecatcher'); - }); + assert.equal(innerCallParams.provider, 'socketio') + assert.property(innerCallParams, 'eyecatcher') + }) it('stashes multi patch', async () => { - const items = [storeInit[0], storeInit[1], storeInit[2]]; - await users.patch(null, { key: 'c' }, { query: { id: { $in: items.map(x => x.id) } } }); + const items = [storeInit[0], storeInit[1], storeInit[2]] + await users.patch(null, { key: 'c' }, { query: { id: { $in: items.map(x => x.id) } } }) - assert.deepEqual(finalParams.before, items); - }); + assert.deepEqual(finalParams.before, items) + }) it('stashes multi remove', async () => { - const items = [storeInit[0], storeInit[1], storeInit[2]]; - await users.remove(null, { query: { id: { $in: items.map(x => x.id) } } }); + const items = [storeInit[0], storeInit[1], storeInit[2]] + await users.remove(null, { query: { id: { $in: items.map(x => x.id) } } }) - assert.deepEqual(finalParams.before, items); - }); -}); + assert.deepEqual(finalParams.before, items) + }) +}) diff --git a/src/hooks/stash-before/stash-before.ts b/src/hooks/stash-before/stash-before.ts index ee6411ec..d3e23eb4 100755 --- a/src/hooks/stash-before/stash-before.ts +++ b/src/hooks/stash-before/stash-before.ts @@ -1,41 +1,41 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext } from '../../utils'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext } from '../../utils/index.js' /** * Stash current value of record, usually before mutating it. Performs a get call. * @see https://hooks-common.feathersjs.com/hooks.html#stashbefore */ export function stashBefore(fieldName?: string) { - const beforeField = fieldName || 'before'; + const beforeField = fieldName || 'before' return async (context: H, next?: NextFunction) => { if (context.params.disableStashBefore) { - return context; + return context } - checkContext(context, ['before', 'around'], ['update', 'patch', 'remove'], 'stashBefore'); + checkContext(context, ['before', 'around'], ['update', 'patch', 'remove'], 'stashBefore') - const isMulti = context.id == null; + const isMulti = context.id == null const params = { ...context.params, disableStashBefore: true, ...(isMulti ? { paginate: false } : {}), - }; + } await (!isMulti ? context.service.get(context.id, params) : context.service.find(params)) .then((result: any) => { - context.params[beforeField] = result; - return context; + context.params[beforeField] = result + return context }) .catch(() => { - return context; - }); + return context + }) if (next) { - return await next(); + return await next() } - return context; - }; + return context + } } diff --git a/src/hooks/throw-if/throw-if-is-multi.ts b/src/hooks/throw-if/throw-if-is-multi.ts index 15e0edce..8d8b65b8 100644 --- a/src/hooks/throw-if/throw-if-is-multi.ts +++ b/src/hooks/throw-if/throw-if-is-multi.ts @@ -1,32 +1,32 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { checkContext } from '../../utils'; -import { PredicateFn } from '../../types'; -import { BadRequest, type FeathersError } from '@feathersjs/errors'; -import { isMulti } from '../../predicates'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { checkContext } from '../../utils/index.js' +import type { PredicateFn } from '../../types.js' +import { BadRequest, type FeathersError } from '@feathersjs/errors' +import { isMulti } from '../../predicates/index.js' export type ThrowIfIsMultiOptions = { - filter?: PredicateFn; - error?: (context: HookContext) => FeathersError; -}; + filter?: PredicateFn + error?: (context: HookContext) => FeathersError +} export const throwIfIsMulti = ( options?: ThrowIfIsMultiOptions, ) => { return async (context: H, next?: NextFunction) => { - checkContext(context, ['before', 'around'], ['create', 'patch', 'remove'], 'throwIfIsMulti'); + checkContext(context, ['before', 'around'], ['create', 'patch', 'remove'], 'throwIfIsMulti') if (!isMulti(context)) { - return context; + return context } if (!options?.filter || (await options.filter(context))) { - throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); + throw options?.error ? options.error(context) : new BadRequest('Invalid operation') } if (next) { - await next(); + await next() } - return context; - }; -}; + return context + } +} diff --git a/src/hooks/throw-if/throw-if-is-provider.ts b/src/hooks/throw-if/throw-if-is-provider.ts index 4003cb18..5e021289 100644 --- a/src/hooks/throw-if/throw-if-is-provider.ts +++ b/src/hooks/throw-if/throw-if-is-provider.ts @@ -1,20 +1,21 @@ -import { HookContext } from '@feathersjs/feathers'; -import { TransportName } from '../../types'; -import { throwIf, ThrowIfOptions } from './throw-if'; -import { toArray } from 'lodash'; -import { isProvider } from '../../predicates'; -import { MethodNotAllowed } from '@feathersjs/errors'; +import type { HookContext } from '@feathersjs/feathers' +import type { TransportName } from '../../types.js' +import type { ThrowIfOptions } from './throw-if.js' +import { throwIf } from './throw-if.js' +import { toArray } from 'lodash' +import { isProvider } from '../../predicates/index.js' +import { MethodNotAllowed } from '@feathersjs/errors' const defaultError = (context: HookContext) => - new MethodNotAllowed(`Provider '${context.params.provider}' can not call '${context.method}'.`); + new MethodNotAllowed(`Provider '${context.params.provider}' can not call '${context.method}'.`) export const throwIfIsProvider = ( transports: TransportName | TransportName[], options?: ThrowIfOptions, ) => { - const disallowTransports = toArray(transports); + const disallowTransports = toArray(transports) return throwIf(isProvider(...(disallowTransports as any)), { error: options?.error ?? defaultError, - }); -}; + }) +} diff --git a/src/hooks/throw-if/throw-if.ts b/src/hooks/throw-if/throw-if.ts index 5e4756f9..3607ac67 100644 --- a/src/hooks/throw-if/throw-if.ts +++ b/src/hooks/throw-if/throw-if.ts @@ -1,27 +1,27 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { PredicateFn } from '../../types'; -import { BadRequest } from '@feathersjs/errors'; -import type { FeathersError } from '@feathersjs/errors'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { PredicateFn } from '../../types.js' +import { BadRequest } from '@feathersjs/errors' +import type { FeathersError } from '@feathersjs/errors' export type ThrowIfOptions = { - error?: (context: HookContext) => FeathersError; -}; + error?: (context: HookContext) => FeathersError +} export const throwIf = ( predicate: PredicateFn, options?: ThrowIfOptions, ) => { return async (context: H, next?: NextFunction) => { - const result = await predicate(context); + const result = await predicate(context) if (result) { - throw options?.error ? options.error(context) : new BadRequest('Invalid operation'); + throw options?.error ? options.error(context) : new BadRequest('Invalid operation') } if (next) { - await next(); + await next() } - return context; - }; -}; + return context + } +} diff --git a/src/hooks/alter-items/alter-data.test.ts b/src/hooks/transform/transform-data.test.ts similarity index 53% rename from src/hooks/alter-items/alter-data.test.ts rename to src/hooks/transform/transform-data.test.ts index 222a8839..4b4f375d 100755 --- a/src/hooks/alter-items/alter-data.test.ts +++ b/src/hooks/transform/transform-data.test.ts @@ -1,17 +1,17 @@ -import { assert } from 'vitest'; -import { alterData } from './alter-data'; +import { assert } from 'vitest' +import { transformData } from './transform-data.js' -let hookBefore: any; -let hookCreateMulti: any; +let hookBefore: any +let hookCreateMulti: any -describe('alterData', () => { +describe('transformData', () => { beforeEach(() => { hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' }, data: { first: 'John', last: 'Doe' }, - }; + } hookCreateMulti = { type: 'before', method: 'create', @@ -20,75 +20,75 @@ describe('alterData', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) it('context is 2nd param', () => { - let contextParam; - alterData((_rec: any, context: any) => { - contextParam = context; - })(hookBefore); - assert.deepEqual(contextParam, hookBefore); - }); + let contextParam + transformData((_rec: any, context: any) => { + contextParam = context + })(hookBefore) + assert.deepEqual(contextParam, hookBefore) + }) it('updates hook before::create', () => { - alterData((rec: any) => { - rec.state = 'UT'; - })(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + transformData((rec: any) => { + rec.state = 'UT' + })(hookBefore) + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }) + }) it('updates hook before::create::multi', () => { - alterData((rec: any) => { - rec.state = 'UT'; - })(hookCreateMulti); + transformData((rec: any) => { + rec.state = 'UT' + })(hookCreateMulti) assert.deepEqual(hookCreateMulti.data, [ { first: 'John', last: 'Doe', state: 'UT' }, { first: 'Jane', last: 'Doe', state: 'UT' }, - ]); - }); + ]) + }) it('updates hook before::create with new item returned', () => { - alterData((rec: any) => Object.assign({}, rec, { state: 'UT' }))(hookBefore); - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + transformData((rec: any) => Object.assign({}, rec, { state: 'UT' }))(hookBefore) + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }) + }) it('returns a promise that contains context', async () => { - const promise = alterData((rec: any) => { - rec.state = 'UT'; - return Promise.resolve(); - })(hookBefore); + const promise = transformData((rec: any) => { + rec.state = 'UT' + return Promise.resolve() + })(hookBefore) - assert.ok(promise instanceof Promise); + assert.ok(promise instanceof Promise) - const result = await promise; + const result = await promise - assert.deepEqual(result, hookBefore); - }); + assert.deepEqual(result, hookBefore) + }) it('updates hook before::create with new item returned', async () => { - await alterData((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( + await transformData((rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })))( hookBefore, - ); + ) - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }) + }) it('updates hook before::create async', async () => { const alterFunc = (rec: any) => { - rec.state = 'UT'; - return Promise.resolve(); - }; - await alterData(alterFunc)(hookBefore); + rec.state = 'UT' + return Promise.resolve() + } + await transformData(alterFunc)(hookBefore) - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }) + }) it('updates hook before::create async with new item returned', async () => { - const alterFunc = (rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })); + const alterFunc = (rec: any) => Promise.resolve(Object.assign({}, rec, { state: 'UT' })) - await alterData(alterFunc)(hookBefore); + await transformData(alterFunc)(hookBefore) - assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }); - }); -}); + assert.deepEqual(hookBefore.data, { first: 'John', last: 'Doe', state: 'UT' }) + }) +}) diff --git a/src/hooks/alter-items/alter-data.ts b/src/hooks/transform/transform-data.ts similarity index 67% rename from src/hooks/alter-items/alter-data.ts rename to src/hooks/transform/transform-data.ts index 0f944af1..f4f1b04e 100755 --- a/src/hooks/alter-items/alter-data.ts +++ b/src/hooks/transform/transform-data.ts @@ -1,25 +1,25 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { replaceData } from '../../utils/replace-items/replace-data'; -import { isPromise } from '../../common'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { replaceData } from '../../utils/replace-items/replace-data.js' +import { isPromise } from '../../common/index.js' /** * Make changes to data items. Very flexible. * @see https://hooks-common.feathersjs.com/hooks.html#alteritems */ -export const alterData = +export const transformData = (cb: (record: T, context: H) => any) => async (context: H, next?: NextFunction) => { await replaceData(context, (item: any) => { - const result = cb(item, context); + const result = cb(item, context) if (isPromise(result)) { - return result.then((res: any) => res ?? item); + return result.then((res: any) => res ?? item) } else { - return result ?? item; + return result ?? item } - }); + }) if (next) { - return next(); + return next() } - }; + } diff --git a/src/hooks/alter-items/alter-result.test.ts b/src/hooks/transform/transform-result.test.ts similarity index 64% rename from src/hooks/alter-items/alter-result.test.ts rename to src/hooks/transform/transform-result.test.ts index 31468f85..7988ff99 100755 --- a/src/hooks/alter-items/alter-result.test.ts +++ b/src/hooks/transform/transform-result.test.ts @@ -1,19 +1,19 @@ -import { assert } from 'vitest'; -import { alterResult } from './alter-result'; -import { HookContext } from '@feathersjs/feathers'; +import { assert } from 'vitest' +import { transformResult } from './transform-result.js' +import type { HookContext } from '@feathersjs/feathers' -let hookAfter: any; -let hookFindPaginate: any; -let hookFind: any; +let hookAfter: any +let hookFindPaginate: any +let hookFind: any -describe('alterResult', () => { +describe('transformResult', () => { beforeEach(() => { hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, - }; + } hookFindPaginate = { type: 'after', method: 'find', @@ -25,7 +25,7 @@ describe('alterResult', () => { { first: 'Jane', last: 'Doe' }, ], }, - }; + } hookFind = { type: 'after', method: 'find', @@ -34,113 +34,113 @@ describe('alterResult', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - }; - }); + } + }) it('updates hook after::find with pagination', () => { - alterResult((rec: any) => { - delete rec.last; - })(hookFindPaginate); + transformResult((rec: any) => { + delete rec.last + })(hookFindPaginate) - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with no pagination', () => { - alterResult((rec: any) => { - rec.new = rec.first; - })(hookFind); + transformResult((rec: any) => { + rec.new = rec.first + })(hookFind) assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + ]) + }) it('updates hook after', () => { - alterResult((rec: any) => { - rec.new = rec.first; - })(hookAfter); + transformResult((rec: any) => { + rec.new = rec.first + })(hookAfter) - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }) + }) it('updates hook after::find with pagination with new item returned', () => { - alterResult((rec: any) => Object.assign({}, { first: rec.first }))(hookFindPaginate); + transformResult((rec: any) => Object.assign({}, { first: rec.first }))(hookFindPaginate) - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with pagination with new item returned', () => { - alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookFind); + transformResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookFind) assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + ]) + }) it('updates hook after with new item returned', () => { - alterResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookAfter); + transformResult((rec: any) => Object.assign({}, rec, { new: rec.first }))(hookAfter) - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }) + }) it('updates hook after::create', async () => { - await alterResult((rec: any) => { - rec.new = rec.first; - return Promise.resolve(); - })(hookAfter); + await transformResult((rec: any) => { + rec.new = rec.first + return Promise.resolve() + })(hookAfter) - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }) + }) it('updates hook after::create with new item returned', async () => { - await alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( - hookAfter, - ); + await transformResult((rec: any) => + Promise.resolve(Object.assign({}, rec, { new: rec.first })), + )(hookAfter) - assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + assert.deepEqual(hookAfter.result, { first: 'Jane', last: 'Doe', new: 'Jane' }) + }) it('updates hook after::find with pagination', async () => { - await alterResult((rec: any) => { - delete rec.last; - return Promise.resolve(); - })(hookFindPaginate); + await transformResult((rec: any) => { + delete rec.last + return Promise.resolve() + })(hookFindPaginate) - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with no pagination', async () => { - await alterResult((rec: any) => { - rec.new = rec.first; - return Promise.resolve(); - })(hookFind); + await transformResult((rec: any) => { + rec.new = rec.first + return Promise.resolve() + })(hookFind) assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + ]) + }) it('updates hook after::find with pagination with new item returned', async () => { - await alterResult((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( + await transformResult((rec: any) => Promise.resolve(Object.assign({}, { first: rec.first })))( hookFindPaginate, - ); + ) - assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]); - }); + assert.deepEqual(hookFindPaginate.result.data, [{ first: 'John' }, { first: 'Jane' }]) + }) it('updates hook after::find with no pagination with new item returned', async () => { - await alterResult((rec: any) => Promise.resolve(Object.assign({}, rec, { new: rec.first })))( - hookFind, - ); + await transformResult((rec: any) => + Promise.resolve(Object.assign({}, rec, { new: rec.first })), + )(hookFind) assert.deepEqual(hookFind.result, [ { first: 'John', last: 'Doe', new: 'John' }, { first: 'Jane', last: 'Doe', new: 'Jane' }, - ]); - }); + ]) + }) it('updates dispatch', () => { const context = { @@ -149,18 +149,18 @@ describe('alterResult', () => { params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, dispatch: { first: 'Jack', last: 'Doe' }, - } as HookContext; + } as HookContext - alterResult( + transformResult( (rec: any) => { - rec.new = rec.first; + rec.new = rec.first }, { dispatch: true }, - )(context); + )(context) - assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }); - assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }); - }); + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }) + assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }) + }) it('updates dispatch even though it is not defined', () => { const context = { @@ -169,18 +169,18 @@ describe('alterResult', () => { params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, dispatch: undefined, - } as HookContext; + } as HookContext - alterResult( + transformResult( (rec: any) => { - rec.new = rec.first; + rec.new = rec.first }, { dispatch: true }, - )(context); + )(context) - assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }); - assert.deepEqual(context.dispatch, { first: 'Jane', last: 'Doe', new: 'Jane' }); - }); + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }) + assert.deepEqual(context.dispatch, { first: 'Jane', last: 'Doe', new: 'Jane' }) + }) it('updates dispatch and result', () => { const context = { @@ -189,16 +189,16 @@ describe('alterResult', () => { params: { provider: 'rest' }, result: { first: 'Jane', last: 'Doe' }, dispatch: { first: 'Jack', last: 'Doe' }, - } as HookContext; + } as HookContext - alterResult( + transformResult( (rec: any) => { - rec.new = rec.first; + rec.new = rec.first }, { dispatch: 'both' }, - )(context); + )(context) - assert.deepEqual(context.result, { first: 'Jane', last: 'Doe', new: 'Jane' }); - assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }); - }); -}); + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe', new: 'Jane' }) + assert.deepEqual(context.dispatch, { first: 'Jack', last: 'Doe', new: 'Jack' }) + }) +}) diff --git a/src/hooks/alter-items/alter-result.ts b/src/hooks/transform/transform-result.ts similarity index 59% rename from src/hooks/alter-items/alter-result.ts rename to src/hooks/transform/transform-result.ts index f637d259..e3ac8201 100755 --- a/src/hooks/alter-items/alter-result.ts +++ b/src/hooks/transform/transform-result.ts @@ -1,35 +1,35 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers'; -import { isPromise } from '../../common'; -import { replaceResult } from '../../utils/replace-items/replace-result'; -import { DispatchOption } from '../../types'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { isPromise } from '../../common/index.js' +import { replaceResult } from '../../utils/replace-items/replace-result.js' +import type { DispatchOption } from '../../types.js' -export type AlterResultOptions = { - dispatch?: DispatchOption; -}; +export type TransformResultOptions = { + dispatch?: DispatchOption +} /** * Make changes to result items. Very flexible. * @see https://hooks-common.feathersjs.com/hooks.html#alteritems */ -export const alterResult = +export const transformResult = ( cb: (record: T, context: H) => any, - options?: AlterResultOptions, + options?: TransformResultOptions, ) => (context: H, next?: NextFunction) => replaceResult( context, (item: any) => { - const result = cb(item, context); + const result = cb(item, context) if (isPromise(result)) { - return result.then((res: any) => res ?? item); + return result.then((res: any) => res ?? item) } else { - return result ?? item; + return result ?? item } }, { next, dispatch: options?.dispatch, }, - ); + ) diff --git a/src/hooks/traverse/traverse.test.ts b/src/hooks/traverse/traverse.test.ts index 1221de21..3d9a689c 100755 --- a/src/hooks/traverse/traverse.test.ts +++ b/src/hooks/traverse/traverse.test.ts @@ -1,13 +1,13 @@ -import { assert } from 'vitest'; -import { traverse } from './traverse'; -import { clone } from '../../common'; +import { assert } from 'vitest' +import { traverse } from './traverse.js' +import { clone } from '../../common/index.js' describe('traverse', () => { - let hookBefore: any; - let hookBeforeArray: any; - let trimmer: any; - let hookAfter: any; - let hookAfterArray: any; + let hookBefore: any + let hookBeforeArray: any + let trimmer: any + let hookAfter: any + let hookAfterArray: any beforeEach(() => { hookBefore = { @@ -15,14 +15,14 @@ describe('traverse', () => { method: 'create', data: { a: ' a b ' }, params: { query: { b: ' b b ' } }, - }; + } hookBeforeArray = { type: 'before', method: 'create', data: [{ a: ' a b ' }, { c: ' c ' }], params: { query: { b: ' b b ' }, something: { c: ' c', d: 'd ' } }, - }; + } hookAfter = { type: 'after', @@ -30,7 +30,7 @@ describe('traverse', () => { data: { q: 1 }, params: { query: { b: ' b b ' } }, result: { a: ' a b ' }, - }; + } hookAfterArray = { type: 'after', @@ -38,82 +38,75 @@ describe('traverse', () => { data: { q: 1 }, params: { query: { b: ' b b ' } }, result: [{ a: ' a b ' }, { c: ' c ' }], - }; + } trimmer = function (this: any, node: any) { if (typeof node === 'string') { - this.update(node.trim()); + this.update(node.trim()) } - }; - }); + } + }) it('transforms hook.data single item', () => { - const result = clone(hookBefore); - result.data = { a: 'a b' }; + const result = clone(hookBefore) + result.data = { a: 'a b' } - // @ts-ignore - traverse(trimmer)(hookBefore); + traverse(trimmer)(hookBefore) - assert.deepEqual(hookBefore, result); - }); + assert.deepEqual(hookBefore, result) + }) it('transforms hook.data array of items', () => { - const result = clone(hookBeforeArray); - result.data = [{ a: 'a b' }, { c: 'c' }]; + const result = clone(hookBeforeArray) + result.data = [{ a: 'a b' }, { c: 'c' }] - // @ts-ignore - traverse(trimmer)(hookBeforeArray); + traverse(trimmer)(hookBeforeArray) - assert.deepEqual(hookBeforeArray, result); - }); + assert.deepEqual(hookBeforeArray, result) + }) it('transforms hook.result single item', () => { - const result = clone(hookAfter); - result.result = { a: 'a b' }; + const result = clone(hookAfter) + result.result = { a: 'a b' } - // @ts-ignore - traverse(trimmer)(hookAfter); + traverse(trimmer)(hookAfter) - assert.deepEqual(hookAfter, result); - }); + assert.deepEqual(hookAfter, result) + }) it('transforms hook.result array of items', () => { - const result = clone(hookAfterArray); - result.result = [{ a: 'a b' }, { c: 'c' }]; + const result = clone(hookAfterArray) + result.result = [{ a: 'a b' }, { c: 'c' }] - // @ts-ignore - traverse(trimmer)(hookAfterArray); + traverse(trimmer)(hookAfterArray) - assert.deepEqual(hookAfterArray, result); - }); + assert.deepEqual(hookAfterArray, result) + }) it('transforms hook.params.query', () => { - const result = clone(hookBefore); - result.params.query = { b: 'b b' }; + const result = clone(hookBefore) + result.params.query = { b: 'b b' } - // @ts-ignore - traverse(trimmer, (hook: any) => hook.params.query)(hookBefore); + traverse(trimmer, (hook: any) => hook.params.query)(hookBefore) - assert.deepEqual(hookBefore, result); - }); + assert.deepEqual(hookBefore, result) + }) it('transforms multiple objects within a hook', () => { - const result = clone(hookBeforeArray); - result.params = { query: { b: 'b b' }, something: { c: 'c', d: 'd' } }; + const result = clone(hookBeforeArray) + result.params = { query: { b: 'b b' }, something: { c: 'c', d: 'd' } } - // @ts-ignore - traverse(trimmer, (hook: any) => [hook.params.query, hook.params.something])(hookBeforeArray); + traverse(trimmer, (hook: any) => [hook.params.query, hook.params.something])(hookBeforeArray) - assert.deepEqual(hookBeforeArray, result); - }); + assert.deepEqual(hookBeforeArray, result) + }) it('transforms objects', () => { - const obj: any = { query: { b: 'b b' }, something: { c: 'c', d: 'd' } }; - const result = clone(obj); + const obj: any = { query: { b: 'b b' }, something: { c: 'c', d: 'd' } } + const result = clone(obj) - // @ts-ignore - traverse(trimmer, obj)(hookBeforeArray); + traverse(trimmer, obj)(hookBeforeArray) - assert.deepEqual(obj, result); - }); -}); + assert.deepEqual(obj, result) + }) +}) diff --git a/src/hooks/traverse/traverse.ts b/src/hooks/traverse/traverse.ts index 935a92da..f8fe74f3 100755 --- a/src/hooks/traverse/traverse.ts +++ b/src/hooks/traverse/traverse.ts @@ -1,7 +1,7 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { traverse as _traverse } from '../../common'; -import type { SyncContextFunction } from '../../types'; -import { getItems } from '../../utils'; +import type { HookContext } from '@feathersjs/feathers' +import { traverse as _traverse } from '../../common/index.js' +import type { SyncContextFunction } from '../../types.js' +import { getItems } from '../../utils/index.js' /** * Transform fields & objects in place in the record(s) using a recursive walk. Powerful. @@ -14,9 +14,9 @@ export function traverse( ) { return (context: H) => { const items = - typeof getObject === 'function' ? getObject(context) : getObject || getItems(context); + typeof getObject === 'function' ? getObject(context) : getObject || getItems(context) - _traverse(items, transformer); - return context; - }; + _traverse(items, transformer) + return context + } } diff --git a/src/index.ts b/src/index.ts index a091ab85..9ad8afc0 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ -export * from './hooks'; -export * from './utils'; -export * from './predicates'; +export * from './hooks/index.js' +export * from './utils/index.js' +export * from './predicates/index.js' -export * from './types'; +export * from './types.js' diff --git a/src/internal.utils.ts b/src/internal.utils.ts index 0636f7b5..dedcc085 100644 --- a/src/internal.utils.ts +++ b/src/internal.utils.ts @@ -1,9 +1,9 @@ export const hasOwnProperty = (obj: Record, ...keys: string[]): boolean => { - return keys.some(x => Object.prototype.hasOwnProperty.call(obj, x)); -}; + return keys.some(x => Object.prototype.hasOwnProperty.call(obj, x)) +} -export type MaybeArray = T | T[]; -export const toArray = (value: T | T[]): T[] => (Array.isArray(value) ? value : [value]); +export type MaybeArray = T | T[] +export const toArray = (value: T | T[]): T[] => (Array.isArray(value) ? value : [value]) -export type Promisable = T | Promise; -export type KeyOf = Extract; +export type Promisable = T | Promise +export type KeyOf = Extract diff --git a/src/predicates/every/every.test.ts b/src/predicates/every/every.test.ts index b3e65b2b..a6e7472d 100755 --- a/src/predicates/every/every.test.ts +++ b/src/predicates/every/every.test.ts @@ -1,14 +1,15 @@ -import { assert } from 'vitest'; -import { feathers, HookContext } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { iff } from '../../hooks'; -import { every } from './every'; -import { isNot } from '../not/not'; +import { assert } from 'vitest' +import type { HookContext } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { iff } from '../../hooks/index.js' +import { every } from './every.js' +import { not } from '../not/not.js' describe('predicates/every', () => { it('returns true synchronously when empty', () => { - assert.equal(every()({} as HookContext), true); - }); + assert.equal(every()({} as HookContext), true) + }) it('returns false synchronously when at least 1 hook is false', () => { expect( @@ -18,8 +19,8 @@ describe('predicates/every', () => { () => Promise.resolve(true), () => false, )({} as HookContext), - ).toBe(false); - }); + ).toBe(false) + }) it('returns true when all hooks are truthy', async () => { await expect( @@ -28,31 +29,31 @@ describe('predicates/every', () => { () => Promise.resolve(true), () => Promise.resolve(true), )({} as HookContext), - ).resolves.toBe(true); - }); + ).resolves.toBe(true) + }) it('rejects with the error', async () => { await expect( async () => await every(() => Promise.reject(new Error('errored')))({} as HookContext), - ).rejects.toThrow('errored'); - }); + ).rejects.toThrow('errored') + }) it('does not run all predicates when one is false', () => { - let ran = 0; + let ran = 0 const fn = () => { - ran++; - return false; - }; + ran++ + return false + } - expect(every(fn, fn, fn)({} as HookContext)).toBe(false); - expect(ran).toBe(1); - }); + expect(every(fn, fn, fn)({} as HookContext)).toBe(false) + expect(ran).toBe(1) + }) - let app: any; + let app: any beforeEach(() => { - app = feathers().use('/users', new MemoryService()); - }); + app = feathers().use('/users', new MemoryService()) + }) describe('when all hooks are truthy', () => { beforeEach(() => { @@ -62,7 +63,7 @@ describe('predicates/every', () => { iff( every( (_hook: any) => true, - // @ts-ignore + // @ts-expect-error TODO (_hook: any) => 1, (_hook: any) => {}, (_hook: any) => Promise.resolve(true), @@ -71,18 +72,18 @@ describe('predicates/every', () => { ), ], }, - }); - }); + }) + }) it('returns true', () => { return app .service('users') .find() .then((result: any) => { - assert.deepEqual(result, []); - }); - }); - }); + assert.deepEqual(result, []) + }) + }) + }) describe('when a hook throws an error', () => { beforeEach(() => { @@ -93,7 +94,7 @@ describe('predicates/every', () => { every( (_hook: any) => true, (_hook: any) => { - throw new Error('Hook 2 errored'); + throw new Error('Hook 2 errored') }, (_hook: any) => true, ), @@ -101,18 +102,18 @@ describe('predicates/every', () => { ), ], }, - }); - }); + }) + }) it('rejects with the error', () => { return app .service('users') .find() .catch((error: any) => { - assert.equal(error.message, 'Hook 2 errored'); - }); - }); - }); + assert.equal(error.message, 'Hook 2 errored') + }) + }) + }) describe('when a hook rejects with an error', () => { beforeEach(() => { @@ -129,18 +130,18 @@ describe('predicates/every', () => { ), ], }, - }); - }); + }) + }) it('rejects with the error', () => { return app .service('users') .find() .catch((error: any) => { - assert.equal(error.message, 'Hook 2 errored'); - }); - }); - }); + assert.equal(error.message, 'Hook 2 errored') + }) + }) + }) describe('when at least one hook is falsey', () => { beforeEach(() => { @@ -148,13 +149,13 @@ describe('predicates/every', () => { before: { all: [ iff( - isNot( + not( every( (_hook: any) => true, (_hook: any) => Promise.resolve(true), (_hook: any) => Promise.resolve(false), (_hook: any) => false, - // @ts-ignore + // @ts-expect-error TODO (_hook: any) => 0, (_hook: any) => null, (_hook: any) => undefined, @@ -165,16 +166,16 @@ describe('predicates/every', () => { ), ], }, - }); - }); + }) + }) it('returns false', () => { return app .service('users') .find() .catch((error: any) => { - assert.equal(error.message, 'A hook returned false'); - }); - }); - }); -}); + assert.equal(error.message, 'A hook returned false') + }) + }) + }) +}) diff --git a/src/predicates/every/every.ts b/src/predicates/every/every.ts index b969b841..85705f43 100755 --- a/src/predicates/every/every.ts +++ b/src/predicates/every/every.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { PredicateFn } from '../../types'; -import { isPromise } from '../../common'; +import type { HookContext } from '@feathersjs/feathers' +import type { PredicateFn } from '../../types.js' +import { isPromise } from '../../common/index.js' /** * Return the and of a series of sync or async predicate functions. @@ -12,24 +12,24 @@ export const every = if (!predicates.length) { // same as Array.prototype.every // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#description - return true; + return true } - const promises: Promise[] = []; + const promises: Promise[] = [] for (const predicate of predicates) { - const result = predicate(context); + const result = predicate(context) if (result === false) { - return false; + return false } else if (isPromise(result)) { - promises.push(result); + promises.push(result) } } if (!promises.length) { // no promises returned -> all predicates are sync and true - return true; + return true } - return Promise.all(promises).then(results => results.every(result => !!result)); - }; + return Promise.all(promises).then(results => results.every(result => !!result)) + } diff --git a/src/predicates/index.ts b/src/predicates/index.ts index 2fc5b9b5..e54ce11d 100644 --- a/src/predicates/index.ts +++ b/src/predicates/index.ts @@ -1,7 +1,7 @@ -export * from './every/every'; -export * from './is-context/is-context'; -export * from './is-multi/is-multi'; -export * from './is-paginated/is-paginated'; -export * from './is-provider/is-provider'; -export * from './not/not'; -export * from './some/some'; +export * from './every/every.js' +export * from './is-context/is-context.js' +export * from './is-multi/is-multi.js' +export * from './is-paginated/is-paginated.js' +export * from './is-provider/is-provider.js' +export * from './not/not.js' +export * from './some/some.js' diff --git a/src/predicates/is-context/is-context.ts b/src/predicates/is-context/is-context.ts index 56058833..2ddbee50 100644 --- a/src/predicates/is-context/is-context.ts +++ b/src/predicates/is-context/is-context.ts @@ -1,39 +1,40 @@ -import { HookType } from '@feathersjs/feathers'; -import { MethodName } from '../../types'; -import { MaybeArray, toArray } from '../../internal.utils'; +import type { HookType } from '@feathersjs/feathers' +import type { MethodName } from '../../types.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' export type IsContextOptions = { - path?: MaybeArray; - type?: MaybeArray; - method?: MaybeArray; -}; + path?: MaybeArray + type?: MaybeArray + method?: MaybeArray +} export const isContext = (options: IsContextOptions) => (context: any): boolean => { if (options.path != null) { - const path = toArray(options.path); + const path = toArray(options.path) if (!path.some(x => context.path.includes(x))) { - return false; + return false } } if (options.type != null) { - const type = toArray(options.type); + const type = toArray(options.type) if (!type.some(x => context.type === x)) { - return false; + return false } } if (options.method != null) { - const method = toArray(options.method); + const method = toArray(options.method) if (!method.some(x => context.method === x)) { - return false; + return false } } - return true; - }; + return true + } diff --git a/src/predicates/is-multi/is-multi.test.ts b/src/predicates/is-multi/is-multi.test.ts index 2895e8e0..c51505aa 100644 --- a/src/predicates/is-multi/is-multi.test.ts +++ b/src/predicates/is-multi/is-multi.test.ts @@ -1,5 +1,5 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { isMulti } from './is-multi'; +import type { HookContext } from '@feathersjs/feathers' +import { isMulti } from './is-multi.js' describe('predicates/isMulti', () => { it('returns true', function () { @@ -7,43 +7,43 @@ describe('predicates/isMulti', () => { const context = { method, type, - } as HookContext; + } as HookContext if (method === 'create') { - context.data = []; + context.data = [] } if (method === 'patch' || method === 'remove') { - context.id = null as any; + context.id = null as any } - return context; - }; - ['before', 'after', 'around'].forEach(type => { - ['find', 'create', 'patch', 'remove'].forEach(method => { - const context = makeContext(type, method); - assert.strictEqual(isMulti(context), true, `'${type}:${method}': returns true`); - }); - }); - }); + return context + } + ;['before', 'after', 'around'].forEach(type => { + ;['find', 'create', 'patch', 'remove'].forEach(method => { + const context = makeContext(type, method) + assert.strictEqual(isMulti(context), true, `'${type}:${method}': returns true`) + }) + }) + }) it('returns false', function () { const makeContext = (type: string, method: string) => { const context = { method, type, - } as HookContext; + } as HookContext if (method === 'create') { - context.data = {}; + context.data = {} } if (method === 'patch' || method === 'remove' || method === 'update') { - context.id = 0; + context.id = 0 } - return context; - }; - ['before', 'after', 'around'].forEach(type => { - ['get', 'create', 'update', 'patch', 'remove'].forEach(method => { - const context = makeContext(type, method); - assert.strictEqual(isMulti(context), false, `'${type}:${method}': returns false`); - }); - }); - }); -}); + return context + } + ;['before', 'after', 'around'].forEach(type => { + ;['get', 'create', 'update', 'patch', 'remove'].forEach(method => { + const context = makeContext(type, method) + assert.strictEqual(isMulti(context), false, `'${type}:${method}': returns false`) + }) + }) + }) +}) diff --git a/src/predicates/is-multi/is-multi.ts b/src/predicates/is-multi/is-multi.ts index 44d513ab..cf9b3cb6 100644 --- a/src/predicates/is-multi/is-multi.ts +++ b/src/predicates/is-multi/is-multi.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext } from '@feathersjs/feathers' /** * util to check if a hook is a multi hook: @@ -10,16 +10,16 @@ import type { HookContext } from '@feathersjs/feathers'; * - remove: `context.id == null` */ export const isMulti = (context: H): boolean => { - const { method } = context; + const { method } = context if (method === 'find') { - return true; + return true } else if (method === 'patch' || method === 'remove') { - return context.id == null; + return context.id == null } else if (method === 'create') { - return Array.isArray(context.data); + return Array.isArray(context.data) } else if (method === 'get' || method === 'update') { - return false; + return false } - return false; -}; + return false +} diff --git a/src/predicates/is-paginated/is-paginated.test.ts b/src/predicates/is-paginated/is-paginated.test.ts index bc9c680b..c303cc2f 100644 --- a/src/predicates/is-paginated/is-paginated.test.ts +++ b/src/predicates/is-paginated/is-paginated.test.ts @@ -1,5 +1,5 @@ -import { HookContext } from '@feathersjs/feathers'; -import { isPaginated } from './is-paginated'; +import type { HookContext } from '@feathersjs/feathers' +import { isPaginated } from './is-paginated.js' describe('predicates/isPaginated', () => { it('returns true for service.options.paginate', function () { @@ -8,7 +8,7 @@ describe('predicates/isPaginated', () => { default: 10, max: 50, }, - }; + } const paginate = isPaginated({ params: {}, @@ -16,10 +16,10 @@ describe('predicates/isPaginated', () => { options: serviceOptions, }, method: 'find', - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, true); - }); + assert.deepStrictEqual(paginate, true) + }) it('returns false for params.paginate: false', function () { const serviceOptions = { @@ -27,22 +27,22 @@ describe('predicates/isPaginated', () => { default: 10, max: 50, }, - }; + } const paginate = isPaginated({ params: { paginate: false }, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, false); - }); + assert.deepStrictEqual(paginate, false) + }) it('returns true for context.adapter.paginate', function () { const serviceOptions = { paginate: false, - }; + } const paginate = isPaginated({ params: { adapter: { paginate: { default: 20, max: 100 } } }, @@ -50,23 +50,23 @@ describe('predicates/isPaginated', () => { options: serviceOptions, }, method: 'find', - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, true); - }); + assert.deepStrictEqual(paginate, true) + }) it('returns false for no paginate', function () { const serviceOptions = { paginate: false, - }; + } const paginate = isPaginated({ params: {}, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, false); - }); -}); + assert.deepStrictEqual(paginate, false) + }) +}) diff --git a/src/predicates/is-paginated/is-paginated.ts b/src/predicates/is-paginated/is-paginated.ts index 0de967d5..e10efbd7 100644 --- a/src/predicates/is-paginated/is-paginated.ts +++ b/src/predicates/is-paginated/is-paginated.ts @@ -1,15 +1,15 @@ -import { HookContext } from '@feathersjs/feathers'; -import { getPaginate } from '../../utils/get-paginate/get-paginate'; +import type { HookContext } from '@feathersjs/feathers' +import { getPaginate } from '../../utils/get-paginate/get-paginate.js' /** * util to check if a hook is a paginated hook using `getPaginate` */ export const isPaginated = (context: H): boolean => { if (context.params.paginate === false || context.method !== 'find') { - return false; + return false } - const paginate = getPaginate(context); + const paginate = getPaginate(context) - return !!paginate; -}; + return !!paginate +} diff --git a/src/predicates/is-provider/is-provider.test.ts b/src/predicates/is-provider/is-provider.test.ts index 3e32f09f..a2ae55a4 100755 --- a/src/predicates/is-provider/is-provider.test.ts +++ b/src/predicates/is-provider/is-provider.test.ts @@ -1,95 +1,95 @@ -import { assert } from 'vitest'; -import { isProvider } from './is-provider'; -import { iff } from '../../hooks'; -import { clone, isPromise } from '../../common'; +import { assert } from 'vitest' +import { isProvider } from './is-provider.js' +import { iff } from '../../hooks/index.js' +import { clone, isPromise } from '../../common/index.js' -let hookServer: any; -let hookSocketio: any; +let hookServer: any +let hookSocketio: any -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; +let hook: any +let hookBefore: any +let hookAfter: any +let hookFcnSyncCalls: any const hookFcnSync = (hook: any) => { - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnSyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - return hook; -}; + return hook +} describe('predicates/isProvider', () => { beforeEach(() => { - hookServer = { type: 'before', method: 'create', params: { provider: '' } }; - hookSocketio = { type: 'before', method: 'create', params: { provider: 'socketio' } }; - }); + hookServer = { type: 'before', method: 'create', params: { provider: '' } } + hookSocketio = { type: 'before', method: 'create', params: { provider: 'socketio' } } + }) it('returns a function', () => { - const fcn = isProvider('server'); + const fcn = isProvider('server') - assert.isFunction(fcn); - }); + assert.isFunction(fcn) + }) it('gets passed the hook', () => { - const hook = clone(hookServer); - const result = isProvider('server')(hook); + const hook = clone(hookServer) + const result = isProvider('server')(hook) - assert.equal(result, true); - }); + assert.equal(result, true) + }) it('throws on no args', () => { - assert.throws(() => isProvider()); - }); + assert.throws(() => isProvider()) + }) it('finds provider with 1 arg', () => { - const hook = clone(hookSocketio); - const result = isProvider('socketio')(hook); + const hook = clone(hookSocketio) + const result = isProvider('socketio')(hook) - assert.equal(result, true); - }); + assert.equal(result, true) + }) it('finds provider with 2 args', () => { - const hook = clone(hookSocketio); - const result = isProvider('rest', 'socketio')(hook); + const hook = clone(hookSocketio) + const result = isProvider('rest', 'socketio')(hook) - assert.equal(result, true); - }); + assert.equal(result, true) + }) it('finds server', () => { - const hook = clone(hookServer); - const result = isProvider('rest', 'socketio', 'server')(hook); + const hook = clone(hookServer) + const result = isProvider('rest', 'socketio', 'server')(hook) - assert.equal(result, true); - }); + assert.equal(result, true) + }) it('finds external', () => { - const hook = clone(hookSocketio); - const result = isProvider('rest', 'server', 'external')(hook); + const hook = clone(hookSocketio) + const result = isProvider('rest', 'server', 'external')(hook) - assert.equal(result, true); - }); + assert.equal(result, true) + }) it('fails properly if not provider', () => { - const hook = clone(hookServer); - const result = isProvider('socketio')(hook); + const hook = clone(hookServer) + const result = isProvider('socketio')(hook) - assert.equal(result, false); - }); + assert.equal(result, false) + }) it('fails properly if not external', () => { - const hook = clone(hookServer); - const result = isProvider('external')(hook); + const hook = clone(hookServer) + const result = isProvider('external')(hook) - assert.equal(result, false); - }); + assert.equal(result, false) + }) it('fails properly if not server', () => { - const hook = clone(hookSocketio); - const result = isProvider('server')(hook); + const hook = clone(hookSocketio) + const result = isProvider('server')(hook) - assert.equal(result, false); - }); -}); + assert.equal(result, false) + }) +}) describe('services isProvider - works with iff', () => { beforeEach(() => { @@ -98,39 +98,37 @@ describe('services isProvider - works with iff', () => { method: 'create', data: { first: 'John' }, params: { provider: 'rest' }, - }; + } hookAfter = { type: 'before', method: 'create', data: { first: 'john' }, params: { provider: 'rest' }, - }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - }); + } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + }) it('calls sync hook function if truthy', () => { iff( isProvider('rest'), hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if falsey', () => { - const result = iff(isProvider('server'), hookFcnSync)(hook); + const result = iff(isProvider('server'), hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); -}); + }) +}) diff --git a/src/predicates/is-provider/is-provider.ts b/src/predicates/is-provider/is-provider.ts index 223d10f5..723e7e61 100755 --- a/src/predicates/is-provider/is-provider.ts +++ b/src/predicates/is-provider/is-provider.ts @@ -1,6 +1,6 @@ -import { MethodNotAllowed } from '@feathersjs/errors'; -import type { HookContext } from '@feathersjs/feathers'; -import type { TransportName } from '../../types'; +import { MethodNotAllowed } from '@feathersjs/errors' +import type { HookContext } from '@feathersjs/feathers' +import type { TransportName } from '../../types.js' /** * Check which transport provided the service call. @@ -8,17 +8,17 @@ import type { TransportName } from '../../types'; */ export function isProvider(...providers: TransportName[]) { if (!providers.length) { - throw new MethodNotAllowed('Calling isProvider predicate incorrectly.'); + throw new MethodNotAllowed('Calling isProvider predicate incorrectly.') } return (context: H): boolean => { - const hookProvider = context.params.provider; + const hookProvider = context.params.provider return providers.some( provider => provider === hookProvider || (provider === 'server' && !hookProvider) || (provider === 'external' && !!hookProvider), - ); - }; + ) + } } diff --git a/src/predicates/not/not.test.ts b/src/predicates/not/not.test.ts index 3e42bb69..8102f803 100755 --- a/src/predicates/not/not.test.ts +++ b/src/predicates/not/not.test.ts @@ -1,85 +1,85 @@ -import { assert } from 'vitest'; -import { iff } from '../../hooks'; -import { clone, isPromise } from '../../common'; -import { not } from './not'; -import { isProvider } from '../is-provider/is-provider'; - -let hookServer: any; -let hook: any; -let hookBefore: any; -let hookAfter: any; -let hookFcnSyncCalls: any; -let predicateCalls: any; +import { assert } from 'vitest' +import { iff } from '../../hooks/index.js' +import { clone, isPromise } from '../../common/index.js' +import { not } from './not.js' +import { isProvider } from '../is-provider/is-provider.js' + +let hookServer: any +let hook: any +let hookBefore: any +let hookAfter: any +let hookFcnSyncCalls: any +let predicateCalls: any const predicateSync = (value: any) => () => { - predicateCalls = +1; - return value; -}; + predicateCalls = +1 + return value +} const predicateAsync = (value: T) => () => new Promise(resolve => { - predicateCalls = +1; - return resolve(value); - }); + predicateCalls = +1 + return resolve(value) + }) const hookFcnSync = (hook: any) => { - hookFcnSyncCalls = +1; - hook.data.first = hook.data.first.toLowerCase(); + hookFcnSyncCalls = +1 + hook.data.first = hook.data.first.toLowerCase() - return hook; -}; + return hook +} describe('predicates/not', () => { beforeEach(() => { - hookServer = { type: 'before', method: 'create', params: { provider: '' } }; - predicateCalls = 0; - }); + hookServer = { type: 'before', method: 'create', params: { provider: '' } } + predicateCalls = 0 + }) it('negates a sync function 1', () => { - const hook = clone(hookServer); - const result = not(predicateSync(true))(hook); + const hook = clone(hookServer) + const result = not(predicateSync(true))(hook) - assert.equal(predicateCalls, 1); - assert.equal(result, false); - }); + assert.equal(predicateCalls, 1) + assert.equal(result, false) + }) it('negates a sync function 2', () => { - const hook = clone(hookServer); - const result = not(predicateSync(false))(hook); + const hook = clone(hookServer) + const result = not(predicateSync(false))(hook) - assert.equal(predicateCalls, 1); - assert.equal(result, true); - }); + assert.equal(predicateCalls, 1) + assert.equal(result, true) + }) it('negates an async function 1', async () => { - const hook = clone(hookServer); + const hook = clone(hookServer) await not(predicateAsync(true))(hook) - // @ts-ignore + // @ts-expect-error TODO .then((result: any) => { - assert.equal(predicateCalls, 1); - assert.equal(result, false); + assert.equal(predicateCalls, 1) + assert.equal(result, false) }) .catch(() => { - assert.fail('unexpected catch'); - }); - }); + assert.fail('unexpected catch') + }) + }) it('negates an async function 2', async () => { - const hook = clone(hookServer); + const hook = clone(hookServer) await not(predicateAsync(false))(hook) - // @ts-ignore + // @ts-expect-error TODO .then((result: any) => { - assert.equal(predicateCalls, 1); - assert.equal(result, true); + assert.equal(predicateCalls, 1) + assert.equal(result, true) }) .catch(() => { - assert.fail('unexpected catch'); - }); - }); -}); + assert.fail('unexpected catch') + }) + }) +}) describe('services not - works with iff and isProvider', () => { beforeEach(() => { @@ -88,39 +88,37 @@ describe('services not - works with iff and isProvider', () => { method: 'create', data: { first: 'John' }, params: { provider: 'rest' }, - }; + } hookAfter = { type: 'before', method: 'create', data: { first: 'john' }, params: { provider: 'rest' }, - }; - hook = clone(hookBefore); - hookFcnSyncCalls = 0; - }); + } + hook = clone(hookBefore) + hookFcnSyncCalls = 0 + }) it('calls sync hook function if truthy', () => { iff( not(isProvider('server')), hookFcnSync, - )(hook) - // @ts-ignore - .then((hook: any) => { - assert.deepEqual(hook, hookAfter); - assert.equal(hookFcnSyncCalls, 1); - assert.deepEqual(hook, hookAfter); - }); - }); + )(hook).then((hook: any) => { + assert.deepEqual(hook, hookAfter) + assert.equal(hookFcnSyncCalls, 1) + assert.deepEqual(hook, hookAfter) + }) + }) it('does not call sync hook function if falsey', () => { - const result = iff(not(isProvider('rest')), hookFcnSync)(hook); + const result = iff(not(isProvider('rest')), hookFcnSync)(hook) if (isPromise(result)) { - assert.fail('promise unexpectedly returned'); + assert.fail('promise unexpectedly returned') } else { - assert.deepEqual(result, hookBefore); - assert.equal(hookFcnSyncCalls, 0); - assert.deepEqual(hook, hookBefore); + assert.deepEqual(result, hookBefore) + assert.equal(hookFcnSyncCalls, 0) + assert.deepEqual(hook, hookBefore) } - }); -}); + }) +}) diff --git a/src/predicates/not/not.ts b/src/predicates/not/not.ts index 785fbca7..b4889d66 100755 --- a/src/predicates/not/not.ts +++ b/src/predicates/not/not.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { isPromise } from '../../common'; -import type { PredicateFn } from '../../types'; +import type { HookContext } from '@feathersjs/feathers' +import { isPromise } from '../../common/index.js' +import type { PredicateFn } from '../../types.js' /** * Negate a predicate function. @@ -10,11 +10,11 @@ import type { PredicateFn } from '../../types'; export const not = (predicate: PredicateFn): PredicateFn => (context: H) => { - const result = predicate(context); + const result = predicate(context) if (!isPromise(result)) { - return !result; + return !result } - return result.then(result1 => !result1); - }; + return result.then(result1 => !result1) + } diff --git a/src/predicates/some/some.test.ts b/src/predicates/some/some.test.ts index 8290b582..1e1c22f8 100755 --- a/src/predicates/some/some.test.ts +++ b/src/predicates/some/some.test.ts @@ -1,11 +1,11 @@ -import { assert, expect } from 'vitest'; -import { HookContext } from '@feathersjs/feathers'; -import { some } from './some'; +import { expect } from 'vitest' +import type { HookContext } from '@feathersjs/feathers' +import { some } from './some.js' describe('predicates/some', () => { it('returns true synchronously when empty', () => { - expect(some()({} as HookContext)).toBe(true); - }); + expect(some()({} as HookContext)).toBe(true) + }) it('returns true synchronously when at least 1 hook is true', () => { expect( @@ -16,8 +16,8 @@ describe('predicates/some', () => { () => Promise.resolve(true), () => true, )({} as HookContext), - ).toBe(true); - }); + ).toBe(true) + }) it('returns true when at least 1 async hook is true', async () => { expect( @@ -26,25 +26,25 @@ describe('predicates/some', () => { () => Promise.resolve(false), () => Promise.resolve(true), )({} as HookContext), - ).resolves.toBe(true); - }); + ).resolves.toBe(true) + }) it('rejects with the error', async () => { await expect( async () => await some(() => Promise.reject(new Error('errored')))({} as HookContext), - ).rejects.toThrow('errored'); - }); + ).rejects.toThrow('errored') + }) it('does not run all predicates when one is true', () => { - let ran = 0; + let ran = 0 const fn = () => { - ran++; - return true; - }; + ran++ + return true + } - expect(some(fn, fn, fn)({} as HookContext)).toBe(true); - expect(ran).toBe(1); - }); + expect(some(fn, fn, fn)({} as HookContext)).toBe(true) + expect(ran).toBe(1) + }) it('when all hooks are falsey', async () => { await expect( @@ -56,6 +56,6 @@ describe('predicates/some', () => { () => undefined, () => 0, )({} as HookContext), - ).resolves.toBe(false); - }); -}); + ).resolves.toBe(false) + }) +}) diff --git a/src/predicates/some/some.ts b/src/predicates/some/some.ts index 0357ae12..ce29c2e0 100755 --- a/src/predicates/some/some.ts +++ b/src/predicates/some/some.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { PredicateFn } from '../../types'; -import { isPromise } from '../../common'; +import type { HookContext } from '@feathersjs/feathers' +import type { PredicateFn } from '../../types.js' +import { isPromise } from '../../common/index.js' /** * Return the or of a series of sync or async predicate functions. @@ -12,27 +12,27 @@ export const some = if (!predicates.length) { // same as Array.prototype.some // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#description - return true; + return true } - const promises: Promise[] = []; + const promises: Promise[] = [] for (const predicate of predicates) { - const result = predicate(context); + const result = predicate(context) if (result === true) { - return true; + return true } else if (result === false) { - continue; + continue } else if (isPromise(result)) { - promises.push(result); + promises.push(result) } } if (!promises.length) { // no promises returned -> all predicates are sync and false - return false; + return false } - return Promise.all(promises).then(results => results.some(result => !!result)); - }; + return Promise.all(promises).then(results => results.some(result => !!result)) + } diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts new file mode 100644 index 00000000..7b502f52 --- /dev/null +++ b/src/resolvers/index.ts @@ -0,0 +1,3 @@ +export * from './resolve-data.js' +export * from './resolve-query.js' +export * from './resolve-result.js' diff --git a/src/hooks/resolvers/resolve-data.ts b/src/resolvers/resolve-data.ts similarity index 68% rename from src/hooks/resolvers/resolve-data.ts rename to src/resolvers/resolve-data.ts index d980895e..2b04760f 100644 --- a/src/hooks/resolvers/resolve-data.ts +++ b/src/resolvers/resolve-data.ts @@ -1,5 +1,6 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { Resolver, runResolvers } from './resolvers.internal'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { Resolver } from './resolvers.internal.js' +import { runResolvers } from './resolvers.internal.js' export const resolveData = , H extends HookContext = HookContext>( @@ -7,22 +8,22 @@ export const resolveData = ) => async (context: H, next?: NextFunction) => { if (context.data !== undefined) { - const data = context.data; + 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); + context.data = await runResolvers(resolvers, data, context, status) } } if (typeof next === 'function') { - return next(); + return next() } - }; + } diff --git a/src/hooks/resolvers/resolve-query.ts b/src/resolvers/resolve-query.ts similarity index 59% rename from src/hooks/resolvers/resolve-query.ts rename to src/resolvers/resolve-query.ts index 357e0e7f..28b0b7a6 100644 --- a/src/hooks/resolvers/resolve-query.ts +++ b/src/resolvers/resolve-query.ts @@ -1,18 +1,18 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { type Resolver, runResolvers } from './resolvers.internal'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { type Resolver, runResolvers } from './resolvers.internal.js' export const resolveQuery = (...resolvers: Resolver[]) => async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {}; - const query = await runResolvers(resolvers, data, context); + const data = context?.params?.query || {} + const query = await runResolvers(resolvers, data, context) context.params = { ...context.params, query, - }; + } if (typeof next === 'function') { - return next(); + return next() } - }; + } diff --git a/src/hooks/resolvers/resolve-result.ts b/src/resolvers/resolve-result.ts similarity index 61% rename from src/hooks/resolvers/resolve-result.ts rename to src/resolvers/resolve-result.ts index 4d14056d..0304abb3 100644 --- a/src/hooks/resolvers/resolve-result.ts +++ b/src/resolvers/resolve-result.ts @@ -1,19 +1,20 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { getResult, Resolver, runResolvers } from './resolvers.internal'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { Resolver } from './resolvers.internal.js' +import { getResult, runResolvers } from './resolvers.internal.js' export const resolveResult = (...resolvers: Resolver[]) => { return async (context: H, next: NextFunction) => { if (typeof next !== 'function') { - throw new Error('The resolveResult hook must be used as an around hook'); + throw new Error('The resolveResult hook must be used as an around hook') } - const { $resolve, $select, ...query } = context.params?.query || {}; + const { $resolve, $select, ...query } = context.params?.query || {} const resolve = { originalContext: context, ...context.params.resolve, properties: $resolve || $select, - }; + } context.params = { ...context.params, @@ -21,23 +22,23 @@ export const resolveResult = (...resolvers: Resolver runResolvers(resolvers, current, context, status)), ) - : await runResolvers(resolvers, data, context, status); + : await runResolvers(resolvers, data, context, status) if (isPaginated) { - context.result.data = result; + context.result.data = result } else { - context.result = result; + context.result = result } - }; -}; + } +} diff --git a/src/hooks/resolvers/resolver.test.ts b/src/resolvers/resolver.test.ts similarity index 61% rename from src/hooks/resolvers/resolver.test.ts rename to src/resolvers/resolver.test.ts index e225f108..1dd709d0 100644 --- a/src/hooks/resolvers/resolver.test.ts +++ b/src/resolvers/resolver.test.ts @@ -1,13 +1,13 @@ -import assert from 'assert'; -import { BadRequest } from '@feathersjs/errors'; -import { resolveData } from './resolve-data'; -import { HookContext } from '@feathersjs/feathers'; +import assert from 'node:assert' +import { BadRequest } from '@feathersjs/errors' +import { resolveData } from './resolve-data.js' +import type { HookContext } from '@feathersjs/feathers' type User = { - firstName: string; - lastName: string; - password: string; -}; + firstName: string + lastName: string + password: string +} describe('resolve', () => { it('simple resolver', async () => { @@ -16,48 +16,48 @@ describe('resolve', () => { firstName: 'Dave', lastName: 'L.', }, - } as unknown as HookContext; + } as unknown as HookContext const resolver = resolveData({ 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'); + assert.deepStrictEqual(ctx, context) + assert.deepStrictEqual(status.path, ['name']) + assert.strictEqual(typeof status.stack[0], 'function') - return `${user.firstName} ${user.lastName}`; + return `${user.firstName} ${user.lastName}` }, - }); + }) - const u = await await resolver(context); + const u = await await resolver(context) assert.deepStrictEqual(u.data, { firstName: 'Dave', lastName: 'L.', name: 'Dave L.', - }); - }); + }) + }) 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`); + throw new Error(`No ${value}s allowed`) } - return value; + return value }, age: async value => { if (value && value < 18) { - throw new BadRequest('Invalid age'); + throw new BadRequest('Invalid age') } - return value; + return value }, }, - }); + }) assert.rejects( () => @@ -83,26 +83,26 @@ describe('resolve', () => { }, }, }, - ); - }); + ) + }) it('empty resolver returns original data', async () => { const resolver = resolve({ properties: {}, - }); - const data = { message: 'Hello' }; - const resolved = await resolver.resolve(data, {}); + }) + const data = { message: 'Hello' } + const resolved = await resolver.resolve(data, {}) - assert.strictEqual(data, resolved); - }); + assert.strictEqual(data, resolved) + }) it('empty resolver still allows to select properties', async () => { - const data = { message: 'Hello', name: 'David' }; + const data = { message: 'Hello', name: 'David' } const resolver = resolve({ properties: {}, - }); - const resolved = await resolver.resolve(data, {}, { properties: ['message'] }); + }) + const resolved = await resolver.resolve(data, {}, { properties: ['message'] }) - assert.deepStrictEqual(resolved, { message: 'Hello' }); - }); -}); + assert.deepStrictEqual(resolved, { message: 'Hello' }) + }) +}) diff --git a/src/hooks/resolvers/resolvers.internal.ts b/src/resolvers/resolvers.internal.ts similarity index 68% rename from src/hooks/resolvers/resolvers.internal.ts rename to src/resolvers/resolvers.internal.ts index e424a94a..06f3462e 100644 --- a/src/hooks/resolvers/resolvers.internal.ts +++ b/src/resolvers/resolvers.internal.ts @@ -1,13 +1,13 @@ -import { BadRequest } from '@feathersjs/errors'; -import { HookContext } from '@feathersjs/feathers'; -import { Promisable } from '../../internal.utils'; +import { BadRequest } from '@feathersjs/errors' +import type { HookContext } from '@feathersjs/feathers' +import type { Promisable } from '../internal.utils.js' export type ResolverProperty = ( value: V | undefined, obj: T, context: C, status: ResolverStatus, -) => Promisable; +) => Promisable export type Resolver = { [key in string]: ResolverProperty< @@ -15,20 +15,20 @@ export type Resolver = { key extends keyof T ? T[key] : undefined, C, key extends keyof T ? T[key] : any - >; -}; + > +} export type ResolverConverter = ( obj: any, context: C, status: ResolverStatus, -) => Promisable; +) => Promisable export interface ResolverStatus { - path: string[]; - originalContext?: C; - properties?: (keyof T)[]; - stack: ResolverProperty[]; + path: string[] + originalContext?: C + properties?: (keyof T)[] + stack: ResolverProperty[] } const resolveProperty = async ( @@ -38,22 +38,22 @@ const resolveProperty = async ( context: C, status: Partial> = {}, ): Promise => { - const value = (data as any)[name]; - const { path = [], stack = [] } = status || {}; + const value = (data as any)[name] + const { path = [], stack = [] } = status || {} // This prevents circular dependencies if (stack.includes(resolver)) { - return undefined as any; + return undefined as any } const resolverStatus = { ...status, path: [...path, name as string], stack: [...stack, resolver], - }; + } - return await resolver(value, data as any, context, resolverStatus); -}; + return await resolver(value, data as any, context, resolverStatus) +} const resolve = async , C>( resolver: Resolver, @@ -61,56 +61,56 @@ const resolve = async , C>( context: C, status?: Partial>, ): Promise => { - const propertyNames = Object.keys(resolver) as any as (keyof T)[]; + const propertyNames = Object.keys(resolver) as any as (keyof T)[] 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(propertyNames as string[]))] - ) as (keyof T)[]; + ) as (keyof T)[] - const result: any = {}; - const errors: any = {}; - let hasErrors = false; + 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]; + const value = (data as any)[name] if (name in resolver) { - const resolverProperty = resolver[name]; + const resolverProperty = resolver[name] try { - const resolved = await resolveProperty(resolverProperty, name, data, context, status); + const resolved = await resolveProperty(resolverProperty, name, data, context, status) if (resolved !== undefined) { - result[name] = resolved; + result[name] = resolved } } catch (error: any) { // TODO add error stacks const convertedError = typeof error.toJSON === 'function' ? error.toJSON() - : { message: error.message || error }; + : { message: error.message || error } - errors[name] = convertedError; - hasErrors = true; + errors[name] = convertedError + hasErrors = true } } else if (value !== undefined) { - result[name] = value; + result[name] = value } }), - ); + ) if (hasErrors) { - const propertyName = status?.properties ? ` ${status.properties.join('.')}` : ''; + const propertyName = status?.properties ? ` ${status.properties.join('.')}` : '' - throw new BadRequest('Error resolving data' + (propertyName ? ` ${propertyName}` : ''), errors); + throw new BadRequest('Error resolving data' + (propertyName ? ` ${propertyName}` : ''), errors) } - return result; -}; + return result +} export const runResolvers = async ( resolvers: Resolver[], @@ -118,18 +118,18 @@ export const runResolvers = async ( ctx: H, status?: Partial>, ) => { - let current: any = data; + let current: any = data for (const resolver of resolvers) { - current = await resolve(resolver, current, ctx, status); + current = await resolve(resolver, current, ctx, status) } - return current as T; -}; + return current as T +} export const getResult = (context: H) => { - const isPaginated = context.method === 'find' && context.result.data; - const data = isPaginated ? context.result.data : context.result; + const isPaginated = context.method === 'find' && context.result.data + const data = isPaginated ? context.result.data : context.result - return { isPaginated, data }; -}; + return { isPaginated, data } +} diff --git a/src/types.ts b/src/types.ts index 7fbbcc67..2e458744 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,34 +1,30 @@ -import type { HookContext, Params } from '@feathersjs/feathers'; +import type { HookContext, Params } from '@feathersjs/feathers' -export const hookTypes = ['around', 'before', 'after', 'error'] as const; -export type HookType = (typeof hookTypes)[number]; +export const hookTypes = ['around', 'before', 'after', 'error'] as const +export type HookType = (typeof hookTypes)[number] -export const methodNames = ['find', 'get', 'create', 'update', 'patch', 'remove'] as const; -export type MethodName = (typeof methodNames)[number] | ({} & string); // allow custom methods +export const methodNames = ['find', 'get', 'create', 'update', 'patch', 'remove'] as const +export type MethodName = (typeof methodNames)[number] | ({} & string) // allow custom methods -export type TransportName = 'socketio' | 'rest' | 'external' | 'server'; +export type TransportName = 'socketio' | 'rest' | 'external' | 'server' -export type SyncContextFunction = (context: H) => T; +export type SyncContextFunction = (context: H) => T export type AsyncContextFunction = ( context: H, -) => Promise; -export type ContextFunction = ( - context: H, -) => T | Promise; +) => Promise +export type ContextFunction = (context: H) => T | Promise -export type SyncPredicateFn = (context: H) => boolean; -export type AsyncPredicateFn = ( - context: H, -) => Promise; +export type SyncPredicateFn = (context: H) => boolean +export type AsyncPredicateFn = (context: H) => Promise export type PredicateFn = ( context: H, -) => boolean | Promise; +) => boolean | Promise export declare type HookFunction = ( context: H, -) => Promise | H | void; +) => Promise | H | void -export type TransformParamsFn

= (params: P) => P | void; +export type TransformParamsFn

= (params: P) => P | void -export type DispatchOption = boolean | 'both'; +export type DispatchOption = boolean | 'both' diff --git a/src/utils/calling-params/calling-params-1.test.ts b/src/utils/calling-params/calling-params-1.test.ts index c70879e8..85e0760a 100755 --- a/src/utils/calling-params/calling-params-1.test.ts +++ b/src/utils/calling-params/calling-params-1.test.ts @@ -1,10 +1,10 @@ -import { assert } from 'vitest'; -import { callingParamsDefaults, callingParams } from './calling-params'; +import { assert } from 'vitest' +import { callingParamsDefaults, callingParams } from './calling-params.js' -let context1: any; -let context2: any; -let context3: any; -let context4: any; +let context1: any +let context2: any +let context3: any +let context4: any describe('util calling-params-1.test.js', () => { describe('has defaults', () => { @@ -18,7 +18,7 @@ describe('util calling-params-1.test.js', () => { authenticated: true, provider: 'socketio', }, - }; + } context2 = { params: { query: { aaa: 'bbb' }, @@ -27,7 +27,7 @@ describe('util calling-params-1.test.js', () => { user: { name: 'Matt' }, authenticated: true, }, - }; + } context3 = { params: { query: { aaa: 'bbb' }, @@ -37,7 +37,7 @@ describe('util calling-params-1.test.js', () => { authenticated: true, provider: undefined, }, - }; + } context4 = { params: { query: { aaa: 'bbb' }, @@ -47,33 +47,33 @@ describe('util calling-params-1.test.js', () => { authenticated: true, provider: null, }, - }; - }); + } + }) it('standard defaults', () => { - const res = callingParams()(context1); - // @ts-ignore - assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: 'socketio' }); - }); + const res = callingParams()(context1) + // @ts-expect-error TODO + assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: 'socketio' }) + }) it('ignores missing', () => { - const res = callingParams()(context2); - // @ts-ignore - assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true }); - }); + const res = callingParams()(context2) + // @ts-expect-error TODO + assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true }) + }) it('ignores undefined', () => { - const res = callingParams()(context3); - // @ts-ignore - assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true }); - }); + const res = callingParams()(context3) + // @ts-expect-error TODO + assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true }) + }) it('does not ignore null', () => { - const res = callingParams()(context4); - // @ts-ignore - assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: null }); - }); - }); + const res = callingParams()(context4) + // @ts-expect-error TODO + assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: null }) + }) + }) describe('can reset defaults', () => { beforeEach(() => { @@ -86,50 +86,50 @@ describe('util calling-params-1.test.js', () => { authenticated: true, provider: 'socketio', }, - }; + } - callingParamsDefaults(['provider', 'authenticated', 'user'], {}); - }); + callingParamsDefaults(['provider', 'authenticated', 'user'], {}) + }) it('check reset to standard defaults', () => { - const res = callingParams()(context1); - // @ts-ignore - assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: 'socketio' }); - }); + const res = callingParams()(context1) + // @ts-expect-error TODO + assert.deepEqual(res, { user: { name: 'Matt' }, authenticated: true, provider: 'socketio' }) + }) it('change default propNames', () => { - callingParamsDefaults(['foo', 'user.name', 'query.aaa']); - const res = callingParams()(context1); - // @ts-ignore - assert.deepEqual(res, { foo: 'bar', user: { name: 'Matt' }, query: { aaa: 'bbb' } }); - }); + callingParamsDefaults(['foo', 'user.name', 'query.aaa']) + const res = callingParams()(context1) + // @ts-expect-error TODO + assert.deepEqual(res, { foo: 'bar', user: { name: 'Matt' }, query: { aaa: 'bbb' } }) + }) it('change default props', () => { - // @ts-ignore - callingParamsDefaults(null, { bar: 'foo' }); - const res = callingParams()(context1); + // @ts-expect-error TODO + callingParamsDefaults(null, { bar: 'foo' }) + const res = callingParams()(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO user: { name: 'Matt' }, authenticated: true, provider: 'socketio', bar: 'foo', - }); - }); + }) + }) it('change both defaults', () => { - callingParamsDefaults(['foo', 'user.name', 'query.aaa'], { bar: 'foo', qqq: 'rrr' }); - const res = callingParams()(context1); + callingParamsDefaults(['foo', 'user.name', 'query.aaa'], { bar: 'foo', qqq: 'rrr' }) + const res = callingParams()(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO foo: 'bar', user: { name: 'Matt' }, query: { aaa: 'bbb' }, bar: 'foo', qqq: 'rrr', - }); - }); - }); + }) + }) + }) describe('can call', () => { beforeEach(() => { @@ -142,103 +142,103 @@ describe('util calling-params-1.test.js', () => { authenticated: true, provider: 'socketio', }, - }; + } - callingParamsDefaults(['provider', 'authenticated', 'user'], {}); - }); + callingParamsDefaults(['provider', 'authenticated', 'user'], {}) + }) it('default call made by common hooks', () => { - const res = callingParams()(context1); + const res = callingParams()(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO authenticated: true, provider: 'socketio', user: { name: 'Matt' }, - }); - }); + }) + }) it('with query', () => { const res = callingParams({ query: { id: 1 }, - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO authenticated: true, provider: 'socketio', user: { name: 'Matt' }, query: { id: 1 }, - }); - }); + }) + }) it('with propNames', () => { const res = callingParams({ propNames: ['foo', 'baz', 'query.aa', 'query.cc'], - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO authenticated: true, provider: 'socketio', user: { name: 'Matt' }, foo: 'bar', baz: 'faz', query: { aa: 'a1' }, - }); - }); + }) + }) it('disable 1 hook', () => { const res = callingParams({ hooksToDisable: ['populate'], - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO authenticated: true, provider: 'socketio', user: { name: 'Matt' }, _populate: 'skip', - }); - }); + }) + }) it('disable multiple hooks', () => { const res = callingParams({ hooksToDisable: ['populate', 'fastJoin', 'softDelete', 'stashBefore'], - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO authenticated: true, provider: 'socketio', user: { name: 'Matt' }, _populate: 'skip', disableStashBefore: true, query: { $disableSoftDelete: true }, - }); - }); + }) + }) it('ignore defaults', () => { let res = callingParams({ ignoreDefaults: true, - })(context1); - assert.deepEqual(res, {}); + })(context1) + assert.deepEqual(res, {}) res = callingParams({ propNames: ['foo', 'baz', 'query.aa', 'query.cc'], ignoreDefaults: true, - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO foo: 'bar', baz: 'faz', query: { aa: 'a1' }, - }); - }); + }) + }) it('with multiple options', () => { const res = callingParams({ query: { id: 1 }, propNames: ['foo', 'baz', 'query.aa', 'query.cc'], hooksToDisable: ['populate', 'fastJoin', 'softDelete', 'stashBefore'], - })(context1); + })(context1) assert.deepEqual(res, { - // @ts-ignore + // @ts-expect-error TODO disableStashBefore: true, query: { id: 1, aa: 'a1', $disableSoftDelete: true }, foo: 'bar', @@ -247,7 +247,7 @@ describe('util calling-params-1.test.js', () => { user: { name: 'Matt' }, authenticated: true, provider: 'socketio', - }); - }); - }); -}); + }) + }) + }) +}) diff --git a/src/utils/calling-params/calling-params-2.test.ts b/src/utils/calling-params/calling-params-2.test.ts index 1b0b2e8a..c7df200e 100755 --- a/src/utils/calling-params/calling-params-2.test.ts +++ b/src/utils/calling-params/calling-params-2.test.ts @@ -1,7 +1,7 @@ -import { assert } from 'vitest'; -import { makeCallingParams } from './calling-params'; +import { assert } from 'vitest' +import { makeCallingParams } from './calling-params.js' -let context: any; +let context: any describe('util calling-params-2.test.js', () => { beforeEach(() => { @@ -14,59 +14,59 @@ describe('util calling-params-2.test.js', () => { authenticated: true, provider: 'socketio', }, - }; - }); + } + }) it('retains default context', () => { - const res: any = makeCallingParams(context); + const res: any = makeCallingParams(context) assert.deepEqual(res, { _populate: 'skip', user: { name: 'Matt' }, authenticated: true, provider: 'socketio', - }); - }); + }) + }) it('sets query', () => { - const res: any = makeCallingParams(context, { a: 1 }); + const res: any = makeCallingParams(context, { a: 1 }) assert.deepEqual(res, { query: { a: 1 }, _populate: 'skip', user: { name: 'Matt' }, authenticated: true, provider: 'socketio', - }); - }); + }) + }) it('sets include string', () => { - const res: any = makeCallingParams(context, null, 'foo'); - assert.deepEqual(res, { foo: 'bar', _populate: 'skip' }); - }); + const res: any = makeCallingParams(context, null, 'foo') + assert.deepEqual(res, { foo: 'bar', _populate: 'skip' }) + }) it('sets include array', () => { - const res: any = makeCallingParams(context, null, ['foo', 'baz']); - assert.deepEqual(res, { foo: 'bar', baz: 'faz', _populate: 'skip' }); - }); + const res: any = makeCallingParams(context, null, ['foo', 'baz']) + assert.deepEqual(res, { foo: 'bar', baz: 'faz', _populate: 'skip' }) + }) it('sets include skip missing names', () => { - const res: any = makeCallingParams(context, null, ['foo', 'baz', 'x']); - assert.deepEqual(res, { foo: 'bar', baz: 'faz', _populate: 'skip' }); - }); + const res: any = makeCallingParams(context, null, ['foo', 'baz', 'x']) + assert.deepEqual(res, { foo: 'bar', baz: 'faz', _populate: 'skip' }) + }) it('injects', () => { - // @ts-ignore - const res: any = makeCallingParams(context, null, null, { aa: 2 }); - assert.deepEqual(res, { aa: 2, _populate: 'skip' }); - }); + // @ts-expect-error TODO + const res: any = makeCallingParams(context, null, null, { aa: 2 }) + assert.deepEqual(res, { aa: 2, _populate: 'skip' }) + }) it('injects overwrites _populate', () => { - // @ts-ignore - const res: any = makeCallingParams(context, null, null, { _populate: false }); - assert.deepEqual(res, { _populate: false }); - }); + // @ts-expect-error TODO + const res: any = makeCallingParams(context, null, null, { _populate: false }) + assert.deepEqual(res, { _populate: false }) + }) it('all work together', () => { - const res: any = makeCallingParams(context, { a: 1 }, ['foo', 'baz', 'x'], { aa: 2 }); - assert.deepEqual(res, { query: { a: 1 }, foo: 'bar', baz: 'faz', aa: 2, _populate: 'skip' }); - }); -}); + const res: any = makeCallingParams(context, { a: 1 }, ['foo', 'baz', 'x'], { aa: 2 }) + assert.deepEqual(res, { query: { a: 1 }, foo: 'bar', baz: 'faz', aa: 2, _populate: 'skip' }) + }) +}) diff --git a/src/utils/calling-params/calling-params.ts b/src/utils/calling-params/calling-params.ts index 8a1e08b8..1de76d3f 100755 --- a/src/utils/calling-params/calling-params.ts +++ b/src/utils/calling-params/calling-params.ts @@ -1,6 +1,6 @@ -import type { HookContext, Params } from '@feathersjs/feathers'; -import _get from 'lodash/get.js'; -import _set from 'lodash/set.js'; +import type { HookContext, Params } from '@feathersjs/feathers' +import _get from 'lodash/get.js' +import _set from 'lodash/set.js' export type Disablable = | 'populate' @@ -8,37 +8,37 @@ export type Disablable = | 'ignoreDeletedAt' | 'softDelete' | 'softDelete2' - | 'stashBefore'; + | 'stashBefore' export interface CallingParamsOptions { /** * The params.query for the calling params. */ - query?: any; + query?: any /** * The names of the props in context.params to include in the new params. */ - propNames?: string[]; + propNames?: string[] /** * Additional props to add to the new params. */ - newProps?: any; + newProps?: any /** * The names of hooks to disable during the service call. populate, fastJoin, softDelete and stashBefore are supported. */ - hooksToDisable?: Disablable[] | Disablable; + hooksToDisable?: Disablable[] | Disablable /** * Ignore the defaults propNames and newProps. */ - ignoreDefaults?: boolean; + ignoreDefaults?: boolean } -const stndAuthProps = ['provider', 'authenticated', 'user']; // feathers-authentication +const stndAuthProps = ['provider', 'authenticated', 'user'] // feathers-authentication // App wide defaults const defaults = { propNames: stndAuthProps, newProps: {}, -}; +} /** * Set defaults for building params for service calls with callingParams. (Utility function.) @@ -46,11 +46,11 @@ const defaults = { */ export function callingParamsDefaults(propNames: string[], newProps?: any): void { if (propNames) { - defaults.propNames = Array.isArray(propNames) ? propNames : [propNames]; + defaults.propNames = Array.isArray(propNames) ? propNames : [propNames] } if (newProps) { - defaults.newProps = newProps; + defaults.newProps = newProps } } @@ -67,53 +67,53 @@ export const callingParams = ignoreDefaults, }: CallingParamsOptions = {}) => (context: H) => { - propNames = Array.isArray(propNames) ? propNames : [propNames]; - hooksToDisable = Array.isArray(hooksToDisable) ? hooksToDisable : [hooksToDisable]; + propNames = Array.isArray(propNames) ? propNames : [propNames] + hooksToDisable = Array.isArray(hooksToDisable) ? hooksToDisable : [hooksToDisable] - const newParams: Params = query ? { query } : {}; - const allPropNames = ignoreDefaults ? propNames : [...defaults.propNames, ...propNames]; + const newParams: Params = query ? { query } : {} + const allPropNames = ignoreDefaults ? propNames : [...defaults.propNames, ...propNames] allPropNames.forEach(name => { if (name) { // for makeCallingParams compatibility - const value = _get(context.params, name); + const value = _get(context.params, name) if (value !== undefined) { - _set(newParams, name, value); + _set(newParams, name, value) } } - }); + }) - Object.assign(newParams, ignoreDefaults ? {} : defaults.newProps, newProps); + Object.assign(newParams, ignoreDefaults ? {} : defaults.newProps, newProps) hooksToDisable.forEach(name => { switch (name) { case 'populate': // fall through case 'fastJoin': // @ts-expect-error TODO - newParams._populate = 'skip'; - break; + newParams._populate = 'skip' + break case 'softDelete': - newParams.query = newParams.query || {}; - newParams.query.$disableSoftDelete = true; - break; + newParams.query = newParams.query || {} + newParams.query.$disableSoftDelete = true + break case 'softDelete2': // @ts-expect-error TODO - newParams.$disableSoftDelete2 = true; - break; + newParams.$disableSoftDelete2 = true + break case 'ignoreDeletedAt': // @ts-expect-error TODO - newParams.$ignoreDeletedAt = true; - break; + newParams.$ignoreDeletedAt = true + break case 'stashBefore': // @ts-expect-error TODO - newParams.disableStashBefore = true; - break; + newParams.disableStashBefore = true + break } - }); + }) - return newParams; - }; + return newParams + } /** * You should prefer using the callingParams utility to makeCallingParams. @@ -136,5 +136,5 @@ export function makeCallingParams( : [include], newProps: Object.assign({}, { _populate: 'skip' }, inject), ignoreDefaults: true, - })(context); + })(context) } diff --git a/src/utils/check-context-if.ts b/src/utils/check-context-if.ts index 0a0e4672..c195c3d7 100755 --- a/src/utils/check-context-if.ts +++ b/src/utils/check-context-if.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { MethodName, HookType } from '../types'; -import { checkContext } from './check-context/check-context'; +import type { HookContext } from '@feathersjs/feathers' +import type { MethodName, HookType } from '../types.js' +import { checkContext } from './check-context/check-context.js' // TODO: Add checkContextIf to docs /** @@ -16,8 +16,8 @@ export function checkContextIf( label?: string, ) { if (Array.isArray(type) ? !type.includes(context.type) : type !== context.type) { - return; + return } - checkContext(context, type, methods, label); + checkContext(context, type, methods, label) } diff --git a/src/utils/check-context/check-context.test.ts b/src/utils/check-context/check-context.test.ts index 52388ba3..5bc81079 100755 --- a/src/utils/check-context/check-context.test.ts +++ b/src/utils/check-context/check-context.test.ts @@ -1,77 +1,77 @@ -import { assert, expect } from 'vitest'; +import { expect } from 'vitest' -import { checkContext } from './check-context'; -import { HookContext } from '@feathersjs/feathers'; +import { checkContext } from './check-context.js' +import type { HookContext } from '@feathersjs/feathers' -const make = (type: any, method: any) => ({ type, method }) as HookContext; +const make = (type: any, method: any) => ({ type, method }) as HookContext describe('util checkContext', () => { it('handles "any" type and method', () => { - expect(() => checkContext(make('before', 'create'))).not.toThrow(); - }); + expect(() => checkContext(make('before', 'create'))).not.toThrow() + }) it('handles expected type', () => { - expect(() => checkContext(make('before', 'create'), 'before')).not.toThrow(); - }); + expect(() => checkContext(make('before', 'create'), 'before')).not.toThrow() + }) it('handles unexpected type', () => { - expect(() => checkContext(make('after', 'create'), 'before')).toThrow(); - }); + expect(() => checkContext(make('after', 'create'), 'before')).toThrow() + }) it('handles undefined type', () => { - expect(() => checkContext(make('after', 'create'), undefined, 'create')).not.toThrow(); - }); + expect(() => checkContext(make('after', 'create'), undefined, 'create')).not.toThrow() + }) it('handles null type', () => { - expect(() => checkContext(make('after', 'create'), null, 'create')).not.toThrow(); - }); + expect(() => checkContext(make('after', 'create'), null, 'create')).not.toThrow() + }) it('handles expected type as array', () => { - expect(() => checkContext(make('before', 'create'), ['before', 'after'])).not.toThrow(); - }); + expect(() => checkContext(make('before', 'create'), ['before', 'after'])).not.toThrow() + }) it('handles unexpected type as array', () => { - expect(() => checkContext(make('error', 'create'), ['before', 'after'])).toThrow(); - }); + expect(() => checkContext(make('error', 'create'), ['before', 'after'])).toThrow() + }) it('handles expected method as string', () => { - expect(() => checkContext(make('before', 'create'), null, 'create')).not.toThrow(); - }); + expect(() => checkContext(make('before', 'create'), null, 'create')).not.toThrow() + }) it('handles unexpected method as string', () => { - expect(() => checkContext(make('before', 'patch'), null, 'create')).toThrow(); - }); + expect(() => checkContext(make('before', 'patch'), null, 'create')).toThrow() + }) it('handles expected method as array', () => { expect(() => checkContext(make('before', 'create'), null, ['create', 'update', 'remove']), - ).not.toThrow(); - }); + ).not.toThrow() + }) it('handles unexpected method as array', () => { expect(() => checkContext(make('before', 'patch'), null, ['create', 'update', 'remove']), - ).toThrow(); - }); + ).toThrow() + }) it('handles undefined method', () => { - expect(() => checkContext(make('before', 'patch'), null, undefined)).not.toThrow(); - }); + expect(() => checkContext(make('before', 'patch'), null, undefined)).not.toThrow() + }) it('handles null method', () => { - expect(() => checkContext(make('before', 'patch'), null, null)).not.toThrow(); - }); + expect(() => checkContext(make('before', 'patch'), null, null)).not.toThrow() + }) it('handles expected type and method as array', () => { expect(() => checkContext(make('before', 'create'), ['before', 'after'], ['create', 'update', 'remove']), - ).not.toThrow(); - }); + ).not.toThrow() + }) it('allows custom methods', () => { - expect(() => checkContext(make('before', 'custom'), 'before', 'create')).toThrow(); + expect(() => checkContext(make('before', 'custom'), 'before', 'create')).toThrow() expect(() => checkContext(make('before', 'custom'), 'before', ['create', 'custom']), - ).not.toThrow(); - }); -}); + ).not.toThrow() + }) +}) diff --git a/src/utils/check-context/check-context.ts b/src/utils/check-context/check-context.ts index 4dbe6b14..09126cc6 100755 --- a/src/utils/check-context/check-context.ts +++ b/src/utils/check-context/check-context.ts @@ -1,6 +1,6 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { HookType, MethodName } from '../../types'; -import { isContext } from '../../predicates/is-context/is-context'; +import type { HookContext } from '@feathersjs/feathers' +import type { HookType, MethodName } from '../../types.js' +import { isContext } from '../../predicates/is-context/is-context.js' /** * Restrict a hook to run for certain methods and method types. (Utility function.) @@ -18,6 +18,6 @@ export function checkContext( type: type ?? undefined, })(context) ) { - throw new Error(`The '${label}' hook has invalid context.`); + throw new Error(`The '${label}' hook has invalid context.`) } } diff --git a/src/utils/combine/combine.test.ts b/src/utils/combine/combine.test.ts index f2c347a0..b83e38e5 100755 --- a/src/utils/combine/combine.test.ts +++ b/src/utils/combine/combine.test.ts @@ -1,11 +1,11 @@ /* eslint-disable @typescript-eslint/no-this-alias */ -import { assert } from 'vitest'; -import { feathers } from '@feathersjs/feathers'; -import { MemoryService } from '@feathersjs/memory'; -import { combine } from './combine'; -import { clone } from '../../common'; +import { assert } from 'vitest' +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { combine } from './combine.js' +import { clone } from '../../common/index.js' -const startId = 6; +const startId = 6 const storeInit = { 0: { name: 'Jane Doe', key: 'a', id: 0 }, 1: { name: 'Jack Doe', key: 'a', id: 1 }, @@ -13,19 +13,19 @@ const storeInit = { 3: { name: 'Rick Doe', key: 'b', id: 3 }, 4: { name: 'Dick Doe', key: 'b', id: 4 }, 5: { name: 'Dick Doe', key: 'b', id: 5, deleted: true }, -}; -let store; +} +let store function services(app: any) { - app.configure(user); + app.configure(user) } function user(app: any) { - let service: any; - let hookId: any; - let hookData: any; - let hookParamsQuery: any; - store = clone(storeInit); + let service: any + let hookId: any + let hookData: any + let hookParamsQuery: any + store = clone(storeInit) app.use( '/users', @@ -33,120 +33,120 @@ function user(app: any) { store, startId, }), - ); + ) app.service('users').hooks({ before: { all: [ function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 0.'); + throw new Error('App wrong 0.') } - service = this; + service = this - hook.data = { a: 'a' }; + hook.data = { a: 'a' } - hookId = hook.id; - hookData = clone(hook.data); - hookParamsQuery = clone(hook.params.query); + hookId = hook.id + hookData = clone(hook.data) + hookParamsQuery = clone(hook.params.query) - return hook; + return hook }, combine( function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 1.'); + throw new Error('App wrong 1.') } if (service !== this) { - throw new Error('Service wrong 1.'); + throw new Error('Service wrong 1.') } - hook.params.trace = ['sync1']; - return hook; + hook.params.trace = ['sync1'] + return hook }, function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 2.'); + throw new Error('App wrong 2.') } if (service !== this) { - throw new Error('Service wrong 2.'); + throw new Error('Service wrong 2.') } if (hook.params.query.key === 'b') { - throw new Error('Requested throw.'); + throw new Error('Requested throw.') } - hook.params.trace.push('promise1'); - return Promise.resolve(hook); + hook.params.trace.push('promise1') + return Promise.resolve(hook) }, function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 3.'); + throw new Error('App wrong 3.') } if (service !== this) { - throw new Error('Service wrong 3.'); + throw new Error('Service wrong 3.') } - hook.params.trace.push('sync2'); + hook.params.trace.push('sync2') }, function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 4.'); + throw new Error('App wrong 4.') } if (service !== this) { - throw new Error('Service wrong 4.'); + throw new Error('Service wrong 4.') } - hook.params.trace.push('cb1'); + hook.params.trace.push('cb1') - return hook; + return hook }, function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 5.'); + throw new Error('App wrong 5.') } if (service !== this) { - throw new Error('Service wrong 5.'); + throw new Error('Service wrong 5.') } - hook.params.trace.push('sync3'); - return hook; + hook.params.trace.push('sync3') + return hook }, ), function (this: any, hook: any) { if (hook.app !== app) { - throw new Error('App wrong 9.'); + throw new Error('App wrong 9.') } if (service !== this) { - throw new Error('Service wrong 9.'); + throw new Error('Service wrong 9.') } - assert.equal(hook.id, hookId); - assert.deepEqual(hook.data, hookData); - assert.deepEqual(hook.params.query, hookParamsQuery); + assert.equal(hook.id, hookId) + assert.deepEqual(hook.data, hookData) + assert.deepEqual(hook.params.query, hookParamsQuery) - assert.deepEqual(hook.params.trace, ['sync1', 'promise1', 'sync2', 'cb1', 'sync3']); + assert.deepEqual(hook.params.trace, ['sync1', 'promise1', 'sync2', 'cb1', 'sync3']) }, ], }, - }); + }) } describe('util combine', () => { - let app; - let user: any; + let app + let user: any beforeEach(() => { - app = feathers().configure(services); - user = app.service('users'); - }); + app = feathers().configure(services) + user = app.service('users') + }) it('runs successful hooks', async () => { - await user.find({ query: { key: 'a' } }); - }); + await user.find({ query: { key: 'a' } }) + }) it('throws on unsuccessful hook', async () => { await user .find({ query: { key: 'b' } }) .then((_data: any) => { - assert.fail(true, false); + assert.fail(true, false) }) - .catch(() => {}); - }); -}); + .catch(() => {}) + }) +}) diff --git a/src/utils/combine/combine.ts b/src/utils/combine/combine.ts index 8a75aca4..51a0e036 100755 --- a/src/utils/combine/combine.ts +++ b/src/utils/combine/combine.ts @@ -1,5 +1,5 @@ -import type { HookContext } from '@feathersjs/feathers'; -import type { HookFunction } from '../../types'; +import type { HookContext } from '@feathersjs/feathers' +import type { HookFunction } from '../../types.js' /** * Sequentially execute multiple hooks. @@ -11,11 +11,11 @@ export function combine(...serviceHooks: Ho // } const isContext = function (ctx: H) { - return typeof ctx?.method === 'string' && typeof ctx?.type === 'string'; - }; + return typeof ctx?.method === 'string' && typeof ctx?.type === 'string' + } return async function (context: H) { - let ctx = context; + let ctx = context const updateCurrentHook = (current: void | H) => { // Either use the returned hook object or the current @@ -24,36 +24,36 @@ export function combine(...serviceHooks: Ho if (!isContext(current)) { throw new Error( `${ctx.type} hook for '${ctx.method}' method returned invalid hook object`, - ); + ) } - ctx = current; + ctx = current } - return ctx; - }; + return ctx + } // Go through all hooks and chain them into our promise // @ts-expect-error TODO const promise = serviceHooks.reduce(async (current, fn) => { // @ts-expect-error TODO - const hook = fn.bind(this); + const hook = fn.bind(this) // Use the returned hook object or the old one - const currentHook = await current; - const currentCtx = await hook(currentHook); - return updateCurrentHook(currentCtx); - }, Promise.resolve(ctx)); + const currentHook = await current + const currentCtx = await hook(currentHook) + return updateCurrentHook(currentCtx) + }, Promise.resolve(ctx)) try { - await promise; - return ctx; + await promise + return ctx } catch (error: any) { // Add the hook information to any errors - error.hook = ctx; - throw error; + error.hook = ctx + throw error } - }; + } } diff --git a/src/utils/get-data-is-array/get-data-is-array.test.ts b/src/utils/get-data-is-array/get-data-is-array.test.ts index b91a42b6..d7350fa5 100644 --- a/src/utils/get-data-is-array/get-data-is-array.test.ts +++ b/src/utils/get-data-is-array/get-data-is-array.test.ts @@ -1,31 +1,31 @@ -import { getDataIsArray } from './get-data-is-array'; +import { getDataIsArray } from './get-data-is-array.js' describe('getDataIsArray', () => { it('falsy data', () => { expect(getDataIsArray({ data: null } as any)).toEqual({ isArray: false, data: [], - }); + }) expect(getDataIsArray({ data: undefined } as any)).toEqual({ isArray: false, data: [], - }); - }); + }) + }) it('array data', () => { - const data = [1, 2, 3]; + const data = [1, 2, 3] expect(getDataIsArray({ data } as any)).toEqual({ isArray: true, data, - }); - }); + }) + }) it('non-array data', () => { - const data = { a: 1, b: 2 }; + const data = { a: 1, b: 2 } expect(getDataIsArray({ data } as any)).toEqual({ isArray: false, data: [data], - }); - }); -}); + }) + }) +}) diff --git a/src/utils/get-data-is-array/get-data-is-array.ts b/src/utils/get-data-is-array/get-data-is-array.ts index c7cf9221..fac2d82b 100644 --- a/src/utils/get-data-is-array/get-data-is-array.ts +++ b/src/utils/get-data-is-array/get-data-is-array.ts @@ -1,4 +1,4 @@ -import { HookContext } from '@feathersjs/feathers'; +import type { HookContext } from '@feathersjs/feathers' export function getDataIsArray( context: H, @@ -7,13 +7,13 @@ export function getDataIsArray( return { isArray: false, data: [], - }; + } } - const isArray = Array.isArray(context.data); + const isArray = Array.isArray(context.data) return { isArray, data: isArray ? context.data : [context.data], - }; + } } diff --git a/src/utils/get-exposed-methods/get-exposed-methods.ts b/src/utils/get-exposed-methods/get-exposed-methods.ts index 17ac30db..2689c538 100644 --- a/src/utils/get-exposed-methods/get-exposed-methods.ts +++ b/src/utils/get-exposed-methods/get-exposed-methods.ts @@ -1,11 +1,12 @@ -import { Service, SERVICE } from '@feathersjs/feathers'; +import type { Service } from '@feathersjs/feathers' +import { SERVICE } from '@feathersjs/feathers' export function getExposedMethods(service: Service) { - const result = (service as any)[SERVICE].methods; + const result = (service as any)[SERVICE].methods if (!result || !Array.isArray(result)) { - throw new Error(`Service does not have exposed methods`); + throw new Error(`Service does not have exposed methods`) } - return result; + return result } diff --git a/src/utils/get-items/get-items.test.ts b/src/utils/get-items/get-items.test.ts index f5308746..c86708d5 100644 --- a/src/utils/get-items/get-items.test.ts +++ b/src/utils/get-items/get-items.test.ts @@ -1,5 +1,5 @@ -import { assert } from 'vitest'; -import { getItems } from './get-items'; +import { assert } from 'vitest' +import { getItems } from './get-items.js' describe('getItems', () => { it('updates hook before::create item', () => { @@ -11,8 +11,8 @@ describe('getItems', () => { data: { first: 'John', last: 'Doe' }, } as any), { first: 'John', last: 'Doe' }, - ); - }); + ) + }) it('updates hook before::create items', () => { assert.deepEqual( @@ -29,8 +29,8 @@ describe('getItems', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - ); - }); + ) + }) it('updates hook after::create item', () => { assert.deepEqual( @@ -41,8 +41,8 @@ describe('getItems', () => { result: { first: 'Jane2', last: 'Doe2' }, } as any), { first: 'Jane2', last: 'Doe2' }, - ); - }); + ) + }) it('updates hook after::create items', () => { assert.deepEqual( @@ -59,8 +59,8 @@ describe('getItems', () => { { first: 'John2', last: 'Doe2' }, { first: 'Jane', last: 'Doe' }, ], - ); - }); + ) + }) it('updates hook after::find item', () => { assert.deepEqual( @@ -80,8 +80,8 @@ describe('getItems', () => { { first: 'John3', last: 'Doe3' }, { first: 'Jane3', last: 'Doe3' }, ], - ); - }); + ) + }) it('updates hook after::find item paginated', () => { assert.deepEqual( @@ -98,20 +98,20 @@ describe('getItems', () => { { first: 'John', last: 'Doe' }, { first: 'Jane', last: 'Doe' }, ], - ); - }); + ) + }) it('does not throw on before without data', () => { assert.equal( getItems({ type: 'before', method: 'create', params: { provider: 'rest' } } as any), undefined, - ); - }); + ) + }) it('does not throw on after without data', () => { assert.equal( getItems({ type: 'after', method: 'find', params: { provider: 'rest' } } as any), undefined, - ); - }); -}); + ) + }) +}) diff --git a/src/utils/get-items/get-items.ts b/src/utils/get-items/get-items.ts index f3a7591f..72796ffd 100755 --- a/src/utils/get-items/get-items.ts +++ b/src/utils/get-items/get-items.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext } from '@feathersjs/feathers' /** * Get the records in context.data or context.result[.data]. (Utility function.) @@ -8,8 +8,8 @@ import type { HookContext } from '@feathersjs/feathers'; * @deprecated Use `getDataIsArray` or `getResultIsArray` instead. */ export function getItems(context: H): any { - if (context.params && context.params._actOn === 'dispatch') return context.dispatch; + if (context.params && context.params._actOn === 'dispatch') return context.dispatch - const items = context.type === 'before' ? context.data : context.result; - return items && context.method === 'find' ? items.data || items : items; + const items = context.type === 'before' ? context.data : context.result + return items && context.method === 'find' ? items.data || items : items } diff --git a/src/utils/get-paginate/get-paginate.test.ts b/src/utils/get-paginate/get-paginate.test.ts index 43891583..a23c2f90 100644 --- a/src/utils/get-paginate/get-paginate.test.ts +++ b/src/utils/get-paginate/get-paginate.test.ts @@ -1,5 +1,5 @@ -import { HookContext } from '@feathersjs/feathers'; -import { getPaginate } from './get-paginate'; +import type { HookContext } from '@feathersjs/feathers' +import { getPaginate } from './get-paginate.js' describe('getPaginate', () => { it('returns service.options.paginate', function () { @@ -8,17 +8,17 @@ describe('getPaginate', () => { default: 10, max: 50, }, - }; + } const paginate = getPaginate({ params: {}, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, { default: 10, max: 50 }); - }); + assert.deepStrictEqual(paginate, { default: 10, max: 50 }) + }) it('returns undefined for params.paginate: false', function () { const serviceOptions = { @@ -26,17 +26,17 @@ describe('getPaginate', () => { default: 10, max: 50, }, - }; + } const paginate = getPaginate({ params: { paginate: false }, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, undefined); - }); + assert.deepStrictEqual(paginate, undefined) + }) it('returns context.adapter.paginate over service.options.paginate', function () { const serviceOptions = { @@ -44,30 +44,30 @@ describe('getPaginate', () => { default: 10, max: 50, }, - }; + } const paginate = getPaginate({ params: { adapter: { paginate: { default: 20, max: 100 } } }, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, { default: 20, max: 100 }); - }); + assert.deepStrictEqual(paginate, { default: 20, max: 100 }) + }) it('returns undefined for no paginate', function () { const serviceOptions = { paginate: false, - }; + } const paginate = getPaginate({ params: {}, service: { options: serviceOptions, }, - } as HookContext); + } as HookContext) - assert.deepStrictEqual(paginate, undefined); - }); -}); + assert.deepStrictEqual(paginate, undefined) + }) +}) diff --git a/src/utils/get-paginate/get-paginate.ts b/src/utils/get-paginate/get-paginate.ts index 6e59fdc4..f75e7fc0 100644 --- a/src/utils/get-paginate/get-paginate.ts +++ b/src/utils/get-paginate/get-paginate.ts @@ -1,6 +1,6 @@ -import type { PaginationOptions } from '@feathersjs/adapter-commons'; -import type { HookContext } from '@feathersjs/feathers'; -import { hasOwnProperty } from '../../internal.utils'; +import type { PaginationOptions } from '@feathersjs/adapter-commons' +import type { HookContext } from '@feathersjs/feathers' +import { hasOwnProperty } from '../../internal.utils.js' /** * util to get paginate options from context @@ -12,18 +12,18 @@ export const getPaginate = ( context: H, ): PaginationOptions | undefined => { if (hasOwnProperty(context.params, 'paginate')) { - return (context.params.paginate as PaginationOptions) || undefined; + return (context.params.paginate as PaginationOptions) || undefined } if (context.params.paginate === false) { - return undefined; + return undefined } - let options = context.service?.options || {}; + let options = context.service?.options || {} options = { ...options, ...context.params.adapter, - }; + } - return options.paginate || undefined; -}; + return options.paginate || undefined +} diff --git a/src/utils/get-result-is-array/get-result-is-array.test.ts b/src/utils/get-result-is-array/get-result-is-array.test.ts index 01cf0c7d..8a729fb3 100644 --- a/src/utils/get-result-is-array/get-result-is-array.test.ts +++ b/src/utils/get-result-is-array/get-result-is-array.test.ts @@ -1,4 +1,4 @@ -import { getResultIsArray } from './get-result-is-array'; +import { getResultIsArray } from './get-result-is-array.js' describe('getResultIsArray', () => { it('falsy result', () => { @@ -6,65 +6,65 @@ describe('getResultIsArray', () => { isArray: false, result: [], key: 'result', - }); + }) expect(getResultIsArray({} as any)).toEqual({ isArray: false, result: [], key: 'result', - }); - }); + }) + }) it('array result', () => { - const result = [1, 2, 3]; + const result = [1, 2, 3] expect(getResultIsArray({ result } as any)).toEqual({ isArray: true, result, key: 'result', - }); + }) expect(getResultIsArray({ method: 'find', result } as any)).toEqual({ isArray: true, result, key: 'result', - }); + }) expect(getResultIsArray({ method: 'find', result: { data: result } } as any)).toEqual({ isArray: true, result, key: 'result', - }); - }); + }) + }) it('non-array result', () => { - const result = { a: 1, b: 2 }; + const result = { a: 1, b: 2 } expect(getResultIsArray({ result } as any)).toEqual({ isArray: false, result: [result], key: 'result', - }); + }) expect(getResultIsArray({ method: 'find', result } as any)).toEqual({ isArray: false, result: [result], key: 'result', - }); + }) expect(getResultIsArray({ method: 'find', result: { data: result } } as any)).toEqual({ isArray: false, result: [result], key: 'result', - }); - }); + }) + }) it('dispatch', () => { - const result = { a: 1, b: 2 }; - const dispatch = { c: 3, d: 4 }; + const result = { a: 1, b: 2 } + const dispatch = { c: 3, d: 4 } expect(getResultIsArray({ result, dispatch } as any, { dispatch: true })).toEqual({ isArray: false, result: [dispatch], key: 'dispatch', - }); + }) expect( getResultIsArray({ method: 'find', result, dispatch } as any, { dispatch: true }), @@ -72,7 +72,7 @@ describe('getResultIsArray', () => { isArray: false, result: [dispatch], key: 'dispatch', - }); + }) expect( getResultIsArray({ method: 'find', result: { data: result }, dispatch } as any, { @@ -82,48 +82,48 @@ describe('getResultIsArray', () => { isArray: false, result: [dispatch], key: 'dispatch', - }); - }); + }) + }) it('returns dispatch if is missing with single result', () => { - const result = { a: 1, b: 2 }; - const context = { result } as any; + const result = { a: 1, b: 2 } + const context = { result } as any expect(getResultIsArray(context, { dispatch: true })).toEqual({ isArray: false, result: [result], key: 'result', - }); - expect(context.dispatch).toEqual(undefined); - }); + }) + expect(context.dispatch).toEqual(undefined) + }) it("doesn't set dispatch if is missing with array result", () => { - const result = [{ a: 1, b: 2 }]; - const context = { method: 'create', result } as any; + const result = [{ a: 1, b: 2 }] + const context = { method: 'create', result } as any expect(getResultIsArray(context, { dispatch: true })).toEqual({ isArray: true, result: result, key: 'result', - }); - expect(context.dispatch).toEqual(undefined); - }); + }) + expect(context.dispatch).toEqual(undefined) + }) it("doesn't set dispatch if is missing with find array", () => { - const result = [{ a: 1, b: 2 }]; - const dispatch = undefined; - const context = { method: 'find', result, dispatch } as any; + const result = [{ a: 1, b: 2 }] + const dispatch = undefined + const context = { method: 'find', result, dispatch } as any expect(getResultIsArray(context, { dispatch: true })).toEqual({ isArray: true, result, key: 'result', - }); - }); + }) + }) it('sets dispatch if is missing with paginated result', () => { - const result = [{ a: 1, b: 2 }]; - const dispatch = undefined; - const context = { method: 'find', result: { data: result, total: 3 }, dispatch } as any; + const result = [{ a: 1, b: 2 }] + const dispatch = undefined + const context = { method: 'find', result: { data: result, total: 3 }, dispatch } as any expect( getResultIsArray(context, { @@ -133,7 +133,7 @@ describe('getResultIsArray', () => { isArray: true, result, key: 'result', - }); - expect(context.dispatch).toEqual(undefined); - }); -}); + }) + expect(context.dispatch).toEqual(undefined) + }) +}) diff --git a/src/utils/get-result-is-array/get-result-is-array.ts b/src/utils/get-result-is-array/get-result-is-array.ts index 1c2b261d..bdb2ad49 100644 --- a/src/utils/get-result-is-array/get-result-is-array.ts +++ b/src/utils/get-result-is-array/get-result-is-array.ts @@ -1,35 +1,35 @@ -import { HookContext } from '@feathersjs/feathers'; -import copy from 'fast-copy'; +import type { HookContext } from '@feathersjs/feathers' +import copy from 'fast-copy' type GetResultIsArrayOptions = { - dispatch?: boolean; -}; + dispatch?: boolean +} export function getResultIsArray( context: H, options?: GetResultIsArrayOptions, ): { isArray: boolean; result: any[]; key: 'dispatch' | 'result' } { - const { dispatch = false } = options || {}; + const { dispatch = false } = options || {} - const isDispatch: boolean = dispatch && context.dispatch !== undefined; + const isDispatch: boolean = dispatch && context.dispatch !== undefined - const result = dispatch ? (isDispatch ? context.dispatch : copy(context.result)) : context.result; + const result = dispatch ? (isDispatch ? context.dispatch : copy(context.result)) : context.result if (!result) { return { isArray: false, result: [], key: isDispatch ? 'dispatch' : 'result', - }; + } } - const items = context.method === 'find' ? result.data || result : result; + const items = context.method === 'find' ? result.data || result : result - const isArray = Array.isArray(items); + const isArray = Array.isArray(items) return { isArray, result: isArray ? items : items ? [items] : [], key: isDispatch ? 'dispatch' : 'result', - }; + } } diff --git a/src/utils/index.ts b/src/utils/index.ts index 7d39e7f6..b6cd5530 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,19 +1,17 @@ -export * from './calling-params/calling-params'; -export * from './check-context/check-context'; -export * from './check-context-if'; -export * from './combine/combine'; +export * from './calling-params/calling-params.js' +export * from './check-context/check-context.js' +export * from './check-context-if.js' +export * from './combine/combine.js' -export * from './get-items/get-items'; -export * from './get-data-is-array/get-data-is-array'; -export * from './get-result-is-array/get-result-is-array'; +export * from './get-items/get-items.js' +export * from './get-data-is-array/get-data-is-array.js' +export * from './get-result-is-array/get-result-is-array.js' -export * from './params-for-server/params-for-server'; +export * from './params-for-server/params-for-server.js' -export * from './replace-items/replace-items'; -export * from './replace-items/replace-data'; -export * from './replace-items/replace-result'; +export * from './replace-items/replace-items.js' +export * from './replace-items/replace-data.js' +export * from './replace-items/replace-result.js' -export * from './run-hook/run-hook'; - -export * from './get-paginate/get-paginate'; -export * from './skip-result/skip-result'; +export * from './get-paginate/get-paginate.js' +export * from './skip-result/skip-result.js' diff --git a/src/utils/params-for-server/params-for-server.test.ts b/src/utils/params-for-server/params-for-server.test.ts index a7d82359..ca89836b 100755 --- a/src/utils/params-for-server/params-for-server.test.ts +++ b/src/utils/params-for-server/params-for-server.test.ts @@ -1,35 +1,35 @@ -import { assert } from 'vitest'; +import { assert } from 'vitest' -import { paramsForServer } from './params-for-server'; +import { paramsForServer } from './params-for-server.js' describe('util paramsToServer', () => { it('handles empty params', () => { - const res = paramsForServer(); - assert.deepEqual(res, { query: { $client: {} } }); - }); + const res = paramsForServer() + assert.deepEqual(res, { query: { $client: {} } }) + }) it('handles params with query only', () => { - const res = paramsForServer({ query: { x: 'x', y: 1 } }); - assert.deepEqual(res, { query: { x: 'x', y: 1, $client: {} } }); - }); + const res = paramsForServer({ query: { x: 'x', y: 1 } }) + assert.deepEqual(res, { query: { x: 'x', y: 1, $client: {} } }) + }) it('copies all params without query', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any); - assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }); - }); + const res: any = paramsForServer({ a: 'a', b: 1 } as any) + assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }) + }) it('copies all params with query', () => { - const res: any = paramsForServer({ query: { x: 'x', y: 1 }, a: 'a', b: 1 } as any); - assert.deepEqual(res, { query: { x: 'x', y: 1, $client: { a: 'a', b: 1 } } }); - }); + const res: any = paramsForServer({ query: { x: 'x', y: 1 }, a: 'a', b: 1 } as any) + assert.deepEqual(res, { query: { x: 'x', y: 1, $client: { a: 'a', b: 1 } } }) + }) it('copies whitelist props', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'a', 'b'); - assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }); - }); + const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'a', 'b') + assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }) + }) it('ignores non whitelist props', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'b'); - assert.deepEqual(res, { query: { $client: { b: 1 } } }); - }); -}); + const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'b') + assert.deepEqual(res, { query: { $client: { b: 1 } } }) + }) +}) diff --git a/src/utils/params-for-server/params-for-server.ts b/src/utils/params-for-server/params-for-server.ts index db86fdcb..dbe225de 100755 --- a/src/utils/params-for-server/params-for-server.ts +++ b/src/utils/params-for-server/params-for-server.ts @@ -1,4 +1,4 @@ -import type { Params } from '@feathersjs/feathers'; +import type { Params } from '@feathersjs/feathers' /** * Pass an explicit context.params from client to server. Client-side. (Utility function.) @@ -8,21 +8,21 @@ import type { Params } from '@feathersjs/feathers'; * @deprecated use the hook `paramsForServer2` instead */ export function paramsForServer(params?: Params, ...whitelist: string[]): Params { - const ifWhitelist = !!whitelist.length; - const _params: Record = Object.assign({}, params); + const ifWhitelist = !!whitelist.length + const _params: Record = Object.assign({}, params) - _params.query = _params.query || {}; - _params.query.$client = _params.query.$client || {}; + _params.query = _params.query || {} + _params.query.$client = _params.query.$client || {} Object.keys(_params).forEach(key => { if (key !== 'query') { if (!ifWhitelist || whitelist.includes(key)) { - _params.query.$client[key] = _params[key]; + _params.query.$client[key] = _params[key] } - delete _params[key]; + delete _params[key] } - }); + }) - return _params; + return _params } diff --git a/src/utils/replace-items/replace-data.ts b/src/utils/replace-items/replace-data.ts index 881164e2..6a263230 100644 --- a/src/utils/replace-items/replace-data.ts +++ b/src/utils/replace-items/replace-data.ts @@ -1,43 +1,43 @@ -import { HookContext } from '@feathersjs/feathers'; -import { getDataIsArray } from '../get-data-is-array/get-data-is-array'; -import { isPromise } from '../../common'; -import { Promisable } from '../../internal.utils'; +import type { HookContext } from '@feathersjs/feathers' +import { getDataIsArray } from '../get-data-is-array/get-data-is-array.js' +import { isPromise } from '../../common/index.js' +import type { Promisable } from '../../internal.utils.js' export function replaceData( context: H, cb: (item: any) => any, ): Promisable { if (!context.data) { - return context; + return context } - const { data, isArray } = getDataIsArray(context); + const { data, isArray } = getDataIsArray(context) if (!data.length) { - return context; + return context } - let hasPromises = false; + let hasPromises = false const results = data.map(item => { - const result = cb(item); + const result = cb(item) if (!hasPromises && isPromise(result)) { - hasPromises = true; + hasPromises = true } - return result; - }); + return result + }) function replace(data: any) { - context.data = isArray ? data : data[0]; + context.data = isArray ? data : data[0] - return context; + return context } if (hasPromises) { - return Promise.all(results).then(replace); + return Promise.all(results).then(replace) } else { - return replace(results); + return replace(results) } } diff --git a/src/utils/replace-items/replace-items.test.ts b/src/utils/replace-items/replace-items.test.ts index 271850ef..2cdb3a1c 100644 --- a/src/utils/replace-items/replace-items.test.ts +++ b/src/utils/replace-items/replace-items.test.ts @@ -1,17 +1,16 @@ -import { assert } from 'vitest'; -import { replaceItems } from './replace-items'; -import { actOnDispatch } from '../../hooks'; +import { assert } from 'vitest' +import { replaceItems } from './replace-items.js' // Tests when context.params._actOn === 'dispatch' are in act-on.test.ts describe('replaceItems', () => { - let hookBefore: any; - let hookAfter: any; - let hookFindPaginate: any; - let hookFind: any; + let hookBefore: any + let hookAfter: any + let hookFindPaginate: any + let hookFind: any beforeEach(() => { - hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; - hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; + hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } } + hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } } hookFindPaginate = { type: 'after', method: 'find', @@ -20,113 +19,53 @@ describe('replaceItems', () => { total: 200, data: [], }, - }; + } hookFind = { type: 'after', method: 'find', params: { provider: 'rest' }, - }; - }); + } + }) it('updates hook before::create item', () => { - replaceItems(hookBefore, { a: 1 }); - assert.deepEqual(hookBefore.data, { a: 1 }); - }); + replaceItems(hookBefore, { a: 1 }) + assert.deepEqual(hookBefore.data, { a: 1 }) + }) it('updates hook before::create items', () => { - replaceItems(hookBefore, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookBefore.data, [{ a: 1 }, { b: 2 }]); - }); + replaceItems(hookBefore, [{ a: 1 }, { b: 2 }]) + assert.deepEqual(hookBefore.data, [{ a: 1 }, { b: 2 }]) + }) it('updates hook after::create item', () => { - replaceItems(hookAfter, { a: 1 }); - assert.deepEqual(hookAfter.result, { a: 1 }); - }); + replaceItems(hookAfter, { a: 1 }) + assert.deepEqual(hookAfter.result, { a: 1 }) + }) it('updates hook after::create items', () => { - replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookAfter.result, [{ a: 1 }, { b: 2 }]); - }); + replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]) + assert.deepEqual(hookAfter.result, [{ a: 1 }, { b: 2 }]) + }) it('updates hook after::find item', () => { - replaceItems(hookFind, { a: 1 }); - assert.deepEqual(hookFind.result, { a: 1 }); - }); + replaceItems(hookFind, { a: 1 }) + assert.deepEqual(hookFind.result, { a: 1 }) + }) it('updates hook after::find items', () => { - replaceItems(hookFind, [{ a: 1 }, { b: 2 }]); - assert.deepEqual(hookFind.result, [{ a: 1 }, { b: 2 }]); - }); + replaceItems(hookFind, [{ a: 1 }, { b: 2 }]) + assert.deepEqual(hookFind.result, [{ a: 1 }, { b: 2 }]) + }) it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', () => { - replaceItems(hookFindPaginate, { a: 1 }); - assert.equal(hookFindPaginate.result.total, 200); - assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }]); - }); + replaceItems(hookFindPaginate, { a: 1 }) + assert.equal(hookFindPaginate.result.total, 200) + assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }]) + }) it('updates hook after::find items paginated', () => { - replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]); - assert.equal(hookFindPaginate.result.total, 200); - assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }, { b: 2 }]); - }); -}); - -describe('replaceItems actOnDispatch', () => { - let hookBefore: any; - let hookAfter: any; - let hookFindPaginate: any; - let hookFind: any; - - beforeEach(() => { - hookBefore = { type: 'before', method: 'create', params: { provider: 'rest' } }; - hookAfter = { type: 'after', method: 'create', params: { provider: 'rest' } }; - hookFindPaginate = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - dispatch: { - total: 200, - data: [], - }, - }; - hookFind = { - type: 'after', - method: 'find', - params: { provider: 'rest' }, - }; - }); - - it('updates hook after::create item', async () => { - await actOnDispatch(() => replaceItems(hookAfter, { a: 1 }))(hookAfter); - assert.deepEqual(hookAfter.dispatch, { a: 1 }); - }); - - it('updates hook after::create items', async () => { - await actOnDispatch(() => replaceItems(hookAfter, [{ a: 1 }, { b: 2 }]))(hookAfter); - assert.deepEqual(hookAfter.dispatch, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item', async () => { - await actOnDispatch(() => replaceItems(hookFind, { a: 1 }))(hookFind); - assert.deepEqual(hookFind.dispatch, { a: 1 }); - }); - - it('updates hook after::find items', async () => { - await actOnDispatch(() => replaceItems(hookFind, [{ a: 1 }, { b: 2 }]))(hookFind); - assert.deepEqual(hookFind.dispatch, [{ a: 1 }, { b: 2 }]); - }); - - it('updates hook after::find item paginated NOTE THIS TEST NOTE THIS TEST', async () => { - await actOnDispatch(() => replaceItems(hookFindPaginate, { a: 1 }))(hookFindPaginate); - assert.equal(hookFindPaginate.dispatch.total, 200); - assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }]); - }); - - it('updates hook after::find items paginated', async () => { - await actOnDispatch(() => replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]))( - hookFindPaginate, - ); - assert.equal(hookFindPaginate.dispatch.total, 200); - assert.deepEqual(hookFindPaginate.dispatch.data, [{ a: 1 }, { b: 2 }]); - }); -}); + replaceItems(hookFindPaginate, [{ a: 1 }, { b: 2 }]) + assert.equal(hookFindPaginate.result.total, 200) + assert.deepEqual(hookFindPaginate.result.data, [{ a: 1 }, { b: 2 }]) + }) +}) diff --git a/src/utils/replace-items/replace-items.ts b/src/utils/replace-items/replace-items.ts index 548e2b2e..b5a03113 100755 --- a/src/utils/replace-items/replace-items.ts +++ b/src/utils/replace-items/replace-items.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers'; +import type { HookContext } from '@feathersjs/feathers' /** * Replace the records in context.data or context.result[.data]. (Utility function.) @@ -9,18 +9,18 @@ import type { HookContext } from '@feathersjs/feathers'; export function replaceItems(context: H, items: any): void { if (context.params && context.params._actOn === 'dispatch') { if (context.method === 'find' && context.dispatch?.data) { - context.dispatch.data = Array.isArray(items) ? items : [items]; + context.dispatch.data = Array.isArray(items) ? items : [items] } else { - context.dispatch = items; + context.dispatch = items } - return; + return } if (context.type === 'before') { - context.data = items; + context.data = items } else if (context.method === 'find' && context.result && context.result.data) { - context.result.data = Array.isArray(items) ? items : [items]; + context.result.data = Array.isArray(items) ? items : [items] } else { - context.result = items; + context.result = items } } diff --git a/src/utils/replace-items/replace-result.test.ts b/src/utils/replace-items/replace-result.test.ts index 30fbf894..0b5c0b71 100644 --- a/src/utils/replace-items/replace-result.test.ts +++ b/src/utils/replace-items/replace-result.test.ts @@ -1,5 +1,5 @@ -import { expect } from 'vitest'; -import { replaceResult } from './replace-result'; +import { expect } from 'vitest' +import { replaceResult } from './replace-result.js' // Tests when context.params._actOn === 'dispatch' are in act-on.test.ts describe('replaceResult', () => { @@ -7,117 +7,117 @@ describe('replaceResult', () => { const context = { method: 'find', result: { total: 2, data: [{ id: 1 }, { id: 2 }] }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ total: 2, data: [{ id: 2 }, { id: 3 }] }); - }); + expect(context.result).toStrictEqual({ total: 2, data: [{ id: 2 }, { id: 3 }] }) + }) it("replaces context.result on array 'find'", async () => { const context = { method: 'find', result: [{ id: 1 }, { id: 2 }], - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); - }); + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]) + }) it("replaces context.result on 'get'", async () => { const context = { method: 'find', id: 1, result: { id: 1 }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ id: 2 }); - }); + expect(context.result).toStrictEqual({ id: 2 }) + }) it("replaces context.result on 'create'", async () => { const context = { method: 'create', result: { id: 1 }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ id: 2 }); - }); + expect(context.result).toStrictEqual({ id: 2 }) + }) it("replaces context.result on multi:'create'", async () => { const context = { method: 'create', result: [{ id: 1 }, { id: 2 }], - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); - }); + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]) + }) it('replaces context.result on update', async () => { const context = { method: 'update', id: 1, result: { id: 1 }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ id: 2 }); - }); + expect(context.result).toStrictEqual({ id: 2 }) + }) it('replaces context.result on patch', async () => { const context = { method: 'patch', id: 1, result: { id: 1 }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ id: 2 }); - }); + expect(context.result).toStrictEqual({ id: 2 }) + }) it('replaces context.result on multi patch', async () => { const context = { method: 'patch', id: null, result: [{ id: 1 }, { id: 2 }], - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); - }); + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]) + }) it('replaces context.result on remove', async () => { const context = { method: 'remove', id: 1, result: { id: 1 }, - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual({ id: 2 }); - }); + expect(context.result).toStrictEqual({ id: 2 }) + }) it('replaces context.result on multi remove', async () => { const context = { method: 'remove', id: null, result: [{ id: 1 }, { id: 2 }], - }; + } - await replaceResult(context as any, item => ({ id: item.id + 1 })); + await replaceResult(context as any, item => ({ id: item.id + 1 })) - expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]); - }); + expect(context.result).toStrictEqual([{ id: 2 }, { id: 3 }]) + }) it("replaces context.dispatch on 'get'", async () => { const context = { @@ -125,13 +125,13 @@ describe('replaceResult', () => { id: 1, result: { result: true }, dispatch: { dispatch: true }, - }; + } - await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: true }); + await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: true }) - expect(context.result).toStrictEqual({ result: true }); - expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }); - }); + expect(context.result).toStrictEqual({ result: true }) + expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }) + }) it("replaces both context.result & context.dispatch on 'get'", async () => { const context = { @@ -139,31 +139,31 @@ describe('replaceResult', () => { id: 1, result: { result: true }, dispatch: { dispatch: true }, - }; + } - await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: 'both' }); + await replaceResult(context as any, item => ({ ...item, test: true }), { dispatch: 'both' }) - expect(context.result).toStrictEqual({ result: true, test: true }); - expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }); - }); + expect(context.result).toStrictEqual({ result: true, test: true }) + expect(context.dispatch).toStrictEqual({ dispatch: true, test: true }) + }) it("replaces context.dispatch even though it was not there before on 'get'", async () => { const context = { method: 'find', id: 1, result: { result: true }, - } as any; + } as any await replaceResult( context as any, item => { - item.test = true; - return item; + item.test = true + return item }, { dispatch: true }, - ); + ) - expect(context.result).toStrictEqual({ result: true }); - expect(context.dispatch).toStrictEqual({ result: true, test: true }); - }); -}); + expect(context.result).toStrictEqual({ result: true }) + expect(context.dispatch).toStrictEqual({ result: true, test: true }) + }) +}) diff --git a/src/utils/replace-items/replace-result.ts b/src/utils/replace-items/replace-result.ts index 2c4478e0..4db5270d 100644 --- a/src/utils/replace-items/replace-result.ts +++ b/src/utils/replace-items/replace-result.ts @@ -1,14 +1,14 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers'; -import { getResultIsArray } from '../get-result-is-array/get-result-is-array'; -import { isPromise } from '../../common'; -import copy from 'fast-copy'; -import { DispatchOption } from '../../types'; +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { getResultIsArray } from '../get-result-is-array/get-result-is-array.js' +import { isPromise } from '../../common/index.js' +import copy from 'fast-copy' +import type { DispatchOption } from '../../types.js' export type ReplaceResultOptions = { - next?: NextFunction; - transform?: (items: any[]) => any[]; - dispatch?: DispatchOption; -}; + next?: NextFunction + transform?: (items: any[]) => any[] + dispatch?: DispatchOption +} export async function replaceResult( context: H, @@ -16,59 +16,59 @@ export async function replaceResult( options?: ReplaceResultOptions, ): Promise { if (options?.next) { - await options.next(); + await options.next() } if (!!options?.dispatch && !context.dispatch) { - context.dispatch = copy(context.result); + context.dispatch = copy(context.result) } async function forResult(dispatch: boolean) { - const { result, isArray, key } = getResultIsArray(context, { dispatch }); + const { result, isArray, key } = getResultIsArray(context, { dispatch }) if (!result.length) { - return context; + return context } - let hasPromises = false; + let hasPromises = false const results = result.map(item => { - const result = cb(item); + const result = cb(item) if (!hasPromises && isPromise(result)) { - hasPromises = true; + hasPromises = true } - return result; - }); + return result + }) function replace(r: any) { if (options?.transform) { - r = options.transform(r); + r = options.transform(r) } if (!isArray) { - context[key] = r[0]; + context[key] = r[0] } else if (isArray && !Array.isArray(context[key]) && context[key].data) { - context[key].data = r; + context[key].data = r } else { - context[key] = r; + context[key] = r } - return context; + return context } if (hasPromises) { - return await Promise.all(results).then(replace); + return await Promise.all(results).then(replace) } else { - return replace(results); + return replace(results) } } if (options?.dispatch === 'both') { - await Promise.all([forResult(true), forResult(false)]); - return context; + await Promise.all([forResult(true), forResult(false)]) + return context } - return await forResult(options?.dispatch ?? false); + return await forResult(options?.dispatch ?? false) } diff --git a/src/utils/run-hook/run-hook.test.ts b/src/utils/run-hook/run-hook.test.ts deleted file mode 100755 index 384d12b1..00000000 --- a/src/utils/run-hook/run-hook.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { assert } from 'vitest'; -import { fastJoin, keep } from '../../hooks'; -import { runHook } from './run-hook'; - -const app = { a: 'a' }; -const params = { p: 'p' }; -const service = { s: 's' }; -let runHooks1: any; -let runHooks2: any; -let hook: any; - -const testHook = (hook1: any) => { - hook = hook1; - - hook1._called = 'called'; - return hook1; -}; - -describe('util runHooks', () => { - beforeEach(() => { - runHooks1 = runHook({ app, params, service } as any); - runHooks2 = runHook(); - }); - - it('get expected hook & object result', () => { - const data = { name: 'john' }; - - return Promise.resolve(data) - .then(runHooks1(testHook)) - .then(result => { - assert.deepEqual(result, data, 'test result'); - assert.deepEqual( - hook, - { - app, - params, - service, - _called: 'called', - result: data, - type: 'after', - }, - 'test hook', - ); - }); - }); - - it('get expected array result', () => { - const data = [{ name: 'john' }]; - - return Promise.resolve(data) - .then(runHooks1(testHook)) - .then(result => { - assert.deepEqual(result, data, 'test result'); - }); - }); - - it('get expected find result', () => { - const data = { total: 1, data: [{ name: 'john' }] }; - - return Promise.resolve(data) - .then(runHooks1(testHook)) - .then(result => { - assert.deepEqual(result, data, 'test result'); - }); - }); - - it('test using keep hook', () => { - const data: any[] = [ - { name: 'John', job: 'dev', address: { city: 'Montreal', postal: 'H4T 2A1' } }, - ]; - - return Promise.resolve(data) - .then(runHooks2(keep('name', 'address.city'))) - .then(result => { - assert.deepEqual(result, [{ name: 'John', address: { city: 'Montreal' } }]); - }); - }); - - it('test using fastJoin hook', () => { - const paymentsRecords = [ - { _id: 101, amount: 100, patientId: 1 }, - { _id: 102, amount: 105, patientId: 1 }, - { _id: 103, amount: 110, patientId: 1 }, - { _id: 104, amount: 115, patientId: 2 }, - { _id: 105, amount: 120, patientId: 3 }, - { _id: 106, amount: 125, patientId: 3 }, - ]; - - const patientsRecords = [ - { _id: 1, name: 'John' }, - { _id: 2, name: 'Marshall' }, - { _id: 3, name: 'David' }, - ]; - - const paymentResolvers = { - joins: { - patient: () => (payment: any) => { - payment.patient = patientsRecords.filter(patient => patient._id === payment.patientId)[0]; - }, - }, - }; - - const expected = [ - { _id: 101, amount: 100, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 102, amount: 105, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 103, amount: 110, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 104, amount: 115, patientId: 2, patient: { _id: 2, name: 'Marshall' } }, - { _id: 105, amount: 120, patientId: 3, patient: { _id: 3, name: 'David' } }, - { _id: 106, amount: 125, patientId: 3, patient: { _id: 3, name: 'David' } }, - ]; - - return ( - Promise.resolve(paymentsRecords) - // @ts-ignore - .then(runHooks2(fastJoin(paymentResolvers))) - .then(result => { - assert.deepEqual(result, expected); - }) - ); - }); -}); diff --git a/src/utils/run-hook/run-hook.ts b/src/utils/run-hook/run-hook.ts deleted file mode 100755 index 1ff4524a..00000000 --- a/src/utils/run-hook/run-hook.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { HookContext, Paginated } from '@feathersjs/feathers'; - -/** - * Let's you call a hook right after the service call. (Utility function.) - * @see https://hooks-common.feathersjs.com/utilities.html#runhook - */ -export function runHook( - context?: H, -): (hook: any) => (data: any[] | Paginated) => Promise { - const extraContent = context; // cannot access extraContent1 below. why not? - - return hookFunc => result => { - const ctx = Object.assign({}, { type: 'after', params: {}, result }, extraContent); - - // @ts-expect-error TODO - if (typeof result === 'object' && result !== null && result.total && result.data) { - // @ts-expect-error method is readonly - ctx.method = 'find'; - } - - return Promise.resolve() - .then(() => hookFunc(ctx)) - .then(newContext => { - if (!newContext) { - return; - } - - const result = newContext.result; - - if (typeof result === 'object' && result !== null && result.total && result.data) { - // find - return newContext.result; - } - - return newContext.result.data || newContext.result; - }); - }; -} diff --git a/src/utils/skip-result/skip-result.test.ts b/src/utils/skip-result/skip-result.test.ts index e209cc43..61ca099d 100644 --- a/src/utils/skip-result/skip-result.test.ts +++ b/src/utils/skip-result/skip-result.test.ts @@ -1,5 +1,5 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { skipResult } from './skip-result'; +import type { HookContext } from '@feathersjs/feathers' +import { skipResult } from './skip-result.js' describe('skipResult', function () { const paginatedService = { @@ -9,44 +9,44 @@ describe('skipResult', function () { max: 50, }, }, - }; + } const nonPaginatedService = { options: { paginate: false, }, - }; + } - const paramsEmpty = {}; - const paramsPaginateFalse = { paginate: false }; - const paramsPaginate = { paginate: { default: 10, max: 50 } }; + const paramsEmpty = {} + const paramsPaginateFalse = { paginate: false } + const paramsPaginate = { paginate: { default: 10, max: 50 } } const paramsAdapterPaginate = { adapter: { paginate: { default: 10, max: 50 } }, - }; + } it('does not overwrite result', function () { - ['find', 'get', 'create', 'update', 'patch', 'remove'].forEach(method => { - ['before', 'after'].forEach(type => { - [paginatedService, nonPaginatedService].forEach(service => { - [paramsPaginateFalse, paramsAdapterPaginate].forEach(params => { + ;['find', 'get', 'create', 'update', 'patch', 'remove'].forEach(method => { + ;['before', 'after'].forEach(type => { + ;[paginatedService, nonPaginatedService].forEach(service => { + ;[paramsPaginateFalse, paramsAdapterPaginate].forEach(params => { const context = skipResult({ method, type, service, params, result: 123, - } as any as HookContext); + } as any as HookContext) assert.deepStrictEqual( context.result, 123, `result is not changed. '${type}:${method}': '${service}' - '${params}'`, - ); - }); - }); - }); - }); - }); + ) + }) + }) + }) + }) + }) describe('find', function () { it('sets paginated result', function () { @@ -55,38 +55,38 @@ describe('skipResult', function () { { service: paginatedService, params: paramsAdapterPaginate }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ service, params, method: 'find', - } as any as HookContext); + } as any as HookContext) assert.deepStrictEqual( result, { total: 0, skip: 0, limit: 0, data: [] }, `'${i}': result is paginated empty`, - ); - }); - }); + ) + }) + }) it('sets empty array', function () { const combos = [ { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsEmpty }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ service, params, method: 'find', - } as any as HookContext); - assert.deepStrictEqual(result, [], `'${i}': result is empty array`); - }); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, [], `'${i}': result is empty array`) + }) + }) + }) describe('get', function () { it('sets result to null', function () { @@ -96,18 +96,18 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ service, params, method: 'get', - } as any as HookContext); - assert.deepStrictEqual(result, null, `'${i}': result is null`); - }); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, null, `'${i}': result is null`) + }) + }) + }) describe('create', function () { it('sets result to null for single data', function () { @@ -117,7 +117,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -125,10 +125,10 @@ describe('skipResult', function () { params, method: 'create', data: { id: 1 }, - } as any as HookContext); - assert.deepStrictEqual(result, null, `'${i}': result is null`); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, null, `'${i}': result is null`) + }) + }) it('sets result to empty array for array data', function () { const combos = [ @@ -137,7 +137,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -146,11 +146,11 @@ describe('skipResult', function () { method: 'create', data: [{ id: 1 }], type: 'before', - } as any as HookContext); - assert.deepStrictEqual(result, [], `'${i}': result is empty array`); - }); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, [], `'${i}': result is empty array`) + }) + }) + }) describe('update', function () { it('sets result to null', function () { @@ -160,7 +160,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -168,11 +168,11 @@ describe('skipResult', function () { params, method: 'update', id: 1, - } as any as HookContext); - assert.deepStrictEqual(result, null, `'${i}': result is null`); - }); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, null, `'${i}': result is null`) + }) + }) + }) describe('patch', function () { it('sets result to null for id: 1', function () { @@ -182,7 +182,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -190,10 +190,10 @@ describe('skipResult', function () { params, method: 'patch', id: 1, - } as any as HookContext); - assert.deepStrictEqual(result, null, `'${i}': result is null`); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, null, `'${i}': result is null`) + }) + }) it('sets result to empty array for id: null', function () { const combos = [ @@ -202,7 +202,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -210,11 +210,11 @@ describe('skipResult', function () { params, method: 'patch', id: null, - } as any as HookContext); - assert.deepStrictEqual(result, [], `'${i}': result is empty array`); - }); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, [], `'${i}': result is empty array`) + }) + }) + }) describe('remove', function () { it('sets result to null for id: 1', function () { @@ -224,7 +224,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -232,10 +232,10 @@ describe('skipResult', function () { params, method: 'remove', id: 1, - } as any as HookContext); - assert.deepStrictEqual(result, null, `'${i}': result is null`); - }); - }); + } as any as HookContext) + assert.deepStrictEqual(result, null, `'${i}': result is null`) + }) + }) it('sets result to empty array for id: null', function () { const combos = [ @@ -244,7 +244,7 @@ describe('skipResult', function () { { service: paginatedService, params: paramsPaginateFalse }, { service: nonPaginatedService, params: paramsPaginate }, { service: nonPaginatedService, params: paramsAdapterPaginate }, - ]; + ] combos.forEach(({ service, params }, i) => { const { result } = skipResult({ @@ -252,9 +252,9 @@ describe('skipResult', function () { params, method: 'remove', id: null, - } as any as HookContext); - assert.deepStrictEqual(result, [], `'${i}': result is empty array`); - }); - }); - }); -}); + } as any as HookContext) + assert.deepStrictEqual(result, [], `'${i}': result is empty array`) + }) + }) + }) +}) diff --git a/src/utils/skip-result/skip-result.ts b/src/utils/skip-result/skip-result.ts index afdc8565..8caa299d 100644 --- a/src/utils/skip-result/skip-result.ts +++ b/src/utils/skip-result/skip-result.ts @@ -1,15 +1,15 @@ -import type { HookContext } from '@feathersjs/feathers'; -import { isMulti, isPaginated } from '../../predicates'; +import type { HookContext } from '@feathersjs/feathers' +import { isMulti, isPaginated } from '../../predicates/index.js' /** * util to set `context.result` to an empty array or object, depending on the hook type */ export const skipResult = (context: H) => { if (context.result) { - return context; + return context } - const multi = isMulti(context); + const multi = isMulti(context) if (multi) { if (context.method === 'find' && isPaginated(context)) { @@ -18,13 +18,13 @@ export const skipResult = (context: H) => { skip: 0, limit: 0, data: [], - }; + } } else { - context.result = []; + context.result = [] } } else { - context.result = null; + context.result = null } - return context; -}; + return context +} diff --git a/src/utils/transform-params/transform-params.ts b/src/utils/transform-params/transform-params.ts index 17d17ebe..30eb4a25 100644 --- a/src/utils/transform-params/transform-params.ts +++ b/src/utils/transform-params/transform-params.ts @@ -1,5 +1,5 @@ -import { Params } from '@feathersjs/feathers'; -import { TransformParamsFn } from '../../types'; +import type { Params } from '@feathersjs/feathers' +import type { TransformParamsFn } from '../../types.js' /** * Safely use a transformParams function to modify params. @@ -9,10 +9,10 @@ export const transformParams =

( fn: TransformParamsFn

| undefined, ): P => { if (!fn) { - return params; + return params } - const result = fn({ ...params }); + const result = fn({ ...params }) - return result ?? params; -}; + return result ?? params +} diff --git a/test/index.test.ts b/test/index.test.ts index 67d80b94..74c04340 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,14 +1,13 @@ -import { assert } from 'vitest'; -import * as allExported from '../src'; +import { assert } from 'vitest' +import * as allExported from '../src/index.js' const members = [ 'actOnDefault', 'actOnDispatch', // alter - 'alterItems', - 'alterData', - 'alterResult', + 'transformData', + 'transformResult', 'cache', 'callingParams', @@ -109,10 +108,10 @@ const members = [ 'getPaginate', 'skipResult', -].sort(); +].sort() describe('services exposed hooks', () => { it('no unexpected hooks', () => { - assert.deepEqual(Object.keys(allExported).sort(), [...members].sort()); - }); -}); + assert.deepEqual(Object.keys(allExported).sort(), [...members].sort()) + }) +}) diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 00000000..fb9c7721 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src/**/*", + "test/**/*", + "tsdown.config.ts", + "vite.config.ts", + "docs/**/*", + "docs/.vitepress/**/*", + ], +} + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 1eadbd48..c17a56f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,12 @@ { + "extends": "@tsconfig/node22/tsconfig.json", "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Node", + "outDir": "./dist", + "rootDir": "./src", "esModuleInterop": true, - "strict": true, - "types": ["vitest/globals"] + "types": ["vitest/globals", "vitest/importMeta"], + "declaration": true, }, - "include": ["src/**/*", "test/**/*"], - "exclude": ["node_modules"] + "include": ["src/**/*"] } + \ No newline at end of file diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 00000000..35e8458e --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,35 @@ +import { defineConfig } from 'tsdown' +import pkg from './package.json' + +export default defineConfig({ + entry: { + hooks: 'src/hooks/index.ts', + utils: 'src/utils/index.ts', + predicates: 'src/predicates/index.ts', + // resolvers: 'src/resolvers/index.ts', + }, + clean: true, + sourcemap: true, + dts: true, + format: ['esm'], + outDir: 'dist', + define: { + 'import.meta.vitest': 'undefined', + }, + target: 'esnext', + platform: 'neutral', + outExtensions: ctx => { + if (ctx.format === 'es') { + return { js: '.js', dts: '.ts' } + } + return {} + }, + external: [ + // regex for "node:*" imports + /^node:.*/, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies), + ], + treeshake: true, + unused: true, +}) diff --git a/vite.config.ts b/vite.config.ts index 439fd77b..2e4ea283 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vitest/config'; +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { @@ -16,4 +16,4 @@ export default defineConfig({ }, }, }, -}); +}) From 609dfead4efa287029ac82e8d737e14a91ee4f6d Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Mon, 9 Jun 2025 23:39:11 +0200 Subject: [PATCH 08/15] fix tests --- README.md | 7 +- src/hooks/index.ts | 1 - src/hooks/lowercase/lowercase-data.test.ts | 8 +- src/hooks/lowercase/lowercase-data.ts | 1 + .../prevent-changes/prevent-changes.test.ts | 58 +++-- src/hooks/prevent-changes/prevent-changes.ts | 2 +- src/hooks/set-field/set-field.ts | 2 +- src/hooks/set-now/set-now-data.test.ts | 4 +- src/hooks/set-now/set-now-data.ts | 13 +- src/hooks/set-slug/set-slug.ts | 14 +- src/hooks/sifter/sifter.test.ts | 50 ---- src/hooks/sifter/sifter.ts | 17 -- src/hooks/soft-delete/soft-delete.test.ts | 96 +++----- src/hooks/soft-delete/soft-delete.ts | 27 ++- src/hooks/transform/transform-data.ts | 2 + src/hooks/trim/trim-data.test.ts | 76 +++++++ src/hooks/trim/trim-data.ts | 31 +++ src/hooks/trim/trim-result.test.ts | 63 +++++ src/hooks/trim/trim-result.ts | 39 ++++ src/resolvers/hooks/index.ts | 4 + src/resolvers/hooks/resolve-data.test.ts | 131 +++++++++++ src/resolvers/hooks/resolve-data.ts | 22 ++ src/resolvers/{ => hooks}/resolve-query.ts | 8 +- src/resolvers/hooks/resolve-result.test.ts | 215 ++++++++++++++++++ src/resolvers/hooks/resolve-result.ts | 21 ++ src/resolvers/hooks/resolve.ts | 51 +++++ src/resolvers/hooks/resolvers.internal.ts | 114 ++++++++++ src/resolvers/index.ts | 4 +- src/resolvers/resolve-data.ts | 29 --- src/resolvers/resolve-result.ts | 44 ---- src/resolvers/resolver.test.ts | 108 --------- src/resolvers/resolvers.internal.ts | 135 ----------- test/index.test.ts | 35 +-- 33 files changed, 886 insertions(+), 546 deletions(-) delete mode 100755 src/hooks/sifter/sifter.test.ts delete mode 100755 src/hooks/sifter/sifter.ts create mode 100755 src/hooks/trim/trim-data.test.ts create mode 100755 src/hooks/trim/trim-data.ts create mode 100755 src/hooks/trim/trim-result.test.ts create mode 100755 src/hooks/trim/trim-result.ts create mode 100644 src/resolvers/hooks/index.ts create mode 100644 src/resolvers/hooks/resolve-data.test.ts create mode 100644 src/resolvers/hooks/resolve-data.ts rename src/resolvers/{ => hooks}/resolve-query.ts (50%) create mode 100644 src/resolvers/hooks/resolve-result.test.ts create mode 100644 src/resolvers/hooks/resolve-result.ts create mode 100644 src/resolvers/hooks/resolve.ts create mode 100644 src/resolvers/hooks/resolvers.internal.ts delete mode 100644 src/resolvers/resolve-data.ts delete mode 100644 src/resolvers/resolve-result.ts delete mode 100644 src/resolvers/resolver.test.ts delete mode 100644 src/resolvers/resolvers.internal.ts diff --git a/README.md b/README.md index dfad3a09..56871c01 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ - removed several checks that are handled by typescript - removed check for `preventChanges(true, ...fieldNames)` - - switch `true` to second argument + - switch `true` to second argument options + - async - renamed 'keepQuery' to 'pickQuery', added alias - renamed 'required' to 'checkRequired', added alias @@ -40,6 +41,10 @@ - rm 'actOnDispatch' & 'actOnDefault' +- rm 'validate', 'validateSchema', 'setNow', 'sequelizeConvert', 'serialize', 'required', 'runHook', 'populate', 'pick', 'omit', 'mongoKeys', 'lowercase', 'lowerCase', 'keepQuery', 'keepQueryInArray', 'isNot', fgraphql', 'fastJoin', 'discard...', 'dePopulate', 'actOnDefault', 'actOnDispatch', 'sifter' + +- softDelete: need to pass 'deletedQuery' and 'removeData' + #### predicates - renamed 'isNot' to 'not' (added alias for 'isNot') diff --git a/src/hooks/index.ts b/src/hooks/index.ts index ce3c33b5..0e505035 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -35,7 +35,6 @@ export * from './set-now/set-now-data.js' export * from './set-now/set-now-result.js' export * from './set-slug/set-slug.js' -export * from './sifter/sifter.js' export * from './soft-delete/soft-delete.js' export * from './stash-before/stash-before.js' export * from './traverse/traverse.js' diff --git a/src/hooks/lowercase/lowercase-data.test.ts b/src/hooks/lowercase/lowercase-data.test.ts index 24ea6924..eef82fa3 100755 --- a/src/hooks/lowercase/lowercase-data.test.ts +++ b/src/hooks/lowercase/lowercase-data.test.ts @@ -36,11 +36,11 @@ describe('lowercaseData', () => { assert.deepEqual(hook.data, { first: null, last: 'doe' }) }) - it('throws if field is not a string', () => { + it('throws if field is not a string', async () => { const hook: any = { type: 'before', method: 'create', data: { first: 1, last: 'Doe' } } - assert.throws(() => { - lowercaseData(['first', 'last'])(hook) - }) + await expect(async () => { + await lowercaseData(['first', 'last'])(hook) + }).rejects.toThrow('Expected string data. (lowercase first)') }) }) diff --git a/src/hooks/lowercase/lowercase-data.ts b/src/hooks/lowercase/lowercase-data.ts index b49e974a..17869c6f 100755 --- a/src/hooks/lowercase/lowercase-data.ts +++ b/src/hooks/lowercase/lowercase-data.ts @@ -11,6 +11,7 @@ import { toArray } from '../../internal.utils.js' */ export const lowercaseData = (fieldNames: MaybeArray) => { const fieldNamesArr = toArray(fieldNames) + return transformData(item => { for (let i = 0; i < fieldNamesArr.length; i++) { const fieldName = fieldNamesArr[i] diff --git a/src/hooks/prevent-changes/prevent-changes.test.ts b/src/hooks/prevent-changes/prevent-changes.test.ts index 8491060a..7e682284 100755 --- a/src/hooks/prevent-changes/prevent-changes.test.ts +++ b/src/hooks/prevent-changes/prevent-changes.test.ts @@ -1,4 +1,4 @@ -import { assert } from 'vitest' +import { assert, expect } from 'vitest' import { preventChanges } from './prevent-changes.js' import { clone } from '../../common/index.js' @@ -15,17 +15,27 @@ describe('preventChanges', () => { } }) - it('does not throw if props not found', () => { - preventChanges(['name', 'address'], { error: true })(hookBefore) - preventChanges(['name.x', 'x.y.z'], { error: true })(hookBefore) + it('does not throw if props not found', async () => { + await preventChanges(['name', 'address'], { error: true })(hookBefore) + await preventChanges(['name.x', 'x.y.z'], { error: true })(hookBefore) }) - it('throw if props found', () => { - assert.throw(() => preventChanges(['name', 'first'], { error: true })(hookBefore)) - assert.throw(() => preventChanges(['name', 'a'], { error: true })(hookBefore)) - assert.throw(() => preventChanges(['name', 'a.b'], { error: true })(hookBefore)) - assert.throw(() => preventChanges(['name', 'a.c'], { error: true })(hookBefore)) - assert.throw(() => preventChanges(['name', 'a.c.d.e'], { error: true })(hookBefore)) + it('throw if props found', async () => { + await expect(() => + preventChanges(['name', 'first'], { error: true })(hookBefore), + ).rejects.toThrow() + await expect(() => + preventChanges(['name', 'a'], { error: true })(hookBefore), + ).rejects.toThrow() + await expect(() => + preventChanges(['name', 'a.b'], { error: true })(hookBefore), + ).rejects.toThrow() + await expect(() => + preventChanges(['name', 'a.c'], { error: true })(hookBefore), + ).rejects.toThrow() + await expect(() => + preventChanges(['name', 'a.c.d.e'], { error: true })(hookBefore), + ).rejects.toThrow() }) }) @@ -39,38 +49,44 @@ describe('preventChanges', () => { } }) - it('does not delete if props not found', () => { - let context: any = preventChanges(['name', 'address'], { error: false })(clone(hookBefore)) + it('does not delete if props not found', async () => { + let context: any = await preventChanges(['name', 'address'], { error: false })( + clone(hookBefore), + ) assert.deepEqual(context, hookBefore) - context = preventChanges(['name.x', 'x.y.z'], { error: false })(clone(hookBefore)) + context = await preventChanges(['name.x', 'x.y.z'], { error: false })(clone(hookBefore)) assert.deepEqual(context, hookBefore) }) - it('deletes if props found', () => { - let context: any = preventChanges(['name', 'first'], { error: false })(clone(hookBefore)) + it('deletes if props found', async () => { + let context: any = await preventChanges(['name', 'first'], { error: false })( + clone(hookBefore), + ) assert.deepEqual(context.data, { last: 'Doe', a: { b: 'john', c: { d: { e: 1 } } } }, '1') - context = preventChanges(['name', 'a'], { error: false })(clone(hookBefore)) + context = await preventChanges(['name', 'a'], { error: false })(clone(hookBefore)) assert.deepEqual(context.data, { first: 'John', last: 'Doe' }, '2') - context = preventChanges(['name', 'a.b'], { error: false })(clone(hookBefore)) + context = await preventChanges(['name', 'a.b'], { error: false })(clone(hookBefore)) assert.deepEqual(context.data, { first: 'John', last: 'Doe', a: { c: { d: { e: 1 } } } }, '3') - context = preventChanges(['name', 'a.c'], { error: false })(clone(hookBefore)) + context = await preventChanges(['name', 'a.c'], { error: false })(clone(hookBefore)) assert.deepEqual(context.data, { first: 'John', last: 'Doe', a: { b: 'john' } }, '4') - context = preventChanges(['name', 'a.c.d.e'], { error: false })(clone(hookBefore)) + context = await preventChanges(['name', 'a.c.d.e'], { error: false })(clone(hookBefore)) assert.deepEqual( context.data, { first: 'John', last: 'Doe', a: { b: 'john', c: { d: {} } } }, '5', ) - context = preventChanges(['first', 'last'], { error: false })(clone(hookBefore)) + context = await preventChanges(['first', 'last'], { error: false })(clone(hookBefore)) assert.deepEqual(context.data, { a: { b: 'john', c: { d: { e: 1 } } } }) - context = preventChanges(['first', 'a.b', 'a.c.d.e'], { error: false })(clone(hookBefore)) + context = await preventChanges(['first', 'a.b', 'a.c.d.e'], { error: false })( + clone(hookBefore), + ) assert.deepEqual(context.data, { last: 'Doe', a: { c: { d: {} } } }) }) }) diff --git a/src/hooks/prevent-changes/prevent-changes.ts b/src/hooks/prevent-changes/prevent-changes.ts index c45ae02f..0fbf5daa 100755 --- a/src/hooks/prevent-changes/prevent-changes.ts +++ b/src/hooks/prevent-changes/prevent-changes.ts @@ -31,7 +31,7 @@ export const preventChanges = (fieldNames: MaybeArray, options?: Prevent throw error } } - + } else { item = _omit(item, fieldNamesArr) } diff --git a/src/hooks/set-field/set-field.ts b/src/hooks/set-field/set-field.ts index 67195f14..c68629a9 100644 --- a/src/hooks/set-field/set-field.ts +++ b/src/hooks/set-field/set-field.ts @@ -34,7 +34,7 @@ export const setField = context = _setWith(context, as, value, _clone) - if (next) return next().then(() => context) + if (next) return next() return context } diff --git a/src/hooks/set-now/set-now-data.test.ts b/src/hooks/set-now/set-now-data.test.ts index 1ebd9f92..9a2fe429 100755 --- a/src/hooks/set-now/set-now-data.test.ts +++ b/src/hooks/set-now/set-now-data.test.ts @@ -21,7 +21,7 @@ describe('setNowData', () => { }) it('supports multiple field names', () => { - setNowData('createdAt1', 'createdAt2')(hookBefore) + setNowData(['createdAt1', 'createdAt2'])(hookBefore) checkHook(hookBefore.data, { first: 'John', last: 'Doe' }, ['createdAt1', 'createdAt2']) }) }) @@ -54,7 +54,7 @@ describe('setNowData', () => { }) it('props with no dots', () => { - setNowData('madeAt', 'builtAt')(hookBefore) + setNowData(['madeAt', 'builtAt'])(hookBefore) checkHook( hookBefore.data, { empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, dept: 'Acct' }, diff --git a/src/hooks/set-now/set-now-data.ts b/src/hooks/set-now/set-now-data.ts index d2a7239a..7ea61159 100755 --- a/src/hooks/set-now/set-now-data.ts +++ b/src/hooks/set-now/set-now-data.ts @@ -1,3 +1,5 @@ +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' import { transformData } from '../transform/transform-data.js' import _set from 'lodash/set.js' @@ -6,11 +8,14 @@ import _set from 'lodash/set.js' * * @see https://hooks-common.feathersjs.com/hooks.html#setnow */ -export const setNowData = (...fieldNames: string[]) => - transformData(data => { - for (let i = 0; i < fieldNames.length; i++) { - const key = fieldNames[i] +export const setNowData = (fieldNames: MaybeArray) => { + const fieldNamesArr = toArray(fieldNames) + + return transformData(data => { + for (let i = 0; i < fieldNamesArr.length; i++) { + const key = fieldNamesArr[i] _set(data, key, new Date()) } }) +} diff --git a/src/hooks/set-slug/set-slug.ts b/src/hooks/set-slug/set-slug.ts index 0b38093b..be4cfcf6 100755 --- a/src/hooks/set-slug/set-slug.ts +++ b/src/hooks/set-slug/set-slug.ts @@ -6,13 +6,12 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' * * @see https://hooks-common.feathersjs.com/hooks.html#setslug */ -export const setSlug = - (slug: string, fieldName?: string) => - (context: H, next?: NextFunction) => { - if (typeof fieldName !== 'string') { - fieldName = `query.${slug}` - } +export const setSlug = (slug: string, fieldName?: string) => { + if (typeof fieldName !== 'string') { + fieldName = `query.${slug}` + } + return (context: H, next?: NextFunction) => { if (context.params && context.params.provider === 'rest') { const value = context.params.route[slug] if (typeof value === 'string' && value[0] !== ':') { @@ -20,7 +19,8 @@ export const setSlug = } } - if (next) return next().then(() => context) + if (next) return next() return context } +} diff --git a/src/hooks/sifter/sifter.test.ts b/src/hooks/sifter/sifter.test.ts deleted file mode 100755 index b55b6566..00000000 --- a/src/hooks/sifter/sifter.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { assert } from 'vitest' - -import sift from 'sift' -import { sifter } from './sifter.js' -import { clone } from '../../common/index.js' - -const dataCanada = [ - { name: 'john', address: { city: 'montreal', country: 'canada' } }, - { name: 'david', address: { city: 'vancouver', country: 'canada' } }, -] - -const dataUsa = [{ name: 'marshall', address: { city: 'utah', country: 'usa' } }] - -let context: any -let contextPaginated: any - -describe('sifter', () => { - beforeEach(() => { - const data = [...dataCanada, ...dataUsa] - - context = clone({ type: 'after', method: 'find', result: data }) - contextPaginated = clone({ - type: 'after', - method: 'find', - result: { total: 1, limit: 10, skip: 0, data }, - }) - }) - - it('sifts non-paginated data', async () => { - const hook1: any = await sifter(() => (sift as any)({ 'address.country': 'canada' }))(context) - assert.deepEqual(hook1.result, dataCanada) - }) - - it('sifts paginated data', async () => { - const hook1: any = await sifter(() => (sift as any)({ 'address.country': 'canada' }))( - contextPaginated, - ) - assert.deepEqual(hook1.result.data, dataCanada) - }) - - it('throws if getSifter not a function', async () => { - // @ts-expect-error throws if getSifter not a function - assert.throws(() => sifter({})(contextPaginated)) - }) - - it('throws if getSifter does not return a function', () => { - // @ts-expect-error throws if getSifter does not return a function - assert.throws(() => sifter((hook: any) => ({}))(contextPaginated)) - }) -}) diff --git a/src/hooks/sifter/sifter.ts b/src/hooks/sifter/sifter.ts deleted file mode 100755 index 2ce41d01..00000000 --- a/src/hooks/sifter/sifter.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers' -import type { SyncContextFunction } from '../../types.js' -import { replaceResult } from '../../utils/replace-items/replace-result.js' - -export const sifter = - (siftFunc: SyncContextFunction<(item: any) => boolean, H>) => - async (context: H, next?: NextFunction) => { - const sifter = siftFunc(context) - - if (next) { - await next() - } - - return replaceResult(context, item => item, { - transform: items => items.filter(sifter), - }) - } diff --git a/src/hooks/soft-delete/soft-delete.test.ts b/src/hooks/soft-delete/soft-delete.test.ts index 571efbf3..a2cf1c9d 100755 --- a/src/hooks/soft-delete/soft-delete.test.ts +++ b/src/hooks/soft-delete/soft-delete.test.ts @@ -6,10 +6,10 @@ import { softDelete } from './soft-delete.js' const initialUsers = [ { name: 'Jane Doe', key: 'a' }, { name: 'Jack Doe', key: 'a' }, - { name: 'Jack Doe', key: 'a', deleted: true }, + { name: 'Jack Doe', key: 'a', deletedAt: new Date() }, { name: 'Rick Doe', key: 'b' }, { name: 'Mick Doe', key: 'b' }, - { name: 'Mick Doe', key: 'b', deleted: true }, + { name: 'Mick Doe', key: 'b', deletedAt: new Date() }, ] describe('softDelete', () => { @@ -19,14 +19,19 @@ describe('softDelete', () => { const app = feathers().use( '/users', new MemoryService({ - multi: ['create', 'patch', 'remove'], + multi: true, }), ) userService = app.service('users') userService.hooks({ before: { - all: [softDelete()], + all: [ + softDelete({ + deletedQuery: { deletedAt: null }, + removeData: { deletedAt: new Date() }, + }), + ], }, }) @@ -45,19 +50,15 @@ describe('softDelete', () => { ]) }) - it('returns everything with params.disableSoftdelete', async () => { + it('returns everything with params.disableSoftDelete', async () => { const users = await userService.find({ disableSoftDelete: true, }) - assert.deepStrictEqual(users, [ - { name: 'Jane Doe', key: 'a', id: 0 }, - { name: 'Jack Doe', key: 'a', id: 1 }, - { name: 'Jack Doe', key: 'a', deleted: true, id: 2 }, - { name: 'Rick Doe', key: 'b', id: 3 }, - { name: 'Mick Doe', key: 'b', id: 4 }, - { name: 'Mick Doe', key: 'b', deleted: true, id: 5 }, - ]) + assert.deepStrictEqual( + users.map(x => x.id), + [0, 1, 2, 3, 4, 5], + ) }) }) @@ -83,12 +84,7 @@ describe('softDelete', () => { disableSoftDelete: true, }) - assert.deepStrictEqual(user, { - name: 'Jack Doe', - key: 'a', - deleted: true, - id: 2, - }) + assert.ok(user.deletedAt) }) it('throws on missing item', async () => { @@ -144,12 +140,8 @@ describe('softDelete', () => { it('marks item as deleted', async () => { const user = await userService.remove(0) - assert.deepStrictEqual(user, { - name: 'Jane Doe', - key: 'a', - id: 0, - deleted: true, - }) + assert.equal(user.id, 0) + assert.equal(!!user.deletedAt, true) await expect(() => userService.get(0)).rejects.toThrow() }) @@ -162,11 +154,20 @@ describe('softDelete', () => { describe('remove, without id', () => { it('marks filtered items as deleted', async () => { const query = { key: 'a' } - await userService.remove(null, { query }) + const removedUsers = await userService.remove(null, { query }) + + assert.strictEqual(removedUsers.length, 2) const users = await userService.find({ query }) assert.strictEqual(users.length, 0) + + const deletedUsers = await userService.find({ + query, + disableSoftDelete: true, + }) + + assert.strictEqual(deletedUsers.length, 3) }) it('handles nothing found', async () => { @@ -175,47 +176,4 @@ describe('softDelete', () => { assert.strictEqual(users.length, 0) }) }) - - describe('with customization: deletedAt', () => { - let peopleService: any - - beforeEach(() => { - const app = feathers().use( - '/people', - new MemoryService({ - multi: ['create', 'patch', 'remove'], - }), - ) - - peopleService = app.service('people') - peopleService.hooks({ - before: { - all: [ - softDelete({ - deletedQuery: async () => { - return { deletedAt: null } - }, - removeData: async () => { - return { deletedAt: new Date() } - }, - }), - ], - create: [ - (context: any) => { - context.data.deletedAt = null - }, - ], - }, - }) - }) - - it('works with setting deletedAt to date', async () => { - const user = await peopleService.create({ name: 'Jon Doe' }) - const deletedUser = await peopleService.remove(user.id) - - assert.ok(deletedUser.deletedAt !== null) - - await expect(() => peopleService.get(user.id)).rejects.toThrow() - }) - }) }) diff --git a/src/hooks/soft-delete/soft-delete.ts b/src/hooks/soft-delete/soft-delete.ts index 1de3518b..d5d8def0 100755 --- a/src/hooks/soft-delete/soft-delete.ts +++ b/src/hooks/soft-delete/soft-delete.ts @@ -10,33 +10,37 @@ export type SoftDeleteOptionFunction = ( export interface SoftDeleteOptions { /** - * @default { deletedAt: { $ne: true } } + * @example { deletedAt: null } */ - deletedQuery?: { [key: string]: any } | SoftDeleteOptionFunction + deletedQuery: { [key: string]: any } | SoftDeleteOptionFunction /** - * @default { deletedAt: new Date() } + * @example { deletedAt: new Date() } */ - removeData?: { [key: string]: any } | SoftDeleteOptionFunction + removeData: { [key: string]: any } | SoftDeleteOptionFunction /** * Transform the params before calling the service method. E.g. remove 'params.provider' or add custom params. */ transformParams?: TransformParamsFn /** + * Key in `params` to disable the soft delete functionality. + * * @default 'disableSoftDelete' */ disableSoftDeleteKey?: string } -const defaultQuery = () => ({ deletedAt: { $ne: true } }) -const defaultData = () => ({ deletedAt: new Date() }) - /** * Allow to mark items as deleted instead of removing them. */ -export const softDelete = - (options: SoftDeleteOptions = {}) => - async (context: H, next?: NextFunction) => { +export const softDelete = (options: SoftDeleteOptions) => { + if (!options?.deletedQuery || !options?.removeData) { + throw new Error( + 'You must provide `deletedQuery` and `removeData` options to the softDelete hook.', + ) + } + + return async (context: H, next?: NextFunction) => { checkContext(context, ['before', 'around'], null, 'softDelete') const { disableSoftDeleteKey = 'disableSoftDelete' } = options @@ -45,7 +49,7 @@ export const softDelete = return context } - const { deletedQuery = defaultQuery, removeData = defaultData } = options + const { deletedQuery, removeData } = options const deleteQuery = await getValue(deletedQuery, context) @@ -75,6 +79,7 @@ export const softDelete = return context } +} const getValue = (value: any, ...args: any[]) => { if (typeof value === 'function') { diff --git a/src/hooks/transform/transform-data.ts b/src/hooks/transform/transform-data.ts index f4f1b04e..57b42ace 100755 --- a/src/hooks/transform/transform-data.ts +++ b/src/hooks/transform/transform-data.ts @@ -22,4 +22,6 @@ export const transformData = if (next) { return next() } + + return context } diff --git a/src/hooks/trim/trim-data.test.ts b/src/hooks/trim/trim-data.test.ts new file mode 100755 index 00000000..7aa97e7b --- /dev/null +++ b/src/hooks/trim/trim-data.test.ts @@ -0,0 +1,76 @@ +import { assert } from 'vitest' +import type { HookContext } from '@feathersjs/feathers' +import { trimData } from './trim-data.js' + +describe('trimData', () => { + it('updates hook before::create', () => { + const context = { + type: 'before', + method: 'create', + data: { first: ' John', last: 'Doe ' }, + } as HookContext + trimData(['first', 'last'])(context) + assert.deepEqual(context.data, { first: 'John', last: 'Doe' }) + }) + + it('does not throw if field is missing', () => { + const context = { type: 'before', method: 'create', data: { last: ' Doe ' } } as HookContext + trimData(['first', 'last'])(context) + assert.deepEqual(context.data, { last: 'Doe' }) + }) + + it('does not throw if field is undefined', () => { + const context = { + type: 'before', + method: 'create', + data: { first: undefined, last: ' Doe' }, + } as HookContext + trimData(['first', 'last'])(context) + assert.deepEqual(context.data, { first: undefined, last: 'Doe' }) + }) + + it('does not throw if field is null', () => { + const context = { + type: 'before', + method: 'create', + data: { first: null, last: 'Doe ' }, + } as HookContext + trimData(['first', 'last'])(context) + assert.deepEqual(context.data, { first: null, last: 'Doe' }) + }) + + it('throws if field is not a string', async () => { + const context = { + type: 'before', + method: 'create', + data: { first: 1, last: 'Doe' }, + } as HookContext + await expect(async () => { + await trimData(['first', 'last'])(context) + }).rejects.toThrow('Expected string data. (trim first)') + }) + + it('prop with 1 dot', () => { + const context = { + data: { empl: { name: { first: 'John', last: 'Doe' }, status: ' AA' }, dept: ' Acct' }, + } as HookContext + trimData('empl.status')(context) + + assert.deepEqual(context.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: ' Acct', + }) + }) + + it('prop with 2 dots', () => { + const context = { + data: { empl: { name: { first: ' John', last: 'Doe' }, status: 'AA' }, dept: ' Acct' }, + } as HookContext + trimData('empl.name.first')(context) + + assert.deepEqual(context.data, { + empl: { name: { first: 'John', last: 'Doe' }, status: 'AA' }, + dept: ' Acct', + }) + }) +}) diff --git a/src/hooks/trim/trim-data.ts b/src/hooks/trim/trim-data.ts new file mode 100755 index 00000000..675d84c7 --- /dev/null +++ b/src/hooks/trim/trim-data.ts @@ -0,0 +1,31 @@ +import _get from 'lodash/get.js' +import _set from 'lodash/set.js' +import { BadRequest } from '@feathersjs/errors' +import { transformData } from '../transform/transform-data.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' + +/** + * Trim certain field values. + * @see https://hooks-common.feathersjs.com/hooks.html#trimData + */ +export const trimData = (fieldNames: MaybeArray) => { + const fieldNamesArr = toArray(fieldNames) + + return transformData(item => { + for (let i = 0; i < fieldNamesArr.length; i++) { + const fieldName = fieldNamesArr[i] + const value = _get(item, fieldName) + + if (value == null) { + continue + } + + if (typeof value !== 'string') { + throw new BadRequest(`Expected string data. (trim ${fieldName})`) + } + + _set(item, fieldName, value.trim()) + } + }) +} diff --git a/src/hooks/trim/trim-result.test.ts b/src/hooks/trim/trim-result.test.ts new file mode 100755 index 00000000..6957fda3 --- /dev/null +++ b/src/hooks/trim/trim-result.test.ts @@ -0,0 +1,63 @@ +import { assert } from 'vitest' +import { trimResult } from './trim-result.js' +import type { HookContext } from '@feathersjs/feathers' + +describe('lowercaseResult', () => { + it('updates hook after::find with pagination', () => { + const context = { + type: 'after', + method: 'find', + result: { + total: 2, + data: [ + { first: 'John ', last: ' Doe' }, + { first: ' Jane ', last: 'Doe ' }, + ], + }, + } as HookContext + + trimResult(['first', 'last'])(context) + assert.deepEqual(context.result.data, [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ]) + }) + + it('updates hook after::find with no pagination', () => { + const context = { + type: 'after', + method: 'find', + result: [ + { first: ' John', last: 'Doe ' }, + { first: ' Jane ', last: ' Doe' }, + ], + } as HookContext + trimResult(['first', 'last'])(context) + assert.deepEqual(context.result, [ + { first: 'John', last: 'Doe' }, + { first: 'Jane', last: 'Doe' }, + ]) + }) + + it('single result', () => { + const context = { + type: 'after', + method: 'create', + result: { first: ' Jane', last: 'Doe ' }, + } as HookContext + trimResult(['first', 'last'])(context) + + assert.deepEqual(context.result, { first: 'Jane', last: 'Doe' }) + }) + + it('single result dot notation', () => { + const context = { + type: 'after', + method: 'create', + result: { first: { name: ' Jane' }, last: 'Doe ' }, + } as HookContext + trimResult('first.name')(context) + + assert.deepEqual(context.result, { first: { name: 'Jane' }, last: 'Doe ' }) + }) +}) diff --git a/src/hooks/trim/trim-result.ts b/src/hooks/trim/trim-result.ts new file mode 100755 index 00000000..3bf0f0ce --- /dev/null +++ b/src/hooks/trim/trim-result.ts @@ -0,0 +1,39 @@ +import _get from 'lodash/get.js' +import _set from 'lodash/set.js' +import { BadRequest } from '@feathersjs/errors' +import { transformResult } from '../transform/transform-result.js' +import type { DispatchOption } from '../../types.js' +import type { MaybeArray } from '../../internal.utils.js' +import { toArray } from '../../internal.utils.js' + +export type TrimResultOptions = { + dispatch?: DispatchOption +} + +/** + * Convert certain field values to lower case. + * @see https://hooks-common.feathersjs.com/hooks.html#trimResult + */ +export const trimResult = (fieldNames: MaybeArray, options?: TrimResultOptions) => { + const fieldNamesArray = toArray(fieldNames) + + return transformResult( + (item: any) => { + for (let i = 0; i < fieldNamesArray.length; i++) { + const fieldName = fieldNamesArray[i] + const value = _get(item, fieldName) + + if (value == null) { + continue + } + + if (typeof value !== 'string') { + throw new BadRequest(`Expected string data. (lowercase ${fieldName})`) + } + + _set(item, fieldName, value.trim()) + } + }, + { dispatch: options?.dispatch }, + ) +} diff --git a/src/resolvers/hooks/index.ts b/src/resolvers/hooks/index.ts new file mode 100644 index 00000000..598ef09f --- /dev/null +++ b/src/resolvers/hooks/index.ts @@ -0,0 +1,4 @@ +export * from './resolve-data.js' +export * from './resolve-query.js' +export * from './resolve-result.js' +export * from './resolve.js' diff --git a/src/resolvers/hooks/resolve-data.test.ts b/src/resolvers/hooks/resolve-data.test.ts new file mode 100644 index 00000000..162ddbd1 --- /dev/null +++ b/src/resolvers/hooks/resolve-data.test.ts @@ -0,0 +1,131 @@ +import assert from 'node:assert' +import { BadRequest } from '@feathersjs/errors' +import { resolveData } from './resolve-data.js' +import type { HookContext } from '@feathersjs/feathers' + +type User = { + firstName: string + lastName: string + password: string +} + +describe('resolve-data', () => { + it('simple resolver', async () => { + const context = { + data: { + firstName: 'Dave', + lastName: 'L.', + }, + } as unknown as HookContext + + const u = await resolveData({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.data, { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }) + }) + + it('array resolver', async () => { + const context = { + data: [ + { + firstName: 'Dave', + lastName: 'L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + }, + ], + } as unknown as HookContext + + const u = await resolveData({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.data, [ + { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + name: 'Fred F.', + }, + ]) + }) + + it('resolving with errors', async () => { + const resolver = resolveData<{ name: string; age: number }>({ + 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 + }, + }) + + await assert.rejects( + () => + resolver({ + data: { + name: 'Dave', + age: 16, + }, + } as HookContext), + { + 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 = resolveData({}) + const data = { message: 'Hello' } + const resolved = await resolver({ data } as HookContext) + + assert.strictEqual(data, resolved.data) + }) +}) diff --git a/src/resolvers/hooks/resolve-data.ts b/src/resolvers/hooks/resolve-data.ts new file mode 100644 index 00000000..8a7b4174 --- /dev/null +++ b/src/resolvers/hooks/resolve-data.ts @@ -0,0 +1,22 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { ResolverObject } from './resolvers.internal.js' +import { resolve } from './resolvers.internal.js' +import { replaceData } from '../../utils/index.js' + +export const resolveData = + , H extends HookContext = HookContext>( + resolverProperties: ResolverObject, + ) => + async (context: H, next?: NextFunction) => { + await replaceData(context, item => + resolve(resolverProperties, item, context, { + originalContext: context, + }), + ) + + if (typeof next === 'function') { + return next() + } + + return context + } diff --git a/src/resolvers/resolve-query.ts b/src/resolvers/hooks/resolve-query.ts similarity index 50% rename from src/resolvers/resolve-query.ts rename to src/resolvers/hooks/resolve-query.ts index 28b0b7a6..8efa72ec 100644 --- a/src/resolvers/resolve-query.ts +++ b/src/resolvers/hooks/resolve-query.ts @@ -1,11 +1,11 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' -import { type Resolver, runResolvers } from './resolvers.internal.js' +import { type ResolverObject, resolve } from './resolvers.internal.js' export const resolveQuery = - (...resolvers: Resolver[]) => + (resolverProperties: ResolverObject) => async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {} - const query = await runResolvers(resolvers, data, context) + const queryIngoing = context?.params?.query || {} + const query = await resolve(resolverProperties, queryIngoing, context) context.params = { ...context.params, diff --git a/src/resolvers/hooks/resolve-result.test.ts b/src/resolvers/hooks/resolve-result.test.ts new file mode 100644 index 00000000..bae835c0 --- /dev/null +++ b/src/resolvers/hooks/resolve-result.test.ts @@ -0,0 +1,215 @@ +import assert from 'node:assert' +import { BadRequest } from '@feathersjs/errors' +import { resolveResult } from './resolve-result.js' +import type { HookContext } from '@feathersjs/feathers' + +type User = { + firstName: string + lastName: string + password: string +} + +describe('resolve-result', () => { + it('simple resolver', async () => { + const context = { + result: { + firstName: 'Dave', + lastName: 'L.', + }, + } as unknown as HookContext + + const u = await resolveResult({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.result, { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }) + }) + + it('array result on create', async () => { + const context = { + method: 'create', + result: [ + { + firstName: 'Dave', + lastName: 'L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + }, + ], + } as unknown as HookContext + + const u = await resolveResult({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.result, [ + { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + name: 'Fred F.', + }, + ]) + }) + + it('array result on find', async () => { + const context = { + method: 'find', + result: [ + { + firstName: 'Dave', + lastName: 'L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + }, + ], + } as unknown as HookContext + + const u = await resolveResult({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.result, [ + { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + name: 'Fred F.', + }, + ]) + }) + + it('paginated result', async () => { + const context = { + method: 'find', + result: { + data: [ + { + firstName: 'Dave', + lastName: 'L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + }, + ], + }, + } as unknown as HookContext + + const u = await resolveResult({ + 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}` + }, + })(context) + + assert.deepStrictEqual(u.result.data, [ + { + firstName: 'Dave', + lastName: 'L.', + name: 'Dave L.', + }, + { + firstName: 'Fred', + lastName: 'F.', + name: 'Fred F.', + }, + ]) + }) + + it('resolving with errors', async () => { + const resolver = resolveResult<{ name: string; age: number }>({ + 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 + }, + }) + + await assert.rejects( + () => + resolver({ + result: { + name: 'Dave', + age: 16, + }, + } as HookContext), + { + 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 result = { message: 'Hello' } + const resolved = await resolveResult({})({ result } as HookContext) + + assert.strictEqual(result, resolved.result) + }) +}) diff --git a/src/resolvers/hooks/resolve-result.ts b/src/resolvers/hooks/resolve-result.ts new file mode 100644 index 00000000..87091a22 --- /dev/null +++ b/src/resolvers/hooks/resolve-result.ts @@ -0,0 +1,21 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { resolve, type ResolverObject } from './resolvers.internal.js' +import { replaceResult } from '../../utils/index.js' + +export const resolveResult = , H extends HookContext = HookContext>( + resolverProperties: ResolverObject, +) => { + return async (context: H, next?: NextFunction) => { + if (next) { + await next() + } + + await replaceResult(context, item => + resolve(resolverProperties, item, context, { + originalContext: context, + }), + ) + + return context + } +} diff --git a/src/resolvers/hooks/resolve.ts b/src/resolvers/hooks/resolve.ts new file mode 100644 index 00000000..06ff2cd4 --- /dev/null +++ b/src/resolvers/hooks/resolve.ts @@ -0,0 +1,51 @@ +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { ResolverObject } from './resolvers.internal.js' +import { resolveData } from './resolve-data.js' +import { resolveQuery } from './resolve-query.js' + +export const resolve = < + T extends Record, + H extends HookContext = HookContext, +>(resolverProperties: { + data?: ResolverObject + query?: ResolverObject + result?: ResolverObject +}) => { + const dataResolver = resolverProperties.data ? resolveData(resolverProperties.data) : undefined + const queryResolver = resolverProperties.query + ? resolveQuery(resolverProperties.query) + : undefined + const resultResolver = resolverProperties.result + ? resolveData(resolverProperties.result) + : undefined + + if (!dataResolver && !queryResolver && !resultResolver) { + throw new Error('At least one resolver must be provided (data, query, or result)') + } + + return async (context: H, next?: NextFunction) => { + if (queryResolver || dataResolver) { + const promisesBefore: Promise[] = [] + + if (queryResolver) { + promisesBefore.push(queryResolver(context, next)) + } + + if (dataResolver) { + promisesBefore.push(dataResolver(context, next)) + } + + await Promise.all(promisesBefore) + } + + if (typeof next === 'function') { + await next() + } + + if (resultResolver) { + await resultResolver(context, next) + } + + return context + } +} diff --git a/src/resolvers/hooks/resolvers.internal.ts b/src/resolvers/hooks/resolvers.internal.ts new file mode 100644 index 00000000..4d6b4f32 --- /dev/null +++ b/src/resolvers/hooks/resolvers.internal.ts @@ -0,0 +1,114 @@ +import { BadRequest } from '@feathersjs/errors' +import type { Promisable } from '../../internal.utils.js' + +export type ResolverProperty = ( + value: V | undefined, + obj: T, + context: C, + status: ResolverOptions, +) => Promisable + +export type ResolverObject = { + [key in string]: ResolverProperty< + T, + key extends keyof T ? T[key] : undefined, + C, + key extends keyof T ? T[key] : any + > +} + +export interface ResolverOptions { + path: string[] + stack: ResolverProperty[] + select?: string[] +} + +const resolveProperty = async ( + resolver: ResolverProperty, + name: K, + data: D, + context: C, + status: Partial> = {}, +): Promise => { + const value = (data as any)[name] + const { path = [], stack = [] } = status || {} + + // This prevents circular dependencies + if (stack.includes(resolver)) { + return undefined as any + } + + const resolverStatus = { + ...status, + path: [...path, name as string], + stack: [...stack, resolver], + } + + return await resolver(value, data as any, context, resolverStatus) +} + +export const resolve = async , C>( + resolverProperties: ResolverObject, + data: D, + context: C, + options?: Partial>, +): Promise => { + let propertyNames = Object.keys(resolverProperties) as any as (keyof T)[] + + if (options?.select) { + // If select is defined, filter the properties to only those that are selected + propertyNames = propertyNames.filter(name => options.select!.includes(name as string)) + } + + if (!propertyNames.length) { + // If no properties are defined, return the data as is + return data as any as T + } + + const propertyList = [...new Set(Object.keys(data).concat(propertyNames as string[]))] + + 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 (name in resolverProperties) { + const resolverProperty = resolverProperties[name] + try { + const resolved = await resolveProperty( + resolverProperty as any, + name as any, + data, + context, + options, + ) + + 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) { + throw new BadRequest('Error resolving data', errors) + } + + return result +} diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts index 7b502f52..fd038e47 100644 --- a/src/resolvers/index.ts +++ b/src/resolvers/index.ts @@ -1,3 +1 @@ -export * from './resolve-data.js' -export * from './resolve-query.js' -export * from './resolve-result.js' +export * from './hooks/index.js' diff --git a/src/resolvers/resolve-data.ts b/src/resolvers/resolve-data.ts deleted file mode 100644 index 2b04760f..00000000 --- a/src/resolvers/resolve-data.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers' -import type { Resolver } from './resolvers.internal.js' -import { runResolvers } from './resolvers.internal.js' - -export const resolveData = - , H extends HookContext = HookContext>( - ...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() - } - } diff --git a/src/resolvers/resolve-result.ts b/src/resolvers/resolve-result.ts deleted file mode 100644 index 0304abb3..00000000 --- a/src/resolvers/resolve-result.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers' -import type { Resolver } from './resolvers.internal.js' -import { getResult, runResolvers } from './resolvers.internal.js' - -export const resolveResult = (...resolvers: Resolver[]) => { - 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 resolve = { - originalContext: context, - ...context.params.resolve, - properties: $resolve || $select, - } - - context.params = { - ...context.params, - resolve, - query: { - ...query, - }, - } - - 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 - } - } -} diff --git a/src/resolvers/resolver.test.ts b/src/resolvers/resolver.test.ts deleted file mode 100644 index 1dd709d0..00000000 --- a/src/resolvers/resolver.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import assert from 'node:assert' -import { BadRequest } from '@feathersjs/errors' -import { resolveData } from './resolve-data.js' -import type { HookContext } from '@feathersjs/feathers' - -type User = { - firstName: string - lastName: string - password: string -} - -describe('resolve', () => { - it('simple resolver', async () => { - const context = { - data: { - firstName: 'Dave', - lastName: 'L.', - }, - } as unknown as HookContext - - const resolver = resolveData({ - 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 await resolver(context) - - assert.deepStrictEqual(u.data, { - firstName: 'Dave', - lastName: 'L.', - name: 'Dave L.', - }) - }) - - 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/src/resolvers/resolvers.internal.ts b/src/resolvers/resolvers.internal.ts deleted file mode 100644 index 06f3462e..00000000 --- a/src/resolvers/resolvers.internal.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { BadRequest } from '@feathersjs/errors' -import type { HookContext } from '@feathersjs/feathers' -import type { Promisable } from '../internal.utils.js' - -export type ResolverProperty = ( - value: V | undefined, - obj: T, - context: C, - status: ResolverStatus, -) => Promisable - -export type Resolver = { - [key in string]: ResolverProperty< - T, - key extends keyof T ? T[key] : undefined, - C, - key extends keyof T ? T[key] : any - > -} - -export type ResolverConverter = ( - obj: any, - context: C, - status: ResolverStatus, -) => Promisable - -export interface ResolverStatus { - path: string[] - originalContext?: C - properties?: (keyof T)[] - stack: ResolverProperty[] -} - -const resolveProperty = async ( - resolver: ResolverProperty, - name: K, - data: D, - context: C, - status: Partial> = {}, -): Promise => { - const value = (data as any)[name] - const { path = [], stack = [] } = status || {} - - // This prevents circular dependencies - if (stack.includes(resolver)) { - return undefined as any - } - - const resolverStatus = { - ...status, - path: [...path, name as string], - stack: [...stack, resolver], - } - - return await resolver(value, data as any, context, resolverStatus) -} - -const resolve = async , C>( - resolver: Resolver, - data: D, - context: C, - status?: Partial>, -): Promise => { - const propertyNames = Object.keys(resolver) as any as (keyof T)[] - - 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(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 (name in resolver) { - const resolverProperty = resolver[name] - try { - const resolved = await resolveProperty(resolverProperty, 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 result -} - -export const runResolvers = async ( - resolvers: Resolver[], - data: any, - ctx: H, - status?: Partial>, -) => { - let current: any = data - - for (const resolver of resolvers) { - current = await resolve(resolver, current, ctx, status) - } - - return current as T -} - -export const getResult = (context: H) => { - const isPaginated = context.method === 'find' && context.result.data - const data = isPaginated ? context.result.data : context.result - - return { isPaginated, data } -} diff --git a/test/index.test.ts b/test/index.test.ts index 74c04340..aee8014d 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -2,10 +2,7 @@ import { assert } from 'vitest' import * as allExported from '../src/index.js' const members = [ - 'actOnDefault', - 'actOnDispatch', - - // alter + // transform 'transformData', 'transformResult', @@ -16,22 +13,14 @@ const members = [ 'checkContextIf', 'combine', 'debug', - 'dePopulate', 'disablePagination', 'disallow', // omit - 'discard', - 'discardData', - 'discardResult', - 'discardQuery', - 'omit', 'omitData', 'omitResult', 'omitQuery', - 'fastJoin', - 'fgraphql', 'getItems', 'getDataIsArray', 'getResultIsArray', @@ -39,31 +28,18 @@ const members = [ 'isProvider', // pick - 'keep', - 'keepData', - 'keepResult', - 'keepQuery', - 'pick', 'pickData', 'pickResult', 'pickQuery', - 'keepInArray', - - 'keepQueryInArray', - // lowercase - 'lowerCase', - 'lowercase', 'lowercaseData', 'lowercaseResult', 'makeCallingParams', 'methodNames', - 'mongoKeys', 'paramsForServer', 'paramsFromClient', - 'populate', 'preventChanges', // replace @@ -72,24 +48,16 @@ const members = [ 'replaceResult', 'checkRequired', - 'required', - 'runHook', 'runParallel', - 'sequelizeConvert', - 'serialize', 'setField', - 'setNow', 'setNowData', 'setNowResult', 'setSlug', - 'sifter', 'softDelete', 'stashBefore', 'traverse', - 'validate', - 'validateSchema', // iff 'iffElse', @@ -100,7 +68,6 @@ const members = [ // predicates 'some', 'every', - 'isNot', 'not', 'isMulti', 'isPaginated', From 8c62848a2490e4d8e81b5a539f3216d656f6b0dd Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Mon, 9 Jun 2025 23:52:03 +0200 Subject: [PATCH 09/15] ci: fix build --- .github/contributing.md | 10 ++-------- .github/workflows/nodejs.yml | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/contributing.md b/.github/contributing.md index 52f1de26..9156892c 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -10,7 +10,7 @@ Before creating an issue please make sure you have checked out the docs, specifi If you haven't found your answer please feel free to join our [slack channel](http://slack.feathersjs.com), create an issue on Github, or post on [Stackoverflow](http://stackoverflow.com) using the `feathers` or `feathersjs` tag. We try our best to monitor Stackoverflow but you're likely to get more immediate responses in Slack and Github. -Issues can be reported in the [issue tracker](https://github.com/feathersjs/feathers/issues). Since feathers combines many modules it can be hard for us to assess the root cause without knowing which modules are being used and what your configuration looks like, so **it helps us immensely if you can link to a simple example that reproduces your issue**. +Issues can be reported in the [issue tracker](https://github.com/feathersjs/feathers/issues). Since feathers combines many modules it can be hard for us to assess the root cause without knowing which modules are being used and what your configuration looks like, so **it helps us immensely if you can link to a simple example that reproduces your issue**. ## Report a Security Concern @@ -34,13 +34,7 @@ Although we generally accept many PRs they can be rejected for many reasons. We Before running the tests from the `test/` folder `npm test` will run ESlint. You can check your code changes individually by running `npm run lint`. -### ES6 compilation - -Feathers uses [Babel](https://babeljs.io/) to leverage the latest developments of the JavaScript language. All code and samples are currently written in ES2015. To transpile the code in this repository run - -> npm run compile - -__Note:__ `npm test` will run the compilation automatically before the tests. +**Note:** `npm test` will run the compilation automatically before the tests. ### Tests diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 846971bb..b612bf0a 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -24,4 +24,4 @@ jobs: with: node-version: 20.x - run: npm install - - run: npm run compile + - run: npm run build From 3ec1ba54ff0a7f5172335da40b2d5d0f368ed124 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Tue, 10 Jun 2025 10:43:11 +0200 Subject: [PATCH 10/15] test: coverage - add throwIf tests --- .github/contributing.md | 22 ++- .github/workflows/nodejs.yml | 17 +- package.json | 21 ++- src/common/index.ts | 2 - src/common/set-fields.ts | 17 -- src/common/transform-items.ts | 13 -- src/hooks/soft-delete/soft-delete.test.ts | 2 +- src/hooks/throw-if/throw-if-is-multi.test.ts | 146 ++++++++++++++++++ src/hooks/throw-if/throw-if-is-multi.ts | 37 ++--- .../throw-if/throw-if-is-provider.test.ts | 37 +++++ src/hooks/throw-if/throw-if-is-provider.ts | 12 +- src/hooks/throw-if/throw-if.test.ts | 23 +++ src/predicates/every/every.test.ts | 12 +- src/predicates/every/every.ts | 19 ++- src/predicates/some/some.test.ts | 12 +- src/predicates/some/some.ts | 19 ++- src/resolvers/hooks/resolve-data.ts | 6 +- src/resolvers/hooks/resolve-result.ts | 6 +- .../get-exposed-methods.test.ts | 45 ++++++ tsdown.config.ts | 3 +- vite.config.ts | 7 +- 21 files changed, 376 insertions(+), 102 deletions(-) delete mode 100755 src/common/set-fields.ts delete mode 100755 src/common/transform-items.ts create mode 100644 src/hooks/throw-if/throw-if-is-multi.test.ts create mode 100644 src/hooks/throw-if/throw-if-is-provider.test.ts create mode 100644 src/hooks/throw-if/throw-if.test.ts create mode 100644 src/utils/get-exposed-methods/get-exposed-methods.test.ts diff --git a/.github/contributing.md b/.github/contributing.md index 9156892c..e4005303 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -2,13 +2,11 @@ Thank you for contributing to Feathers! :heart: :tada: -This repo is the main core and where most issues are reported. Feathers embraces modularity and is broken up across many repos. To make this easier to manage we currently use [Zenhub](https://www.zenhub.com/) for issue triage and visibility. They have a free browser plugin you can install so that you can see what is in flight at any time, but of course you also always see current issues in Github. - ## Report a bug Before creating an issue please make sure you have checked out the docs, specifically the [FAQ](https://docs.feathersjs.com/help/faq.html) section. You might want to also try searching Github. It's pretty likely someone has already asked a similar question. -If you haven't found your answer please feel free to join our [slack channel](http://slack.feathersjs.com), create an issue on Github, or post on [Stackoverflow](http://stackoverflow.com) using the `feathers` or `feathersjs` tag. We try our best to monitor Stackoverflow but you're likely to get more immediate responses in Slack and Github. +If you haven't found your answer please feel free to join our [Discord server](https://discord.gg/qa8kez8QBx), create an issue on Github, or post on [Stackoverflow](http://stackoverflow.com) using the `feathersjs` tag. We try our best to monitor Stackoverflow but you're likely to get more immediate responses in Discord and Github. Issues can be reported in the [issue tracker](https://github.com/feathersjs/feathers/issues). Since feathers combines many modules it can be hard for us to assess the root cause without knowing which modules are being used and what your configuration looks like, so **it helps us immensely if you can link to a simple example that reproduces your issue**. @@ -16,17 +14,17 @@ Issues can be reported in the [issue tracker](https://github.com/feathersjs/feat We take security very seriously at Feathers. We welcome any peer review of our 100% open source code to ensure nobody's Feathers app is ever compromised or hacked. As a web application developer you are responsible for any security breaches. We do our very best to make sure Feathers is as secure as possible by default. -In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Slack](http://slack.feathersjs.com) or email us at hello@feathersjs.com with details and we will respond ASAP. +In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Discord](https://discord.gg/qa8kez8QBx) or email us at hello@feathersjs.com with details and we will respond ASAP. For full details refer to our [Security docs](https://docs.feathersjs.com/SECURITY.html). ## Pull Requests -We :heart: pull requests and we're continually working to make it as easy as possible for people to contribute, including a [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) and a [common test suite](https://github.com/feathersjs/feathers-service-tests) for database adapters. +We :heart: pull requests and we're continually working to make it as easy as possible for people to contribute. -We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. +We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A FeathersJS maintainer will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. -Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: +Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context, historical knowledge or information regarding the roadmap that the maintainers have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: **All PRs (except documentation) should be accompanied with tests and pass the linting rules.** @@ -34,21 +32,19 @@ Although we generally accept many PRs they can be rejected for many reasons. We Before running the tests from the `test/` folder `npm test` will run ESlint. You can check your code changes individually by running `npm run lint`. -**Note:** `npm test` will run the compilation automatically before the tests. - ### Tests [Mocha](http://mochajs.org/) tests are located in the `test/` folder and can be run using the `npm run mocha` or `npm test` (with ESLint and code coverage) command. ### Documentation -Feathers documentation is contained in Markdown files in the [feathers-docs](https://github.com/feathersjs/feathers-docs) repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated with the next release. +Feathers documentation is contained in Markdown files in the [docs folder](https://github.com/feathersjs/feathers) of the main repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated as soon as it is merged. -## External Modules +## Community Contributions -If you're written something awesome for Feathers, the Feathers ecosystem, or using Feathers please add it to the [showcase](https://docs.feathersjs.com/why/showcase.html). You also might want to check out the [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) that can be used to scaffold plugins to be Feathers compliant from the start. +If you've written something awesome about Feathers, for the Feathers ecosystem, or created an app using Feathers please add it to the [awesome-feathersjs](https://github.com/feathersjs-ecosystem/awesome-feathersjs). -If you think it would be a good core module then please contact one of the Feathers core team members in [Slack](http://slack.feathersjs.com) and we can discuss whether it belongs in core and how to get it there. :beers: +If you think your module would be a good core `feathersjs` module or [featherjs-ecosystem](https://github.com/feathersjs-ecosystem) module then please contact one of the Feathers maintainers on [Discord](https://discord.gg/qa8kez8QBx) and we can discuss whether it belongs and how to get it there. :beers: ## Contributor Code of Conduct diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index b612bf0a..e46af5ea 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -19,9 +19,22 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Use Node.js 20.x + - name: Use Node.js 22.x uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x - run: npm install - run: npm run build + + are_the_types_wrong: + name: Are The Types Wrong? + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js 22.x + uses: actions/setup-node@v4 + with: + node-version: 22.x + - run: npm install + - run: npm run build + - run: npx --yes @arethetypeswrong/cli --pack . --profile esm-only diff --git a/package.json b/package.json index c0be922f..665489f4 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,29 @@ "version": "8.2.1", "description": "Useful hooks for use with Feathersjs services.", "main": "./dist/index.js", - "module": "./dist/index.mjs", + "module": "./dist/index.js", "types": "./dist/index.d.ts", "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "require": "./dist/index.js", - "import": "./dist/index.mjs" + "import": "./dist/index.js" + }, + "./hooks": { + "types": "./dist/hooks.d.ts", + "import": "./dist/hooks.js" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "import": "./dist/utils.js" + }, + "./predicates": { + "types": "./dist/predicates.d.ts", + "import": "./dist/predicates.js" + }, + "./resolvers": { + "types": "./dist/resolvers.d.ts", + "import": "./dist/resolvers.js" } }, "scripts": { diff --git a/src/common/index.ts b/src/common/index.ts index 45b71372..4fd737f1 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -2,7 +2,5 @@ export function isPromise(p: any): p is Promise { return p instanceof Promise } -export { setFields } from './set-fields.js' -export { transformItems } from './transform-items.js' export { traverse } from './traverse.js' export { clone } from './clone.js' diff --git a/src/common/set-fields.ts b/src/common/set-fields.ts deleted file mode 100755 index 94058dae..00000000 --- a/src/common/set-fields.ts +++ /dev/null @@ -1,17 +0,0 @@ -import _set from 'lodash/set.js' - -export function setFields>( - items: T | T[], - fieldValue: any, - fieldNames: string[], - defaultFieldName: string, -): void { - const value = typeof fieldValue === 'function' ? fieldValue() : fieldValue - - if (!fieldNames.length) fieldNames = [defaultFieldName] - ;(Array.isArray(items) ? items : [items]).forEach(item => { - fieldNames.forEach((fieldName: any) => { - _set(item, fieldName, value) - }) - }) -} diff --git a/src/common/transform-items.ts b/src/common/transform-items.ts deleted file mode 100755 index 3ea81a58..00000000 --- a/src/common/transform-items.ts +++ /dev/null @@ -1,13 +0,0 @@ -import _get from 'lodash/get.js' - -export function transformItems>( - items: T | T[], - fieldNames: string[], - transformer: (item: T, fieldName: string, val: any) => void, -): void { - ;(Array.isArray(items) ? items : [items]).forEach(item => { - fieldNames.forEach((fieldName: any) => { - transformer(item, fieldName, _get(item, fieldName)) - }) - }) -} diff --git a/src/hooks/soft-delete/soft-delete.test.ts b/src/hooks/soft-delete/soft-delete.test.ts index a2cf1c9d..5a137019 100755 --- a/src/hooks/soft-delete/soft-delete.test.ts +++ b/src/hooks/soft-delete/soft-delete.test.ts @@ -56,7 +56,7 @@ describe('softDelete', () => { }) assert.deepStrictEqual( - users.map(x => x.id), + users.map((x: any) => x.id), [0, 1, 2, 3, 4, 5], ) }) diff --git a/src/hooks/throw-if/throw-if-is-multi.test.ts b/src/hooks/throw-if/throw-if-is-multi.test.ts new file mode 100644 index 00000000..c1d9812f --- /dev/null +++ b/src/hooks/throw-if/throw-if-is-multi.test.ts @@ -0,0 +1,146 @@ +import { BadRequest } from '@feathersjs/errors' +import { throwIfIsMulti } from './throw-if-is-multi.js' +import type { HookContext } from '@feathersjs/feathers' + +describe('throwIfIsMulti', () => { + describe('general', () => { + it('does not throw on find', async () => { + const context = { + method: 'find', + params: { query: { name: 'item1' } }, + } as HookContext + + await throwIfIsMulti()(context) + }) + + it('does not throw on get', async () => { + const context = { + method: 'get', + id: 'item1', + } as HookContext + await throwIfIsMulti()(context) + }) + + it('does not throw on single create', async () => { + const context = { + method: 'create', + data: { name: 'item1' }, + } as HookContext + + await throwIfIsMulti()(context) + }) + + it('does not throw on single update', async () => { + const context = { + method: 'update', + id: 'item1', + data: { name: 'item1' }, + } as HookContext + + await throwIfIsMulti()(context) + }) + + it('does not throw on single patch', async () => { + const context = { + method: 'patch', + id: 'item1', + data: { name: 'item1' }, + } as HookContext + + await throwIfIsMulti()(context) + }) + + it('does not throw on single remove', async () => { + const context = { + method: 'remove', + id: 'item1', + } as HookContext + + await throwIfIsMulti()(context) + }) + }) + + it('throws on multi create by default', async () => { + const context = { + method: 'create', + data: [{ name: 'item1' }, { name: 'item2' }], + } as HookContext + + await expect(() => throwIfIsMulti()(context)).rejects.toThrow(BadRequest) + }) + + it('throws on multi patch by default', async () => { + const context = { + method: 'patch', + id: null, + data: { name: 'item1' }, + } as any as HookContext + + await expect(() => throwIfIsMulti()(context)).rejects.toThrow(BadRequest) + }) + + it('throws on multi remove by default', async () => { + const context = { + method: 'remove', + id: null, + } as any as HookContext + + await expect(() => throwIfIsMulti()(context)).rejects.toThrow(BadRequest) + }) + + describe('with filter', () => { + it('filter function has context as argument', async () => { + const filterFn = vi.fn(() => true) + const context = { + method: 'create', + data: [{ name: 'item1' }, { name: 'item2' }], + } as HookContext + await expect(() => throwIfIsMulti({ filter: filterFn })(context)).rejects.toThrow(BadRequest) + expect(filterFn).toHaveBeenCalledWith(context) + }) + + it('does not throw on multi create if filter returns false', async () => { + const context = { + method: 'create', + data: [{ name: 'item1' }, { name: 'item2' }], + } as HookContext + + await expect(() => throwIfIsMulti()(context)).rejects.toThrow(BadRequest) + + // sync + await expect( + throwIfIsMulti({ + filter: () => false, + })(context), + ).resolves.not.toThrow() + + // async + await expect( + throwIfIsMulti({ + filter: async () => false, + })(context), + ).resolves.not.toThrow() + }) + + it('throws on multi create if filter returns true', async () => { + const context = { + method: 'create', + data: [{ name: 'item1' }, { name: 'item2' }], + } as HookContext + + // sync + await expect(() => + throwIfIsMulti({ + filter: () => true, + })(context), + ).rejects.toThrow() + + // async + await expect(() => + throwIfIsMulti({ + filter: async () => true, + })(context), + ).rejects.toThrow() + }) + }) +}) diff --git a/src/hooks/throw-if/throw-if-is-multi.ts b/src/hooks/throw-if/throw-if-is-multi.ts index 8d8b65b8..8af44714 100644 --- a/src/hooks/throw-if/throw-if-is-multi.ts +++ b/src/hooks/throw-if/throw-if-is-multi.ts @@ -1,8 +1,8 @@ -import type { HookContext, NextFunction } from '@feathersjs/feathers' -import { checkContext } from '../../utils/index.js' +import type { HookContext } from '@feathersjs/feathers' import type { PredicateFn } from '../../types.js' -import { BadRequest, type FeathersError } from '@feathersjs/errors' -import { isMulti } from '../../predicates/index.js' +import { type FeathersError } from '@feathersjs/errors' +import { every, isMulti } from '../../predicates/index.js' +import { throwIf } from './throw-if.js' export type ThrowIfIsMultiOptions = { filter?: PredicateFn @@ -11,22 +11,13 @@ export type ThrowIfIsMultiOptions = { export const throwIfIsMulti = ( options?: ThrowIfIsMultiOptions, -) => { - return async (context: H, next?: NextFunction) => { - checkContext(context, ['before', 'around'], ['create', 'patch', 'remove'], 'throwIfIsMulti') - - if (!isMulti(context)) { - return context - } - - if (!options?.filter || (await options.filter(context))) { - throw options?.error ? options.error(context) : new BadRequest('Invalid operation') - } - - if (next) { - await next() - } - - return context - } -} +) => + throwIf( + every( + every(isMulti, context => context.method !== 'find'), + options?.filter, + ), + { + error: options?.error, + }, + ) diff --git a/src/hooks/throw-if/throw-if-is-provider.test.ts b/src/hooks/throw-if/throw-if-is-provider.test.ts new file mode 100644 index 00000000..c1ef8bf9 --- /dev/null +++ b/src/hooks/throw-if/throw-if-is-provider.test.ts @@ -0,0 +1,37 @@ +import type { HookContext } from '@feathersjs/feathers' +import { throwIfIsProvider } from './throw-if-is-provider.js' +import { MethodNotAllowed } from '@feathersjs/errors' + +describe('throwIfIsProvider', () => { + it('should throw if provider matches', async () => { + const context = { + method: 'create', + params: { provider: 'rest' }, + } as HookContext + + await expect(() => throwIfIsProvider(['rest', 'socketio'])(context)).rejects.toThrow( + MethodNotAllowed, + ) + }) + + it('should not throw on provider mismatch', async () => { + const context = { + method: 'create', + params: { provider: 'rest' }, + } as HookContext + await expect(throwIfIsProvider(['socketio'])(context)).resolves.not.toThrow() + }) + + it('can use options.filter', async () => { + const context = { + method: 'create', + params: { provider: 'rest' }, + } as HookContext + + await expect( + throwIfIsProvider(['rest', 'socketio'], { + filter: ctx => ctx.method === 'find', + })(context), + ).resolves.not.toThrow("Provider 'rest' can not call 'create'.") + }) +}) diff --git a/src/hooks/throw-if/throw-if-is-provider.ts b/src/hooks/throw-if/throw-if-is-provider.ts index 5e021289..cd0fba40 100644 --- a/src/hooks/throw-if/throw-if-is-provider.ts +++ b/src/hooks/throw-if/throw-if-is-provider.ts @@ -1,21 +1,25 @@ import type { HookContext } from '@feathersjs/feathers' -import type { TransportName } from '../../types.js' +import type { PredicateFn, TransportName } from '../../types.js' import type { ThrowIfOptions } from './throw-if.js' import { throwIf } from './throw-if.js' import { toArray } from 'lodash' -import { isProvider } from '../../predicates/index.js' +import { every, isProvider } from '../../predicates/index.js' import { MethodNotAllowed } from '@feathersjs/errors' const defaultError = (context: HookContext) => new MethodNotAllowed(`Provider '${context.params.provider}' can not call '${context.method}'.`) +export type ThrowIfIsIsProviderOptions = ThrowIfOptions & { + filter?: PredicateFn +} + export const throwIfIsProvider = ( transports: TransportName | TransportName[], - options?: ThrowIfOptions, + options?: ThrowIfIsIsProviderOptions, ) => { const disallowTransports = toArray(transports) - return throwIf(isProvider(...(disallowTransports as any)), { + return throwIf(every(isProvider(...(disallowTransports as any)), options?.filter), { error: options?.error ?? defaultError, }) } diff --git a/src/hooks/throw-if/throw-if.test.ts b/src/hooks/throw-if/throw-if.test.ts new file mode 100644 index 00000000..e3c46e97 --- /dev/null +++ b/src/hooks/throw-if/throw-if.test.ts @@ -0,0 +1,23 @@ +import { BadRequest, GeneralError } from '@feathersjs/errors' +import { throwIf } from './throw-if.js' +import type { HookContext } from '@feathersjs/feathers' + +describe('throwIf', () => { + it('throws BadRequest if no error function is provided', async () => { + await expect(() => throwIf(() => true)({} as HookContext)).rejects.toThrow(BadRequest) + }) + + it('should throw an error if the predicate returns true', async () => { + await expect(() => + throwIf(() => true, { error: () => new GeneralError('Test error') })({} as HookContext), + ).rejects.toThrow(GeneralError) + }) + + it('async predicate should throw an error if it returns true', async () => { + await expect(() => + throwIf(async () => true, { error: () => new GeneralError('Async test error') })( + {} as HookContext, + ), + ).rejects.toThrow(GeneralError) + }) +}) diff --git a/src/predicates/every/every.test.ts b/src/predicates/every/every.test.ts index a6e7472d..399fad87 100755 --- a/src/predicates/every/every.test.ts +++ b/src/predicates/every/every.test.ts @@ -11,6 +11,10 @@ describe('predicates/every', () => { assert.equal(every()({} as HookContext), true) }) + it('returns true when all are undefined', () => { + expect(every(undefined, undefined, undefined)({} as HookContext)).toBe(true) + }) + it('returns false synchronously when at least 1 hook is false', () => { expect( every( @@ -39,14 +43,12 @@ describe('predicates/every', () => { }) it('does not run all predicates when one is false', () => { - let ran = 0 - const fn = () => { - ran++ + const fn = vi.fn(() => { return false - } + }) expect(every(fn, fn, fn)({} as HookContext)).toBe(false) - expect(ran).toBe(1) + expect(fn).toHaveBeenCalledTimes(1) }) let app: any diff --git a/src/predicates/every/every.ts b/src/predicates/every/every.ts index 85705f43..aebb6a6b 100755 --- a/src/predicates/every/every.ts +++ b/src/predicates/every/every.ts @@ -7,7 +7,9 @@ import { isPromise } from '../../common/index.js' * @see https://hooks-common.feathersjs.com/utilities.html#every */ export const every = - (...predicates: PredicateFn[]): PredicateFn => + ( + ...predicates: (PredicateFn | undefined)[] + ): PredicateFn => (context: H): boolean | Promise => { if (!predicates.length) { // same as Array.prototype.every @@ -17,7 +19,16 @@ export const every = const promises: Promise[] = [] + let everyUndefined = true + for (const predicate of predicates) { + if (!predicate) { + // skip undefined predicates + continue + } else { + everyUndefined = false + } + const result = predicate(context) if (result === false) { return false @@ -26,6 +37,12 @@ export const every = } } + if (everyUndefined) { + // all predicates are undefined -> same as Array.prototype.every + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#description + return true + } + if (!promises.length) { // no promises returned -> all predicates are sync and true return true diff --git a/src/predicates/some/some.test.ts b/src/predicates/some/some.test.ts index 1e1c22f8..3e6126c4 100755 --- a/src/predicates/some/some.test.ts +++ b/src/predicates/some/some.test.ts @@ -7,6 +7,10 @@ describe('predicates/some', () => { expect(some()({} as HookContext)).toBe(true) }) + it('returns true when all are undefined', () => { + expect(some(undefined, undefined, undefined)({} as HookContext)).toBe(true) + }) + it('returns true synchronously when at least 1 hook is true', () => { expect( some( @@ -36,14 +40,12 @@ describe('predicates/some', () => { }) it('does not run all predicates when one is true', () => { - let ran = 0 - const fn = () => { - ran++ + const fn = vi.fn(() => { return true - } + }) expect(some(fn, fn, fn)({} as HookContext)).toBe(true) - expect(ran).toBe(1) + expect(fn).toHaveBeenCalledTimes(1) }) it('when all hooks are falsey', async () => { diff --git a/src/predicates/some/some.ts b/src/predicates/some/some.ts index ce29c2e0..e829eb63 100755 --- a/src/predicates/some/some.ts +++ b/src/predicates/some/some.ts @@ -7,7 +7,9 @@ import { isPromise } from '../../common/index.js' * @see https://hooks-common.feathersjs.com/utilities.html#some */ export const some = - (...predicates: PredicateFn[]): PredicateFn => + ( + ...predicates: (PredicateFn | undefined)[] + ): PredicateFn => (context: H): boolean | Promise => { if (!predicates.length) { // same as Array.prototype.some @@ -17,7 +19,16 @@ export const some = const promises: Promise[] = [] + let everyUndefined = true + for (const predicate of predicates) { + if (!predicate) { + // skip undefined predicates + continue + } else { + everyUndefined = false + } + const result = predicate(context) if (result === true) { @@ -29,6 +40,12 @@ export const some = } } + if (everyUndefined) { + // all predicates are undefined -> same as Array.prototype.some + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#description + return true + } + if (!promises.length) { // no promises returned -> all predicates are sync and false return false diff --git a/src/resolvers/hooks/resolve-data.ts b/src/resolvers/hooks/resolve-data.ts index 8a7b4174..f473d5a9 100644 --- a/src/resolvers/hooks/resolve-data.ts +++ b/src/resolvers/hooks/resolve-data.ts @@ -8,11 +8,7 @@ export const resolveData = resolverProperties: ResolverObject, ) => async (context: H, next?: NextFunction) => { - await replaceData(context, item => - resolve(resolverProperties, item, context, { - originalContext: context, - }), - ) + await replaceData(context, item => resolve(resolverProperties, item, context)) if (typeof next === 'function') { return next() diff --git a/src/resolvers/hooks/resolve-result.ts b/src/resolvers/hooks/resolve-result.ts index 87091a22..64dc4a66 100644 --- a/src/resolvers/hooks/resolve-result.ts +++ b/src/resolvers/hooks/resolve-result.ts @@ -10,11 +10,7 @@ export const resolveResult = , H extends HookConte await next() } - await replaceResult(context, item => - resolve(resolverProperties, item, context, { - originalContext: context, - }), - ) + await replaceResult(context, item => resolve(resolverProperties, item, context)) return context } diff --git a/src/utils/get-exposed-methods/get-exposed-methods.test.ts b/src/utils/get-exposed-methods/get-exposed-methods.test.ts new file mode 100644 index 00000000..55224ad7 --- /dev/null +++ b/src/utils/get-exposed-methods/get-exposed-methods.test.ts @@ -0,0 +1,45 @@ +import { feathers } from '@feathersjs/feathers' +import { MemoryService } from '@feathersjs/memory' +import { getExposedMethods } from './get-exposed-methods.js' + +describe('getExposedMethods', () => { + it('returns an array of exposed methods', () => { + const app = feathers().use('/test', new MemoryService({})) + + expect(getExposedMethods(app.service('test'))).toEqual([ + 'find', + 'get', + 'create', + 'update', + 'patch', + 'remove', + ]) + }) + + it('returns an empty array if no methods are exposed', () => { + const app = feathers().use('/test', new MemoryService({}), { methods: [] }) + expect(getExposedMethods(app.service('test'))).toEqual([]) + }) + + it('returns default methods if no custom methods are provided', () => { + const app = feathers().use('/test', new MemoryService({}), { methods: ['find', 'get'] }) + expect(getExposedMethods(app.service('test'))).toEqual(['find', 'get']) + }) + + it('returns custom methods', () => { + const service = new MemoryService({}) + // @ts-expect-error to allow custom methods + service.customMethod1 = () => {} + // @ts-expect-error to allow custom methods + service.customMethod2 = () => {} + + const app = feathers().use('/test', service, { + methods: ['find', 'customMethod1', 'customMethod2'], + }) + expect(getExposedMethods(app.service('test'))).toEqual([ + 'find', + 'customMethod1', + 'customMethod2', + ]) + }) +}) diff --git a/tsdown.config.ts b/tsdown.config.ts index 35e8458e..842e872f 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -3,10 +3,11 @@ import pkg from './package.json' export default defineConfig({ entry: { + index: 'src/index.ts', hooks: 'src/hooks/index.ts', utils: 'src/utils/index.ts', predicates: 'src/predicates/index.ts', - // resolvers: 'src/resolvers/index.ts', + resolvers: 'src/resolvers/index.ts', }, clean: true, sourcemap: true, diff --git a/vite.config.ts b/vite.config.ts index 2e4ea283..cc32bbea 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,7 +7,12 @@ export default defineConfig({ provider: 'v8', reporter: ['text', 'lcov'], include: ['src/**/*.{js,ts}'], - exclude: ['**/*.test.{js,ts}', 'src/types.ts'], + exclude: [ + '**/*.test.{js,ts}', + 'src/types.ts', + 'src/resolvers/index.ts', + 'src/resolvers/hooks/index.ts', + ], thresholds: { lines: 85, functions: 85, From cf9bd1f4488166fa626182959f8666ccf80a416f Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:15:03 +0200 Subject: [PATCH 11/15] docs: refactor docs --- README.md | 3 +- docs/.vitepress/config.mts | 93 +- docs/.vitepress/meta.ts | 5 +- docs/.vitepress/plugins/markdownTransform.ts | 84 + docs/.vitepress/plugins/utility.ts | 39 + docs/.vitepress/style/main.css | 2 + .../.vitepress/theme/components/HookTable.vue | 70 + docs/.vitepress/theme/index.ts | 16 +- docs/.vitepress/utilities.ts | 78 + docs/components/HookTable.vue | 37 - docs/hooks.md | 1993 ----- docs/hooks/HookDirectory.vue | 17 + docs/hooks/[slug].md | 4 + docs/hooks/[slug].paths.ts | 15 + docs/hooks/index.data.ts | 8 + docs/hooks/index.md | 11 + docs/index.md | 4 +- docs/overview.md | 1 + docs/predicates/PredicateDirectory.vue | 17 + docs/predicates/[slug].md | 4 + docs/predicates/[slug].paths.ts | 16 + docs/predicates/index.data.ts | 8 + docs/predicates/index.md | 11 + docs/utilities.md | 624 +- docs/utils/UtilDirectory.vue | 17 + docs/utils/[slug].md | 4 + docs/utils/[slug].paths.ts | 15 + docs/utils/index.data.ts | 8 + docs/utils/index.md | 11 + package-lock.json | 2731 +++++-- package.json | 13 +- pnpm-lock.yaml | 6667 +++++++++++++++++ src/hooks/cache/cache.md | 94 + src/hooks/cache/cache.ts | 9 +- src/hooks/check-required/check-required.md | 24 + src/hooks/check-required/check-required.ts | 2 +- src/hooks/combine/combine.md | 43 + src/{utils => hooks}/combine/combine.test.ts | 0 src/{utils => hooks}/combine/combine.ts | 0 src/hooks/create-related/create-related.md | 9 + src/hooks/create-related/create-related.ts | 2 +- src/hooks/debug/debug.md | 49 + .../disable-pagination/disable-pagination.md | 21 + src/hooks/disallow/disallow.md | 48 + src/hooks/iff-else/iff-else.md | 40 + src/hooks/{iff => iff-else}/iff-else.test.ts | 0 src/hooks/{iff => iff-else}/iff-else.ts | 2 +- src/hooks/iff/iff.md | 54 + src/hooks/iff/iff.ts | 2 +- src/hooks/index.ts | 46 +- src/hooks/lowercase-data/lowercase-data.md | 28 + .../lowercase-data.test.ts | 0 .../lowercase-data.ts | 2 +- .../lowercase-result/lowercase-result.md | 28 + .../lowercase-result.test.ts | 0 .../lowercase-result.ts | 2 +- .../{omit => omit-data}/omit-data-1.test.ts | 0 src/hooks/omit-data/omit-data.md | 33 + .../{omit => omit-data}/omit-data.test.ts | 0 src/hooks/{omit => omit-data}/omit-data.ts | 2 +- src/hooks/omit-query/omit-query.md | 30 + .../{omit => omit-query}/omit-query.test.ts | 0 src/hooks/{omit => omit-query}/omit-query.ts | 0 .../omit-result-1.test.ts | 0 .../omit-result-2.test.ts | 0 src/hooks/omit-result/omit-result.md | 9 + .../{omit => omit-result}/omit-result.test.ts | 0 .../{omit => omit-result}/omit-result.ts | 2 +- .../params-for-server/params-for-server.md | 9 + .../params-for-server/params-for-server.ts | 8 +- .../params-from-client/params-from-client.md | 46 + .../params-from-client/params-from-client.ts | 10 +- src/hooks/pick-data/pick-data.md | 31 + .../{pick => pick-data}/pick-data.test.ts | 0 src/hooks/{pick => pick-data}/pick-data.ts | 2 +- src/hooks/pick-query/pick-query.md | 30 + .../{pick => pick-query}/pick-query.test.ts | 0 src/hooks/{pick => pick-query}/pick-query.ts | 0 src/hooks/pick-result/pick-result.md | 9 + .../{pick => pick-result}/pick-result.test.ts | 0 .../{pick => pick-result}/pick-result.ts | 2 +- src/hooks/prevent-changes/prevent-changes.md | 31 + src/hooks/prevent-changes/prevent-changes.ts | 2 +- src/hooks/run-parallel/run-parallel.md | 42 + src/hooks/set-field/set-field.md | 88 + src/hooks/set-now-data/set-now-data.md | 28 + .../set-now-data.test.ts | 0 .../{set-now => set-now-data}/set-now-data.ts | 2 +- src/hooks/set-now-result/set-now-result.md | 9 + .../set-now-result.test.ts | 0 .../set-now-result.ts | 2 +- src/hooks/set-slug/set-slug.md | 42 + src/hooks/soft-delete/soft-delete.md | 66 + src/hooks/stash-before/stash-before.md | 37 + .../throw-if-is-multi/throw-if-is-multi.md | 9 + .../throw-if-is-multi.test.ts | 0 .../throw-if-is-multi.ts | 0 .../throw-if-is-provider.md | 9 + .../throw-if-is-provider.test.ts | 0 .../throw-if-is-provider.ts | 0 src/hooks/throw-if/throw-if.md | 9 + src/hooks/transform-data/transform-data.md | 81 + .../transform-data.test.ts | 0 .../transform-data.ts | 0 .../transform-result/transform-result.md | 9 + .../transform-result.test.ts | 0 .../transform-result.ts | 0 src/hooks/traverse/traverse.md | 50 + src/hooks/traverse/traverse.ts | 9 +- src/hooks/trim-data/trim-data.md | 9 + .../{trim => trim-data}/trim-data.test.ts | 0 src/hooks/{trim => trim-data}/trim-data.ts | 2 +- src/hooks/trim-result/trim-result.md | 9 + .../{trim => trim-result}/trim-result.test.ts | 0 .../{trim => trim-result}/trim-result.ts | 2 +- src/hooks/unless/unless.md | 42 + src/hooks/{iff => unless}/unless.test.ts | 0 src/hooks/{iff => unless}/unless.ts | 2 +- src/predicates/every/every.md | 35 + src/predicates/is-provider/is-provider.md | 40 + src/predicates/not/not.md | 36 + src/predicates/some/some.md | 35 + src/resolvers/hooks/resolve-data.ts | 2 +- src/resolvers/hooks/resolve-query.ts | 4 +- src/resolvers/hooks/resolve.ts | 2 +- src/utils/check-context/check-context.md | 43 + .../get-data-is-array/get-data-is-array.md | 4 + .../get-exposed-methods.md | 4 + src/utils/get-paginate/get-paginate.md | 4 + .../get-result-is-array.md | 4 + src/utils/index.ts | 11 +- .../params-for-server.test.ts | 35 - .../params-for-server/params-for-server.ts | 28 - src/utils/replace-data/replace-data.md | 4 + .../replace-data.ts | 0 src/utils/replace-result/replace-result.md | 4 + .../replace-result.test.ts | 0 .../replace-result.ts | 0 src/utils/skip-result/skip-result.md | 4 + .../transform-params/transform-params.md | 4 + tsconfig.json | 3 + 141 files changed, 11154 insertions(+), 3097 deletions(-) create mode 100644 docs/.vitepress/plugins/markdownTransform.ts create mode 100644 docs/.vitepress/plugins/utility.ts create mode 100644 docs/.vitepress/theme/components/HookTable.vue create mode 100644 docs/.vitepress/utilities.ts delete mode 100644 docs/components/HookTable.vue delete mode 100644 docs/hooks.md create mode 100644 docs/hooks/HookDirectory.vue create mode 100644 docs/hooks/[slug].md create mode 100644 docs/hooks/[slug].paths.ts create mode 100644 docs/hooks/index.data.ts create mode 100644 docs/hooks/index.md create mode 100644 docs/predicates/PredicateDirectory.vue create mode 100644 docs/predicates/[slug].md create mode 100644 docs/predicates/[slug].paths.ts create mode 100644 docs/predicates/index.data.ts create mode 100644 docs/predicates/index.md create mode 100644 docs/utils/UtilDirectory.vue create mode 100644 docs/utils/[slug].md create mode 100644 docs/utils/[slug].paths.ts create mode 100644 docs/utils/index.data.ts create mode 100644 docs/utils/index.md create mode 100644 pnpm-lock.yaml create mode 100644 src/hooks/cache/cache.md create mode 100644 src/hooks/check-required/check-required.md create mode 100644 src/hooks/combine/combine.md rename src/{utils => hooks}/combine/combine.test.ts (100%) rename src/{utils => hooks}/combine/combine.ts (100%) create mode 100644 src/hooks/create-related/create-related.md create mode 100644 src/hooks/debug/debug.md create mode 100644 src/hooks/disable-pagination/disable-pagination.md create mode 100644 src/hooks/disallow/disallow.md create mode 100644 src/hooks/iff-else/iff-else.md rename src/hooks/{iff => iff-else}/iff-else.test.ts (100%) rename src/hooks/{iff => iff-else}/iff-else.ts (96%) create mode 100644 src/hooks/iff/iff.md create mode 100644 src/hooks/lowercase-data/lowercase-data.md rename src/hooks/{lowercase => lowercase-data}/lowercase-data.test.ts (100%) rename src/hooks/{lowercase => lowercase-data}/lowercase-data.ts (92%) create mode 100644 src/hooks/lowercase-result/lowercase-result.md rename src/hooks/{lowercase => lowercase-result}/lowercase-result.test.ts (100%) rename src/hooks/{lowercase => lowercase-result}/lowercase-result.ts (93%) rename src/hooks/{omit => omit-data}/omit-data-1.test.ts (100%) create mode 100644 src/hooks/omit-data/omit-data.md rename src/hooks/{omit => omit-data}/omit-data.test.ts (100%) rename src/hooks/{omit => omit-data}/omit-data.ts (84%) create mode 100644 src/hooks/omit-query/omit-query.md rename src/hooks/{omit => omit-query}/omit-query.test.ts (100%) rename src/hooks/{omit => omit-query}/omit-query.ts (100%) rename src/hooks/{omit => omit-result}/omit-result-1.test.ts (100%) rename src/hooks/{omit => omit-result}/omit-result-2.test.ts (100%) create mode 100644 src/hooks/omit-result/omit-result.md rename src/hooks/{omit => omit-result}/omit-result.test.ts (100%) rename src/hooks/{omit => omit-result}/omit-result.ts (88%) create mode 100644 src/hooks/params-for-server/params-for-server.md create mode 100644 src/hooks/params-from-client/params-from-client.md create mode 100644 src/hooks/pick-data/pick-data.md rename src/hooks/{pick => pick-data}/pick-data.test.ts (100%) rename src/hooks/{pick => pick-data}/pick-data.ts (88%) create mode 100644 src/hooks/pick-query/pick-query.md rename src/hooks/{pick => pick-query}/pick-query.test.ts (100%) rename src/hooks/{pick => pick-query}/pick-query.ts (100%) create mode 100644 src/hooks/pick-result/pick-result.md rename src/hooks/{pick => pick-result}/pick-result.test.ts (100%) rename src/hooks/{pick => pick-result}/pick-result.ts (91%) create mode 100644 src/hooks/prevent-changes/prevent-changes.md create mode 100644 src/hooks/run-parallel/run-parallel.md create mode 100644 src/hooks/set-field/set-field.md create mode 100644 src/hooks/set-now-data/set-now-data.md rename src/hooks/{set-now => set-now-data}/set-now-data.test.ts (100%) rename src/hooks/{set-now => set-now-data}/set-now-data.ts (89%) create mode 100644 src/hooks/set-now-result/set-now-result.md rename src/hooks/{set-now => set-now-result}/set-now-result.test.ts (100%) rename src/hooks/{set-now => set-now-result}/set-now-result.ts (91%) create mode 100644 src/hooks/set-slug/set-slug.md create mode 100644 src/hooks/soft-delete/soft-delete.md create mode 100644 src/hooks/stash-before/stash-before.md create mode 100644 src/hooks/throw-if-is-multi/throw-if-is-multi.md rename src/hooks/{throw-if => throw-if-is-multi}/throw-if-is-multi.test.ts (100%) rename src/hooks/{throw-if => throw-if-is-multi}/throw-if-is-multi.ts (100%) create mode 100644 src/hooks/throw-if-is-provider/throw-if-is-provider.md rename src/hooks/{throw-if => throw-if-is-provider}/throw-if-is-provider.test.ts (100%) rename src/hooks/{throw-if => throw-if-is-provider}/throw-if-is-provider.ts (100%) create mode 100644 src/hooks/throw-if/throw-if.md create mode 100644 src/hooks/transform-data/transform-data.md rename src/hooks/{transform => transform-data}/transform-data.test.ts (100%) rename src/hooks/{transform => transform-data}/transform-data.ts (100%) create mode 100644 src/hooks/transform-result/transform-result.md rename src/hooks/{transform => transform-result}/transform-result.test.ts (100%) rename src/hooks/{transform => transform-result}/transform-result.ts (100%) create mode 100644 src/hooks/traverse/traverse.md create mode 100644 src/hooks/trim-data/trim-data.md rename src/hooks/{trim => trim-data}/trim-data.test.ts (100%) rename src/hooks/{trim => trim-data}/trim-data.ts (92%) create mode 100644 src/hooks/trim-result/trim-result.md rename src/hooks/{trim => trim-result}/trim-result.test.ts (100%) rename src/hooks/{trim => trim-result}/trim-result.ts (93%) create mode 100644 src/hooks/unless/unless.md rename src/hooks/{iff => unless}/unless.test.ts (100%) rename src/hooks/{iff => unless}/unless.ts (89%) create mode 100644 src/predicates/every/every.md create mode 100644 src/predicates/is-provider/is-provider.md create mode 100644 src/predicates/not/not.md create mode 100644 src/predicates/some/some.md create mode 100644 src/utils/check-context/check-context.md create mode 100644 src/utils/get-data-is-array/get-data-is-array.md create mode 100644 src/utils/get-exposed-methods/get-exposed-methods.md create mode 100644 src/utils/get-paginate/get-paginate.md create mode 100644 src/utils/get-result-is-array/get-result-is-array.md delete mode 100755 src/utils/params-for-server/params-for-server.test.ts delete mode 100755 src/utils/params-for-server/params-for-server.ts create mode 100644 src/utils/replace-data/replace-data.md rename src/utils/{replace-items => replace-data}/replace-data.ts (100%) create mode 100644 src/utils/replace-result/replace-result.md rename src/utils/{replace-items => replace-result}/replace-result.test.ts (100%) rename src/utils/{replace-items => replace-result}/replace-result.ts (100%) create mode 100644 src/utils/skip-result/skip-result.md create mode 100644 src/utils/transform-params/transform-params.md diff --git a/README.md b/README.md index 56871c01..b079244f 100755 --- a/README.md +++ b/README.md @@ -27,7 +27,8 @@ - added throwIf - added throwIfIsProvider - added throwIfIsMulti -- added paramsForServer2 & paramsForClient2 + +- removed old paramsForServer & changed to hook - added 'onDelete' & 'createRelated' diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 1483ae05..d5ecbd97 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,9 +1,19 @@ import { defineConfig } from 'vitepress' -import { name, description, ogUrl, ogImage } from './meta' +import { name, description, ogUrl, ogImage, repository, mainBranch } from './meta' import { version } from '../../package.json' +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { discoverUtilities } from './utilities' +import { MarkdownTransform } from './plugins/markdownTransform' +import { transformerTwoslash } from '@shikijs/vitepress-twoslash' +import tailwindcss from '@tailwindcss/vite' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + +const utilities = await discoverUtilities() export default defineConfig({ - title: 'feathers-hooks-common/index.js', + title: name, lastUpdated: true, description: '', head: [ @@ -19,24 +29,19 @@ export default defineConfig({ ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ], themeConfig: { - siteTitle: 'feathers-hooks-common/index.js', + siteTitle: name, editLink: { - pattern: - 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/edit/master/docs/:path', + pattern: `https://github.com/${repository}/edit/${mainBranch}/docs/:path`, }, lastUpdatedText: 'Last Updated', socialLinks: [ - { - icon: 'twitter', - link: 'https://twitter.com/feathersjs', - }, { icon: 'discord', link: 'https://discord.gg/qa8kez8QBx', }, { icon: 'github', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/index.js', + link: `https://github.com/${repository}`, }, ], logo: '/feathers-hooks-common-logo.png', @@ -45,8 +50,36 @@ export default defineConfig({ text: 'Guide', items: [ { text: 'Overview', link: '/overview' }, - { text: 'Hooks', link: '/hooks/index.js' }, - { text: 'Utilities', link: '/utilities' }, + { + text: 'Hooks', + link: '/hooks', + items: utilities + .filter(x => x.category === 'hooks') + .map(x => ({ + text: x.title, + link: x.path, + })), + }, + { + text: 'Utilities', + link: '/utils', + items: utilities + .filter(x => x.category === 'utils') + .map(x => ({ + text: x.title, + link: x.path, + })), + }, + { + text: 'Predicates', + link: '/predicates', + items: utilities + .filter(x => x.category === 'predicates') + .map(x => ({ + text: x.title, + link: x.path, + })), + }, { text: 'Migrating', link: '/migrating' }, { text: 'Guides', link: '/guides' }, ], @@ -58,11 +91,11 @@ export default defineConfig({ items: [ { text: 'Changelog', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/CHANGELOG.md', + link: `https://github.com/${repository}/blob/${mainBranch}/CHANGELOG.md`, }, { text: 'Contributing', - link: 'https://github.com/feathersjs-ecosystem/feathers-hooks-common/blob/master/.github/contributing.md', + link: `https://github.com/${repository}/blob/${mainBranch}/.github/contributing.md`, }, ], }, @@ -77,4 +110,36 @@ export default defineConfig({ indexName: 'feathers-hooks', }, }, + markdown: { + codeTransformers: [ + transformerTwoslash({ + twoslashOptions: { + compilerOptions: { + paths: { + 'feathers-commons': [resolve(__dirname, '../../src/index.ts')], + 'feathers-commons/hooks': [resolve(__dirname, '../../src/hooks/index.ts')], + 'feathers-commons/utils': [resolve(__dirname, '../../src/utils/index.ts')], + 'feathers-commons/predicates': [resolve(__dirname, '../../src/predicates/index.ts')], + 'feathers-commons/resolvers': [resolve(__dirname, '../../src/resolvers/index.ts')], + }, + }, + }, + }), + ], + // Explicitly load these languages for types hightlighting + languages: ['js', 'ts'], + }, + vite: { + server: { + fs: { + allow: [resolve(__dirname, '../../src')], + }, + }, + plugins: [ + MarkdownTransform({ + vitepressDirectory: resolve(__dirname, '../'), + }), + tailwindcss(), + ], + }, }) diff --git a/docs/.vitepress/meta.ts b/docs/.vitepress/meta.ts index e17e20ad..a7ddeb8d 100644 --- a/docs/.vitepress/meta.ts +++ b/docs/.vitepress/meta.ts @@ -1,5 +1,8 @@ -export const name = 'feathers-hooks-common/index.js' +export const name = 'feathers-commons' export const description = 'Common hooks and utils for FeathersJS apps' +export const repository = 'feathersjs-ecosystem/feathers-hooks-common' +export const mainBranch = 'master' + export const ogUrl = 'https://hooks-common.feathersjs.com/' export const ogImage = 'https://hooks-common.feathersjs.com/feathers-hooks-common-logo.png' diff --git a/docs/.vitepress/plugins/markdownTransform.ts b/docs/.vitepress/plugins/markdownTransform.ts new file mode 100644 index 00000000..50125754 --- /dev/null +++ b/docs/.vitepress/plugins/markdownTransform.ts @@ -0,0 +1,84 @@ +import type { Plugin } from 'vite' + +import { discoverUtilities, type Utility } from '../utilities' +import md from './utility' + +export type MarkdownTransformOptions = { + srcDir?: string + pattern?: string + exclude?: string[] + vitepressDirectory: string +} + +export function MarkdownTransform(options: MarkdownTransformOptions): Plugin { + const { + srcDir = '../../src', + pattern = '**/*.md', + exclude = ['**/node_modules/**', '**/dist/**'], + vitepressDirectory, + } = options ?? {} + + let utilitiesList: Utility[] = [] + + return { + name: 'feathers-commons-md-transform', + enforce: 'pre', + async buildStart() { + const result = await discoverUtilities() + utilitiesList = result + }, + async transform(code, id) { + if (!id.match(/\.md\b/)) return null + + const slug = id.replace(vitepressDirectory, '') + + const utility = utilitiesList.find(x => x.pathMd === slug) + if (!utility) { + console.warn(`Utility not found for slug: ${slug}`) + return null + } + + return md(utility) + }, + // configureServer(server) { + // const watcher = server.watcher + + // watcher.add(`${srcDir}/**/*.md`) + + // watcher.on('change', async filePath => { + // console.log(`🔄 Utility changed: ${filePath}`) + // if (filePath.includes(srcDir) && filePath.endsWith('.md')) { + // console.log(`📝 Utility changed: ${filePath}`) + // await discoverUtilities(options) + + // // Invalidate virtual modules + // const moduleGraph = server.moduleGraph + // const virtualModules = Array.from(moduleGraph.urlToModuleMap.keys()).filter( + // url => url.startsWith(VIRTUAL_UTILITY_PREFIX) || url === VIRTUAL_UTILITIES_LIST, + // ) + + // virtualModules.forEach(url => { + // const module = moduleGraph.getModuleById(url) + // if (module) { + // server.reloadModule(module) + // } + // }) + // } + // }) + + // watcher.on('add', async filePath => { + // if (filePath.includes(srcDir) && filePath.endsWith('.md')) { + // console.log(`➕ New utility: ${filePath}`) + // await discoverUtilities(options) + // } + // }) + + // watcher.on('unlink', async filePath => { + // if (filePath.includes(srcDir) && filePath.endsWith('.md')) { + // console.log(`➖ Utility removed: ${filePath}`) + // await discoverUtilities(options) + // } + // }) + // }, + } +} diff --git a/docs/.vitepress/plugins/utility.ts b/docs/.vitepress/plugins/utility.ts new file mode 100644 index 00000000..7a91f4cc --- /dev/null +++ b/docs/.vitepress/plugins/utility.ts @@ -0,0 +1,39 @@ +import type { Utility } from '../utilities' +import dedent from 'dedent' + +const arr = (value: any[]) => { + if (!value || !value.length) return '[]' + const val = value + .map(x => { + if (typeof x === 'string') return `'${x}'` + if (typeof x === 'number') return x.toString() + return JSON.stringify(x) + }) + .join(', ') + + return `[${val}]` +} + +export default (utility: Utility) => { + const code = [ + dedent`# ${utility.title} + + [Source Code](${utility.sourceUrl}) + + ${utility.description} + + \`\`\`ts twoslash + import { ${utility.name} } from 'feathers-commons/${utility.category}'; + \`\`\` `, + ] + + if (utility.hook) { + code.push(dedent` + + `) + } + + code.push(utility.content) + + return code.join('\n\n') +} diff --git a/docs/.vitepress/style/main.css b/docs/.vitepress/style/main.css index b1f5af0f..501543f0 100644 --- a/docs/.vitepress/style/main.css +++ b/docs/.vitepress/style/main.css @@ -1,3 +1,5 @@ +@import "tailwindcss"; + /** * Colors * -------------------------------------------------------------------------- */ diff --git a/docs/.vitepress/theme/components/HookTable.vue b/docs/.vitepress/theme/components/HookTable.vue new file mode 100644 index 00000000..11792f8c --- /dev/null +++ b/docs/.vitepress/theme/components/HookTable.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 5b9ffcab..633262dd 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,6 +1,16 @@ -import Theme from 'vitepress/theme' +import DefaultTheme from 'vitepress/theme' +import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client' + +import type { Theme } from 'vitepress' +import HookTable from './components/HookTable.vue' + import '../style/main.css' +import '@shikijs/vitepress-twoslash/style.css' export default { - ...Theme, -} + extends: DefaultTheme, + enhanceApp({ app }) { + app.use(TwoslashFloatingVue) + app.component('HookTable', HookTable) + }, +} satisfies Theme diff --git a/docs/.vitepress/utilities.ts b/docs/.vitepress/utilities.ts new file mode 100644 index 00000000..8b0fbe72 --- /dev/null +++ b/docs/.vitepress/utilities.ts @@ -0,0 +1,78 @@ +import fs from 'node:fs/promises' +import matter from 'gray-matter' +import { glob } from 'glob' +import kebabCase from 'lodash/kebabCase.js' +import { mainBranch, repository } from './meta' + +export type Utility = { + name: string + title: string + description: string + category: 'hooks' | 'utils' | 'resolvers' | 'predicates' + slug: string + path: string + pathMd: string + frontmatter: Record + content: string + lastModified: Date + sourceUrl: string + hook?: Record +} + +const utilities = new Map() +let utilitiesList: Utility[] = [] + +export async function discoverUtilities() { + const { srcDir = 'src', pattern = '**/*.md', exclude = ['**/node_modules/**', '**/dist/**'] } = {} + + const markdownFiles = await glob(`${srcDir}/${pattern}`, { ignore: exclude }) + utilities.clear() + utilitiesList = [] + + for (const filePath of markdownFiles) { + try { + const content = await fs.readFile(filePath, 'utf-8') + const { data: frontmatter, content: body } = matter(content) + + const { title = '', description = '', category, hook } = frontmatter + + if (!title || ['hooks', 'utils', 'resolvers', 'predicates'].indexOf(category) === -1) { + console.warn( + `Skipping ${filePath}: Missing title or invalid category`, + title, + category, + frontmatter, + ) + continue + } + + const slug = kebabCase(title) + + console.log(`Processing ${filePath} -> ${slug}`) + + const utility: Utility = { + name: title, + title, + description, + category, + slug, + path: `/${category}/${slug}`, + pathMd: `/${category}/${slug}.md`, + frontmatter, + content: body, + hook, + lastModified: (await fs.stat(filePath)).mtime, + sourceUrl: `https://github.com/${repository}/blob/${mainBranch}/src/${category}/${slug}/${slug}.ts`, + } + + utilities.set(slug, utility) + utilitiesList.push(utility) + } catch (error) { + console.warn(`Failed to process ${filePath}:`, error.message) + } + } + + utilitiesList.sort((a, b) => a.title.localeCompare(b.title)) + + return utilitiesList +} diff --git a/docs/components/HookTable.vue b/docs/components/HookTable.vue deleted file mode 100644 index 5361db48..00000000 --- a/docs/components/HookTable.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/docs/hooks.md b/docs/hooks.md deleted file mode 100644 index c6286b02..00000000 --- a/docs/hooks.md +++ /dev/null @@ -1,1993 +0,0 @@ - - -# Hooks - -## actOnDefault - -Runs a series of hooks which mutate context.data or content.result (the Feathers default). - - - -- **Arguments** - - - `{...Function}` Hook functions. - -| Argument | Type | Default | Description | -| -------- | :-----------: | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| `hooks` | `...Function` | | The hooks to run. They will mutate `context.data` for before hooks, or `context.result` for after hooks. This is the default action for hooks. | - -- **Example** - - ```js - const { actOnDefault, actOnDispatch } = require('feathers-hooks-common/index.js'); - - module.exports = { - after: { find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] }, - }; - ``` - - Hooks `hook1`, `hook3` and `hook5` will run "normally", mutating `content.result`. - Hooks `hook2` and `hook4` will mutate `context.dispatch`. - -- **Details** - - A hook can call a series of hooks using `actOnDispatch`. Some of those hooks may call other hooks with `actOnDefault` or `actOnDispatch`. This can "turtle down" to further layers. - - The main purpose of `actOnDefault` is to "undo" `actOnDispatch`. - -## actOnDispatch - -Runs a series of hooks which mutate context.dispatch. - - - -- **Arguments** - - - `{...Function}` Hook functions. - -| Argument | Type | Default | Description | -| -------- | :-----------: | ------- | ------------------------------------------------------ | -| `hooks` | `...Function` | | The hooks to run. They will mutate `context.dispatch`. | - -- **Example** - - ```js - const { actOnDefault, actOnDispatch } = require('feathers-hooks-common/index.js'); - - module.exports = { - after: { find: [hook1(), actOnDispatch(hook2(), actOnDefault(hook3()), hook4()), hook5()] }, - }; - ``` - - Hooks `hook1`, `hook3` and `hook5` will run "normally", mutating `content.result`. - Hooks `hook2` and `hook4` will mutate `context.dispatch`. - -- **Details** - - A hook can call a series of hooks using `actOnDispatch`. Some of those hooks may call other hooks with `actOnDefault` or `actOnDispatch`. This can "turtle down" to further layers. - -

context.dispatch is a writeable, optional property and contains a "safe" version of the data that should be sent to any client. If context.dispatch has not been set context.result will be sent to the client instead.

Note: context.dispatch only affects the data sent through a Feathers Transport like REST or Socket.io. An internal method call will still get the data set in context.result.

- -## alterItems - -Make changes to data or result items. Very flexible. - - - -- **Arguments** - - `{Function} func` - -| Argument | Type | Default | Description | -| -------- | :--------: | --------------------------- | --------------------------------------------- | -| `func` | `Function` | `(item,` `context) =>` `{}` | Function modifies `item` in place. See below. | - -- **returns** - -The mutated `item`. Returning `undefined` means the `item` in the parameters was mutated in place. returns result `undefined || item` - -- **Example** - - ```js - const { alterItems } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { - all: [ - alterItems(rec => { delete rec.password; }) // Like `discard('password')`. - alterItems(rec => rec.email = email.lowerCase()), // Like `lowerCase('email')`. - ], - } }; - ``` - - Async mutations can be handled with async/await: - - ```js - alterItems(rec => { - rec.userRecord = (async () => await service.get(...) )() - }) - ``` - - You can also perform async mutations using Promises by returning a Promise that is resolved once all mutations are complete: - - ```js - alterItems(rec => new Promise(resolve => { - service.get(...).then(result => { - rec.userRecord = result; - resolve(); - }}); - ``` - - You can also perform async mutations using Promises by returning a Promise that is resolved once all mutations are complete: - - ```js - alterItems(async rec => { - rec.userRecord = await service.get(...); - }) - ``` - -- **Details** - - The declarative nature of most of the common hooks, e.g. `discard('password')`, requires you to remember the names of a fair number of hooks, their parameters, and any possible nuances. - - The `alterItems` hook offers an imperative alternative where you directly alter the items. It allows you to reduce the number of trivial hooks you have to register, and you are aware of exactly what your `alterItems` hooks do. - - `func` is called for each item in `context.data` (before hook) or `context.result[.data]` (after hook). It receives the parameters - - - `{Object} item` - - `{Object} context` - - | Argument | Type | Description | - | --------- | :------: | ---------------------------------------------------------------------- | - | `item` | `Object` | The item. The function modifies it in place. | - | `context` | `Object` | The current context. It contains any alterations made to items so far. | - -- **Returns** - - `func` may alternatively return a replacement `item` rather than `undefined`. This is a convenience feature which permits, for example, use of functions from the [Lodash](https://lodash.com/) library, as such functions tend to return new objects. - -## cache - -Persistent, least-recently-used record cache for services. - - - -- **Arguments** - - - `{Object | Map} cacheMap` - - `{String} [ keyField ]` - - `{Object} [ options ]` - - `{Function} [ clone ]` - - `{Function} [makeCacheKey]` - -| Argument | Type | Default | Description | -| ---------- | :------------: | -------------------------------------------------- | ---------------------------------------------------------------------------- | -| `cacheMap` | `Object` `Map` | | Instance of `Map`, or an object with a similar API, to be used as the cache. | -| `keyField` | `String` | `context.service.id` or `item._id ? '_id' !! 'id'` | The name of the record id field. | -| `option` | `Object` | | Options. | - -| `options` | Argument | Type | Default | Description | -| -------------- | ---------- | :--------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | -| `clone` | `Function` | `item => JSON.parse(` `JSON.stringify(item) )` | Function to perform a deep clone. See below. | -| `makeCacheKey` | `Function` | `key => key` | Function to convert record key to cache key. Use this to convert MongoDB/Mongoose ObjectId/bson keys to a cache key using `item._id.toString()`. | - -- **Example** - - ```js - const CacheMap = require('@feathers-plus/cache'); - const { cache } = require('feathers-hooks-common/index.js'); - - const cacheMap = CacheMap({ max: 100 }); // Keep the 100 most recently used. - - module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; - ``` - - ```js - const { cache } = require('feathers-hooks-common/index.js'); - - const cacheMap = new Map(); - - module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; - ``` - - ```js - const CacheMap = require('@feathers-plus/cache'); - const mongoose = require('mongoose'); - const { cache } = require('feathers-hooks-common/index.js'); - - const cacheMap = CacheMap({ max: 100 }); - const makeCacheKey = key => (key instanceof mongoose.Types.ObjectId ? key.toString() : key); - - module.exports = { - before: { all: cache(cacheMap, undefined, { makeCacheKey }) }, - after: { all: cache(cacheMap, undefined, { makeCacheKey }) }, - }; - ``` - - > The `cache` hook **must** be registered in both `before` and `after`. - -

The cache will grow without limit when `Map` is used and the resulting memory pressure may adversely affect your performance. `Map` should only be used when you know or can control its size.

- -- **Details** - - The `cache` hook maintain a persistent cache for the service it is registerd on. A persistent cache stores records so future requests for those records can be served faster; the records stored in the cache are duplicates of records stored in the database. - - The `get` service method retrieves records from the cache and updates `context.result` `[.data]`. The other methods remove their `context.data` entries from the cache in the `before` hook, and add entries in the `after` hook. All the records returned by a `find` call are added to the cache. - - The `cache` hook may be provided a custom Map instance to use as its memoization cache. Any object that implements the methods get(), set(), delete() and clear() can be provided. This allows for custom Maps which implement various [cache algorithms](https://en.wikipedia.org/wiki/Cache_replacement_policies) to be provided. - - The companion `@feathers-plus/cache` provides a least recently-used cache which discards the least recently used items first. It is compatible with `cache` as well as the BatchLoaders used with the `fastJoin` hook. - - > The `cache` hook can make [fastJoin](#fastjoin) hooks run more efficiently. - - MongoDB and Mongoose store record keys as bson objects rather than as scalars. The safest way to use the cache is in conjunction with the `makeCacheKey` option. - -- **options.clone** - - The clone function has a single parameter. - - - `{Object} item` - - It returns - - - `{Object} clonedItem` - -| Argument | Type | Default | Description | -| ------------ | :------: | ------- | ------------------ | -| `item` | `Object` | | The record. | -| `clonedItem` | `Object` | | A clone of `item`. | - -## debug - -Display the current hook context for debugging. - - - -- **Arguments** - - `{String} label` - - `{Array < String >} [ fieldNames ]` - -| Argument | Type | Default | Description | -| ------------ | :----------: | ------- | ------------------------------------------------ | -| `label` | `String` | | Label to identify the logged information. | -| `fieldNames` | dot notation | | The field values in `context.params` to display. | - -- **Example** - - ```js - const { debug } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { - all: [ debug('step 1'), setNow('updatedAt'), debug(' step 2') ], - } }; - - // Result - * step 1 - type: before, method: create - data: { name: 'Joe Doe' } - query: { sex: 'm' } - result: { assigned: true } - params props: [ 'query' ] - * step 2 - type: before, method: create - data: { name: 'Joe Doe', createdAt: 1510518511547 } - query: { sex: 'm' } - result: { assigned: true } - params props: [ 'query' ] - params.query: { sex: 'm' } - error: ... - ``` - -- **Details** - - `debug` is great for debugging issues with hooks. Log the hook context before and after a hook to see what the hook started with, and what it changed. - -## dePopulate - -Remove records and properties created by the populate hook. - - - -- **Arguments** - - `{Function} customDepop` - -| Argument | Type | Default | Description | -| ------------- | :--------: | ------------ | -------------------------------------- | -| `customDepop` | `Function` | `rec => rec` | Additional modifications for a record. | - -- **Example** - - ```js - const { dePopulate } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { all: [depopulate()] } }; - ``` - -- **Details** - - Removes joined records, computed properties, and profile information created by [`populate`](#populate). Populated and serialized items may, after dePopulate, be used in service calls. - - Removes fields created by resolver functions using `fgraphql`. Populated items may, after dePopulate, be used in a patch service call. - -## disablePagination - -Disables pagination when query.$limit is -1 or '-1'. - - - -- **Example** - - ```js - const { disablePagination } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { find: disablePagination() } }; - ``` - -- **Details** - - Pagination is disabled if `context.query.$limit` is -1 or '-1'. It works for all types of calls including REST. - -## disallow - -Prevents access to a service method completely or for specific transports. - - - -- **Arguments** - - - `{Array< String >} transports` - -| Argument | Type | Default | Description | -| ------------ | :---------------: | ----------------------- | ----------------------------------------- | -| `transports` | `Array< String >` | disallow all transports | The transports that you want to disallow. | - -| `transports` | Value | Description | -| ------------ | ------------------------------------- | ----------- | -| `socketio` | disallow calls by Socket.IO transport | -| `rest` | disallow calls by REST transport | -| `external` | disallow calls other than from server | -| `server` | disallow calls from server | - -- **Example** - - ```js - const { disallow, iff } = require('feathers-hooks-common/index.js'); - - module.exports = { - before: { - // Users can not be created by external access - create: disallow('external'), - // A user can not be deleted through the REST provider - remove: disallow('rest'), - // disallow calling `update` completely (e.g. to allow only `patch`) - update: disallow(), - // disallow the remove hook if the user is not an admin - remove: iff(context => !context.params.user.isAdmin, disallow()), - }, - }; - ``` - -- **Details** - - Prevents access to a service method completely or just for specific transports. All transports set the `context.params.provider` property, and `disallow` checks this. - -## discard - -Delete certain fields from the record(s). - - - -> **Note:** The discard hook will remove fields even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), discard(...))`. - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | --------------------------------------------------------- | -| fieldNames | dot notation | One or more fields you want to remove from the record(s). | - -- **Example** - - ```js - const { discard, iff, isProvider } = require('feathers-hooks-common/index.js'); - - module.exports = { - after: { all: iff(isProvider('external'), discard('password', 'address.city')) }, - }; - ``` - -- **Details** - - Delete the fields either from `context.data` (before hook) or `context.result[.data]` (after hook). - They are not modified if they are not an object, so a `null` value is supported. - -## discardQuery - -Delete certain fields from the query object. - - - -> **Note:** The discardQuery hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), discardQuery(...))`. - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | ----------------------------------------------------- | -| fieldNames | dot notation | One or more fields you want to remove from the query. | - -- **Example** - - ```js - const { discardQuery, iff, isProvider } = require('feathers-hooks-common/index.js'); - - module.exports = { after: { all: iff(isProvider('external'), discardQuery('secret')) } }; - ``` - -- **Details** - - Delete the fields from `context.params.query`. - -## fastJoin - -Join related records. - - - -> `fastJoin` is preferred over using `populate`. - -- **Arguments** - - - `{Object | Function} resolvers` - - - `{Function} [ before ]` - - `{Function} [ after ]` - - `{Object} joins` - - - `{Object | Function} [ query ]` - -| Argument | Type | Default | Description | -| ----------- | --------------------------------- | ----------------------------------------- | ----------------------------------------------------------------- | -| `resolvers` | `Object` or `context` `=> Object` | | The group of operations to perform on the data. | -| `query` | `Object` | run all resolvers with `undefined` params | You can customise the current operations with the optional query. | - -| `resolvers` | Argument | Type | Default | Description | -| ----------- | ------------------ | ---- | -------------------------------------------------------------------------------------------------------------------------- | ----------- | -| `before` | `context` `=> { }` | | Processing performed before the operations are started. Batch-loaders are usually created here. | -| `after` | `context` `=> { }` | | Processing performed after all other operations are completed. | -| `joins` | `Object` | | Resolver functions provide a mapping between a portion of a operation and actual backend code responsible for handling it. | - -> Read the [guide](guides.html#fastjoin) for more information on the arguments. - -- **Example using Feathers services** - -

The services in all these examples are assumed, for simplicity, to have pagination disabled. You will have to decide when to use `paginate: false` in your code.

- - ```js - // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common/index.js'); - - const postResolvers = { - joins: { - author: - (...args) => - async post => - (post.author = (await users.find({ query: { id: post.userId }, paginate: false }))[0]), - - starers: $select => async post => - (post.starers = await users.find({ - query: { id: { $in: post.starIds }, $select: $select || ['name'] }, - paginate: false, - })), - }, - }; - - const query = { author: true, starers: [['id', 'name']] }; - - module.exports = { after: { all: [fastJoin(postResolvers, query)] } }; - - // Original record - [{ id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] }][ - // Result - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [{ name: 'Marshall' }, { name: 'Barbara' }, { name: 'Aubree' }], - } - ]; - ``` - -- **Example with recursive operations** - - ```js - // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common/index.js'); - - const postResolvers = { - joins: { - comments: { - resolver: ($select, $limit, $sort) => async post => post.comments = await comments.find({ - query: { postId: post.id, $select: $select, $limit: $limit || 5, [$sort]: { createdAt: -1 } }, - paginate: false - }), - - joins: { - author: $select => async comment => comment.author = (await users.find({ - query: { id: comment.userId, $select: $select }, - paginate: false - }))[0], - }, - }, - } - }; - - const query = { - comments: { - args: [...], - author: [['id', 'name']] - }, - }; - - module.exports = { after: { - all: [ fastJoin(postResolvers, query) ], - } }; - - // Original record - [ { id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] } ] - - // Result - [ { id: 1, - body: 'John post', - userId: 101, - starIds: [ 102, 103, 104 ], - comments: - [ { id: 11, - text: 'John post Marshall comment 11', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } }, - { id: 12, - text: 'John post Marshall comment 12', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } }, - { id: 13, - text: 'John post Marshall comment 13', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } } ] - } ] - ``` - -- **Example with a simple batch-loader** - - ```js - // project/src/services/posts/posts.hooks.js - const { fastJoin } = require('feathers-hooks-common/index.js'); - const BatchLoader = require('@feathers-plus/batch-loader'); - const { loaderFactory } = BatchLoader; - - const postResolvers = { - before: context => { - context._loaders = { user: {} }; - context._loaders.user.id = loaderFactory(users, 'id', false, { paginate: false })(context); - }, - joins: { - author: () => async (post, context) => - (post.author = await context._loaders.user.id.load(post.userId)), - - starers: () => async (post, context) => - !post.starIds - ? null - : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), - }, - }; - - module.exports = { after: { all: [fastJoin(postResolvers)] } }; - - // Original record - [{ id: 1, body: 'John post', userId: 101, starIds: [102, 103, 104] }][ - // Result - { - id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - author: { id: 101, name: 'John' }, - starers: [ - { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' }, - ], - } - ]; - ``` - -- **Comprehensive example** - - ```js - // project/src/services/posts/posts.hooks.js - const { fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); - const BatchLoader = require('@feathers-plus/batch-loader'); - const { getResultsByKey, getUniqueKeys } = BatchLoader; - - const commentResolvers = { - joins: { - author: () => async (comment, context) => !comment.userId ? null : - comment.userRecord = await context._loaders.user.id.load(comment.userId) - }, - }; - - const postResolvers = { - before: context => { - context._loaders = { user: {}, comments: {} }; - - context._loaders.user.id = new BatchLoader(async (keys, context) => { - const result = await users.find(makeCallingParams( - context, { id: { $in: getUniqueKeys(keys) } }, undefined, { paginate: false } - )); - return getResultsByKey(keys, result, user => user.id, '!'); - }, - { context } - ); - - context._loaders.comments.postId = new BatchLoader(async (keys, context) => { - const result = await comments.find(makeCallingParams( - context, { postId: { $in: getUniqueKeys(keys) } }, undefined, { paginate: false } - )); - return getResultsByKey(keys, result, comment => comment.postId, '[!]'); - }, - { context } - ); - }, - joins: { - author: () => async (post, context) => - post.userRecord = await context._loaders.user.id.load(post.userId), - - starers: () => async (post, context) => !post.starIds ? null : - post.starIdsRecords = await context._loaders.user.id.loadMany(post.starIds), - - comments: { - resolver: (...args) => async (post, context) => - post.commentRecords = await context._loaders.comments.postId.load(post.id), - - joins: commentResolvers, - }, - } - }; - - const query = { - author: true, - starers: [['id', 'name']], - comments: { - args: null, - author: [['id', 'name']] - }, - }; - - module.exports = { after: { - all: [ fastJoin(postResolvers, context => query) ], - } }; - - // Original record - [ { id: 1, - body: 'John post', - userId: 101, - starIds: [102, 103, 104], - reputation: [ // The `populate` hook cannot handle this structure. - { userId: 102, points: 1 }, - { userId: 103, points: 1 }, - { userId: 104, points: 1 } - ]}, - ] - - // Results - [ { id: 1, - body: 'John post', - userId: 101, - starIds: [ 102, 103, 104 ], - reputation: - [ { userId: 102, points: 1, author: 'Marshall' }, - { userId: 103, points: 1, author: 'Barbara' }, - { userId: 104, points: 1, author: 'Aubree' } ], - author: { id: 101, name: 'John' }, - comments: - [ { id: 11, - text: 'John post Marshall comment 11', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } }, - { id: 12, - text: 'John post Marshall comment 12', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } }, - { id: 13, - text: 'John post Marshall comment 13', - postId: 1, - userId: 102, - author: { id: 102, name: 'Marshall' } } ], - starers: - [ { id: 102, name: 'Marshall' }, - { id: 103, name: 'Barbara' }, - { id: 104, name: 'Aubree' } ] }, - ] - ``` - -- **Example Using a Persistent Cache** - - ```js - const { cache, fastJoin, makeCallingParams } = require('feathers-hooks-common/index.js'); - const BatchLoader = require('@feathers-plus/batch-loader'); - const CacheMap = require('@feathers-plus/cache'); - const { getResultsByKey, getUniqueKeys } = BatchLoader; - - // Create a cache for a maximum of 100 users - const cacheMapUsers = CacheMap({ max: 100 }); - - // Create a batchLoader using the persistent cache - const userBatchLoader = new BatchLoader( - async keys => { - const result = await users.find( - makeCallingParams({}, { id: { $in: getUniqueKeys(keys) } }, undefined, { paginate: false }), - ); - return getResultsByKey(keys, result, user => user.id, '!'); - }, - { cacheMap: cacheMapUsers }, - ); - - const postResolvers = { - before: context => { - context._loaders = { user: {} }; - context._loaders.user.id = userBatchLoader; - }, - - joins: { - author: () => async (post, context) => - (post.author = await context._loaders.user.id.load(post.userId)), - - starers: () => async (post, context) => - !post.starIds - ? null - : (post.starers = await context._loaders.user.id.loadMany(post.starIds)), - }, - }; - - const query = { - author: true, - starers: [['id', 'name']], - comments: { args: null, author: [['id', 'name']] }, - }; - - module.exports = { - before: { all: cache(cacheMapUsers) }, - after: { all: [cache(cacheMapUsers), fastJoin(postResolvers, () => query)] }, - }; - ``` - - The number of service calls needed to run the `query` above **the second time**: - -| Using | number of service calls | -| ---------------------: | :---------------------: | -| `populate` | **22** | -| `fastJoin` alone | **2** | -| `fastJoin` and `cache` | **0** | - -The `cache` hook also makes `get` service calls more efficient. - -> The `cache` hook **must** be registered in both `before` and `after`. - -- **Details** - - We often want to combine rows from two or more tables based on a relationship between them. The `fastJoin` hook will select records that have matching values in both tables. It can batch service calls and cache records, thereby needing roughly an order of magnitude fewer database calls than the `populate` hook, e.g. _2_ calls instead of _20_. - - Relationships such as `1:1`, `1:m`, `n:1`, and `n:m` relationships can be handled. - - `fastJoin` uses a GraphQL-like imperative API, and it is not restricted to using data from Feathers services. Resources for which there are no Feathers adapters can [be used.](https://github.com/feathersjs-ecosystem/batch-loader) - - The companion `@feathers-plus/cache` implements a least recently-used cache which discards the least recently used items first. When used in conjunction with the `cache` hook, it can be used to implement persistent caches for BatchLoaders. BatchLoaders configured this way would retain their cache between requests, eliminating the need to _prime_ the cache at the start of each request. - -## iff - -Execute one or another series of hooks depending on a sync or async predicate. - - - -- **Arguments** - - `{Boolean | Promise | Function} predicate` - - `{Array< Function >} hookFuncsTrue` - - `{Array< Function >} hookFuncsFalse` - -| Argument | Type | Default | Description | -| ---------------- | :--------------------------------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `predicate` | `Boolean`, `Promise` or `Function` | | Determine if `hookFuncsTrue` or `hookFuncsFalse` should be run. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | -| `hookFuncsTrue` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | -| `hookFuncsFalse` | `Array<` `Function >` | | Sync or async hook functions to run if `false`. They may include other conditional hooks. | - -- **Example** - - ```js - const { discard, iff, isProvider, populate } = require('feathers-hooks-common/index.js'); - const isNotAdmin = adminRole => context => context.params.user.roles.indexOf(adminRole || 'admin') === -1; - - module.exports = { before: { - create: iff( - () => new Promise((resolve, reject) => { ... }), - populate('user', { field: 'authorisedByUserId', service: 'users' }) - ), - - get: [ iff(isNotAdmin(), discard('budget')) ] - - update: - iff(isProvider('server'), - hookA, - iff(isProvider('rest'), hook1, hook2, hook3) - .else(hook4, hook5), - hookB - ) - .else( - iff(hook => hook.path === 'users', hook6, hook7) - ) - } }; - ``` - -- **Details** - - Resolve the predicate, then run one set of hooks sequentially. - - The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. - -## iffElse - -Execute one array of hooks or another based on a sync or async predicate. - - - -- **Arguments** - - `{Function} predicate` - - `{Array< Functions >} hookFuncsTrue` - - `{Array< Functions >} hookFuncsFalse` - -| Argument | Type | Default | Description | -| ---------------- | :--------------------------------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `predicate` | `Boolean`, `Promise` or `Function` | | Determine if `hookFuncsTrue` or `hookFuncsFalse` should be run. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | -| `hookFuncsTrue` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | -| `hookFuncsFalse` | `Array<` `Function >` | | Sync or async hook functions to run if `false`. They may include other conditional hooks. | - -- **Example** - - ```js - const { iffElse, populate, serialize } = require('feathers-hooks-common/index.js'); - - module.exports = { after: { - create: iffElse(() => { ... }, - [populate(poAccting), serialize( ... )], - [populate(poReceiving), serialize( ... )] - ) - } }; - ``` - -- **Details** - - Resolve the predicate, then run one set of hooks sequentially. - - The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. - -## keep - -Keep certain fields in the record(s), deleting the rest. - - - -> **Note:** The keep hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keep(...))`. - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | -------------------------------------------------- | -| fieldNames | dot notation | The only fields you want to keep in the record(s). | - -- **Example** - - ```js - const { keep } = require('feathers-hooks-common/index.js'); - - module.exports = { after: { create: keep('name', 'dept', 'address.city') } }; - ``` - -- **Details** - - Update either `context.data` (before hook) or `context.result[.data]` (after hook). - Their values are returned if they are not an object, so a `null` value is supported. - -## keepInArray - -Keep certain fields in a nested array inside the record(s), deleting the rest. - - - -> **Note:** The keepInArray hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keepInArray(...))`. - -- **Arguments** - - `{String} arrayName` - - `{Array< String >} fieldNames` - -| Argument | Type | Default | Description | -| ------------ | ----------------- | ------- | --------------------------------------------------------------------- | -| `arrayName` | `String` | | Field name containing an array of objects. Dot notation is supported. | -| `fieldNames` | `Array< String >` | | Field names to keep in each object. Dot notation is supported. | - -- **Example** - - ```js - const { keepInArray } = require('feathers-hooks-common/index.js'); - - module.exports = { - after: { - create: keepInArray('users', ['name', 'dept', 'address.city']), - find: keepInArray('account.users', ['name', 'dept', 'address.city']), - }, - }; - ``` - -- **Details** - - Update either `context.data` (before hook) or `context.result[.data]` (after hook). - Their values are returned if they are not an object, so a `null` value is supported. - -## keepQuery - -Keep certain fields in the query object, deleting the rest. - - - -> **Note:** The keepQuery hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keepQuery(...))`. - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | ----------------------------------------------------- | -| fieldNames | dot notation | The only fields you want to keep in the query object. | - -- **Example** - - ```js - const { keepQuery } = require('feathers-hooks-common/index.js'); - - module.exports = { after: { create: keepQuery('name', 'address.city') } }; - ``` - -- **Details** - - Updates `context.params.query`. - -## keepQueryInArray - -Keep certain fields in a nested array inside the query object, deleting the rest. - - - -> **Note:** The keepQueryInArray hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keepQueryInArray(...))`. - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | --------------------------------------------------------------------------- | -| fieldNames | dot notation | The only fields you want to keep in a nested array inside the query object. | - -- **Arguments** - - `{String} arrayName` - - `{Array< String >} fieldNames` - -| Argument | Type | Default | Description | -| ------------ | ----------------- | ------- | --------------------------------------------------------------------- | -| `arrayName` | `String` | | Field name containing an array of objects. Dot notation is supported. | -| `fieldNames` | `Array< String >` | | Field names to keep in each object. Dot notation is supported. | - -- **Example** - - ```js - const { keepQueryInArray } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { find: keepQueryInArray('$or', ['name', 'dept', 'address.city']) } }; - ``` - -- **Details** - - Updates `context.params.query`. - Their values are returned if they are not an object, so a `null` value is supported. - -## lowerCase - -Convert certain field values to lower case. - - - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | --------------------------------------------------------------------- | -| fieldNames | dot notation | The fields in the record(s) whose values are converted to lower case. | - -- **Example** - - ```js - const { lowerCase } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { create: lowerCase('email', 'username', 'div.dept') } }; - ``` - -- **Details** - - Update either `context.data` (before hook) or `context.result[.data]` (after hook). - -## mongoKeys - -Wrap MongoDB foreign keys in ObjectID. - - - -- **Arguments** - - - `{Function} ObjectID` - - `{Array < String >} foreignKeyNames` - -| Argument | Type | Default | Description | -| ----------------- | :-------------------------------------: | ------- | -------------------------------------------- | -| `ObjectID` | `Function` | - | `require('mongodb').ObjectID` or equivalent. | -| `foreignKeyNames` | `Array < String >` dot notation allowed | - | Field names of the foreign keys. | - -- **Example** - - ```js - const { ObjectID } = require('mongodb'); - const { mongoKeys } = require('feathers-hooks-common/index.js'); - - /* Comment Schema - { - _id, - body, - authorId, // User creating this Comment - postId, // Comment is for this Post - edit: { - reason, - editorId, // User last editing Comment - ) - } - */ - - const foreignKeys = [ - '_id', 'authorId', 'postId', 'edit.editorId' - ]; - - module.exports = { before: { - find: mongoKeys(ObjectID, foreignKeys) - } }; - - // Usage - comment.find({ query: { postId: '111111111111' } }) // Get all Comments for the Post. - comment.find({ query: { authorId: { $in: [...] } } }) // Get all Comments from these authors. - comment.find({ query: { edit: { editorId: { $in: [...] } } } }) // Get all comments edited by these editors. - ``` - -- **Details** - - In MongoDB, foreign keys must be wrapped in ObjectID when used in a query, e.g. `comment.find({ query: { authorId: new ObjectID('111111111111') } })`. - - `mongoKeys` automates this, given the field names of all the foreign keys in the schema. This reduces the boilerplate clutter and reduces the chance of bugs occurring. - -## paramsFromClient - -Pass `context.params` from client to server. Server hook. - - - -- **Arguments** - - - `{Array< String > | String} whitelist` - -| Argument | Type | Default | Description | -| ----------- | :----------: | ------- | ------------------------------------------------------------------------------------------------------------ | -| `whitelist` | dot notation | | Names of the props permitted to be in `context.params`. Other props are ignored. This is a security feature. | - -- **Example** - - ```js - // client - const { paramsForServer } = require('feathers-hooks-common/index.js'); - - service.update( - id, - data, - paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), - ); - - // server - const { paramsFromClient } = require('feathers-hooks-common/index.js'); - - module.exports = { - before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, - }; - - // myHook's `context.params` will now be - // { query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' } } - ``` - -- **Details** - - By default, only the `context.params.query` object is transferred from a Feathers client to the server, for security among other reasons. However you can explicitly transfer other `context.params` props with the client utility function `paramsForServer` in conjunction with the `paramsFromClient` hook on the server. - - This technique also works for service calls made on the server. - -## populate - -Join related records. - - - -> `fastJoin` is preferred over using `populate`. - -- **Arguments** - - - `{Object} options` - - - `{Object | Function} schema` - - - `{String} service` - - `{any} [ permissions ]` - - `{Array< Object > | Object} include` - - - `{String} service` - - `{String} [ nameAs ]` - - `{String} [ parentField ]` - - `{String} [ childField]` - - `{String} [ permissions ]` - - `{Object} [ query ]` - - `{Function} [ select ]` - - `{Boolean} [ asArray ]` - - `{Boolean | Number} [ paginate ]` - - `{Boolean} [ useInnerPopulate ]` - - `{undefined}} [ provider ]` - - `{Array< Object > | Object} include` - - - ... - - - `{Function} [ checkPermissions ]` - - `{Boolean} [ profile ]` - -| Argument | Type | Default | Description | -| ------------------ | ------------------- | ---------------------------- | ---------------------------------- | -| `options` | `Object` | | Options. | -| `schema` | `Object` `Function` | `(context, options)` `=> {}` | Info on how to join records. | -| `checkPermissions` | `Function` | no permission check | Check if call allowed joins. | -| `profile` | `Boolean` | `false` | If profile info is to be gathered. | - -| `schema` | Argument | Type | Default | Description | -| ------------------ | ------------------------------------ | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| `service` | `String` | | The name of the service providing the items, actually its path. | -| `nameAs` | dot notation | `service` | Where to place the items from the join | -| `parentField` | dot notation | | The name of the field in the parent item for the relation. | -| `childField` | dot notation if database supports it | | The name of the field in the child item for the relation. Dot notation is allowed and will result in a query like `{ 'name.first':` `'John' }` which is not suitable for all DBs. You may use query or select to create a query suitable for your DB. | -| `permissions` | `any` | no permission check | Who is allowed to perform this join. See `checkPermissions` above. | -| `query` | `Object` | | An object to inject into `context.params.query`. | -| `select` | `Function` | `(context,` `parentItem,` `depth)` `=> {}` | A function whose result is injected into the query. | -| `asArray` | `Boolean` | `false` | Force a single joined item to be stored as an array. | -| `paginate` | `Boolean` `Number` | `false` | Controls pagination for this service. | -| `useInnerPopulate` | `Boolean` | `false` | Perform any `populate` or `fastJoin` registered on this service. | -| `provider` | `undefined` | | Call the service as the server, not with the client's transport. | -| `include` | `Array<` `Object >` or `Object` | | Continue recursively join records to these records. | - -> Read the [guide](guides.html#populate) for more information on the arguments. - -- **Examples** - - - 1:1 relationship - - ```javascript - // users like { _id: '111', name: 'John', roleId: '555' } - // roles like { _id: '555', permissions: ['foo', bar'] } - import { populate } from 'feathers-hooks-common/index.js'; - - const userRoleSchema = { - include: { service: 'roles', nameAs: 'role', parentField: 'roleId', childField: '_id' }, - }; - - app.service('users').hooks({ after: { all: populate({ schema: userRoleSchema }) } }); - - // result like - // { _id: '111', name: 'John', roleId: '555', - // role: { _id: '555', permissions: ['foo', bar'] } } - ``` - - - 1:n relationship - - ```javascript - // users like { _id: '111', name: 'John', roleIds: ['555', '666'] } - // roles like { _id: '555', permissions: ['foo', 'bar'] } - const userRolesSchema = { - include: { service: 'roles', nameAs: 'roles', parentField: 'roleIds', childField: '_id' }, - }; - - usersService.hooks({ after: { all: populate({ schema: userRolesSchema }) } }); - - // result like - // { _id: '111', name: 'John', roleIds: ['555', '666'], roles: [ - // { _id: '555', permissions: ['foo', 'bar'] } - // { _id: '666', permissions: ['fiz', 'buz'] } - // ]} - ``` - - - n:1 relationship - - ```javascript - // posts like { _id: '111', body: '...' } - // comments like { _id: '555', text: '...', postId: '111' } - const postCommentsSchema = { - include: { service: 'comments', nameAs: 'comments', parentField: '_id', childField: 'postId' }, - }; - - postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); - - // result like - // { _id: '111', body: '...' }, comments: [ - // { _id: '555', text: '...', postId: '111' } - // { _id: '666', text: '...', postId: '111' } - // ]} - ``` - - - Multiple and recursive includes - - ```javascript - const schema = { - service: '...', - permissions: '...', - include: [ - { - service: 'users', - nameAs: 'authorItem', - parentField: 'author', - childField: 'id', - include: [ ... ], - }, - { - service: 'comments', - parentField: 'id', - childField: 'postId', - query: { - $limit: 5, - $select: ['title', 'content', 'postId'], - $sort: {createdAt: -1} - }, - select: (hook, parent, depth) => ({ $limit: 6 }), - asArray: true, - provider: undefined, - }, - { - service: 'users', - permissions: '...', - nameAs: 'readers', - parentField: 'readers', - childField: 'id' - } - ], - }; - - module.exports.after = { - all: populate({ schema, checkPermissions, profile: true }) - }; - ``` - - - Flexible relationship, similar to the n:1 relationship example above - - ```javascript - // posts like { _id: '111', body: '...' } - // comments like { _id: '555', text: '...', postId: '111' } - const postCommentsSchema = { - include: { - service: 'comments', - nameAs: 'comments', - select: (hook, parentItem) => ({ postId: parentItem._id }), - }, - }; - - postService.hooks({ after: { all: populate({ schema: postCommentsSchema }) } }); - - // result like - // { _id: '111', body: '...' }, comments: [ - // { _id: '555', text: '...', postId: '111' } - // { _id: '666', text: '...', postId: '111' } - // ]} - ``` - -- **Details** - - We often want to combine rows from two or more tables based on a relationship between them. The `populate` hook will select records that have matching values in both tables. - - `populate` supports 1:1, 1:n and n:1 relationships. It can provide performance profile information. - -## preventChanges - -Prevent patch service calls from changing certain fields. - - - -- **Arguments** - -- `{Boolean} ifThrow` -- `{Array < String >} fieldNames` - -| Argument | Type | Default | Description | -| ------------ | :----------: | ------- | ------------------------------------------------------ | -| `ifThrow` | `Boolean` | | Deletes any `fieldNames` if `false`; throws if `true`. | -| `fieldNames` | dot notation | | The fields names which may not be patched. | - -- **Example** - - ```js - const { preventChanges } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { patch: preventChanges(true, 'security.badge') } }; - ``` - -- **Details** - - Consider using validateSchema if you would rather specify which fields are allowed to change. - -## required - -Check selected fields exist and are not falsey. Numeric 0 is acceptable. - - - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | ------------------------------------------------------------------- | -| fieldNames | dot notation | These fields must exist and not be falsey. Numeric 0 is acceptable. | - -- **Example** - - ```js - const { required } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { all: required('email', 'password') } }; - ``` - -## runParallel - -Run a hook in parallel to the other hooks and the service call. - - - -- **Arguments** - - - `{Function} hookFunc` - - `{Function} clone` - - `{Number} [ depth ]` - -| Argument | Type | Default | Description | -| ---------- | :--------: | :-----: | ------------------------------------------------------------------------------------------------------------------- | -| `hookFunc` | `Function` | | The hook function to run in parallel to the rest of the service call. | -| `clone` | `Function` | | Function to deep clone its only parameter. | -| `depth` | `Number` | 6 | Depth to which `context` is to be cloned. 0 does not clone. A depth of 5 would clone `context.result.data.[].item`. | - -- **Example** - - ```js - const { runParallel } = require('feathers-hooks-common/index.js'); - const clone = require('clone'); - - function sendEmail(...) { - return context => { ... }; - } - - module.exports = { after: { - create: runParallel(sendEmail(...), clone) - } }; - ``` - -- **Details** - - `hookFunc` is scheduled with a `setTimeout`. The next hook starts immediately. - - The hook was provided by bedeoverend. Thank you. - -## serialize - -Prune values from related records. Calculate new values. - - - -- **Arguments** - - `{Object | Function} schema` - - `{Array< String> | String} only` - - `{Array< String> | String} exclude` - - `[fieldName]: {Object} schema` - - `{Object} computed` - - `[fieldName]: {Function} computeFunc` - -| Argument | Type | Default | Description | -| -------- | :-----------------: | --------------------- | --------------------------- | -| `schema` | `Object` `Function` | `context` `=> schema` | How to serialize the items. | - -| `schema` | Argument | Type | Default | Description | -| ---------- | ------------------------------ | :--: | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| `only` | `Array<` `String>` or `String` | | The names of the fields to keep in each item. The names for included sets of items plus `_include` and `_elapsed` are not removed by `only`. | -| `exclude` | `Array<` `String>` or `String` | | The names of fields to drop in each item. You may drop, at your own risk, names of included sets of items, `_include` and `_elapsed`. | -| `computed` | `Object` | | The new names you want added and how to compute their values. | - -| `schema` `.computed` | Argument | Type | Default | Description | -| -------------------- | ---------- | :------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| `fieldName` | `String` | | The name of the field to add to the records. | -| `computeFunnc` | `Function` | `(record,` `context)` `=> value` | Function to calculate the computed value. `item`: The item with all its initial values, plus all of its included items. The function can still reference values which will be later removed by only and exclude. `context`: The context passed to `serialize`. | - -- **Example** - - The schema reflects the structure of the populated records. The base records for this example have included `post` records, which themselves have included `authorItem`, `readersInfo` and `commentsInfo` records. - - ```js - const schema = { - only: 'updatedAt', - computed: { - commentsCount: (recommendation, hook) => recommendation.post.commentsInfo.length, - }, - post: { - exclude: ['id', 'createdAt', 'author', 'readers'], - authorItem: { - exclude: ['id', 'password', 'age'], - computed: { - isUnder18: (authorItem, hook) => authorItem.age < 18, - }, - }, - readersInfo: { - exclude: 'id', - }, - commentsInfo: { - only: ['title', 'content'], - exclude: 'content', - }, - }, - }; - purchaseOrders.after({ - all: [ populate( ... ), serialize(schema) ] - }); - - module.exports = { after: { - get: [ populate( ... ), serialize(schema) ], - find: [ fastJoin( ... ), serialize(schema) ] - } }; - ``` - -- **Details** - - Works with fastJoin and populate. - -## setField - -The `setField` hook allows to set a field on the hook context based on the value of another field on the hook context. - - - -### Options - -- `from` _required_ - The property on the hook context to use. Can be an array (e.g. `[ 'params', 'user', 'id' ]`) or a dot separated string (e.g. `'params.user.id'`). -- `as` _required_ - The property on the hook context to set. Can be an array (e.g. `[ 'params', 'query', 'userId' ]`) or a dot separated string (e.g. `'params.query.userId'`). -- `allowUndefined` (default: `false`) - If set to `false`, an error will be thrown if the value of `from` is `undefined` in an external request (`params.provider` is set). On internal calls (or if set to true `true` for external calls) the hook will do nothing. - -> **Important:** This hook should be used after the [authenticate hook](https://docs.feathersjs.com/api/authentication/hook.html#authenticate-options) when accessing user fields (from `params.user`). - -**Note:** When the service enable `multi:true` and `data` is an array data type, this hook may working to an unexpected result - -### Examples - -Limit all external access of the `users` service to the authenticated user: - -> **Note:** For MongoDB, Mongoose and NeDB `params.user.id` needs to be changed to `params.user._id`. For any other custom id accordingly. - -```js -const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common/index.js'); - -app - .service('users') - .hooks({ - before: { - all: [authenticate('jwt'), setField({ from: 'params.user.id', as: 'params.query.id' })], - }, - }); -``` - -Only allow access to invoices for the users organization: - -```js -const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common/index.js'); - -app - .service('invoices') - .hooks({ - before: { - all: [ - authenticate('jwt'), - setField({ from: 'params.user.organizationId', as: 'params.query.organizationId' }), - ], - }, - }); -``` - -Set the current user id as `userId` when creating a message and only allow users to edit and remove their own messages: - -```js -const { authenticate } = require('@feathersjs/authentication'); -const { setField } = require('feathers-hooks-common/index.js'); - -const setUserId = setField({ - from: 'params.user.id', - as: 'data.userId' -}); -const limitToUser = setField({ - from: 'params.user.id', - as: 'params.query.userId' -}); - -app.service('messages').hooks({ - before: { - all: [ - authenticate('jwt') - ], - create: [ - setUserId - ], - patch: [ - limitToUser - ], - update: [ - limitToUser - ] - remove: [ - limitToUser - ] - } -}) -``` - -## setNow - -Create/update certain fields to the current date-time. - - - -- Arguments - - `{Array < String >} fieldNames` - -| Name | Type | Description | -| ---------- | ------------ | ---------------------------------------------------------------- | -| fieldNames | dot notation | The fields that you want to add or set to the current date-time. | - -- **Example** - - ```js - const { setNow } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { create: setNow('createdAt', 'updatedAt') } }; - ``` - -- **Details** - - Update either `context.data` (before hook) or `context.result[.data]` (after hook). - -## setSlug - -Set slugs in URL, e.g. /stores/:storeId. - - - -- **Arguments** - - `{String} slug` - - `{String} [ fieldName ]` - -| Argument | Type | Default | Description | -| ----------- | :------: | ------------- | ---------------------------------------------------------------------------------- | -| `slug` | `String` | | The slug as it appears in the route, e.g. `storeId` for`/stores/:storeId/candies`. | -| `fieldName` | `String` | `query[slug]` | The field to contain the slug value. | - -- **Example** - - ```js - const { setSlug } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { all: [hooks.setSlug('storeId')] } }; - - // `context.params.query` will always be normalized, - // e.g. `{ size: 'large', storeId: '123' }` - ``` - -- **Details** - - A service may have a slug in its URL, e.g. `storeId` in `app.use(` `'/stores/:storeId/candies',` `new Service());`. The service gets slightly different values depending on the transport used by the client. - -| transport | `hook.data` `.storeId` | `hook.params` `.query` | code run on client | -| --------- | ---------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------- | -| socketio | `undefined` | `{ size: 'large',` `storeId: '123' }` | `candies.create({ name: 'Gummi',qty: 100 },` `{ query: { size: 'large', storeId: '123' } })` | -| rest | `:storeId` | same as above | same as above | -| raw HTTP | `123` | `{ size: 'large' }` | `fetch('/stores/123/candies?size=large', ..` | - -This hook normalizes the difference between the transports. - -## sifter - -Filter data or result records using a MongoDB-like selection syntax. - - - -- **Arguments** - - - `{Function} siftFunc` - -| Argument | Type | Default | Description | -| ---------- | :--------: | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `siftFunc` | `Function` | | Function similar to `context => sift(mongoQueryObj)`. Information about the mongoQueryObj syntax is available at [crcn/sift](https://github.com/crcn/sift.js). | - -- **Example** - - ```js - const sift = require('sift'); - const { sifter } = require('feathers-hooks-common/index.js'); - - const selectCountry = hook => sift({ 'address.country': hook.params.country }); - - module.exports = { before: { find: sifter(selectCountry) } }; - ``` - - ```js - const sift = require('sift'); - const { sifter } = require('feathers-hooks-common/index.js'); - - const selectCountry = country => () => sift({ address: { country: country } }); - - module.exports = { before: { find: sifter(selectCountry('Canada')) } }; - ``` - -- **Details** - - All official Feathers database adapters support a common way for querying, sorting, limiting and selecting find method calls. These are limited to what is commonly supported by all the databases. - - The `sifter` hook provides an extensive MongoDB-like selection capabilities, and it may be used to more extensively select records. - - `sifter` filters the result of a find call. Therefore more records will be physically read than needed. You can use the Feathers database adapters query to reduce this number.` - -## softDelete - -Flag records as logically deleted instead of physically removing them. Requires a Feathers v4 or later database adapter. - - - -- **Arguments** - -| Argument | Type | Default | Description | | -| -------------- | --------- | ------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------- | -| `deletedQuery` | `Function | Object` | `{ deleted: { $ne: true } }` | An object or async function that takes the query which returns the part of the query to exclude deleted entrie | -| `removeData` | `Function | Object` | `{ deleted: true }` | An object or async function that returns the data used to flag an entry as deleted | - -By default, `softDelete` queries for a `deleted` property not set to `true` (meaning it can either exist or be anything else). - -Setting `params.disableSoftDelete` to `true` allows to skip the `softDelete` hook. - -- **Example** - - Basic usage: - - ```js - const { softDelete } = require('feathers-hooks-common/index.js'); - - // Use standard softDelete which uses `deleted: true` - app.service('people').hooks({ before: { all: [softDelete()] } }); - - // will set `deleted: true` for entry with id 1 - app.service('people').remove(1); - - // Will find all people where `deleted` is not `true` - let people = app.service('people').find(); - - // `get`, `patch`, `update` or `remove` on a deleted entry will throw NotFound - app.service('people').get(1); - ``` - - Customizing `deletedQuery` and `removeData` to e.g. use `deletedAt`: - - ```js - // Use deletedAt and set when the entry was deleted - app.service('people').hooks({ - before: { - all: [ - hooks.softDelete({ - // context is the normal hook context - deletedQuery: async context => { - return { deletedAt: null }; - }, - removeData: async context => { - return { deletedAt: new Date() }; - }, - }), - ], - create: [ - context => { - context.data.deletedAt = null; - }, - ], - }, - }); - ``` - -## stashBefore - -Stash current value of record, usually before mutating it. Performs a get call. - - - -- **Arguments** - - `{String} fieldName` - -| Argument | Type | Default | Description | -| ----------- | :--: | ---------- | ------------------------------------------------------------------------------ | -| `fieldName` | | `'before'` | The name of the `context.params` property to contain the current record value. | - -- **Example** - - ```js - const { stashBefore } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { patch: stashBefore() } }; - ``` - -- **Details** - - The hook performs its own preliminary `get` call. If the original service call is also a `get`, its `context.params` is used for the preliminary `get`. The preliminary `get` will be skipped if `params.disableStashBefore` is truthy. - - For any other method the calling params are formed from the original calling context: - - ```js - { provider: context.params.provider, - authenticated: context.params.authenticated, - user: context.params.user } - ``` - -## traverse - -Transform fields & objects in place in the record(s) using a recursive walk. Powerful. - - - -- **Arguments** - - `{Function} transformer` - - `{Function} [ getObject ]` - -| Argument | Type | Default | Description | -| ------------- | :--------: | ----------------------------------------- | ----------------------------------------------------------------------------- | -| `transformer` | `Function` | | Called for every node in every record(s). May change the node in place. | -| `getObject` | `Function` | `context.data` or `context.result[.data]` | Function with signature `context => {}` which returns the object to traverse. | - -- **Example** - - ```js - const { traverse } = require('feathers-hooks-common/index.js'); - - // Trim strings - const trimmer = function (node) { - if (typeof node === 'string') { - this.update(node.trim()); - } - }; - - // REST HTTP request may use the string 'null' in its query string. - // Replace these strings with the value null. - const nuller = function (node) { - if (node === 'null') { - this.update(null); - } - }; - - module.exports = { - before: { create: traverse(trimmer), find: traverse(nuller, context => context.params.query) }, - }; - ``` - -- **Details** - - Traverse and transform objects in place by visiting every node on a recursive walk. Any object in the hook may be traversed, including the query object. - - > [traverse (NPM)](https://npmjs.com/package/traverse) documents the extensive methods and context available to the transformer function. - -## unless - -Execute a series of hooks if a sync or async predicate is falsey. - - - -- **Arguments** - - `{Boolean | Promise | Function} predicate` - - `{Array< Function >} hookFuncs` - -| Argument | Type | Default | Description | -| ----------- | :--------------------------------: | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `predicate` | `Boolean`, `Promise` or `Function` | | Run `hookFunc` if the `predicate` is false. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | -| `hookFuncs` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | - -- **Example** - - ```js - const { isProvider, unless } = require('feathers-hooks-common/index.js'); - - module.exports = { - before: { - create: unless( - isProvider('server'), - hookA, - unless(isProvider('rest'), hook1, hook2, hook3), - hookB, - ), - }, - }; - ``` - -- **Details** - - Resolve the predicate to a boolean. Run the hooks sequentially if the result is falsey. - - The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. - -## validate - -Validate data using a validation function. - - - -- **Arguments** - - - `{Function} validator` - -| Argument | Type | Default | Description | -| ----------- | :--------: | ------- | ---------------------------------------- | -| `validator` | `Function` | | Validation function. See Details below.. | - -- **Example** - - ```js - const { validate } = require('feathers-hooks-common/index.js'); - const { promisify } = require('util'); - - // function myCallbackValidator(values, cb) { ... } - const myValidator = promisify(myCallbackValidator); - - module.exports = { before: { create: validate(myValidator) } }; - ``` - -- **Details** - - The validation function may be sync or return a Promise. Sync functions return either an error object like `{ fieldName1: 'message', ... }` or `null`. They may also throw with `throw new errors.BadRequest({ errors: errors });`. - - Promise functions should throw on an error or reject with `new errors.BadRequest('Error message', { errors: { fieldName1: 'message', ... } });`. Their `.then` returns either sanitized values to replace `context.data`, or `null`. - - The validator's parameters are - - - `{Object} formValues` - - `{Object} context` - - Sync functions return either an error object like `{ fieldName1: 'message', ... }` or `null`. `Validate` will throw on an error object with `throw new errors.BadRequest({ errors: errorObject });`. - - - `{Object | null} errors` - -| Argument | Type | Default | Description | -| ------------ | :-------------: | ------- | ----------------------------------------------------- | -| `formValues` | `Object` | | The data, e.g. `{ name: 'John', ... }` | -| `context` | `Object` | | The hook context. | -| `errors` | `Object` `null` | | An error object like `{ fieldName1: 'message', ... }` | - -> If you have a different signature for the validator then pass a wrapper as the validator e.g. `values => myValidator(..., values, ...)`. - -> Wrap your validator in Node's `util.promisify` if it uses a callback. - -## validateSchema - -Validate data using JSON-Schema. - - - -- **Arguments** - - `{Object} schema` - - `{Function | Object} ajv` - - `{Object} options` - - `{Function} [ addNewError ]` - - `...` - -| Argument | Type | Default | Description | -| --------- | :-----------------: | ------- | ---------------------------------------------------------------------------------------------------------- | -| `schema` | `Object` | | The [JSON-schema.](https://code.tutsplus.com/tutorials/validating-data-with-json-schema-part-1--cms-25343) | -| `ajv` | `Function` `Object` | | The ajv validator. Could be either the Ajv constructor or an instance of it. | -| `options` | `Object` | | Options for `validateSchema` and `ajv`. | - -| `options` | Argument | Type | Default | Description | -| ------------- | ---------- | :-------: | ------------------------------------------------------------------------------------- | ----------- | -| `addNewError` | `Function` | see below | Custom error message formatter. | -| other | `any` | | Any `ajv` options. Only effective when the second parameter is the `Ajv` constructor. | - -- **Example** - - ```js - const Ajv = require('ajv'); - const createSchema = { - /* JSON-Schema */ - }; - - module.before({ create: validateSchema(createSchema, Ajv) }); - ``` - - ```js - const Ajv = require('ajv'); - const ajv = new Ajv({ allErrors: true, $data: true }); - - ajv.addFormat('allNumbers', '^d+$'); - const createSchema = { - /* JSON-Schema */ - }; - - module.before({ create: validateSchema(createSchema, ajv) }); - ``` - -- **Details** - - There are some good [tutorials](https://code.tutsplus.com/tutorials/validating-data-with-json-schema-part-1--cms-25343) on using JSON-Schema with [Ajv](https://github.com/epoberezkin/ajv). - - If you need to customize `Ajv` with new keywords, formats or schemas, then instead of passing the `Ajv` constructor, you may pass in an instance of `Ajv` as the second parameter. In this case you need to pass `Ajv` options to the `Ajv` instance when `new`ing, rather than passing them in the third parameter of `validateSchema`. See the examples. - -- **options.addNewError** - - The hook will throw if the data does not match the JSON-Schema. `error.errors` will, by default, contain an array of error messages. You may change this with a custom formatting function. Its a reducing function which works similarly to `Array.reduce()`. Its parameters are - - - `{any} currentFormattedMessages` - - `{Object} ajvErrorObject` - - `{Number} itemsLen` - - `{Number} index` - - It returns - - - `{any} newFormattedMessages` - -| Argument | Type | Default | Description | -| -------------------------- | :------: | ---------------- | -------------------------------------------------------------------- | -| `currentFormattedMessages` | `any` | initially `null` | Formatted messages so far. Initially null. | -| `ajvErrorObject` | `Object` | | [ajv error object](https://github.com/epoberezkin/ajv#error-objects) | -| `itemsLen` | `Number` | | How many data items there are. 1-based. | -| `item` | `Number` | | Which item this is. 0-based. | -| `newFormattedMessages` | `any` | | The function returns the updated formatted messages. | - -`error.errors` will, by default, contain an array of error messages. By default the message will look like - -```js -[ - '\'in row 1 of 3, first\' should match format "startWithJo"', - "in row 1 of 3, should have required property 'last'", - '\'in row 2 of 3, first\' should match format "startWithJo"', - "in row 3 of 3, should have required property 'last'", -]; -``` - -> You could, for example, return `{ name1: message, name2: message }` which might be more suitable for a UI. - -- **Internationalization of Messages** - - You can consider using [ajv-i18n](https://github.com/epoberezkin/ajv-i18n), together with ajv's `messages` option, to internationalize your error messages. - - You can also consider copying `addNewErrorDflt`, the default error message formatter, modifying it for your needs, and using that as `newFormattedMessages`. - -## when - -An alias for [iff](#iff). diff --git a/docs/hooks/HookDirectory.vue b/docs/hooks/HookDirectory.vue new file mode 100644 index 00000000..27bb9717 --- /dev/null +++ b/docs/hooks/HookDirectory.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/hooks/[slug].md b/docs/hooks/[slug].md new file mode 100644 index 00000000..d9dc0004 --- /dev/null +++ b/docs/hooks/[slug].md @@ -0,0 +1,4 @@ +--- +--- + + diff --git a/docs/hooks/[slug].paths.ts b/docs/hooks/[slug].paths.ts new file mode 100644 index 00000000..5e2b9bb3 --- /dev/null +++ b/docs/hooks/[slug].paths.ts @@ -0,0 +1,15 @@ +import path from 'node:path' +import { discoverUtilities } from '../.vitepress/utilities' +import { defineRoutes } from 'vitepress' + +export default defineRoutes({ + async paths() { + const utilities = (await discoverUtilities()).filter(utility => utility.category === 'hooks') + + return utilities.map(utility => ({ + params: { slug: utility.slug }, + content: utility.content, + })) + }, + watch: [path.resolve(import.meta.dirname, '../../src/hooks/**/*.md')], +}) diff --git a/docs/hooks/index.data.ts b/docs/hooks/index.data.ts new file mode 100644 index 00000000..37a1f563 --- /dev/null +++ b/docs/hooks/index.data.ts @@ -0,0 +1,8 @@ +import { defineLoader } from 'vitepress' +import { discoverUtilities } from '../.vitepress/utilities' + +export default defineLoader({ + async load() { + return (await discoverUtilities()).filter(utility => utility.category === 'hooks') + }, +}) diff --git a/docs/hooks/index.md b/docs/hooks/index.md new file mode 100644 index 00000000..d5f97f60 --- /dev/null +++ b/docs/hooks/index.md @@ -0,0 +1,11 @@ +--- +--- + + + +# Hooks + + diff --git a/docs/index.md b/docs/index.md index b5599cb5..fa42fba0 100755 --- a/docs/index.md +++ b/docs/index.md @@ -2,10 +2,10 @@ layout: home hero: - name: feathers-hooks-common + name: feathers-commons image: src: /feathers-hooks-common-logo.png - alt: feathers-hooks-common + alt: feathers-commons tagline: Common hooks and utils for FeathersJS apps actions: - theme: brand diff --git a/docs/overview.md b/docs/overview.md index b5ee34b8..5d397c47 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -6,6 +6,7 @@ This documentation has several parts: - [Hooks API](./hooks.md) - The API for the available hooks - [Utilities API](./utilities.md) - The API for the available utility methods +- [Predicates](./predicates.md)- The API for the available predicates - [Migrating](./migrating.md) - Information on how to migrate to the latest version of `feathers-hooks-common` - [Guides](./guides.md) - More in-depth guides for some of the available hooks diff --git a/docs/predicates/PredicateDirectory.vue b/docs/predicates/PredicateDirectory.vue new file mode 100644 index 00000000..45aaebd5 --- /dev/null +++ b/docs/predicates/PredicateDirectory.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/predicates/[slug].md b/docs/predicates/[slug].md new file mode 100644 index 00000000..d9dc0004 --- /dev/null +++ b/docs/predicates/[slug].md @@ -0,0 +1,4 @@ +--- +--- + + diff --git a/docs/predicates/[slug].paths.ts b/docs/predicates/[slug].paths.ts new file mode 100644 index 00000000..557d2fe8 --- /dev/null +++ b/docs/predicates/[slug].paths.ts @@ -0,0 +1,16 @@ +import { discoverUtilities } from '../.vitepress/utilities' +import { defineRoutes } from 'vitepress' + +export default defineRoutes({ + async paths() { + const utilities = (await discoverUtilities()).filter( + utility => utility.category === 'predicates', + ) + + return utilities.map(utility => ({ + params: { slug: utility.slug }, + content: utility.content, + })) + }, + watch: ['../src/predicates/**/*.md'], +}) diff --git a/docs/predicates/index.data.ts b/docs/predicates/index.data.ts new file mode 100644 index 00000000..97a368b4 --- /dev/null +++ b/docs/predicates/index.data.ts @@ -0,0 +1,8 @@ +import { defineLoader } from 'vitepress' +import { discoverUtilities } from '../.vitepress/utilities' + +export default defineLoader({ + async load() { + return (await discoverUtilities()).filter(utility => utility.category === 'predicates') + }, +}) diff --git a/docs/predicates/index.md b/docs/predicates/index.md new file mode 100644 index 00000000..25748d77 --- /dev/null +++ b/docs/predicates/index.md @@ -0,0 +1,11 @@ +--- +--- + + + +# Predicates + + diff --git a/docs/utilities.md b/docs/utilities.md index 97d95b3f..75aeb144 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -1,5 +1,4 @@ # Utilities @@ -8,9 +7,9 @@ import HookTable from './components/HookTable.vue' Build `params` for a service call. -- **Arguments** +## Arguments - - `{Object} options` +- `{Object} options` | Argument | Type | Default | Description | | --------- | :------: | ------- | ----------------------------------------- | @@ -28,7 +27,7 @@ Build `params` for a service call. - `{Function}` - - **Arguments** + ## Arguments - `{Object} context` @@ -44,309 +43,74 @@ Build `params` for a service call. | ----------- | :------: | -------------------------------- | | `newParams` | `Object` | The params for the service call. | -- **Example** - - ```js - const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); - // Authentication props to always copy. Suitable for feathers-authentication-management. - callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified']); - - async function myCustomHook(context) { - // ... - const result = await service.find(callingParams({ - query: { { id: { $in: [1, 2, 3] } } }, - propNames: ['customProp'], - newProps: { mongoose: ... }, - hooksToDisable: 'populate' - }))(context); - // ... - } - ``` +## Example + +```js +const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); +// Authentication props to always copy. Suitable for feathers-authentication-management. +callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified']); + +async function myCustomHook(context) { + // ... + const result = await service.find(callingParams({ + query: { { id: { $in: [1, 2, 3] } } }, + propNames: ['customProp'], + newProps: { mongoose: ... }, + hooksToDisable: 'populate' + }))(context); + // ... +} +``` -- **Details** +## Details - When calling another service within a hook, [consideration must be given](https://auk.docs.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `params`. +When calling another service within a hook, [consideration must be given](https://auk.docs.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `params`. - The properties `provider`, `authenticated` and `user` are the standard authentication properties used by Feathers. They are copied automatically. +The properties `provider`, `authenticated` and `user` are the standard authentication properties used by Feathers. They are copied automatically. - These defaults and others can be changed app-wide by calling the `callingParamsDefaults` utility. +These defaults and others can be changed app-wide by calling the `callingParamsDefaults` utility. ## callingParamsDefaults Set defaults for building `params` for service calls with callingParams. -- **Arguments** +## Arguments - - `{Array< String >} propNames` - - `{Object} newProps` +- `{Array< String >} propNames` +- `{Object} newProps` | Argument | Type | Default | Description | | ----------- | :---------------: | ------- | -------------------------------------------------------------------------------------- | | `propNames` | `Array< String >` | | The names of the props in `context.params` to automatically include in the new params. | | `newProps` | `Object` | | Additional props to add to the new params. | -- **Example** - - ```js - const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); - // Authentication props to always copy. Suitable for feathers-authentication-management. - // Only hooks will be calling `callingParams`. Set a flag so other hooks recognize such a call. - callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified'], { _calledByHook: true }); - - async function myCustomHook(context) { - // ... - const result = await service.find(callingParams({ - query: { { id: { $in: [1, 2, 3] } } }, - propNames: ['customProp'], - newProps: { mongoose: ... }, - hooksToDisable: 'populate' - }), context); - // ... - } - ``` - -- **Details** - - When calling another service within a hook, [consideration must be given](https://auk.docs.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `params`. - - The properties `provider`, `authenticated` and `user` are the standard authentication properties used by Feathers. They are copied automatically. - - These defaults and others can be changed app-wide by calling the `callingParamsDefaults` utility. - -## checkContext - -Restrict a hook to run for certain methods and method types. - -- **Arguments** - - `{Object} context` - - `{String | Array< String >} [ type ]` - - `{String | Array< String >} [ methods ]` - - `{String} [ label ]` - -| Argument | Type | Default | Description | -| --------- | :------: | ---------------- | --------------------------------- | --------------------------------------------------------------- | -| `context` | `Object` | | The hook context. | -| `type` | `String | Array< String >` | all types | The service type allowed - before, after, error. | -| `methods` | `String | Array< String >` | all methods | The service methods allowed - find, get, update, patch, remove. | -| `label` | `String` | `'anonymous'` | Name of hook to use with `throw`. | - -- **Example** - - ```js - const { checkContext } = require('feathers-hooks-common/index.js'); - - function myHook(context) { - checkContext(context, 'after', ['create', 'remove']); - ... - } - - module.exports = { before: { - create: [ myHook ] // throws - } }; - - // checkContext(hook, 'before', ['update', 'patch'], 'hookName'); - // checkContext(hook, null, ['update', 'patch']); - // checkContext(hook, 'before', null, 'hookName'); - // checkContext(hook, 'before'); - ``` - -- **Details** - - Its important to ensure the hook is being used as intended. `checkContext` let's you restrict the hook to a hook type and a set of service methods. - -## combine - -Sequentially execute multiple sync or async hooks. - - - -- **Arguments** - - `{Array< Function >} hookFuncs` - -| Argument | Type | Default | Description | -| ----------- | :----------------: | ------- | --------------------------------------------------- | -| `hookFuncs` | `Array` | | Hooks, used the same way as when you register them. | - -- **Example** - - ```js - const { combine, createdAt, updatedAt } = require('feathers-hooks-common/index.js'); - - async function myCustomHook(context) { - const newContext = await combine(setNow('createdAt'), setNow('updatedAt')).call(this, context); - return newContext; - } - ``` - -- **Details** - - `combine` has the signature of a hook, but is primarily intended to be used within your custom hooks, not when registering hooks. - -The following is a better technique to use when registering hooks. +## Example ```js -const workflow = [createdAt(), updatedAt(), ...]; - -module.exports = { before: { - update: [...workflow], - patch: [...workflow], -} }; +const { callingParams, callingParamsDefaults } = require('feathers-hooks-common/index.js'); +// Authentication props to always copy. Suitable for feathers-authentication-management. +// Only hooks will be calling `callingParams`. Set a flag so other hooks recognize such a call. +callingParamsDefaults(['provider', 'authenticated', 'user', 'isVerified'], { _calledByHook: true }); + +async function myCustomHook(context) { + // ... + const result = await service.find(callingParams({ + query: { { id: { $in: [1, 2, 3] } } }, + propNames: ['customProp'], + newProps: { mongoose: ... }, + hooksToDisable: 'populate' + }), context); + // ... +} ``` -## every - -Return the and of a series of sync or async predicate functions. - - - -- **Arguments** - - `{Array< Function >} predicates` - -| Argument | Type | Default | Description | -| ------------ | :-----------------: | ------- | ----------------------------------------------------------------------------- | -| `predicates` | `Array< Function >` | | Functions which take the current hook as a param and return a boolean result. | - -**Returns** - -- `{Boolean} result` - -| Name | Type | Description | -| ------ | ------- | ----------------------------- | -| result | Boolean | The logical and of predicates | - -- **Example** - - ```js - const { iff, every } = require('feathers-hooks-common/index.js'); - - module.exports = { before: { - create: iff(every(hook1, hook2, ...), hookA, hookB, ...) - } }; - ``` - -- **Details** - - `every` is a predicate function for use in conditional hooks. The predicate functions are run in parallel, and `true` is returned if every predicate returns a truthy value. - -## getItems - -Get the records in `context.data` or `context.result` - -- **Arguments** - - `{Object} context` - -| Argument | Type | Default | Description | -| --------- | :------: | ------- | ----------------- | -| `context` | `Object` | | The hook context. | - -**Returns** - -- `{Array< Object > | Object | undefined} records` - -| Name | Type | Description | -| ------- | --------------- | ----------- | --------- | ------------ | -| records | Array< Object > | Object | undefined | The records. | - -- **Example** - - ```js - const { getItems, replaceItems } = require('feathers-hooks-common/index.js'); - - const insertCode = code => context => { - const items = getItems(context); - if (Array.isArray(items)) { - items.forEach(item => { - item.code = code; - }); - } else { - items.code = code; - } - replaceItems(context, items); - }; - - module.exports = { before: { create: insertCode('a') } }; - ``` +## Details -- **Details** +When calling another service within a hook, [consideration must be given](https://auk.docs.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `params`. - `getItems` gets the records from the hook context: `context.data` (before hook) or `context.result[.data]` (after hook). +The properties `provider`, `authenticated` and `user` are the standard authentication properties used by Feathers. They are copied automatically. -## isNot - -Negate a sync or async predicate function. - - - -- **Arguments** - - - `{Function | Boolean} predicate` - -| Argument | Type | Default | Description | -| ----------- | :------------------: | ------- | --------------------------------------------------------------------------------------------- | -| `predicate` | `Function` `Boolean` | | A sync or async function which take the current hook as a param and returns a boolean result. | - -**Returns** - -- `{Boolean} result` - -| Name | Type | Description | -| ------ | ------- | -------------------- | -| result | Boolean | The not of predicate | - -- **Example** - - ```js - const { iff, isNot, isProvider, discard } = require('feathers-hooks-common/index.js'); - const isRequestor = () => context => new Promise(resolve, reject) => ... ); - - module.exports = { after: { - create: iff(isNot(isRequestor()), discard('password')) - } }; - ``` - -- **Details** - - `isNot` is a predicate function for use in conditional hooks. - -## isProvider - -Check which transport provided the service call. - - - -- **Arguments** - - `{Array< String >} transports` - -| Name | Type | Default | Description | -| ------------ | :---------------: | ------- | --------------------------------- | -| `transports` | `Array< String >` | | The transports you want to allow. | - -| `transports` | Value | Description | -| ------------ | :---------------------------------: | ----------- | -| `socketio` | Allow calls by Socket.IO transport. | -| `rest` | Allow calls by REST transport. | -| `external` | Allow calls other than from server. | -| `server` | Allow calls from server. | - -**Returns** - -- `{Boolean} result` - -| Name | Type | Description | -| ------ | ------- | ---------------------------------------------- | -| result | Boolean | If the call was made by one of the transports. | - -- **Example** - - ```js - const { iff, isProvider, discard } = require('feathers-hooks-common/index.js'); - - module.exports = { after: { create: iff(isProvider('external'), discard('password')) } }; - ``` - -- **Details** - - `isProvider` is a predicate function for use in conditional hooks. Its determines which transport provided the service call by checking `context.params.provider`. +These defaults and others can be changed app-wide by calling the `callingParamsDefaults` utility. ## makeCallingParams @@ -354,12 +118,12 @@ Build context.params for service calls. > **Tip:** You should prefer using the `callingParams` utility to `makeCallingParams`. -- **Arguments** +## Arguments - - `{Object} context` - - `{Object} [ query ]` - - `{Array< String > | String} [ include ]` - - `{Object} [ inject ]` +- `{Object} context` +- `{Object} [ query ]` +- `{Array< String > | String} [ include ]` +- `{Object} [ inject ]` | Argument | Type | Default | Description | | --------- | :---------------: | ------- | ------------------------------------------------------------------ | @@ -376,68 +140,69 @@ Build context.params for service calls. | ------------ | :------: | ------- | ------------------------ | | `newContext` | `Object` | | The new context created. | -- **Example** +## Example - ```js - const { makeCallingParams } = require('feathers-hooks-common/index.js'); - - async function myCustomHook(context) { - // ... - const result = await service.find(makeCallingParams( - context, { id: { $in: [1, 2, 3] } }, 'user', - { _populate: false, mongoose: ... } - )); - // ... - } - ``` +```js +const { makeCallingParams } = require('feathers-hooks-common/index.js'); + +async function myCustomHook(context) { + // ... + const result = await service.find(makeCallingParams( + context, { id: { $in: [1, 2, 3] } }, 'user', + { _populate: false, mongoose: ... } + )); + // ... +} +``` -- **Details** +## Details - When calling another service within a hook, [consideration must be given](https://auk.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `context.params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `context.params`. +When calling another service within a hook, [consideration must be given](https://auk.feathersjs.com/guides/step-by-step/basic-feathers/writing-hooks.html#calling-a-service) to what the `context.params` should be for the called service. For example, should the called service see that a client is making the call, or the server? What authentication and authorization information should be provided? You can use this convenience function to help create that `context.params`. - The value `context.params._populate: 'skip'` is automatically added to skip any `fastJoin` or `populate` hooks registered on the called service. Set it to `false`, like in the example above, to make those hooks run. +The value `context.params._populate: 'skip'` is automatically added to skip any `fastJoin` or `populate` hooks registered on the called service. Set it to `false`, like in the example above, to make those hooks run. ## paramsForServer Pass an explicit context.params from client to server. Client-side. -- **Arguments** - - `{Object} params` - - `{Array< String >} [ whitelist ]` +## Arguments + +- `{Object} params` +- `{Array< String >} [ whitelist ]` | Argument | Type | Default | Description | | ----------- | :----------: | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | `params` | `Object` | | The `context.params` to use for the service call, including any query object. | | `whitelist` | dot notation | all props in `context.params` | Names of the props in `context.params` to transfer to the server. This is a security feature. All props are transferred if no `whitelist` is provided. | -- **Example** +## Example - ```js - // client - const { paramsForServer } = require('feathers-hooks-common/index.js'); +```js +// client +const { paramsForServer } = require('feathers-hooks-common/index.js'); - service.update( - id, - data, - paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), - ); +service.update( + id, + data, + paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), +); - // server - const { paramsFromClient } = require('feathers-hooks-common/index.js'); +// server +const { paramsFromClient } = require('feathers-hooks-common/index.js'); - module.exports = { - before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, - }; +module.exports = { + before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, +}; - // myHook's `context.params` will now be - // { query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' } } - ``` +// myHook's `context.params` will now be +// { query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' } } +``` -- **Details** +## Details - By default, only the `context.params.query` object is transferred from a Feathers client to the server, for security among other reasons. However you can explicitly transfer other `context.params` props with the client utility function `paramsForServer` in conjunction with the `paramsFromClient` hook on the server. +By default, only the `context.params.query` object is transferred from a Feathers client to the server, for security among other reasons. However you can explicitly transfer other `context.params` props with the client utility function `paramsForServer` in conjunction with the `paramsFromClient` hook on the server. - This technique also works for service calls made on the server. +This technique also works for service calls made on the server.

The data is transfered using `context.params.query.$client`. If that field already exists, it must be an Object.

@@ -445,153 +210,118 @@ Pass an explicit context.params from client to server. Client-side. Replace the records in context.data or context.result[.data]. -- **Arguments** +## Arguments - - `{Object} context` - - `{Array< Object > | Object} records` +- `{Object} context` +- `{Array< Object > | Object} records` | Argument | Type | Default | Description | | --------- | :------------------------: | ------- | ----------------- | | `context` | `Object` | | The hook context. | | `records` | `Array< Object >` `Object` | | The new records. | -- **Example** - - ```js - const { getItems, replaceItems } = require('feathers-hooks-common/index.js'); +## Example - const insertCode = code => context { - const items = getItems(context); - if (Array.isArray(items)) { - items.forEach(item => { item.code = code; }); - } else { - items.code = code; - } - replaceItems(context, items); - }; +```js +const { getItems, replaceItems } = require('feathers-hooks-common/index.js'); + +const insertCode = code => context { + const items = getItems(context); + if (Array.isArray(items)) { + items.forEach(item => { item.code = code; }); + } else { + items.code = code; + } + replaceItems(context, items); +}; - module.exports = { before: { - create: insertCode('a') - } }; - ``` +module.exports = { before: { + create: insertCode('a') +} }; +``` -- **Details** +## Details - `replaceItems` replaces the records in the hook context: `context.data` (before hook) or `context.result[.data]` (after hook). +`replaceItems` replaces the records in the hook context: `context.data` (before hook) or `context.result[.data]` (after hook). ## runHook Let's you call a hook right after the service call. -- **Arguments** - - `{Object} [ hookContext ]` - - `{Function} hookFunc` +## Arguments + +- `{Object} [ hookContext ]` +- `{Function} hookFunc` | Argument | Type | Default | Description | | ------------- | :--------: | ------- | ----------------------------- | | `hookContext` | `Object` | `{}` | The `context` for `hookFunc`. | | `hookFunc` | `Function` | | The hook to run. | -- **Example** - - ```js - const { keep, runHook } = require('feathers-hooks-common/index.js'); - - user.get(...) - .then( runHook()(keep('name', 'address.state')) ) - .then(data => ...); // [{ name: 'Marshall', address: { state: 'UT' }}] - - const data = await user.get(...); - const result = await runHook()(data)(keep('name', 'address.state')); - ``` - - ```js - const { fastJoin, runHook } = require('feathers-hooks-common/index.js'); - const runHookFinds = runHook({ app: app, method: 'find' }); - - const paymentsRecords = [ - { _id: 101, amount: 100, patientId: 1 }, - { _id: 102, amount: 105, patientId: 1 }, - { _id: 103, amount: 110, patientId: 1 }, - { _id: 104, amount: 115, patientId: 2 }, - { _id: 105, amount: 120, patientId: 3 }, - { _id: 106, amount: 125, patientId: 3 }, - ]; - await payments.create(paymentsRecords); - - const patientsRecords = [ - { _id: 1, name: 'John' }, - { _id: 2, name: 'Marshall' }, - { _id: 3, name: 'David' }, - ]; - await patients.create(patientsRecords); - - const paymentResolvers = { - joins: { - patient: () => async payment => { - payment.patient = (await patients.find({ query: { id: payment.patientId } }))[0]; - }, - }, - }; - - await payments - .find() - .then(runHookFinds(fastJoin(paymentResolvers))) - .then(data => console.log(data)); - - // log - [ - { _id: 101, amount: 100, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 102, amount: 105, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 103, amount: 110, patientId: 1, patient: { _id: 1, name: 'John' } }, - { _id: 104, amount: 115, patientId: 2, patient: { _id: 2, name: 'Marshall' } }, - { _id: 105, amount: 120, patientId: 3, patient: { _id: 3, name: 'David' } }, - { _id: 106, amount: 125, patientId: 3, patient: { _id: 3, name: 'David' } }, - ]; - ``` +## Example -- **Details** - - Hooks are normally registered for a service, e.g. in `project/src/services` `/posts/posts.hooks.js`. This is nice and simple when, for example, all the `find` hooks have to run for every `find` call. - - The [conditional hooks](#tag-Conditionals) can be used when hooks have to be conditionally run based on the current environment. For example, we can discard the `password` field when the call is made by a client. - - However things are not always so straightforward. There can be that one call for which we want to join specific records. We could add a conditional hook that runs just for that one call, however we may soon find ourselves with a second and a third special case. - - `runHook` is designed for such cases. Instead of having to register a conditioned hook, it allows us to run the hook in a `.then()` right after the service call. - -## some - -Return the or of a series of sync or async predicate functions. - - - -- **Arguments** - - - `{Array< Function >} predicates` - -| Argument | Type | Default | Description | -| ------------ | :-----------------: | ------- | ----------------------------------------------------------------------------- | -| `predicates` | `Array< Function >` | | Functions which take the current hook as a param and return a boolean result. | +```js +const { keep, runHook } = require('feathers-hooks-common/index.js'); -**Returns** +user.get(...) + .then( runHook()(keep('name', 'address.state')) ) + .then(data => ...); // [{ name: 'Marshall', address: { state: 'UT' }}] -- `{Boolean} result` +const data = await user.get(...); +const result = await runHook()(data)(keep('name', 'address.state')); +``` -| Name | Type | Description | -| ------ | ------- | ---------------------------- | -| result | Boolean | The logical or of predicates | +```js +const { fastJoin, runHook } = require('feathers-hooks-common/index.js'); +const runHookFinds = runHook({ app: app, method: 'find' }); + +const paymentsRecords = [ + { _id: 101, amount: 100, patientId: 1 }, + { _id: 102, amount: 105, patientId: 1 }, + { _id: 103, amount: 110, patientId: 1 }, + { _id: 104, amount: 115, patientId: 2 }, + { _id: 105, amount: 120, patientId: 3 }, + { _id: 106, amount: 125, patientId: 3 }, +]; +await payments.create(paymentsRecords); + +const patientsRecords = [ + { _id: 1, name: 'John' }, + { _id: 2, name: 'Marshall' }, + { _id: 3, name: 'David' }, +]; +await patients.create(patientsRecords); + +const paymentResolvers = { + joins: { + patient: () => async payment => { + payment.patient = (await patients.find({ query: { id: payment.patientId } }))[0]; + }, + }, +}; + +await payments + .find() + .then(runHookFinds(fastJoin(paymentResolvers))) + .then(data => console.log(data)); + +// log +[ + { _id: 101, amount: 100, patientId: 1, patient: { _id: 1, name: 'John' } }, + { _id: 102, amount: 105, patientId: 1, patient: { _id: 1, name: 'John' } }, + { _id: 103, amount: 110, patientId: 1, patient: { _id: 1, name: 'John' } }, + { _id: 104, amount: 115, patientId: 2, patient: { _id: 2, name: 'Marshall' } }, + { _id: 105, amount: 120, patientId: 3, patient: { _id: 3, name: 'David' } }, + { _id: 106, amount: 125, patientId: 3, patient: { _id: 3, name: 'David' } }, +]; +``` -- **Example** +## Details - ```js - const { iff, some } = require('feathers-hooks-common/index.js'); +Hooks are normally registered for a service, e.g. in `project/src/services` `/posts/posts.hooks.js`. This is nice and simple when, for example, all the `find` hooks have to run for every `find` call. - module.exports = { before: { - create: iff(some(hook1, hook2, ...), hookA, hookB, ...) - } }; - ``` +The [conditional hooks](#tag-Conditionals) can be used when hooks have to be conditionally run based on the current environment. For example, we can discard the `password` field when the call is made by a client. -- **Details** +However things are not always so straightforward. There can be that one call for which we want to join specific records. We could add a conditional hook that runs just for that one call, however we may soon find ourselves with a second and a third special case. - `some` is a predicate function for use in conditional hooks. The predicate functions are run in parallel, and `true` is returned if any predicate returns a truthy value. +`runHook` is designed for such cases. Instead of having to register a conditioned hook, it allows us to run the hook in a `.then()` right after the service call. diff --git a/docs/utils/UtilDirectory.vue b/docs/utils/UtilDirectory.vue new file mode 100644 index 00000000..1d62075c --- /dev/null +++ b/docs/utils/UtilDirectory.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/utils/[slug].md b/docs/utils/[slug].md new file mode 100644 index 00000000..d9dc0004 --- /dev/null +++ b/docs/utils/[slug].md @@ -0,0 +1,4 @@ +--- +--- + + diff --git a/docs/utils/[slug].paths.ts b/docs/utils/[slug].paths.ts new file mode 100644 index 00000000..bfef7467 --- /dev/null +++ b/docs/utils/[slug].paths.ts @@ -0,0 +1,15 @@ +import path from 'node:path' +import { discoverUtilities } from '../.vitepress/utilities' +import { defineRoutes } from 'vitepress' + +export default defineRoutes({ + async paths() { + const utilities = (await discoverUtilities()).filter(utility => utility.category === 'utils') + + return utilities.map(utility => ({ + params: { slug: utility.slug }, + content: utility.content, + })) + }, + watch: [path.resolve(import.meta.dirname, '../../src/utils/**/*.md')], +}) diff --git a/docs/utils/index.data.ts b/docs/utils/index.data.ts new file mode 100644 index 00000000..97a368b4 --- /dev/null +++ b/docs/utils/index.data.ts @@ -0,0 +1,8 @@ +import { defineLoader } from 'vitepress' +import { discoverUtilities } from '../.vitepress/utilities' + +export default defineLoader({ + async load() { + return (await discoverUtilities()).filter(utility => utility.category === 'predicates') + }, +}) diff --git a/docs/utils/index.md b/docs/utils/index.md new file mode 100644 index 00000000..a76a8cf4 --- /dev/null +++ b/docs/utils/index.md @@ -0,0 +1,11 @@ +--- +--- + + + +# Utils + + diff --git a/package-lock.json b/package-lock.json index 76594c30..cc825c2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,19 +24,25 @@ "@feathersjs/memory": "^5.0.31", "@feathersjs/socketio": "^5.0.31", "@feathersjs/socketio-client": "^5.0.31", + "@shikijs/vitepress-twoslash": "^3.6.0", + "@tailwindcss/vite": "^4.1.10", "@tsconfig/node22": "^22.0.2", "@types/lodash": "^4.17.14", "@types/node": "^22.10.7", "@vitest/coverage-v8": "^3.0.3", + "dedent": "^1.6.0", "eslint": "^9.18.0", + "glob": "^11.0.2", + "gray-matter": "^4.0.3", "npm-check-updates": "^17.1.14", "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsdown": "^0.12.6", + "tailwindcss": "^4.1.10", + "tsdown": "^0.12.7", "typescript": "^5.7.3", "unplugin-unused": "^0.5.0", - "vitepress": "^1.6.2", + "vitepress": "^2.0.0-alpha.6", "vitest": "^3.0.3" }, "peerDependencies": { @@ -44,37 +50,37 @@ } }, "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==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz", + "integrity": "sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.9", + "@algolia/autocomplete-shared": "1.17.9" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz", + "integrity": "sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz", + "integrity": "sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" + "@algolia/autocomplete-shared": "1.17.9" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -82,9 +88,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz", + "integrity": "sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -394,39 +400,39 @@ } }, "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==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.9.0.tgz", + "integrity": "sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==", "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==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.9.0.tgz", + "integrity": "sha512-4bKHcye6EkLgRE8ze0vcdshmEqxeiJM77M0JXjef7lrYZfSlMunrDOCqyLjiZyo1+c0BhUqA2QpFartIjuHIjw==", "dev": true, "license": "MIT", "dependencies": { - "@docsearch/react": "3.8.2", + "@docsearch/react": "3.9.0", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", - "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.9.0.tgz", + "integrity": "sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.2", + "@algolia/autocomplete-core": "1.17.9", + "@algolia/autocomplete-preset-algolia": "1.17.9", + "@docsearch/css": "3.9.0", "algoliasearch": "^5.14.2" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { @@ -479,9 +485,9 @@ } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -492,13 +498,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -509,13 +515,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -526,13 +532,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -543,13 +549,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -560,13 +566,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -577,13 +583,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -594,13 +600,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -611,13 +617,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -628,13 +634,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -645,13 +651,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -662,13 +668,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -679,13 +685,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -696,13 +702,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -713,13 +719,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -730,13 +736,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -747,13 +753,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -764,13 +770,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -781,13 +804,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -798,13 +838,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -815,13 +855,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -832,13 +872,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -849,13 +889,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -866,7 +906,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1439,6 +1479,33 @@ "url": "https://github.com/sponsors/daffl" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1506,9 +1573,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.37", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.37.tgz", - "integrity": "sha512-jZwTBznpYVDYKWyAuRpepPpCiHScVrX6f8WRX8ReX6pdii99LYVHwJywKcH2excWQrWmBomC9nkxGlEKzXZ/wQ==", + "version": "1.2.38", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.38.tgz", + "integrity": "sha512-mvMeFQgVjoHanQE9Q7ihmriEXAorjLZW+crUgQspDjFpzWuQp2RZMTppl1MN6TQztMVTsNFgF6LDKsp+v1RYRg==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -1625,6 +1692,19 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2258,78 +2338,91 @@ ] }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.6.0.tgz", + "integrity": "sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" + "hast-util-to-html": "^9.0.5" } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.6.0.tgz", + "integrity": "sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" + "oniguruma-to-es": "^4.3.3" } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.6.0.tgz", + "integrity": "sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.6.0.tgz", + "integrity": "sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0" + "@shikijs/types": "3.6.0" } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.6.0.tgz", + "integrity": "sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "2.5.0" + "@shikijs/types": "3.6.0" } }, "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.6.0.tgz", + "integrity": "sha512-PYkU54lYV0RCaUG8n2FNTF+YWiU3uPhcjLGq2x/C8lIrUX9GVnRb3bK+R5xtdFHbuctntATKm7ondp/H/dux9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.6.0", + "@shikijs/types": "3.6.0" + } + }, + "node_modules/@shikijs/twoslash": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.6.0.tgz", + "integrity": "sha512-AxRxLWtmrVftwxN/2hSL6Hym+bannS+zuUEXpbNuo6BpG4jHTM0KEkICEH3B3Gm5ZNzGdI74NdDiAqAZ6WPJuQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" + "@shikijs/core": "3.6.0", + "@shikijs/types": "3.6.0", + "twoslash": "^0.3.1" + }, + "peerDependencies": { + "typescript": ">=5.5.0" } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.6.0.tgz", + "integrity": "sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==", "dev": true, "license": "MIT", "dependencies": { @@ -2337,6 +2430,24 @@ "@types/hast": "^3.0.4" } }, + "node_modules/@shikijs/vitepress-twoslash": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-3.6.0.tgz", + "integrity": "sha512-pUoRj98UDV41CxfxPysrBryc1/1WdUL93ogcD/s156i4XcujnCfJJc+y5vR3W5Nc1R31VUacwWsI8HhaRRS/uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/twoslash": "", + "floating-vue": "^5.2.2", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-gfm": "^3.1.0", + "mdast-util-to-hast": "^13.2.0", + "shiki": "3.6.0", + "twoslash": "^0.3.1", + "twoslash-vue": "^0.3.1", + "vue": "^3.5.16" + } + }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", @@ -2351,114 +2462,401 @@ "dev": true, "license": "MIT" }, - "node_modules/@tsconfig/node22": { - "version": "22.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.2.tgz", - "integrity": "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "node_modules/@tailwindcss/node": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.10.tgz", + "integrity": "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.10" } }, - "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==", + "node_modules/@tailwindcss/oxide": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.10.tgz", + "integrity": "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==", "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "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==", + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-x64": "4.1.10", + "@tailwindcss/oxide-freebsd-x64": "4.1.10", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-x64-musl": "4.1.10", + "@tailwindcss/oxide-wasm32-wasi": "4.1.10", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz", + "integrity": "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@types/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-g4vmPIwbTii9dX1HVioHbOolubEaf4re4vDxuzpKrzz9uI7uarBExi9begX0cXyIB85jXZ5X2A/v8rsHZxSAPw==", + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz", + "integrity": "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/node": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz", + "integrity": "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.18", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", - "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz", + "integrity": "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" } }, - "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/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz", + "integrity": "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@types/express": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", - "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz", + "integrity": "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz", + "integrity": "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz", + "integrity": "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz", + "integrity": "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz", + "integrity": "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.10", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz", + "integrity": "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz", + "integrity": "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.10.tgz", + "integrity": "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.10", + "@tailwindcss/oxide": "4.1.10", + "tailwindcss": "4.1.10" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tsconfig/node22": { + "version": "22.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.2.tgz", + "integrity": "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-g4vmPIwbTii9dX1HVioHbOolubEaf4re4vDxuzpKrzz9uI7uarBExi9begX0cXyIB85jXZ5X2A/v8rsHZxSAPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "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/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/@types/express": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", + "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "dev": true, + "license": "MIT", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2503,13 +2901,6 @@ "@types/node": "*" } }, - "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, - "license": "MIT" - }, "node_modules/@types/lodash": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz", @@ -2517,17 +2908,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "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" - } - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -2538,13 +2918,6 @@ "@types/unist": "*" } }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -2874,6 +3247,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@typescript/vfs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.1.tgz", + "integrity": "sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + }, + "peerDependencies": { + "typescript": "*" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -3284,6 +3670,23 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@volar/language-core": { + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.14.tgz", + "integrity": "sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.14" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.14", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.14.tgz", + "integrity": "sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@vue/compiler-core": { "version": "3.5.16", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", @@ -3352,6 +3755,17 @@ "@vue/shared": "3.5.16" } }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, "node_modules/@vue/devtools-api": { "version": "7.7.6", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.6.tgz", @@ -3388,6 +3802,31 @@ "rfdc": "^1.4.1" } }, + "node_modules/@vue/language-core": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.4.tgz", + "integrity": "sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@vue/reactivity": { "version": "3.5.16", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", @@ -3444,31 +3883,32 @@ "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==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.3.0.tgz", + "integrity": "sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg==", "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" + "@vueuse/metadata": "13.3.0", + "@vueuse/shared": "13.3.0" }, "funding": { "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.3.0.tgz", + "integrity": "sha512-h5mGRYPbiTZTFP/AKELLPGnUDBly7z7Qd1pgEQlT3ItQ0NlZM0vB+8SOQycpSBOBlgg72Zgw+mi2r+4O/G8RuQ==", "dev": true, "license": "MIT", "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" + "@vueuse/core": "13.3.0", + "@vueuse/shared": "13.3.0" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -3485,7 +3925,8 @@ "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", - "universal-cookie": "^7" + "universal-cookie": "^7", + "vue": "^3.5.0" }, "peerDependenciesMeta": { "async-validator": { @@ -3527,9 +3968,9 @@ } }, "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==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.3.0.tgz", + "integrity": "sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw==", "dev": true, "license": "MIT", "funding": { @@ -3537,16 +3978,16 @@ } }, "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==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.3.0.tgz", + "integrity": "sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA==", "dev": true, "license": "MIT", - "dependencies": { - "vue": "^3.5.13" - }, "funding": { "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, "node_modules/accepts": { @@ -3656,6 +4097,13 @@ "node": ">= 14.0.0" } }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4050,9 +4498,20 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "license": "MIT", @@ -4098,6 +4557,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/ci-info": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", @@ -4375,6 +4844,13 @@ "dev": true, "license": "MIT" }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -4393,6 +4869,35 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -4468,6 +4973,16 @@ "node": ">=8" } }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4576,13 +5091,6 @@ "dev": true, "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, - "license": "MIT" - }, "node_modules/empathic": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/empathic/-/empathic-1.1.0.tgz", @@ -4662,6 +5170,20 @@ } } }, + "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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -4732,9 +5254,9 @@ } }, "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==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4742,32 +5264,34 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "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" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -5259,6 +5783,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "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" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -5431,6 +5969,19 @@ "dev": true, "license": "MIT" }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -5635,6 +6186,26 @@ "dev": true, "license": "ISC" }, + "node_modules/floating-vue": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-5.2.2.tgz", + "integrity": "sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "~1.1.1", + "vue-resize": "^2.0.0-alpha.1" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.0", + "vue": "^3.2.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, "node_modules/focus-trap": { "version": "7.6.5", "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", @@ -5804,22 +6375,24 @@ } }, "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", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "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" + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5838,28 +6411,63 @@ "node": ">=10.13.0" } }, - "node_modules/glob/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/glob/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -5888,6 +6496,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -5895,6 +6510,46 @@ "dev": true, "license": "MIT" }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "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" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5985,6 +6640,16 @@ "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, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", @@ -6171,6 +6836,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6490,6 +7165,16 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "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/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6504,45 +7189,284 @@ "node": ">= 0.8.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "p-locate": "^5.0.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "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/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "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/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", "dev": true, "license": "MIT" @@ -6589,6 +7513,17 @@ "dev": true, "license": "MIT" }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -6652,6 +7587,17 @@ "dev": true, "license": "MIT" }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6662,72 +7608,629 @@ "node": ">= 0.4" } }, - "node_modules/mdast-util-to-hast": { - "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==", + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "escape-string-regexp": "^5.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/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==", + "node_modules/mdast-util-find-and-replace/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": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dev": true, "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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" + } + }, + "node_modules/methods": { + "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" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "funding": [ { @@ -6741,14 +8244,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/micromark-util-encode": { + "node_modules/micromark-util-resolve-all": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "funding": [ { @@ -6760,7 +8262,10 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", @@ -6784,6 +8289,29 @@ "micromark-util-symbol": "^2.0.0" } }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", @@ -6931,6 +8459,19 @@ "dev": true, "license": "MIT" }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -6938,6 +8479,22 @@ "dev": true, "license": "MIT" }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6945,6 +8502,13 @@ "dev": true, "license": "MIT" }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -7084,14 +8648,21 @@ "wrappy": "1" } }, + "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==", + "dev": true, + "license": "MIT" + }, "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==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex-xs": "^1.0.0", + "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } @@ -7192,6 +8763,13 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7356,9 +8934,9 @@ } }, "node_modules/preact": { - "version": "10.26.8", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.8.tgz", - "integrity": "sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==", + "version": "10.26.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", + "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", "dev": true, "license": "MIT", "funding": { @@ -7872,6 +9450,20 @@ "license": "MIT", "peer": true }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -8001,19 +9593,65 @@ "node": ">=4" } }, + "node_modules/shelljs/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/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, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/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/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.6.0.tgz", + "integrity": "sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==", "dev": true, "license": "MIT", "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/core": "3.6.0", + "@shikijs/engine-javascript": "3.6.0", + "@shikijs/engine-oniguruma": "3.6.0", + "@shikijs/langs": "3.6.0", + "@shikijs/themes": "3.6.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } @@ -8316,6 +9954,13 @@ "node": ">=0.10.0" } }, + "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/stable-hash-x": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", @@ -8423,6 +10068,16 @@ "node": ">=8" } }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", @@ -8514,6 +10169,51 @@ "dev": true, "license": "MIT" }, + "node_modules/tailwindcss": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", + "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -8756,6 +10456,45 @@ "license": "0BSD", "optional": true }, + "node_modules/twoslash": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/twoslash/-/twoslash-0.3.1.tgz", + "integrity": "sha512-OGqMTGvqXTcb92YQdwGfEdK0nZJA64Aj/ChLOelbl3TfYch2IoBST0Yx4C0LQ7Lzyqm9RpgcpgDxeXQIz4p2Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript/vfs": "^1.6.1", + "twoslash-protocol": "0.3.1" + }, + "peerDependencies": { + "typescript": "^5.5.0" + } + }, + "node_modules/twoslash-protocol": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.1.tgz", + "integrity": "sha512-BMePTL9OkuNISSyyMclBBhV2s9++DiOCyhhCoV5Kaht6eaWLwVjCCUJHY33eZJPsyKeZYS8Wzz0h+XI01VohVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/twoslash-vue": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/twoslash-vue/-/twoslash-vue-0.3.1.tgz", + "integrity": "sha512-9/PS0/iL2m8G6N2ILdI18sZ8l6ex+W2nN5jIaTpfFPlnY0MOX2G5UxEVs+AuNimM9SwEnwfiIuDY9ubDCIQpSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/language-core": "2.2.4", + "twoslash": "0.3.1", + "twoslash-protocol": "0.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "typescript": "^5.5.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9122,21 +10861,24 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "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" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -9145,19 +10887,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -9178,6 +10926,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -9204,43 +10958,74 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, - "license": "MIT", - "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", + "version": "2.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-2.0.0-alpha.6.tgz", + "integrity": "sha512-k58ZsFJi+ml0eHM6skEC3wSUm0piDJJmNJu2LSa9BhGMge69vSN07qTBDK5Ad87aDyYhmkbiIFW2AG6bboMFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "^3.9.0", + "@docsearch/js": "^3.9.0", + "@iconify-json/simple-icons": "^1.2.38", + "@shikijs/core": "^3.6.0", + "@shikijs/transformers": "^3.6.0", + "@shikijs/types": "^3.6.0", + "@vitejs/plugin-vue": "^5.2.4", + "@vue/devtools-api": "^7.7.6", + "@vue/shared": "^3.5.16", + "@vueuse/core": "^13.3.0", + "@vueuse/integrations": "^13.3.0", + "focus-trap": "^7.6.5", "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" + "minisearch": "^7.1.2", + "shiki": "^3.6.0", + "vite": "^6.3.5", + "vue": "^3.5.16" }, "bin": { "vitepress": "bin/vitepress.js" }, "peerDependencies": { "markdown-it-mathjax3": "^4", + "oxc-minify": "^0.72.3", "postcss": "^8" }, "peerDependenciesMeta": { "markdown-it-mathjax3": { "optional": true }, + "oxc-minify": { + "optional": true + }, "postcss": { "optional": true } @@ -9361,6 +11146,16 @@ } } }, + "node_modules/vue-resize": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz", + "integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.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", diff --git a/package.json b/package.json index 665489f4..9ad09e35 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,9 @@ }, "scripts": { "build": "tsc --noEmit && tsdown", - "docs": "vitepress dev docs", + "docs:dev": "vitepress dev docs --port 5177", "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs --port 4177", "prepublishOnly": "npm run build", "publish": "git push origin --tags && npm run changelog && git push origin", "release:prerelease": "npm version prerelease --preid pre && npm publish --tag pre", @@ -94,19 +95,25 @@ "@feathersjs/memory": "^5.0.31", "@feathersjs/socketio": "^5.0.31", "@feathersjs/socketio-client": "^5.0.31", + "@shikijs/vitepress-twoslash": "^3.6.0", + "@tailwindcss/vite": "^4.1.10", "@tsconfig/node22": "^22.0.2", "@types/lodash": "^4.17.14", "@types/node": "^22.10.7", "@vitest/coverage-v8": "^3.0.3", + "dedent": "^1.6.0", "eslint": "^9.18.0", + "glob": "^11.0.2", + "gray-matter": "^4.0.3", "npm-check-updates": "^17.1.14", "prettier": "^3.4.2", "shx": "^0.3.4", "sift": "^17.1.3", - "tsdown": "^0.12.6", + "tailwindcss": "^4.1.10", + "tsdown": "^0.12.7", "typescript": "^5.7.3", "unplugin-unused": "^0.5.0", - "vitepress": "^1.6.2", + "vitepress": "^2.0.0-alpha.6", "vitest": "^3.0.3" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..a59c02fa --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6667 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@feathersjs/errors': + specifier: ^5.0.31 + version: 5.0.34 + fast-copy: + specifier: ^3.0.2 + version: 3.0.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + neotraverse: + specifier: ^0.6.18 + version: 0.6.18 + devDependencies: + '@feathers-community/eslint-config': + specifier: ^0.0.7 + version: 0.0.7(@types/estree@1.0.8)(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)(prettier@3.5.3)(typescript@5.8.3) + '@feathers-plus/cache': + specifier: ^1.4.0 + version: 1.4.0 + '@feathersjs/authentication': + specifier: ^5.0.31 + version: 5.0.34(typescript@5.8.3) + '@feathersjs/authentication-local': + specifier: ^5.0.31 + version: 5.0.34(typescript@5.8.3) + '@feathersjs/client': + specifier: ^5.0.31 + version: 5.0.34(typescript@5.8.3) + '@feathersjs/express': + specifier: ^5.0.31 + version: 5.0.34(typescript@5.8.3) + '@feathersjs/memory': + specifier: ^5.0.31 + version: 5.0.34 + '@feathersjs/socketio': + specifier: ^5.0.31 + version: 5.0.34 + '@feathersjs/socketio-client': + specifier: ^5.0.31 + version: 5.0.34 + '@shikijs/vitepress-twoslash': + specifier: ^3.6.0 + version: 3.6.0(typescript@5.8.3) + '@tsconfig/node22': + specifier: ^22.0.2 + version: 22.0.2 + '@types/lodash': + specifier: ^4.17.14 + version: 4.17.17 + '@types/node': + specifier: ^22.10.7 + version: 22.15.31 + '@vitest/coverage-v8': + specifier: ^3.0.3 + version: 3.2.3(vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2)) + dedent: + specifier: ^1.6.0 + version: 1.6.0 + eslint: + specifier: ^9.18.0 + version: 9.28.0(jiti@2.4.2) + glob: + specifier: ^11.0.2 + version: 11.0.3 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + npm-check-updates: + specifier: ^17.1.14 + version: 17.1.18 + prettier: + specifier: ^3.4.2 + version: 3.5.3 + shx: + specifier: ^0.3.4 + version: 0.3.4 + sift: + specifier: ^17.1.3 + version: 17.1.3 + tsdown: + specifier: ^0.12.7 + version: 0.12.7(typescript@5.8.3)(unplugin-unused@0.5.1) + typescript: + specifier: ^5.7.3 + version: 5.8.3 + unplugin-unused: + specifier: ^0.5.0 + version: 0.5.1 + vitepress: + specifier: ^2.0.0-alpha.6 + version: 2.0.0-alpha.6(@algolia/client-search@5.27.0)(@types/node@22.15.31)(jiti@2.4.2)(postcss@8.5.5)(search-insights@2.17.3)(typescript@5.8.3) + vitest: + specifier: ^3.0.3 + version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2) + +packages: + + '@algolia/autocomplete-core@1.17.9': + resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.9': + resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.9': + resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.9': + resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.27.0': + resolution: {integrity: sha512-SITU5umoknxETtw67TxJu9njyMkWiH8pM+Bvw4dzfuIrIAT6Y1rmwV4y0A0didWoT+6xVuammIykbtBMolBcmg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.27.0': + resolution: {integrity: sha512-go1b9qIZK5vYEQ7jD2bsfhhhVsoh9cFxQ5xF8TzTsg2WOCZR3O92oXCkq15SOK0ngJfqDU6a/k0oZ4KuEnih1Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.27.0': + resolution: {integrity: sha512-tnFOzdNuMzsz93kOClj3fKfuYoF3oYaEB5bggULSj075GJ7HUNedBEm7a6ScrjtnOaOtipbnT7veUpHA4o4wEQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.27.0': + resolution: {integrity: sha512-y1qgw39qZijjQBXrqZTiwK1cWgWGRiLpJNWBv9w36nVMKfl9kInrfsYmdBAfmlhVgF/+Woe0y1jQ7pa4HyShAw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.27.0': + resolution: {integrity: sha512-XluG9qPZKEbiLoIfXTKbABsWDNOMPx0t6T2ImJTTeuX+U/zBdmfcqqgcgkqXp+vbXof/XX/4of9Eqo1JaqEmKw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.27.0': + resolution: {integrity: sha512-V8/To+SsAl2sdw2AAjeLJuCW1L+xpz+LAGerJK7HKqHzE5yQhWmIWZTzqYQcojkii4iBMYn0y3+uReWqT8XVSQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.27.0': + resolution: {integrity: sha512-EJJ7WmvmUXZdchueKFCK8UZFyLqy4Hz64snNp0cTc7c0MKaSeDGYEDxVsIJKp15r7ORaoGxSyS4y6BGZMXYuCg==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.27.0': + resolution: {integrity: sha512-xNCyWeqpmEo4EdmpG57Fs1fJIQcPwt5NnJ6MBdXnUdMVXF4f5PHgza+HQWQQcYpCsune96jfmR0v7us6gRIlCw==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.27.0': + resolution: {integrity: sha512-P0NDiEFyt9UYQLBI0IQocIT7xHpjMpoFN3UDeerbztlkH9HdqT0GGh1SHYmNWpbMWIGWhSJTtz6kSIWvFu4+pw==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.27.0': + resolution: {integrity: sha512-cqfTMF1d1cc7hg0vITNAFxJZas7MJ4Obc36WwkKpY23NOtGb+4tH9X7UKlQa2PmTgbXIANoJ/DAQTeiVlD2I4Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.27.0': + resolution: {integrity: sha512-ErenYTcXl16wYXtf0pxLl9KLVxIztuehqXHfW9nNsD8mz9OX42HbXuPzT7y6JcPiWJpc/UU/LY5wBTB65vsEUg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.27.0': + resolution: {integrity: sha512-CNOvmXsVi+IvT7z1d+6X7FveVkgEQwTNgipjQCHTIbF9KSMfZR7tUsJC+NpELrm10ALdOMauah84ybs9rw1cKQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.27.0': + resolution: {integrity: sha512-Nx9EdLYZDsaYFTthqmc0XcVvsx6jqeEX8fNiYOB5i2HboQwl8pJPj1jFhGqoGd0KG7KFR+sdPO5/e0EDDAru2Q==} + engines: {node: '>= 14.0.0'} + + '@altano/repository-tools@0.1.1': + resolution: {integrity: sha512-5vbUs2A98CC3g1AlOBdkBE0BMukkLjLIsMHAtuxg6Pt9dQXxYWdLKOf66v6c/vIqtNcgTMv0oGtddLdMuH9X6w==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@docsearch/css@3.9.0': + resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} + + '@docsearch/js@3.9.0': + resolution: {integrity: sha512-4bKHcye6EkLgRE8ze0vcdshmEqxeiJM77M0JXjef7lrYZfSlMunrDOCqyLjiZyo1+c0BhUqA2QpFartIjuHIjw==} + + '@docsearch/react@3.9.0': + resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@feathers-community/eslint-config@0.0.7': + resolution: {integrity: sha512-HhZ08KT5SKzRvDQ3ZCoepc5ZOhrYTBbAsjnq1oBQ8qe4jWwGlfT8AFMFzQsqE/7mJq0dVYfLnj8Jx0+Tntee2Q==} + peerDependencies: + eslint: ^9.0.0 + + '@feathers-plus/cache@1.4.0': + resolution: {integrity: sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==} + engines: {node: '>= 6.0.0'} + + '@feathersjs/adapter-commons@5.0.34': + resolution: {integrity: sha512-wc0HAZ0uov68p1ytBR5npyAePdNbFrRqr1fINSpLvIkrUkKDEcC6I/lOpk1TBpoI8so5IO/seZhkl25pqKM43A==} + engines: {node: '>= 12'} + + '@feathersjs/authentication-client@5.0.34': + resolution: {integrity: sha512-j+p88bnyZmOHelpiL3AbTee0gsEDF5G3/vyJm0x157Q3Y3vXsI4LU7n7Go3cbrjNkCpdqV0pn8CiaxFgQ2lteA==} + engines: {node: '>= 12'} + + '@feathersjs/authentication-local@5.0.34': + resolution: {integrity: sha512-3swHyoz/kW3lTAoGRNT1Y49PXy+wx1/bgw5AQpExLanLuXipevuKHapLvlDUh914bz8vw6FmC/5TnFwxrx8OOQ==} + engines: {node: '>= 12'} + + '@feathersjs/authentication@5.0.34': + resolution: {integrity: sha512-JnOoYJKx60SQDCj/JJAH9wzAL0EFFMaOjBN5Vh8JVTj1L4IrxUfy7uGathBumQc5vB2BqtyCy4BG8+/L49oQbA==} + engines: {node: '>= 12'} + + '@feathersjs/client@5.0.34': + resolution: {integrity: sha512-6ZFnETydjXH4wHwSB6TwiYUQ2qHhKhcw8finyA7A845yVSbQQYns5pTPNCHFG2GPpZpb43I6RZuP//HRfN5AIw==} + engines: {node: '>= 12'} + + '@feathersjs/commons@5.0.34': + resolution: {integrity: sha512-UfHzq7taVJx++TXxX5pmDSR72xRp+h5nler4xcUlcJWLLykCOYo8YCeW03S7T1p1NuFdy0qBmU+B+G89bjyGmg==} + engines: {node: '>= 12'} + + '@feathersjs/errors@5.0.34': + resolution: {integrity: sha512-C0t+pONnMvwlDW6iczcYmxaHzGvaGn3+BLhwlySEVYRciWOURIO8Eo5JVdN7cSM3Z7AxS3Dpk4DEhyFU/D2w6w==} + engines: {node: '>= 12'} + + '@feathersjs/express@5.0.34': + resolution: {integrity: sha512-TNy8vEIYnjB9eEwancP07C5wYnv5i1vXctKH9HhtIfa1xJ7KnGgIDT9LNO4gX0OeURzDcE+zFEB9Xnto6zKh4g==} + engines: {node: '>= 12'} + + '@feathersjs/feathers@5.0.34': + resolution: {integrity: sha512-jgeqKq/Uhsfeld42F8uimqzPv/uhtohkenpaWeD+NudJp2YZNYfA6gDZAL5UTpAvrTJFmK3QR1q1CnuL1mJdHg==} + engines: {node: '>= 12'} + + '@feathersjs/hooks@0.9.0': + resolution: {integrity: sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==} + engines: {node: '>= 14'} + + '@feathersjs/memory@5.0.34': + resolution: {integrity: sha512-VU9cMdUPNL89FogvkiVPH70cHnDwIBU8mJWz0HMxeehycN3iUIjqmVIUO8Qg6HH4O17oiU/nKqvXgEOdr+L9AQ==} + engines: {node: '>= 12'} + + '@feathersjs/rest-client@5.0.34': + resolution: {integrity: sha512-rWn47ZVLJ6igqbJeKyy6QleZceEjfPtmjR/DI+S1Ph7CAep0Ax2rqkwhSIWIoRnp4A7jFay1M3Jy3tA3Eyk7MQ==} + engines: {node: '>= 12'} + + '@feathersjs/schema@5.0.34': + resolution: {integrity: sha512-BpQxp46Vp0tH7l9jW4HIAGQerql7aJBeRXRggCVhBuqK48KoD1UhvYCWBmWwEouaYUnZ77HjQIMn9c1fK+dF2w==} + engines: {node: '>= 12'} + peerDependencies: + typescript: '>=5.8' + + '@feathersjs/socketio-client@5.0.34': + resolution: {integrity: sha512-7mejzCX/lotsKFZaRrL1KA/lIuI/m1iPxy+5I7Fb+PLpRQUWAdNcCJPk/TutyXm+ksFNliPe2hB6qiXpKeqg3Q==} + engines: {node: '>= 12'} + + '@feathersjs/socketio@5.0.34': + resolution: {integrity: sha512-uT94CeSRcnhOIThjiFg/wU30koVPoPrJUHyiQia3Q9sSB5wcaoWaJAIUcOEIZmGrgW2FNLPRw9THpAUTIgd4/w==} + engines: {node: '>= 12'} + + '@feathersjs/transport-commons@5.0.34': + resolution: {integrity: sha512-l+oQm1oIvfrxNUlidcqCtKfdWdKn1zHXGhEa13xIKiU5m2LFz1EYeMuq5vh/1pU0iECq3Oi+KdW53YnGl446cw==} + engines: {node: '>= 12'} + + '@floating-ui/core@1.7.1': + resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} + + '@floating-ui/dom@1.1.1': + resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@iconify-json/simple-icons@1.2.38': + resolution: {integrity: sha512-mvMeFQgVjoHanQE9Q7ihmriEXAorjLZW+crUgQspDjFpzWuQp2RZMTppl1MN6TQztMVTsNFgF6LDKsp+v1RYRg==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/runtime@0.72.2': + resolution: {integrity: sha512-J2lsPDen2mFs3cOA1gIBd0wsHEhum2vTnuKIRwmj3HJJcIz/XgeNdzvgSOioIXOJgURIpcDaK05jwaDG1rhDwg==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.72.2': + resolution: {integrity: sha512-il5RF8AP85XC0CMjHF4cnVT9nT/v/ocm6qlZQpSiAR9qBbQMGkFKloBZwm7PcnOdiUX97yHgsKM7uDCCWCu3tg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@quansync/fs@0.1.3': + resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} + engines: {node: '>=20.0.0'} + + '@rolldown/binding-darwin-arm64@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-Hlt/h+lOJ+ksC2wED2M9Hku/9CA2Hr17ENK82gNMmi3OqwcZLdZFqJDpASTli65wIOeT4p9rIUMdkfshCoJpYA==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-Bnst+HBwhW2YrNybEiNf9TJkI1myDgXmiPBVIOS0apzrLCmByzei6PilTClOpTpNFYB+UviL3Ox2gKUmcgUjGw==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-3jAxVmYDPc8vMZZOfZI1aokGB9cP6VNeU9XNCx0UJ6ShlSPK3qkAa0sWgueMhaQkgBVf8MOfGpjo47ohGd7QrA==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-TpUltUdvcsAf2WvXXD8AVc3BozvhgazJ2gJLXp4DVV2V82m26QelI373Bzx8d/4hB167EEIg4wWW/7GXB/ltoQ==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-eGvHnYQSdbdhsTdjdp/+83LrN81/7X9HD6y3jg7mEmdsicxEMEIt6CsP7tvYS/jn4489jgO/6mLxW/7Vg+B8pw==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-0NJZWXJls83FpBRzkTbGBsXXstaQLsfodnyeOghxbnNdsjn+B4dcNPpMK5V3QDsjC0pNjDLaDdzB2jWKlZbP/Q==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-9vXnu27r4zgS/BHP6RCLBOrJoV2xxtLYHT68IVpSOdCkBHGpf1oOJt6blv1y5NRRJBEfAFCvj5NmwSMhETF96w==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-e6tvsZbtHt4kzl82oCajOUxwIN8uMfjhuQ0qxIVRzPekRRjKEzyH9agYPW6toN0cnHpkhPsu51tyZKJOdUl7jg==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-nBQVizPoUQiViANhWrOyihXNf2booP2iq3S396bI1tmHftdgUXWKa6yAoleJBgP0oF0idXpTPU82ciaROUcjpg==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-Rey/ECXKI/UEykrKfJX3oVAPXDH2k1p2BKzYGza0z3S2X5I3sTDOeBn2I0IQgyyf7U3+DCBhYjkDFnmSePrU/A==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-LtuMKJe6iFH4iV55dy+gDwZ9v23Tfxx5cd7ZAxvhYFGoVNSvarxAgl844BvFGReERCnLTGRvo85FUR6fDHQX+A==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-YY8UYfBm4dbWa4psgEPPD9T9X0nAvlYu0BOsQC5vDfCwzzU7IHT4jAfetvlQq+4+M6qWHSTr6v+/WX5EmlM1WA==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.11-commit.f051675': + resolution: {integrity: sha512-TAqMYehvpauLKz7v4TZOTUQNjxa5bUQWw2+51/+Zk3ItclBxgoSWhnZ31sXjdoX6le6OXdK2vZfV3KoyW/O/GA==} + + '@rollup/rollup-android-arm-eabi@4.43.0': + resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.43.0': + resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.43.0': + resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.43.0': + resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.43.0': + resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.43.0': + resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.43.0': + resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.43.0': + resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.43.0': + resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.43.0': + resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.43.0': + resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.43.0': + resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.43.0': + resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.43.0': + resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.43.0': + resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.43.0': + resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.43.0': + resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.6.0': + resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} + + '@shikijs/engine-javascript@3.6.0': + resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} + + '@shikijs/engine-oniguruma@3.6.0': + resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} + + '@shikijs/langs@3.6.0': + resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} + + '@shikijs/themes@3.6.0': + resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} + + '@shikijs/transformers@3.6.0': + resolution: {integrity: sha512-PYkU54lYV0RCaUG8n2FNTF+YWiU3uPhcjLGq2x/C8lIrUX9GVnRb3bK+R5xtdFHbuctntATKm7ondp/H/dux9Q==} + + '@shikijs/twoslash@3.6.0': + resolution: {integrity: sha512-AxRxLWtmrVftwxN/2hSL6Hym+bannS+zuUEXpbNuo6BpG4jHTM0KEkICEH3B3Gm5ZNzGdI74NdDiAqAZ6WPJuQ==} + peerDependencies: + typescript: '>=5.5.0' + + '@shikijs/types@3.6.0': + resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} + + '@shikijs/vitepress-twoslash@3.6.0': + resolution: {integrity: sha512-pUoRj98UDV41CxfxPysrBryc1/1WdUL93ogcD/s156i4XcujnCfJJc+y5vR3W5Nc1R31VUacwWsI8HhaRRS/uA==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@tsconfig/node22@22.0.2': + resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/compression@1.8.1': + resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} + + '@types/lodash@4.17.17': + resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.15.31': + resolution: {integrity: sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@8.34.0': + resolution: {integrity: sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.34.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.34.0': + resolution: {integrity: sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.34.0': + resolution: {integrity: sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.34.0': + resolution: {integrity: sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.34.0': + resolution: {integrity: sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.34.0': + resolution: {integrity: sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.34.0': + resolution: {integrity: sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.34.0': + resolution: {integrity: sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.34.0': + resolution: {integrity: sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.34.0': + resolution: {integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript/vfs@1.6.1': + resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} + peerDependencies: + typescript: '*' + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.9.0': + resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.9.0': + resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@vitest/coverage-v8@3.2.3': + resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} + peerDependencies: + '@vitest/browser': 3.2.3 + vitest: 3.2.3 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.3': + resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + + '@vitest/mocker@3.2.3': + resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.3': + resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + + '@vitest/runner@3.2.3': + resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} + + '@vitest/snapshot@3.2.3': + resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} + + '@vitest/spy@3.2.3': + resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + + '@vitest/utils@3.2.3': + resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + + '@volar/language-core@2.4.14': + resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} + + '@volar/source-map@2.4.14': + resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} + + '@vue/compiler-core@3.5.16': + resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} + + '@vue/compiler-dom@3.5.16': + resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} + + '@vue/compiler-sfc@3.5.16': + resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} + + '@vue/compiler-ssr@3.5.16': + resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@7.7.6': + resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} + + '@vue/devtools-kit@7.7.6': + resolution: {integrity: sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==} + + '@vue/devtools-shared@7.7.6': + resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} + + '@vue/language-core@2.2.4': + resolution: {integrity: sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.16': + resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} + + '@vue/runtime-core@3.5.16': + resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} + + '@vue/runtime-dom@3.5.16': + resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} + + '@vue/server-renderer@3.5.16': + resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} + peerDependencies: + vue: 3.5.16 + + '@vue/shared@3.5.16': + resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} + + '@vueuse/core@13.3.0': + resolution: {integrity: sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@13.3.0': + resolution: {integrity: sha512-h5mGRYPbiTZTFP/AKELLPGnUDBly7z7Qd1pgEQlT3ItQ0NlZM0vB+8SOQycpSBOBlgg72Zgw+mi2r+4O/G8RuQ==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@13.3.0': + resolution: {integrity: sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw==} + + '@vueuse/shared@13.3.0': + resolution: {integrity: sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA==} + peerDependencies: + vue: ^3.5.0 + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch@5.27.0: + resolution: {integrity: sha512-2PvAgvxxJzA3+dB+ERfS2JPdvUsxNf89Cc2GF5iCcFupTULOwmbfinvqrC4Qj9nHJJDNf494NqEN/1f9177ZTQ==} + engines: {node: '>= 14.0.0'} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@2.1.0: + resolution: {integrity: sha512-ROM2LlXbZBZVk97crfw8PGDOBzzsJvN2uJCmwswvPUNyfH14eg90mSN3xNqsri1JS1G9cz0VzeDUhxJkTrr4Ew==} + engines: {node: '>=20.18.0'} + + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + bcryptjs@3.0.2: + resolution: {integrity: sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==} + hasBin: true + + birpc@2.3.0: + resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + engines: {node: '>=18.20'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001723: + resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + core-js-compat@3.43.0: + resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dts-resolver@2.1.1: + resolution: {integrity: sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.167: + resolution: {integrity: sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + empathic@1.1.0: + resolution: {integrity: sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==} + engines: {node: '>=14'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-fix-utils@0.2.1: + resolution: {integrity: sha512-vHvLGmqdgPhZgH+cymlAlAqVuV22auB+uk/mgFdg5zotEtMHAHcOzNzhr5XOrDzyKGEQY2uQHoT+tS8P36/2CQ==} + engines: {node: '>=18.3.0'} + peerDependencies: + '@types/estree': '>=1' + eslint: '>=8' + peerDependenciesMeta: + '@types/estree': + optional: true + + eslint-import-context@0.1.8: + resolution: {integrity: sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-import-resolver-typescript@4.4.3: + resolution: {integrity: sha512-elVDn1eWKFrWlzxlWl9xMt8LltjKl161Ix50JFC50tHXI5/TRP32SNEqlJ/bo/HV+g7Rou/tlPQU2AcRtIhrOg==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-plugin-import-x@4.15.2: + resolution: {integrity: sha512-J5gx7sN6DTm0LRT//eP3rVVQ2Yi4hrX0B+DbWxa5er8PZ6JjLo9GUBwogIFvEDdwJaSqZplpQT+haK/cXhb7VQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + + eslint-plugin-package-json@0.33.2: + resolution: {integrity: sha512-YhWRNeiR44jLCLHDsG2W0mcuHflF9lKG2fSSaN+UDt4lYPCWUzTkQrrKxapabUIobMN+OnM4zsgnPKX97l/N0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8.0.0' + jsonc-eslint-parser: ^2.0.0 + + eslint-plugin-prettier@5.4.1: + resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@59.0.1: + resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==} + engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} + peerDependencies: + eslint: '>=9.22.0' + + eslint-plugin-unused-imports@4.1.4: + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + exsolve@1.0.5: + resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + floating-vue@5.2.2: + resolution: {integrity: sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==} + peerDependencies: + '@nuxt/kit': ^3.2.0 + vue: ^3.2.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + + git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} + engines: {node: '>=18.20'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} + + lru-cache@4.1.1: + resolution: {integrity: sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@7.1.2: + resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + npm-check-updates@17.1.18: + resolution: {integrity: sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==} + engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json-validator@0.10.2: + resolution: {integrity: sha512-i8qx/xfHdkzOzP39bNOtK6VauRrLdJoQf7L1lVRG2/evpLAd3vrj3EGNlzB9QiztBerxWAx5QXZh5z+Jfi0IvQ==} + engines: {node: '>=18'} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss@8.5.5: + resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.26.9: + resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown-plugin-dts@0.13.11: + resolution: {integrity: sha512-1TScN31JImk8xcq9kdm52z2W8/QX3zeDpEjFkyZmK+GcD0u8QqSWWARBsCEdfS99NyI6D9NIbUpsABXlcpZhig==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~2.2.0 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.11-commit.f051675: + resolution: {integrity: sha512-g8MCVkvg2GnrrG+j+WplOTx1nAmjSwYOMSOQI0qfxf8D4NmYZqJuG3f85yWK64XXQv6pKcXZsfMkOPs9B6B52A==} + hasBin: true + + rollup@4.43.0: + resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.6.0: + resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} + + shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + sift@17.1.3: + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@3.2.1: + resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stable-hash-x@0.1.1: + resolution: {integrity: sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==} + engines: {node: '>=12.0.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.0: + resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsdown@0.12.7: + resolution: {integrity: sha512-VJjVaqJfIQuQwtOoeuEJMOJUf3MPDrfX0X7OUNx3nq5pQeuIl3h58tmdbM1IZcu8Dn2j8NQjLh+5TXa0yPb9zg==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + twoslash-protocol@0.3.1: + resolution: {integrity: sha512-BMePTL9OkuNISSyyMclBBhV2s9++DiOCyhhCoV5Kaht6eaWLwVjCCUJHY33eZJPsyKeZYS8Wzz0h+XI01VohVw==} + + twoslash-vue@0.3.1: + resolution: {integrity: sha512-9/PS0/iL2m8G6N2ILdI18sZ8l6ex+W2nN5jIaTpfFPlnY0MOX2G5UxEVs+AuNimM9SwEnwfiIuDY9ubDCIQpSQ==} + peerDependencies: + typescript: ^5.5.0 + + twoslash@0.3.1: + resolution: {integrity: sha512-OGqMTGvqXTcb92YQdwGfEdK0nZJA64Aj/ChLOelbl3TfYch2IoBST0Yx4C0LQ7Lzyqm9RpgcpgDxeXQIz4p2Kg==} + peerDependencies: + typescript: ^5.5.0 + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript-eslint@8.34.0: + resolution: {integrity: sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + unconfig@7.3.2: + resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-unused@0.5.1: + resolution: {integrity: sha512-USnsy4XsInQFcIb/kSt5HbTkwIIYfW1ujGN0jPanq76IvG7RsqHPk4kJqDoZSqCgDkTjolr72a/f7K1Hr2XmWg==} + engines: {node: '>=20.18.0'} + + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} + + unrs-resolver@1.9.0: + resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + validate-npm-package-name@6.0.1: + resolution: {integrity: sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==} + engines: {node: ^18.17.0 || >=20.5.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@3.2.3: + resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + 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 + + vitepress@2.0.0-alpha.6: + resolution: {integrity: sha512-k58ZsFJi+ml0eHM6skEC3wSUm0piDJJmNJu2LSa9BhGMge69vSN07qTBDK5Ad87aDyYhmkbiIFW2AG6bboMFcg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + oxc-minify: ^0.72.3 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + oxc-minify: + optional: true + postcss: + optional: true + + vitest@3.2.3: + resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.3 + '@vitest/ui': 3.2.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@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 + + vue-resize@2.0.0-alpha.1: + resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} + peerDependencies: + vue: ^3.0.0 + + vue@3.5.16: + resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) + '@algolia/client-search': 5.27.0 + algoliasearch: 5.27.0 + + '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': + dependencies: + '@algolia/client-search': 5.27.0 + algoliasearch: 5.27.0 + + '@algolia/client-abtesting@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/client-analytics@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/client-common@5.27.0': {} + + '@algolia/client-insights@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/client-personalization@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/client-query-suggestions@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/client-search@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/ingestion@1.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/monitoring@1.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/recommend@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + '@algolia/requester-browser-xhr@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + + '@algolia/requester-fetch@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + + '@algolia/requester-node-http@5.27.0': + dependencies: + '@algolia/client-common': 5.27.0 + + '@altano/repository-tools@0.1.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + + '@babel/runtime@7.27.6': {} + + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@1.0.2': {} + + '@docsearch/css@3.9.0': {} + + '@docsearch/js@3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3) + preact: 10.26.9 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + + '@docsearch/react@3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) + '@docsearch/css': 3.9.0 + algoliasearch: 5.27.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': + dependencies: + eslint: 9.28.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.1': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.3': {} + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.28.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@eslint/plugin-kit@0.3.2': + dependencies: + '@eslint/core': 0.15.0 + levn: 0.4.1 + + '@feathers-community/eslint-config@0.0.7(@types/estree@1.0.8)(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)(prettier@3.5.3)(typescript@5.8.3)': + dependencies: + '@eslint/js': 9.28.0 + '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) + eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 4.4.3(eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-package-json: 0.33.2(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) + eslint-plugin-prettier: 5.4.1(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3) + eslint-plugin-unicorn: 59.0.1(eslint@9.28.0(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) + globals: 16.2.0 + typescript-eslint: 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + transitivePeerDependencies: + - '@types/eslint' + - '@types/estree' + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - eslint-plugin-import + - jsonc-eslint-parser + - prettier + - supports-color + - typescript + + '@feathers-plus/cache@1.4.0': + dependencies: + lru-cache: 4.1.1 + + '@feathersjs/adapter-commons@5.0.34': + dependencies: + '@feathersjs/commons': 5.0.34 + '@feathersjs/errors': 5.0.34 + '@feathersjs/feathers': 5.0.34 + + '@feathersjs/authentication-client@5.0.34(typescript@5.8.3)': + dependencies: + '@feathersjs/authentication': 5.0.34(typescript@5.8.3) + '@feathersjs/commons': 5.0.34 + '@feathersjs/errors': 5.0.34 + '@feathersjs/feathers': 5.0.34 + transitivePeerDependencies: + - typescript + + '@feathersjs/authentication-local@5.0.34(typescript@5.8.3)': + dependencies: + '@feathersjs/authentication': 5.0.34(typescript@5.8.3) + '@feathersjs/commons': 5.0.34 + '@feathersjs/errors': 5.0.34 + '@feathersjs/feathers': 5.0.34 + bcryptjs: 3.0.2 + lodash: 4.17.21 + transitivePeerDependencies: + - typescript + + '@feathersjs/authentication@5.0.34(typescript@5.8.3)': + 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(typescript@5.8.3) + '@feathersjs/transport-commons': 5.0.34 + '@types/jsonwebtoken': 9.0.9 + jsonwebtoken: 9.0.2 + lodash: 4.17.21 + long-timeout: 0.1.1 + uuid: 11.1.0 + transitivePeerDependencies: + - typescript + + '@feathersjs/client@5.0.34(typescript@5.8.3)': + dependencies: + '@feathersjs/authentication-client': 5.0.34(typescript@5.8.3) + '@feathersjs/errors': 5.0.34 + '@feathersjs/feathers': 5.0.34 + '@feathersjs/rest-client': 5.0.34 + '@feathersjs/socketio-client': 5.0.34 + transitivePeerDependencies: + - typescript + + '@feathersjs/commons@5.0.34': {} + + '@feathersjs/errors@5.0.34': {} + + '@feathersjs/express@5.0.34(typescript@5.8.3)': + dependencies: + '@feathersjs/authentication': 5.0.34(typescript@5.8.3) + '@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.23 + '@types/express-serve-static-core': 4.19.6 + compression: 1.8.0 + cors: 2.8.5 + express: 4.21.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@feathersjs/feathers@5.0.34': + dependencies: + '@feathersjs/commons': 5.0.34 + '@feathersjs/hooks': 0.9.0 + events: 3.3.0 + + '@feathersjs/hooks@0.9.0': {} + + '@feathersjs/memory@5.0.34': + dependencies: + '@feathersjs/adapter-commons': 5.0.34 + '@feathersjs/commons': 5.0.34 + '@feathersjs/errors': 5.0.34 + sift: 17.1.3 + + '@feathersjs/rest-client@5.0.34': + 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 + + '@feathersjs/schema@5.0.34(typescript@5.8.3)': + 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(ajv@8.17.1) + json-schema-to-ts: 3.1.1 + typescript: 5.8.3 + + '@feathersjs/socketio-client@5.0.34': + dependencies: + '@feathersjs/feathers': 5.0.34 + '@feathersjs/transport-commons': 5.0.34 + + '@feathersjs/socketio@5.0.34': + dependencies: + '@feathersjs/commons': 5.0.34 + '@feathersjs/feathers': 5.0.34 + '@feathersjs/transport-commons': 5.0.34 + socket.io: 4.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@feathersjs/transport-commons@5.0.34': + dependencies: + '@feathersjs/commons': 5.0.34 + '@feathersjs/errors': 5.0.34 + '@feathersjs/feathers': 5.0.34 + encodeurl: 2.0.0 + lodash: 4.17.21 + + '@floating-ui/core@1.7.1': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.1.1': + dependencies: + '@floating-ui/core': 1.7.1 + + '@floating-ui/utils@0.2.9': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify-json/simple-icons@1.2.38': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oxc-project/runtime@0.72.2': {} + + '@oxc-project/types@0.72.2': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.7': {} + + '@quansync/fs@0.1.3': + dependencies: + quansync: 0.2.10 + + '@rolldown/binding-darwin-arm64@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.11-commit.f051675': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.11-commit.f051675': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.11-commit.f051675': {} + + '@rollup/rollup-android-arm-eabi@4.43.0': + optional: true + + '@rollup/rollup-android-arm64@4.43.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.43.0': + optional: true + + '@rollup/rollup-darwin-x64@4.43.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.43.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.43.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.43.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.43.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.43.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.43.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.43.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.43.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.43.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.43.0': + optional: true + + '@shikijs/core@3.6.0': + dependencies: + '@shikijs/types': 3.6.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.6.0': + dependencies: + '@shikijs/types': 3.6.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.6.0': + dependencies: + '@shikijs/types': 3.6.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.6.0': + dependencies: + '@shikijs/types': 3.6.0 + + '@shikijs/themes@3.6.0': + dependencies: + '@shikijs/types': 3.6.0 + + '@shikijs/transformers@3.6.0': + dependencies: + '@shikijs/core': 3.6.0 + '@shikijs/types': 3.6.0 + + '@shikijs/twoslash@3.6.0(typescript@5.8.3)': + dependencies: + '@shikijs/core': 3.6.0 + '@shikijs/types': 3.6.0 + twoslash: 0.3.1(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@shikijs/types@3.6.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vitepress-twoslash@3.6.0(typescript@5.8.3)': + dependencies: + '@shikijs/twoslash': 3.6.0(typescript@5.8.3) + floating-vue: 5.2.2(vue@3.5.16(typescript@5.8.3)) + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.1.0 + mdast-util-to-hast: 13.2.0 + shiki: 3.6.0 + twoslash: 0.3.1(typescript@5.8.3) + twoslash-vue: 0.3.1(typescript@5.8.3) + vue: 3.5.16(typescript@5.8.3) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - typescript + + '@shikijs/vscode-textmate@10.0.2': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@tsconfig/node22@22.0.2': {} + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.15.31 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/compression@1.8.1': + dependencies: + '@types/express': 4.17.23 + '@types/node': 22.15.31 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.15.31 + + '@types/cookiejar@2.1.5': {} + + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.15.31 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.7': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.15.31 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@4.17.23': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-errors@2.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/jsonwebtoken@9.0.9': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.15.31 + + '@types/lodash@4.17.17': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/methods@1.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.15.31': + dependencies: + undici-types: 6.21.0 + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.15.31 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.15.31 + '@types/send': 0.17.5 + + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.15.31 + form-data: 4.0.3 + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.34.0 + '@typescript-eslint/type-utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.34.0 + eslint: 9.28.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.34.0 + '@typescript-eslint/types': 8.34.0 + '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.34.0 + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.34.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) + '@typescript-eslint/types': 8.34.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.34.0': + dependencies: + '@typescript-eslint/types': 8.34.0 + '@typescript-eslint/visitor-keys': 8.34.0 + + '@typescript-eslint/tsconfig-utils@8.34.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.34.0': {} + + '@typescript-eslint/typescript-estree@8.34.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.34.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) + '@typescript-eslint/types': 8.34.0 + '@typescript-eslint/visitor-keys': 8.34.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.34.0 + '@typescript-eslint/types': 8.34.0 + '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.34.0': + dependencies: + '@typescript-eslint/types': 8.34.0 + eslint-visitor-keys: 4.2.1 + + '@typescript/vfs@1.6.1(typescript@5.8.3)': + dependencies: + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + optional: true + + '@unrs/resolver-binding-android-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + optional: true + + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))(vue@3.5.16(typescript@5.8.3))': + dependencies: + vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) + vue: 3.5.16(typescript@5.8.3) + + '@vitest/coverage-v8@3.2.3(vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2))': + dependencies: + '@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 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.3': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))': + dependencies: + '@vitest/spy': 3.2.3 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) + + '@vitest/pretty-format@3.2.3': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.3': + dependencies: + '@vitest/utils': 3.2.3 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.3': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + '@volar/language-core@2.4.14': + dependencies: + '@volar/source-map': 2.4.14 + + '@volar/source-map@2.4.14': {} + + '@vue/compiler-core@3.5.16': + dependencies: + '@babel/parser': 7.27.5 + '@vue/shared': 3.5.16 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.16': + dependencies: + '@vue/compiler-core': 3.5.16 + '@vue/shared': 3.5.16 + + '@vue/compiler-sfc@3.5.16': + dependencies: + '@babel/parser': 7.27.5 + '@vue/compiler-core': 3.5.16 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.5 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.16': + dependencies: + '@vue/compiler-dom': 3.5.16 + '@vue/shared': 3.5.16 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@7.7.6': + dependencies: + '@vue/devtools-kit': 7.7.6 + + '@vue/devtools-kit@7.7.6': + 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 + + '@vue/devtools-shared@7.7.6': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@2.2.4(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.14 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.16 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/reactivity@3.5.16': + dependencies: + '@vue/shared': 3.5.16 + + '@vue/runtime-core@3.5.16': + dependencies: + '@vue/reactivity': 3.5.16 + '@vue/shared': 3.5.16 + + '@vue/runtime-dom@3.5.16': + dependencies: + '@vue/reactivity': 3.5.16 + '@vue/runtime-core': 3.5.16 + '@vue/shared': 3.5.16 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.16(vue@3.5.16(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + vue: 3.5.16(typescript@5.8.3) + + '@vue/shared@3.5.16': {} + + '@vueuse/core@13.3.0(vue@3.5.16(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.3.0 + '@vueuse/shared': 13.3.0(vue@3.5.16(typescript@5.8.3)) + vue: 3.5.16(typescript@5.8.3) + + '@vueuse/integrations@13.3.0(focus-trap@7.6.5)(vue@3.5.16(typescript@5.8.3))': + dependencies: + '@vueuse/core': 13.3.0(vue@3.5.16(typescript@5.8.3)) + '@vueuse/shared': 13.3.0(vue@3.5.16(typescript@5.8.3)) + vue: 3.5.16(typescript@5.8.3) + optionalDependencies: + focus-trap: 7.6.5 + + '@vueuse/metadata@13.3.0': {} + + '@vueuse/shared@13.3.0(vue@3.5.16(typescript@5.8.3))': + dependencies: + vue: 3.5.16(typescript@5.8.3) + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.27.0: + dependencies: + '@algolia/client-abtesting': 5.27.0 + '@algolia/client-analytics': 5.27.0 + '@algolia/client-common': 5.27.0 + '@algolia/client-insights': 5.27.0 + '@algolia/client-personalization': 5.27.0 + '@algolia/client-query-suggestions': 5.27.0 + '@algolia/client-search': 5.27.0 + '@algolia/ingestion': 1.27.0 + '@algolia/monitoring': 1.27.0 + '@algolia/recommend': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 + + alien-signals@1.0.13: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + ansis@4.1.0: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + assertion-error@2.0.1: {} + + ast-kit@2.1.0: + dependencies: + '@babel/parser': 7.27.5 + pathe: 2.0.3 + + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + asynckit@0.4.0: {} + + balanced-match@1.0.2: {} + + base64id@2.0.0: {} + + bcryptjs@3.0.2: {} + + birpc@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.0: + dependencies: + caniuse-lite: 1.0.30001723 + electron-to-chromium: 1.5.167 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) + + buffer-equal-constant-time@1.0.1: {} + + builtin-modules@5.0.0: {} + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001723: {} + + ccount@2.0.1: {} + + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@4.2.0: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + comment-parser@1.4.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + confbox@0.2.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-js-compat@3.43.0: + dependencies: + browserslist: 4.25.0 + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + dedent@1.6.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-indent@6.1.0: {} + + detect-indent@7.0.1: {} + + detect-newline@3.1.0: {} + + detect-newline@4.0.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.2: {} + + dts-resolver@2.1.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.167: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + empathic@1.1.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 22.15.31 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): + dependencies: + eslint: 9.28.0(jiti@2.4.2) + + eslint-fix-utils@0.2.1(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2)): + dependencies: + eslint: 9.28.0(jiti@2.4.2) + optionalDependencies: + '@types/estree': 1.0.8 + + eslint-import-context@0.1.8(unrs-resolver@1.9.0): + dependencies: + get-tsconfig: 4.10.1 + stable-hash-x: 0.1.1 + optionalDependencies: + unrs-resolver: 1.9.0 + + eslint-import-resolver-typescript@4.4.3(eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2)): + dependencies: + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) + eslint-import-context: 0.1.8(unrs-resolver@1.9.0) + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash-x: 0.1.1 + tinyglobby: 0.2.14 + unrs-resolver: 1.9.0 + optionalDependencies: + eslint-plugin-import-x: 4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): + dependencies: + '@typescript-eslint/types': 8.34.0 + comment-parser: 1.4.1 + debug: 4.4.1 + eslint: 9.28.0(jiti@2.4.2) + eslint-import-context: 0.1.8(unrs-resolver@1.9.0) + is-glob: 4.0.3 + minimatch: 10.0.3 + semver: 7.7.2 + stable-hash-x: 0.1.1 + unrs-resolver: 1.9.0 + optionalDependencies: + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-package-json@0.33.2(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0): + dependencies: + '@altano/repository-tools': 0.1.1 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + eslint: 9.28.0(jiti@2.4.2) + eslint-fix-utils: 0.2.1(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2)) + jsonc-eslint-parser: 2.4.0 + package-json-validator: 0.10.2 + semver: 7.7.2 + sort-object-keys: 1.1.3 + sort-package-json: 3.2.1 + validate-npm-package-name: 6.0.1 + transitivePeerDependencies: + - '@types/estree' + + eslint-plugin-prettier@5.4.1(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3): + dependencies: + eslint: 9.28.0(jiti@2.4.2) + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.8 + optionalDependencies: + eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) + + eslint-plugin-unicorn@59.0.1(eslint@9.28.0(jiti@2.4.2)): + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@eslint/plugin-kit': 0.2.8 + ci-info: 4.2.0 + clean-regexp: 1.0.0 + core-js-compat: 3.43.0 + eslint: 9.28.0(jiti@2.4.2) + esquery: 1.6.0 + find-up-simple: 1.0.1 + globals: 16.2.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + jsesc: 3.1.0 + pluralize: 8.0.0 + regexp-tree: 0.1.27 + regjsparser: 0.12.0 + semver: 7.7.2 + strip-indent: 4.0.0 + + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): + dependencies: + eslint: 9.28.0(jiti@2.4.2) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.28.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.28.0 + '@eslint/plugin-kit': 0.3.2 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events@3.3.0: {} + + expect-type@1.2.1: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.5: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.6(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up-simple@1.0.1: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + floating-vue@5.2.2(vue@3.5.16(typescript@5.8.3)): + dependencies: + '@floating-ui/dom': 1.1.1 + vue: 3.5.16(typescript@5.8.3) + vue-resize: 2.0.0-alpha.1(vue@3.5.16(typescript@5.8.3)) + + focus-trap@7.6.5: + dependencies: + tabbable: 6.2.0 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-hooks-list@4.1.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@14.0.0: {} + + globals@16.2.0: {} + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + hookable@5.5.3: {} + + html-escaper@2.0.2: {} + + html-void-elements@3.0.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + interpret@1.4.0: {} + + ipaddr.js@1.9.1: {} + + is-builtin-module@5.0.0: + dependencies: + builtin-modules: 5.0.0 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.2 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-what@4.1.16: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jiti@2.4.2: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.27.6 + ts-algebra: 2.0.0 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonc-eslint-parser@2.4.0: + dependencies: + acorn: 8.15.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.7.2 + + jsonwebtoken@9.0.2: + 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.1.1 + ms: 2.1.3 + semver: 7.7.2 + + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + 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.merge@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash@4.17.21: {} + + long-timeout@0.1.1: {} + + longest-streak@3.1.0: {} + + loupe@3.1.3: {} + + lru-cache@10.4.3: {} + + lru-cache@11.1.0: {} + + lru-cache@4.1.1: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + mark.js@8.11.1: {} + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + min-indent@1.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minisearch@7.1.2: {} + + mitt@3.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.2.4: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neotraverse@0.6.18: {} + + node-releases@2.0.19: {} + + npm-check-updates@17.1.18: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + package-json-validator@0.10.2: + dependencies: + yargs: 17.7.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + pathe@2.0.3: {} + + pathval@2.0.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.5 + pathe: 2.0.3 + + pluralize@8.0.0: {} + + postcss@8.5.5: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.26.9: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.3: {} + + property-information@7.1.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pseudomap@1.0.2: {} + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readdirp@4.1.2: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.10 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexp-tree@0.1.27: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rolldown-plugin-dts@0.13.11(rolldown@1.0.0-beta.11-commit.f051675)(typescript@5.8.3): + dependencies: + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + ast-kit: 2.1.0 + birpc: 2.3.0 + debug: 4.4.1 + dts-resolver: 2.1.1 + get-tsconfig: 4.10.1 + rolldown: 1.0.0-beta.11-commit.f051675 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.11-commit.f051675: + dependencies: + '@oxc-project/runtime': 0.72.2 + '@oxc-project/types': 0.72.2 + '@rolldown/pluginutils': 1.0.0-beta.11-commit.f051675 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-darwin-x64': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.11-commit.f051675 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.11-commit.f051675 + + rollup@4.43.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.43.0 + '@rollup/rollup-android-arm64': 4.43.0 + '@rollup/rollup-darwin-arm64': 4.43.0 + '@rollup/rollup-darwin-x64': 4.43.0 + '@rollup/rollup-freebsd-arm64': 4.43.0 + '@rollup/rollup-freebsd-x64': 4.43.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 + '@rollup/rollup-linux-arm-musleabihf': 4.43.0 + '@rollup/rollup-linux-arm64-gnu': 4.43.0 + '@rollup/rollup-linux-arm64-musl': 4.43.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-musl': 4.43.0 + '@rollup/rollup-linux-s390x-gnu': 4.43.0 + '@rollup/rollup-linux-x64-gnu': 4.43.0 + '@rollup/rollup-linux-x64-musl': 4.43.0 + '@rollup/rollup-win32-arm64-msvc': 4.43.0 + '@rollup/rollup-win32-ia32-msvc': 4.43.0 + '@rollup/rollup-win32-x64-msvc': 4.43.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + search-insights@2.17.3: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@7.7.2: {} + + send@0.19.0: + 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 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.6.0: + dependencies: + '@shikijs/core': 3.6.0 + '@shikijs/engine-javascript': 3.6.0 + '@shikijs/engine-oniguruma': 3.6.0 + '@shikijs/langs': 3.6.0 + '@shikijs/themes': 3.6.0 + '@shikijs/types': 3.6.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + shx@0.3.4: + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sift@17.1.3: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + sort-object-keys@1.1.3: {} + + sort-package-json@3.2.1: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + git-hooks-list: 4.1.1 + is-plain-obj: 4.1.0 + semver: 7.7.2 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.14 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + sprintf-js@1.0.3: {} + + stable-hash-x@0.1.1: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.9.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom-string@1.0.0: {} + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + + tabbable@6.2.0: {} + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.1.0: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + trim-lines@3.0.1: {} + + ts-algebra@2.0.0: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + tsdown@0.12.7(typescript@5.8.3)(unplugin-unused@0.5.1): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.1 + diff: 8.0.2 + empathic: 1.1.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.11-commit.f051675 + rolldown-plugin-dts: 0.13.11(rolldown@1.0.0-beta.11-commit.f051675)(typescript@5.8.3) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.14 + unconfig: 7.3.2 + optionalDependencies: + typescript: 5.8.3 + unplugin-unused: 0.5.1 + transitivePeerDependencies: + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + + tslib@2.8.1: + optional: true + + twoslash-protocol@0.3.1: {} + + twoslash-vue@0.3.1(typescript@5.8.3): + dependencies: + '@vue/language-core': 2.2.4(typescript@5.8.3) + twoslash: 0.3.1(typescript@5.8.3) + twoslash-protocol: 0.3.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + twoslash@0.3.1(typescript@5.8.3): + dependencies: + '@typescript/vfs': 1.6.1(typescript@5.8.3) + twoslash-protocol: 0.3.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript-eslint@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.28.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + unconfig@7.3.2: + dependencies: + '@quansync/fs': 0.1.3 + defu: 6.1.4 + jiti: 2.4.2 + quansync: 0.2.10 + + undici-types@6.21.0: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unpipe@1.0.0: {} + + unplugin-unused@0.5.1: + dependencies: + js-tokens: 9.0.1 + picocolors: 1.1.1 + pkg-types: 2.1.0 + unplugin: 2.3.5 + + unplugin@2.3.5: + dependencies: + acorn: 8.15.0 + picomatch: 4.0.2 + webpack-virtual-modules: 0.6.2 + + unrs-resolver@1.9.0: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.9.0 + '@unrs/resolver-binding-android-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-x64': 1.9.0 + '@unrs/resolver-binding-freebsd-x64': 1.9.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.9.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-musl': 1.9.0 + '@unrs/resolver-binding-wasm32-wasi': 1.9.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.9.0 + + update-browserslist-db@1.1.3(browserslist@4.25.0): + dependencies: + browserslist: 4.25.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utils-merge@1.0.1: {} + + uuid@11.1.0: {} + + validate-npm-package-name@6.0.1: {} + + vary@1.1.2: {} + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite-node@3.2.3(@types/node@22.15.31)(jiti@2.4.2): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.5 + rollup: 4.43.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.15.31 + fsevents: 2.3.3 + jiti: 2.4.2 + + vitepress@2.0.0-alpha.6(@algolia/client-search@5.27.0)(@types/node@22.15.31)(jiti@2.4.2)(postcss@8.5.5)(search-insights@2.17.3)(typescript@5.8.3): + dependencies: + '@docsearch/css': 3.9.0 + '@docsearch/js': 3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.38 + '@shikijs/core': 3.6.0 + '@shikijs/transformers': 3.6.0 + '@shikijs/types': 3.6.0 + '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))(vue@3.5.16(typescript@5.8.3)) + '@vue/devtools-api': 7.7.6 + '@vue/shared': 3.5.16 + '@vueuse/core': 13.3.0(vue@3.5.16(typescript@5.8.3)) + '@vueuse/integrations': 13.3.0(focus-trap@7.6.5)(vue@3.5.16(typescript@5.8.3)) + focus-trap: 7.6.5 + mark.js: 8.11.1 + minisearch: 7.1.2 + shiki: 3.6.0 + vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) + vue: 3.5.16(typescript@5.8.3) + optionalDependencies: + postcss: 8.5.5 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.3 + '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.3 + '@vitest/snapshot': 3.2.3 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + 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.0 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) + vite-node: 3.2.3(@types/node@22.15.31)(jiti@2.4.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.15.31 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vue-resize@2.0.0-alpha.1(vue@3.5.16(typescript@5.8.3)): + dependencies: + vue: 3.5.16(typescript@5.8.3) + + vue@3.5.16(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-sfc': 3.5.16 + '@vue/runtime-dom': 3.5.16 + '@vue/server-renderer': 3.5.16(vue@3.5.16(typescript@5.8.3)) + '@vue/shared': 3.5.16 + optionalDependencies: + typescript: 5.8.3 + + webpack-virtual-modules@0.6.2: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zwitch@2.0.4: {} diff --git a/src/hooks/cache/cache.md b/src/hooks/cache/cache.md new file mode 100644 index 00000000..ad7ba63e --- /dev/null +++ b/src/hooks/cache/cache.md @@ -0,0 +1,94 @@ +--- +title: cache +description: Persistent, least-recently-used record cache for services. +category: hooks +hook: + type: ['before', 'after'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- + +## Arguments + +- `{Object | Map} cacheMap` +- `{String} [ keyField ]` +- `{Object} [ options ]` + - `{Function} [ clone ]` + - `{Function} [makeCacheKey]` + +| Argument | Type | Default | Description | +| ---------- | :------------: | -------------------------------------------------- | ---------------------------------------------------------------------------- | +| `cacheMap` | `Object` `Map` | | Instance of `Map`, or an object with a similar API, to be used as the cache. | +| `keyField` | `String` | `context.service.id` or `item._id ? '_id' !! 'id'` | The name of the record id field. | +| `option` | `Object` | | Options. | + +| `options` | Argument | Type | Default | Description | +| -------------- | ---------- | :--------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | +| `clone` | `Function` | `item => JSON.parse(` `JSON.stringify(item) )` | Function to perform a deep clone. See below. | +| `makeCacheKey` | `Function` | `key => key` | Function to convert record key to cache key. Use this to convert MongoDB/Mongoose ObjectId/bson keys to a cache key using `item._id.toString()`. | + +## Examples + +```ts twoslash +const CacheMap = require('@feathers-plus/cache'); +const { cache } = require('feathers-hooks-common/index.js'); + +const cacheMap = CacheMap({ max: 100 }); // Keep the 100 most recently used. + +module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; +``` + +```js +const { cache } = require('feathers-hooks-common/index.js'); + +const cacheMap = new Map(); + +module.exports = { before: { all: cache(cacheMap) }, after: { all: cache(cacheMap) } }; +``` + +```js +const CacheMap = require('@feathers-plus/cache'); +const mongoose = require('mongoose'); +const { cache } = require('feathers-hooks-common/index.js'); + +const cacheMap = CacheMap({ max: 100 }); +const makeCacheKey = key => (key instanceof mongoose.Types.ObjectId ? key.toString() : key); + +module.exports = { + before: { all: cache(cacheMap, undefined, { makeCacheKey }) }, + after: { all: cache(cacheMap, undefined, { makeCacheKey }) }, +}; +``` + +> The `cache` hook **must** be registered in both `before` and `after`. + +

The cache will grow without limit when `Map` is used and the resulting memory pressure may adversely affect your performance. `Map` should only be used when you know or can control its size.

+ +## Details + +The `cache` hook maintain a persistent cache for the service it is registerd on. A persistent cache stores records so future requests for those records can be served faster; the records stored in the cache are duplicates of records stored in the database. + +The `get` service method retrieves records from the cache and updates `context.result` `[.data]`. The other methods remove their `context.data` entries from the cache in the `before` hook, and add entries in the `after` hook. All the records returned by a `find` call are added to the cache. + +The `cache` hook may be provided a custom Map instance to use as its memoization cache. Any object that implements the methods get(), set(), delete() and clear() can be provided. This allows for custom Maps which implement various [cache algorithms](https://en.wikipedia.org/wiki/Cache_replacement_policies) to be provided. + +The companion `@feathers-plus/cache` provides a least recently-used cache which discards the least recently used items first. It is compatible with `cache` as well as the BatchLoaders used with the `fastJoin` hook. + +> The `cache` hook can make [fastJoin](#fastjoin) hooks run more efficiently. + +MongoDB and Mongoose store record keys as bson objects rather than as scalars. The safest way to use the cache is in conjunction with the `makeCacheKey` option. + +- **options.clone** + + The clone function has a single parameter. + + - `{Object} item` + + It returns + + - `{Object} clonedItem` + +| Argument | Type | Default | Description | +| ------------ | :------: | ------- | ------------------ | +| `item` | `Object` | | The record. | +| `clonedItem` | `Object` | | A clone of `item`. | diff --git a/src/hooks/cache/cache.ts b/src/hooks/cache/cache.ts index b82bf4a7..d575cec6 100755 --- a/src/hooks/cache/cache.ts +++ b/src/hooks/cache/cache.ts @@ -12,11 +12,12 @@ export interface CacheOptions { const defaultMakeCacheKey = (key: any) => key /** - * TODO: rm 'getItems' & migrate to around hook + * A hook that caches results in a Map. * - * Persistent, most-recently-used record cache for services. - * - * @see https://hooks-common.feathersjs.com/hooks.html#cache + * @param cacheMap - The Map to use for caching. + * @param keyField - Optional field name to use as the cache key. + * @param options - Optional configuration for cloning and cache key generation. + * @param options.clone - Function to clone items before caching. */ export function cache( cacheMap: CacheMap, diff --git a/src/hooks/check-required/check-required.md b/src/hooks/check-required/check-required.md new file mode 100644 index 00000000..fc190fb5 --- /dev/null +++ b/src/hooks/check-required/check-required.md @@ -0,0 +1,24 @@ +--- +title: checkRequired +description: Check selected fields exist and are not falsey. Numeric 0 is acceptable. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | ------------------------------------------------------------------- | +| fieldNames | dot notation | These fields must exist and not be falsey. Numeric 0 is acceptable. | + +## Example + +```js +const { required } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { all: required('email', 'password') } }; +``` diff --git a/src/hooks/check-required/check-required.ts b/src/hooks/check-required/check-required.ts index a9240adf..a872ec12 100755 --- a/src/hooks/check-required/check-required.ts +++ b/src/hooks/check-required/check-required.ts @@ -14,7 +14,7 @@ import { toArray } from '../../internal.utils.js' export function checkRequired(fieldNames: MaybeArray) { const fieldNamesArray = toArray(fieldNames) return (context: H, next?: NextFunction) => { - checkContext(context, ['before', 'around'], ['create', 'update', 'patch'], 'required') + checkContext(context, ['before', 'around'], ['create', 'update', 'patch'], 'checkRequired') const { data } = getDataIsArray(context) diff --git a/src/hooks/combine/combine.md b/src/hooks/combine/combine.md new file mode 100644 index 00000000..59e0189a --- /dev/null +++ b/src/hooks/combine/combine.md @@ -0,0 +1,43 @@ +--- +title: combine +description: Sequentially execute multiple sync or async hooks. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Array< Function >} hookFuncs` + +| Argument | Type | Default | Description | +| ----------- | :----------------: | ------- | --------------------------------------------------- | +| `hookFuncs` | `Array` | | Hooks, used the same way as when you register them. | + +## Example + +```js +const { combine, createdAt, updatedAt } = require('feathers-hooks-common/index.js'); + +async function myCustomHook(context) { + const newContext = await combine(setNow('createdAt'), setNow('updatedAt')).call(this, context); + return newContext; +} +``` + +## Details + +`combine` has the signature of a hook, but is primarily intended to be used within your custom hooks, not when registering hooks. + +The following is a better technique to use when registering hooks. + +```js +const workflow = [createdAt(), updatedAt(), ...]; + +module.exports = { before: { + update: [...workflow], + patch: [...workflow], +} }; +``` diff --git a/src/utils/combine/combine.test.ts b/src/hooks/combine/combine.test.ts similarity index 100% rename from src/utils/combine/combine.test.ts rename to src/hooks/combine/combine.test.ts diff --git a/src/utils/combine/combine.ts b/src/hooks/combine/combine.ts similarity index 100% rename from src/utils/combine/combine.ts rename to src/hooks/combine/combine.ts diff --git a/src/hooks/create-related/create-related.md b/src/hooks/create-related/create-related.md new file mode 100644 index 00000000..137a5666 --- /dev/null +++ b/src/hooks/create-related/create-related.md @@ -0,0 +1,9 @@ +--- +title: createRelated +description: Create related records in other services. +category: hooks +hook: + type: ['before', 'around'] + method: ['create'] + multi: true +--- diff --git a/src/hooks/create-related/create-related.ts b/src/hooks/create-related/create-related.ts index d128de8b..6598780e 100644 --- a/src/hooks/create-related/create-related.ts +++ b/src/hooks/create-related/create-related.ts @@ -15,7 +15,7 @@ export function createRelated, H extends HookContext = H options: MaybeArray>, ) { return async (context: H, next?: NextFunction) => { - checkContext(context, ['after', 'around'], undefined, 'createRelated') + checkContext(context, ['after', 'around'], ['create'], 'createRelated') if (next) { await next() diff --git a/src/hooks/debug/debug.md b/src/hooks/debug/debug.md new file mode 100644 index 00000000..fbd53d2d --- /dev/null +++ b/src/hooks/debug/debug.md @@ -0,0 +1,49 @@ +--- +title: debug +description: Display the current hook context for debugging. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{String} label` +- `{Array < String >} [ fieldNames ]` + +| Argument | Type | Default | Description | +| ------------ | :----------: | ------- | ------------------------------------------------ | +| `label` | `String` | | Label to identify the logged information. | +| `fieldNames` | dot notation | | The field values in `context.params` to display. | + +## Example + +```js +const { debug } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { + all: [ debug('step 1'), setNow('updatedAt'), debug(' step 2') ], +} }; + +// Result +* step 1 +type: before, method: create +data: { name: 'Joe Doe' } +query: { sex: 'm' } +result: { assigned: true } +params props: [ 'query' ] +* step 2 +type: before, method: create +data: { name: 'Joe Doe', createdAt: 1510518511547 } +query: { sex: 'm' } +result: { assigned: true } +params props: [ 'query' ] +params.query: { sex: 'm' } +error: ... +``` + +## Details + +`debug` is great for debugging issues with hooks. Log the hook context before and after a hook to see what the hook started with, and what it changed. diff --git a/src/hooks/disable-pagination/disable-pagination.md b/src/hooks/disable-pagination/disable-pagination.md new file mode 100644 index 00000000..c7653a54 --- /dev/null +++ b/src/hooks/disable-pagination/disable-pagination.md @@ -0,0 +1,21 @@ +--- +title: disablePagination +description: Disable pagination when query.$limit is -1 or '-1'. +category: hooks +hook: + type: ['before'] + method: ['find'] + multi: true +--- + +## Example + +```js +const { disablePagination } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { find: disablePagination() } }; +``` + +## Details + +Pagination is disabled if `context.query.$limit` is -1 or '-1'. It works for all types of calls including REST. diff --git a/src/hooks/disallow/disallow.md b/src/hooks/disallow/disallow.md new file mode 100644 index 00000000..b0bcc6ad --- /dev/null +++ b/src/hooks/disallow/disallow.md @@ -0,0 +1,48 @@ +--- +title: disallow +description: Prevents access to a service method completely or for specific transports. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['all'] + multi: true + methods: ['all'] +--- + +## Arguments + +- `{Array< String >} transports` + +| Argument | Type | Default | Description | +| ------------ | :---------------: | ----------------------- | ----------------------------------------- | +| `transports` | `Array< String >` | disallow all transports | The transports that you want to disallow. | + +| `transports` | Value | Description | +| ------------ | ------------------------------------- | ----------- | +| `socketio` | disallow calls by Socket.IO transport | +| `rest` | disallow calls by REST transport | +| `external` | disallow calls other than from server | +| `server` | disallow calls from server | + +## Example + +```js +const { disallow, iff } = require('feathers-hooks-common/index.js'); + +module.exports = { + before: { + // Users can not be created by external access + create: disallow('external'), + // A user can not be deleted through the REST provider + remove: disallow('rest'), + // disallow calling `update` completely (e.g. to allow only `patch`) + update: disallow(), + // disallow the remove hook if the user is not an admin + remove: iff(context => !context.params.user.isAdmin, disallow()), + }, +}; +``` + +## Details + +Prevents access to a service method completely or just for specific transports. All transports set the `context.params.provider` property, and `disallow` checks this. diff --git a/src/hooks/iff-else/iff-else.md b/src/hooks/iff-else/iff-else.md new file mode 100644 index 00000000..2148061a --- /dev/null +++ b/src/hooks/iff-else/iff-else.md @@ -0,0 +1,40 @@ +--- +title: iffElse +description: Execute one array of hooks or another based on a sync or async predicate. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Function} predicate` +- `{Array< Functions >} hookFuncsTrue` +- `{Array< Functions >} hookFuncsFalse` + +| Argument | Type | Default | Description | +| ---------------- | :--------------------------------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `predicate` | `Boolean`, `Promise` or `Function` | | Determine if `hookFuncsTrue` or `hookFuncsFalse` should be run. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | +| `hookFuncsTrue` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | +| `hookFuncsFalse` | `Array<` `Function >` | | Sync or async hook functions to run if `false`. They may include other conditional hooks. | + +## Example + +```js +const { iffElse, populate, serialize } = require('feathers-hooks-common/index.js'); + +module.exports = { after: { + create: iffElse(() => { ... }, + [populate(poAccting), serialize( ... )], + [populate(poReceiving), serialize( ... )] + ) +} }; +``` + +## Details + +Resolve the predicate, then run one set of hooks sequentially. + +The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. diff --git a/src/hooks/iff/iff-else.test.ts b/src/hooks/iff-else/iff-else.test.ts similarity index 100% rename from src/hooks/iff/iff-else.test.ts rename to src/hooks/iff-else/iff-else.test.ts diff --git a/src/hooks/iff/iff-else.ts b/src/hooks/iff-else/iff-else.ts similarity index 96% rename from src/hooks/iff/iff-else.ts rename to src/hooks/iff-else/iff-else.ts index cf29189a..a9ee48ec 100755 --- a/src/hooks/iff/iff-else.ts +++ b/src/hooks/iff-else/iff-else.ts @@ -1,6 +1,6 @@ import type { HookContext } from '@feathersjs/feathers' import { isPromise } from '../../common/index.js' -import { combine } from '../../utils/combine/combine.js' +import { combine } from '../combine/combine.js' import type { HookFunction, PredicateFn } from '../../types.js' /** diff --git a/src/hooks/iff/iff.md b/src/hooks/iff/iff.md new file mode 100644 index 00000000..7292f89e --- /dev/null +++ b/src/hooks/iff/iff.md @@ -0,0 +1,54 @@ +--- +title: iff +description: Execute one or another series of hooks depending on a sync or async predicate. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Boolean | Promise | Function} predicate` +- `{Array< Function >} hookFuncsTrue` +- `{Array< Function >} hookFuncsFalse` + +| Argument | Type | Default | Description | +| ---------------- | :--------------------------------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `predicate` | `Boolean`, `Promise` or `Function` | | Determine if `hookFuncsTrue` or `hookFuncsFalse` should be run. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | +| `hookFuncsTrue` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | +| `hookFuncsFalse` | `Array<` `Function >` | | Sync or async hook functions to run if `false`. They may include other conditional hooks. | + +## Example + +```js +const { discard, iff, isProvider, populate } = require('feathers-hooks-common/index.js'); +const isNotAdmin = adminRole => context => context.params.user.roles.indexOf(adminRole || 'admin') === -1; + +module.exports = { before: { + create: iff( + () => new Promise((resolve, reject) => { ... }), + populate('user', { field: 'authorisedByUserId', service: 'users' }) + ), + + get: [ iff(isNotAdmin(), discard('budget')) ] + + update: + iff(isProvider('server'), + hookA, + iff(isProvider('rest'), hook1, hook2, hook3) + .else(hook4, hook5), + hookB + ) + .else( + iff(hook => hook.path === 'users', hook6, hook7) + ) +} }; +``` + +## Details + +Resolve the predicate, then run one set of hooks sequentially. + +The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. diff --git a/src/hooks/iff/iff.ts b/src/hooks/iff/iff.ts index c996a5be..2bdba9fc 100755 --- a/src/hooks/iff/iff.ts +++ b/src/hooks/iff/iff.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers' -import { iffElse } from './iff-else.js' +import { iffElse } from '../iff-else/iff-else.js' import type { HookFunction, PredicateFn } from '../../types.js' export interface IffHook extends HookFunction { diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 0e505035..96b98d23 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,40 +1,32 @@ -// transform -export * from './transform/transform-data.js' -export * from './transform/transform-result.js' - export * from './cache/cache.js' +export * from './check-required/check-required.js' +export * from './combine/combine.js' export * from './debug/debug.js' export * from './disable-pagination/disable-pagination.js' export * from './disallow/disallow.js' - -// omit -export * from './omit/omit-data.js' -export * from './omit/omit-result.js' -export * from './omit/omit-query.js' - -// iff +export * from './iff-else/iff-else.js' export * from './iff/iff.js' -export * from './iff/iff-else.js' -export * from './iff/unless.js' - -// pick -export * from './pick/pick-data.js' -export * from './pick/pick-result.js' -export * from './pick/pick-query.js' - -export * from './lowercase/lowercase-data.js' -export * from './lowercase/lowercase-result.js' - +export * from './lowercase-data/lowercase-data.js' +export * from './lowercase-result/lowercase-result.js' +export * from './omit-data/omit-data.js' +export * from './omit-query/omit-query.js' +export * from './omit-result/omit-result.js' export * from './params-from-client/params-from-client.js' +export * from './pick-data/pick-data.js' +export * from './pick-query/pick-query.js' +export * from './pick-result/pick-result.js' export * from './prevent-changes/prevent-changes.js' -export * from './check-required/check-required.js' export * from './run-parallel/run-parallel.js' export * from './set-field/set-field.js' - -export * from './set-now/set-now-data.js' -export * from './set-now/set-now-result.js' - +export * from './set-now-data/set-now-data.js' +export * from './set-now-result/set-now-result.js' export * from './set-slug/set-slug.js' export * from './soft-delete/soft-delete.js' export * from './stash-before/stash-before.js' +export * from './throw-if-is-multi/throw-if-is-multi.js' +export * from './throw-if-is-provider/throw-if-is-provider.js' +export * from './throw-if/throw-if.js' +export * from './transform-data/transform-data.js' +export * from './transform-result/transform-result.js' export * from './traverse/traverse.js' +export * from './unless/unless.js' diff --git a/src/hooks/lowercase-data/lowercase-data.md b/src/hooks/lowercase-data/lowercase-data.md new file mode 100644 index 00000000..d849b1ba --- /dev/null +++ b/src/hooks/lowercase-data/lowercase-data.md @@ -0,0 +1,28 @@ +--- +title: lowercaseData +description: Convert certain field values to lower case. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | --------------------------------------------------------------------- | +| fieldNames | dot notation | The fields in the record(s) whose values are converted to lower case. | + +## Example + +```js +const { lowerCase } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { create: lowerCase('email', 'username', 'div.dept') } }; +``` + +## Details + +Update either `context.data` (before hook) or `context.result[.data]` (after hook). diff --git a/src/hooks/lowercase/lowercase-data.test.ts b/src/hooks/lowercase-data/lowercase-data.test.ts similarity index 100% rename from src/hooks/lowercase/lowercase-data.test.ts rename to src/hooks/lowercase-data/lowercase-data.test.ts diff --git a/src/hooks/lowercase/lowercase-data.ts b/src/hooks/lowercase-data/lowercase-data.ts similarity index 92% rename from src/hooks/lowercase/lowercase-data.ts rename to src/hooks/lowercase-data/lowercase-data.ts index 17869c6f..af05d1db 100755 --- a/src/hooks/lowercase/lowercase-data.ts +++ b/src/hooks/lowercase-data/lowercase-data.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/lowercase-result/lowercase-result.md b/src/hooks/lowercase-result/lowercase-result.md new file mode 100644 index 00000000..bc30197f --- /dev/null +++ b/src/hooks/lowercase-result/lowercase-result.md @@ -0,0 +1,28 @@ +--- +title: lowercaseResult +description: Convert certain field values to lower case. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | --------------------------------------------------------------------- | +| fieldNames | dot notation | The fields in the record(s) whose values are converted to lower case. | + +## Example + +```js +const { lowerCase } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { create: lowerCase('email', 'username', 'div.dept') } }; +``` + +## Details + +Update either `context.data` (before hook) or `context.result[.data]` (after hook). diff --git a/src/hooks/lowercase/lowercase-result.test.ts b/src/hooks/lowercase-result/lowercase-result.test.ts similarity index 100% rename from src/hooks/lowercase/lowercase-result.test.ts rename to src/hooks/lowercase-result/lowercase-result.test.ts diff --git a/src/hooks/lowercase/lowercase-result.ts b/src/hooks/lowercase-result/lowercase-result.ts similarity index 93% rename from src/hooks/lowercase/lowercase-result.ts rename to src/hooks/lowercase-result/lowercase-result.ts index b1118712..d37c0fcd 100755 --- a/src/hooks/lowercase/lowercase-result.ts +++ b/src/hooks/lowercase-result/lowercase-result.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformResult } from '../transform/transform-result.js' +import { transformResult } from '../transform-data/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/omit/omit-data-1.test.ts b/src/hooks/omit-data/omit-data-1.test.ts similarity index 100% rename from src/hooks/omit/omit-data-1.test.ts rename to src/hooks/omit-data/omit-data-1.test.ts diff --git a/src/hooks/omit-data/omit-data.md b/src/hooks/omit-data/omit-data.md new file mode 100644 index 00000000..bb502b37 --- /dev/null +++ b/src/hooks/omit-data/omit-data.md @@ -0,0 +1,33 @@ +--- +title: omitData +description: Delete certain fields from the record(s). +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +> **Note:** The discard hook will remove fields even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), discard(...))`. + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | --------------------------------------------------------- | +| fieldNames | dot notation | One or more fields you want to remove from the record(s). | + +## Example + +```js +const { discard, iff, isProvider } = require('feathers-hooks-common/index.js'); + +module.exports = { + after: { all: iff(isProvider('external'), discard('password', 'address.city')) }, +}; +``` + +## Details + +Delete the fields either from `context.data` (before hook) or `context.result[.data]` (after hook). +They are not modified if they are not an object, so a `null` value is supported. diff --git a/src/hooks/omit/omit-data.test.ts b/src/hooks/omit-data/omit-data.test.ts similarity index 100% rename from src/hooks/omit/omit-data.test.ts rename to src/hooks/omit-data/omit-data.test.ts diff --git a/src/hooks/omit/omit-data.ts b/src/hooks/omit-data/omit-data.ts similarity index 84% rename from src/hooks/omit/omit-data.ts rename to src/hooks/omit-data/omit-data.ts index 4ac055db..49c86ebf 100755 --- a/src/hooks/omit/omit-data.ts +++ b/src/hooks/omit-data/omit-data.ts @@ -1,5 +1,5 @@ import _omit from 'lodash/omit.js' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/omit-query/omit-query.md b/src/hooks/omit-query/omit-query.md new file mode 100644 index 00000000..fc0916b0 --- /dev/null +++ b/src/hooks/omit-query/omit-query.md @@ -0,0 +1,30 @@ +--- +title: omitQuery +description: Delete certain fields from the query object. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['all'] + multi: true +--- + +> **Note:** The discardQuery hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), discardQuery(...))`. + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | ----------------------------------------------------- | +| fieldNames | dot notation | One or more fields you want to remove from the query. | + +## Example + +```js +const { discardQuery, iff, isProvider } = require('feathers-hooks-common/index.js'); + +module.exports = { after: { all: iff(isProvider('external'), discardQuery('secret')) } }; +``` + +## Details + +Delete the fields from `context.params.query`. diff --git a/src/hooks/omit/omit-query.test.ts b/src/hooks/omit-query/omit-query.test.ts similarity index 100% rename from src/hooks/omit/omit-query.test.ts rename to src/hooks/omit-query/omit-query.test.ts diff --git a/src/hooks/omit/omit-query.ts b/src/hooks/omit-query/omit-query.ts similarity index 100% rename from src/hooks/omit/omit-query.ts rename to src/hooks/omit-query/omit-query.ts diff --git a/src/hooks/omit/omit-result-1.test.ts b/src/hooks/omit-result/omit-result-1.test.ts similarity index 100% rename from src/hooks/omit/omit-result-1.test.ts rename to src/hooks/omit-result/omit-result-1.test.ts diff --git a/src/hooks/omit/omit-result-2.test.ts b/src/hooks/omit-result/omit-result-2.test.ts similarity index 100% rename from src/hooks/omit/omit-result-2.test.ts rename to src/hooks/omit-result/omit-result-2.test.ts diff --git a/src/hooks/omit-result/omit-result.md b/src/hooks/omit-result/omit-result.md new file mode 100644 index 00000000..900657fc --- /dev/null +++ b/src/hooks/omit-result/omit-result.md @@ -0,0 +1,9 @@ +--- +title: omitResult +description: Omit certain fields from the result. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- diff --git a/src/hooks/omit/omit-result.test.ts b/src/hooks/omit-result/omit-result.test.ts similarity index 100% rename from src/hooks/omit/omit-result.test.ts rename to src/hooks/omit-result/omit-result.test.ts diff --git a/src/hooks/omit/omit-result.ts b/src/hooks/omit-result/omit-result.ts similarity index 88% rename from src/hooks/omit/omit-result.ts rename to src/hooks/omit-result/omit-result.ts index 91b375d5..0334052f 100755 --- a/src/hooks/omit/omit-result.ts +++ b/src/hooks/omit-result/omit-result.ts @@ -1,5 +1,5 @@ import _omit from 'lodash/omit.js' -import { transformResult } from '../transform/transform-result.js' +import { transformResult } from '../transform-data/transform-result.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' import type { DispatchOption } from '../../types.js' diff --git a/src/hooks/params-for-server/params-for-server.md b/src/hooks/params-for-server/params-for-server.md new file mode 100644 index 00000000..39656020 --- /dev/null +++ b/src/hooks/params-for-server/params-for-server.md @@ -0,0 +1,9 @@ +--- +title: paramsForServer +description: Add or modify parameters for the server. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- diff --git a/src/hooks/params-for-server/params-for-server.ts b/src/hooks/params-for-server/params-for-server.ts index 62fa33d5..48535f5e 100644 --- a/src/hooks/params-for-server/params-for-server.ts +++ b/src/hooks/params-for-server/params-for-server.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' @@ -25,7 +25,7 @@ export const paramsForServer = ( const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {} - return (context: H) => { + return (context: H, next?: NextFunction) => { // clone params on demand let clonedParams: any @@ -57,6 +57,10 @@ export const paramsForServer = ( context.params = clonedParams } + if (next) { + return next() + } + return context } } diff --git a/src/hooks/params-from-client/params-from-client.md b/src/hooks/params-from-client/params-from-client.md new file mode 100644 index 00000000..43d1c552 --- /dev/null +++ b/src/hooks/params-from-client/params-from-client.md @@ -0,0 +1,46 @@ +--- +title: paramsFromClient +description: Pass `context.params` from client to server. Server hook. +category: hooks +hook: + type: ['before', 'around'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Array< String > | String} whitelist` + +| Argument | Type | Default | Description | +| ----------- | :----------: | ------- | ------------------------------------------------------------------------------------------------------------ | +| `whitelist` | dot notation | | Names of the props permitted to be in `context.params`. Other props are ignored. This is a security feature. | + +## Example + +```js +// client +const { paramsForServer } = require('feathers-hooks-common/index.js'); + +service.update( + id, + data, + paramsForServer({ query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' }), +); + +// server +const { paramsFromClient } = require('feathers-hooks-common/index.js'); + +module.exports = { + before: { all: [paramsFromClient('populate', 'serialize', 'otherProp'), myHook] }, +}; + +// myHook's `context.params` will now be +// { query: { dept: 'a' }, populate: 'po-1', serialize: 'po-mgr' } } +``` + +## Details + +By default, only the `context.params.query` object is transferred from a Feathers client to the server, for security among other reasons. However you can explicitly transfer other `context.params` props with the client utility function `paramsForServer` in conjunction with the `paramsFromClient` hook on the server. + +This technique also works for service calls made on the server. diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts index fa4ab08b..746d2ce0 100644 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-server.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' @@ -13,10 +13,10 @@ export type paramsFromClientOptions = { export const paramsFromClient = ( whitelist: MaybeArray, options?: paramsFromClientOptions, -): ((context: HookContext) => HookContext) => { +) => { const whitelistArr = toArray(whitelist) const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {} - return (context: HookContext): HookContext => { + return (context: HookContext, next?: NextFunction) => { if ( !context.params?.query?.[keyToHide] || typeof context.params.query[keyToHide] !== 'object' @@ -49,6 +49,10 @@ export const paramsFromClient = ( context.params = params + if (next) { + return next() + } + return context } } diff --git a/src/hooks/pick-data/pick-data.md b/src/hooks/pick-data/pick-data.md new file mode 100644 index 00000000..2762e38f --- /dev/null +++ b/src/hooks/pick-data/pick-data.md @@ -0,0 +1,31 @@ +--- +title: pickData +description: Keep certain fields in the record(s), deleting the rest. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +> **Note:** The keep hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keep(...))`. + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | -------------------------------------------------- | +| fieldNames | dot notation | The only fields you want to keep in the record(s). | + +## Example + +```js +const { keep } = require('feathers-hooks-common/index.js'); + +module.exports = { after: { create: keep('name', 'dept', 'address.city') } }; +``` + +## Details + +Update either `context.data` (before hook) or `context.result[.data]` (after hook). +Their values are returned if they are not an object, so a `null` value is supported. diff --git a/src/hooks/pick/pick-data.test.ts b/src/hooks/pick-data/pick-data.test.ts similarity index 100% rename from src/hooks/pick/pick-data.test.ts rename to src/hooks/pick-data/pick-data.test.ts diff --git a/src/hooks/pick/pick-data.ts b/src/hooks/pick-data/pick-data.ts similarity index 88% rename from src/hooks/pick/pick-data.ts rename to src/hooks/pick-data/pick-data.ts index 53b9d112..87fd9ce9 100755 --- a/src/hooks/pick/pick-data.ts +++ b/src/hooks/pick-data/pick-data.ts @@ -1,5 +1,5 @@ import _pick from 'lodash/pick.js' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/pick-query/pick-query.md b/src/hooks/pick-query/pick-query.md new file mode 100644 index 00000000..b77de53c --- /dev/null +++ b/src/hooks/pick-query/pick-query.md @@ -0,0 +1,30 @@ +--- +title: pickQuery +description: Keep certain fields in the query object, deleting the rest. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +> **Note:** The keepQuery hook will remove any fields not specified even if the service is being called from the server. You may want to condition the hook to run only for external transports, e.g. `iff(isProvider('external'), keepQuery(...))`. + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | ----------------------------------------------------- | +| fieldNames | dot notation | The only fields you want to keep in the query object. | + +## Example + +```js +const { keepQuery } = require('feathers-hooks-common/index.js'); + +module.exports = { after: { create: keepQuery('name', 'address.city') } }; +``` + +## Details + +Updates `context.params.query`. diff --git a/src/hooks/pick/pick-query.test.ts b/src/hooks/pick-query/pick-query.test.ts similarity index 100% rename from src/hooks/pick/pick-query.test.ts rename to src/hooks/pick-query/pick-query.test.ts diff --git a/src/hooks/pick/pick-query.ts b/src/hooks/pick-query/pick-query.ts similarity index 100% rename from src/hooks/pick/pick-query.ts rename to src/hooks/pick-query/pick-query.ts diff --git a/src/hooks/pick-result/pick-result.md b/src/hooks/pick-result/pick-result.md new file mode 100644 index 00000000..ebd11870 --- /dev/null +++ b/src/hooks/pick-result/pick-result.md @@ -0,0 +1,9 @@ +--- +title: pickResult +description: Pick certain fields from the result. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- diff --git a/src/hooks/pick/pick-result.test.ts b/src/hooks/pick-result/pick-result.test.ts similarity index 100% rename from src/hooks/pick/pick-result.test.ts rename to src/hooks/pick-result/pick-result.test.ts diff --git a/src/hooks/pick/pick-result.ts b/src/hooks/pick-result/pick-result.ts similarity index 91% rename from src/hooks/pick/pick-result.ts rename to src/hooks/pick-result/pick-result.ts index 58e77a90..eec84b69 100755 --- a/src/hooks/pick/pick-result.ts +++ b/src/hooks/pick-result/pick-result.ts @@ -1,6 +1,6 @@ import _pick from 'lodash/pick.js' -import { transformResult } from '../transform/transform-result.js' +import { transformResult } from '../transform-data/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/prevent-changes/prevent-changes.md b/src/hooks/prevent-changes/prevent-changes.md new file mode 100644 index 00000000..c926ffe2 --- /dev/null +++ b/src/hooks/prevent-changes/prevent-changes.md @@ -0,0 +1,31 @@ +--- +title: preventChanges +description: Prevent patch service calls from changing certain fields. +category: hooks +hook: + type: ['before', 'around'] + method: ['patch'] + multi: true +--- + +## Arguments + +- `{Boolean} ifThrow` +- `{Array < String >} fieldNames` + +| Argument | Type | Default | Description | +| ------------ | :----------: | ------- | ------------------------------------------------------ | +| `ifThrow` | `Boolean` | | Deletes any `fieldNames` if `false`; throws if `true`. | +| `fieldNames` | dot notation | | The fields names which may not be patched. | + +## Example + +```js +const { preventChanges } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { patch: preventChanges(true, 'security.badge') } }; +``` + +## Details + +Consider using validateSchema if you would rather specify which fields are allowed to change. diff --git a/src/hooks/prevent-changes/prevent-changes.ts b/src/hooks/prevent-changes/prevent-changes.ts index 0fbf5daa..fd81d4fe 100755 --- a/src/hooks/prevent-changes/prevent-changes.ts +++ b/src/hooks/prevent-changes/prevent-changes.ts @@ -2,7 +2,7 @@ import _has from 'lodash/has.js' import _omit from 'lodash/omit.js' import type { FeathersError } from '@feathersjs/errors' import { BadRequest } from '@feathersjs/errors' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/run-parallel/run-parallel.md b/src/hooks/run-parallel/run-parallel.md new file mode 100644 index 00000000..327d2a7a --- /dev/null +++ b/src/hooks/run-parallel/run-parallel.md @@ -0,0 +1,42 @@ +--- +title: runParallel +description: Run a hook in parallel to the other hooks and the service call. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Function} hookFunc` +- `{Function} clone` +- `{Number} [ depth ]` + +| Argument | Type | Default | Description | +| ---------- | :--------: | :-----: | ------------------------------------------------------------------------------------------------------------------- | +| `hookFunc` | `Function` | | The hook function to run in parallel to the rest of the service call. | +| `clone` | `Function` | | Function to deep clone its only parameter. | +| `depth` | `Number` | 6 | Depth to which `context` is to be cloned. 0 does not clone. A depth of 5 would clone `context.result.data.[].item`. | + +## Example + +```js +const { runParallel } = require('feathers-hooks-common/index.js'); +const clone = require('clone'); + +function sendEmail(...) { + return context => { ... }; +} + +module.exports = { after: { + create: runParallel(sendEmail(...), clone) +} }; +``` + +## Details + +`hookFunc` is scheduled with a `setTimeout`. The next hook starts immediately. + +The hook was provided by bedeoverend. Thank you. diff --git a/src/hooks/set-field/set-field.md b/src/hooks/set-field/set-field.md new file mode 100644 index 00000000..17aac04f --- /dev/null +++ b/src/hooks/set-field/set-field.md @@ -0,0 +1,88 @@ +--- +title: setField +description: The `setField` hook allows to set a field on the hook context based on the value of another field on the hook context. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['all'] + multi: true +--- + +### Options + +- `from` _required_ - The property on the hook context to use. Can be an array (e.g. `[ 'params', 'user', 'id' ]`) or a dot separated string (e.g. `'params.user.id'`). +- `as` _required_ - The property on the hook context to set. Can be an array (e.g. `[ 'params', 'query', 'userId' ]`) or a dot separated string (e.g. `'params.query.userId'`). +- `allowUndefined` (default: `false`) - If set to `false`, an error will be thrown if the value of `from` is `undefined` in an external request (`params.provider` is set). On internal calls (or if set to true `true` for external calls) the hook will do nothing. + +> **Important:** This hook should be used after the [authenticate hook](https://docs.feathersjs.com/api/authentication/hook.html#authenticate-options) when accessing user fields (from `params.user`). + +**Note:** When the service enable `multi:true` and `data` is an array data type, this hook may working to an unexpected result + +### Examples + +Limit all external access of the `users` service to the authenticated user: + +> **Note:** For MongoDB, Mongoose and NeDB `params.user.id` needs to be changed to `params.user._id`. For any other custom id accordingly. + +```js +const { authenticate } = require('@feathersjs/authentication'); +const { setField } = require('feathers-hooks-common/index.js'); + +app.service('users').hooks({ + before: { + all: [authenticate('jwt'), setField({ from: 'params.user.id', as: 'params.query.id' })], + }, +}); +``` + +Only allow access to invoices for the users organization: + +```js +const { authenticate } = require('@feathersjs/authentication'); +const { setField } = require('feathers-hooks-common/index.js'); + +app.service('invoices').hooks({ + before: { + all: [ + authenticate('jwt'), + setField({ from: 'params.user.organizationId', as: 'params.query.organizationId' }), + ], + }, +}); +``` + +Set the current user id as `userId` when creating a message and only allow users to edit and remove their own messages: + +```js +const { authenticate } = require('@feathersjs/authentication'); +const { setField } = require('feathers-hooks-common/index.js'); + +const setUserId = setField({ + from: 'params.user.id', + as: 'data.userId' +}); +const limitToUser = setField({ + from: 'params.user.id', + as: 'params.query.userId' +}); + +app.service('messages').hooks({ + before: { + all: [ + authenticate('jwt') + ], + create: [ + setUserId + ], + patch: [ + limitToUser + ], + update: [ + limitToUser + ] + remove: [ + limitToUser + ] + } +}) +``` diff --git a/src/hooks/set-now-data/set-now-data.md b/src/hooks/set-now-data/set-now-data.md new file mode 100644 index 00000000..7ef04fd0 --- /dev/null +++ b/src/hooks/set-now-data/set-now-data.md @@ -0,0 +1,28 @@ +--- +title: setNowData +description: Create/update certain fields to the current date-time. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- + +- Arguments + - `{Array < String >} fieldNames` + +| Name | Type | Description | +| ---------- | ------------ | ---------------------------------------------------------------- | +| fieldNames | dot notation | The fields that you want to add or set to the current date-time. | + +## Example + +```js +const { setNow } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { create: setNow('createdAt', 'updatedAt') } }; +``` + +## Details + +Update either `context.data` (before hook) or `context.result[.data]` (after hook). diff --git a/src/hooks/set-now/set-now-data.test.ts b/src/hooks/set-now-data/set-now-data.test.ts similarity index 100% rename from src/hooks/set-now/set-now-data.test.ts rename to src/hooks/set-now-data/set-now-data.test.ts diff --git a/src/hooks/set-now/set-now-data.ts b/src/hooks/set-now-data/set-now-data.ts similarity index 89% rename from src/hooks/set-now/set-now-data.ts rename to src/hooks/set-now-data/set-now-data.ts index 7ea61159..799a8ce5 100755 --- a/src/hooks/set-now/set-now-data.ts +++ b/src/hooks/set-now-data/set-now-data.ts @@ -1,6 +1,6 @@ import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import _set from 'lodash/set.js' /** diff --git a/src/hooks/set-now-result/set-now-result.md b/src/hooks/set-now-result/set-now-result.md new file mode 100644 index 00000000..3c5b006f --- /dev/null +++ b/src/hooks/set-now-result/set-now-result.md @@ -0,0 +1,9 @@ +--- + +title: setNowResult +description: Set the current date/time on certain fields in the result. +category: hooks +hook: +type: ['before', 'after', 'around'] +method: ['find', 'get', 'create', 'update', 'patch', 'remove'] +multi: true diff --git a/src/hooks/set-now/set-now-result.test.ts b/src/hooks/set-now-result/set-now-result.test.ts similarity index 100% rename from src/hooks/set-now/set-now-result.test.ts rename to src/hooks/set-now-result/set-now-result.test.ts diff --git a/src/hooks/set-now/set-now-result.ts b/src/hooks/set-now-result/set-now-result.ts similarity index 91% rename from src/hooks/set-now/set-now-result.ts rename to src/hooks/set-now-result/set-now-result.ts index 7c2f16c6..10c978e3 100755 --- a/src/hooks/set-now/set-now-result.ts +++ b/src/hooks/set-now-result/set-now-result.ts @@ -1,5 +1,5 @@ import _set from 'lodash/set.js' -import { transformResult } from '../transform/transform-result.js' +import { transformResult } from '../transform-data/transform-result.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' import type { DispatchOption } from '../../types.js' diff --git a/src/hooks/set-slug/set-slug.md b/src/hooks/set-slug/set-slug.md new file mode 100644 index 00000000..fa6748b7 --- /dev/null +++ b/src/hooks/set-slug/set-slug.md @@ -0,0 +1,42 @@ +--- +title: setSlug +description: Set slugs in URL, e.g. /stores/:storeId. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{String} slug` +- `{String} [ fieldName ]` + +| Argument | Type | Default | Description | +| ----------- | :------: | ------------- | ---------------------------------------------------------------------------------- | +| `slug` | `String` | | The slug as it appears in the route, e.g. `storeId` for`/stores/:storeId/candies`. | +| `fieldName` | `String` | `query[slug]` | The field to contain the slug value. | + +## Example + +```js +const { setSlug } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { all: [hooks.setSlug('storeId')] } }; + +// `context.params.query` will always be normalized, +// e.g. `{ size: 'large', storeId: '123' }` +``` + +## Details + +A service may have a slug in its URL, e.g. `storeId` in `app.use(` `'/stores/:storeId/candies',` `new Service());`. The service gets slightly different values depending on the transport used by the client. + +| transport | `hook.data` `.storeId` | `hook.params` `.query` | code run on client | +| --------- | ---------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------- | +| socketio | `undefined` | `{ size: 'large',` `storeId: '123' }` | `candies.create({ name: 'Gummi',qty: 100 },` `{ query: { size: 'large', storeId: '123' } })` | +| rest | `:storeId` | same as above | same as above | +| raw HTTP | `123` | `{ size: 'large' }` | `fetch('/stores/123/candies?size=large', ..` | + +This hook normalizes the difference between the transports. diff --git a/src/hooks/soft-delete/soft-delete.md b/src/hooks/soft-delete/soft-delete.md new file mode 100644 index 00000000..3516e01e --- /dev/null +++ b/src/hooks/soft-delete/soft-delete.md @@ -0,0 +1,66 @@ +--- +title: softDelete +description: Flag records as logically deleted instead of physically removing them. Requires a Feathers v4 or later database adapter. +category: hooks +hook: + type: ['before', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- + +## Arguments + +| Argument | Type | Default | Description | | +| -------------- | --------- | ------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `deletedQuery` | `Function | Object` | `{ deleted: { $ne: true } }` | An object or async function that takes the query which returns the part of the query to exclude deleted entrie | +| `removeData` | `Function | Object` | `{ deleted: true }` | An object or async function that returns the data used to flag an entry as deleted | + +By default, `softDelete` queries for a `deleted` property not set to `true` (meaning it can either exist or be anything else). + +Setting `params.disableSoftDelete` to `true` allows to skip the `softDelete` hook. + +## Example + +Basic usage: + +```js +const { softDelete } = require('feathers-hooks-common/index.js'); + +// Use standard softDelete which uses `deleted: true` +app.service('people').hooks({ before: { all: [softDelete()] } }); + +// will set `deleted: true` for entry with id 1 +app.service('people').remove(1); + +// Will find all people where `deleted` is not `true` +let people = app.service('people').find(); + +// `get`, `patch`, `update` or `remove` on a deleted entry will throw NotFound +app.service('people').get(1); +``` + +Customizing `deletedQuery` and `removeData` to e.g. use `deletedAt`: + +```js +// Use deletedAt and set when the entry was deleted +app.service('people').hooks({ + before: { + all: [ + hooks.softDelete({ + // context is the normal hook context + deletedQuery: async context => { + return { deletedAt: null }; + }, + removeData: async context => { + return { deletedAt: new Date() }; + }, + }), + ], + create: [ + context => { + context.data.deletedAt = null; + }, + ], + }, +}); +``` diff --git a/src/hooks/stash-before/stash-before.md b/src/hooks/stash-before/stash-before.md new file mode 100644 index 00000000..c230791c --- /dev/null +++ b/src/hooks/stash-before/stash-before.md @@ -0,0 +1,37 @@ +--- +title: stashBefore +description: Stash current value of record, usually before mutating it. Performs a get call. +category: hooks +hook: + type: ['before', 'around'] + method: ['get', 'update', 'patch', 'remove'] + multi: true +--- + +## Arguments + +- `{String} fieldName` + +| Argument | Type | Default | Description | +| ----------- | :--: | ---------- | ------------------------------------------------------------------------------ | +| `fieldName` | | `'before'` | The name of the `context.params` property to contain the current record value. | + +## Example + +```js +const { stashBefore } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { patch: stashBefore() } }; +``` + +## Details + +The hook performs its own preliminary `get` call. If the original service call is also a `get`, its `context.params` is used for the preliminary `get`. The preliminary `get` will be skipped if `params.disableStashBefore` is truthy. + +For any other method the calling params are formed from the original calling context: + +```js +{ provider: context.params.provider, + authenticated: context.params.authenticated, + user: context.params.user } +``` diff --git a/src/hooks/throw-if-is-multi/throw-if-is-multi.md b/src/hooks/throw-if-is-multi/throw-if-is-multi.md new file mode 100644 index 00000000..4430acfe --- /dev/null +++ b/src/hooks/throw-if-is-multi/throw-if-is-multi.md @@ -0,0 +1,9 @@ +--- +title: throwIfIsMulti +description: Throw an error if the hook is called with multiple records. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- diff --git a/src/hooks/throw-if/throw-if-is-multi.test.ts b/src/hooks/throw-if-is-multi/throw-if-is-multi.test.ts similarity index 100% rename from src/hooks/throw-if/throw-if-is-multi.test.ts rename to src/hooks/throw-if-is-multi/throw-if-is-multi.test.ts diff --git a/src/hooks/throw-if/throw-if-is-multi.ts b/src/hooks/throw-if-is-multi/throw-if-is-multi.ts similarity index 100% rename from src/hooks/throw-if/throw-if-is-multi.ts rename to src/hooks/throw-if-is-multi/throw-if-is-multi.ts diff --git a/src/hooks/throw-if-is-provider/throw-if-is-provider.md b/src/hooks/throw-if-is-provider/throw-if-is-provider.md new file mode 100644 index 00000000..7c0dbfaf --- /dev/null +++ b/src/hooks/throw-if-is-provider/throw-if-is-provider.md @@ -0,0 +1,9 @@ +--- +title: throwIfIsProvider +description: Throw an error if the hook is called with a specific provider. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- diff --git a/src/hooks/throw-if/throw-if-is-provider.test.ts b/src/hooks/throw-if-is-provider/throw-if-is-provider.test.ts similarity index 100% rename from src/hooks/throw-if/throw-if-is-provider.test.ts rename to src/hooks/throw-if-is-provider/throw-if-is-provider.test.ts diff --git a/src/hooks/throw-if/throw-if-is-provider.ts b/src/hooks/throw-if-is-provider/throw-if-is-provider.ts similarity index 100% rename from src/hooks/throw-if/throw-if-is-provider.ts rename to src/hooks/throw-if-is-provider/throw-if-is-provider.ts diff --git a/src/hooks/throw-if/throw-if.md b/src/hooks/throw-if/throw-if.md new file mode 100644 index 00000000..56b35554 --- /dev/null +++ b/src/hooks/throw-if/throw-if.md @@ -0,0 +1,9 @@ +--- +title: throwIf +description: Throw an error if the hook is called with certain conditions. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['create', 'update', 'patch'] + multi: true +--- diff --git a/src/hooks/transform-data/transform-data.md b/src/hooks/transform-data/transform-data.md new file mode 100644 index 00000000..163ff5ee --- /dev/null +++ b/src/hooks/transform-data/transform-data.md @@ -0,0 +1,81 @@ +--- +title: transformData +description: Make changes to data or result items. Very flexible. +category: hooks +hook: + type: ['before', 'around'] + method: ['create', 'update', 'patch', 'remove'] + multi: true + source: +--- + +## Arguments + +- `{Function} func` + +| Argument | Type | Default | Description | +| -------- | :--------: | --------------------------- | --------------------------------------------- | +| `func` | `Function` | `(item,` `context) =>` `{}` | Function modifies `item` in place. See below. | + +- **returns** + +The mutated `item`. Returning `undefined` means the `item` in the parameters was mutated in place. returns result `undefined || item` + +## Example + +```js +const { alterItems } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { + all: [ + alterItems(rec => { delete rec.password; }) // Like `discard('password')`. + alterItems(rec => rec.email = email.lowerCase()), // Like `lowerCase('email')`. + ], +} }; +``` + +Async mutations can be handled with async/await: + +```js +alterItems(rec => { + rec.userRecord = (async () => await service.get(...) )() +}) +``` + +You can also perform async mutations using Promises by returning a Promise that is resolved once all mutations are complete: + +```js +alterItems(rec => new Promise(resolve => { + service.get(...).then(result => { + rec.userRecord = result; + resolve(); +}}); +``` + +You can also perform async mutations using Promises by returning a Promise that is resolved once all mutations are complete: + +```js +alterItems(async rec => { + rec.userRecord = await service.get(...); +}) +``` + +## Details + +The declarative nature of most of the common hooks, e.g. `discard('password')`, requires you to remember the names of a fair number of hooks, their parameters, and any possible nuances. + +The `alterItems` hook offers an imperative alternative where you directly alter the items. It allows you to reduce the number of trivial hooks you have to register, and you are aware of exactly what your `alterItems` hooks do. + +`func` is called for each item in `context.data` (before hook) or `context.result[.data]` (after hook). It receives the parameters + +- `{Object} item` +- `{Object} context` + +| Argument | Type | Description | +| --------- | :------: | ---------------------------------------------------------------------- | +| `item` | `Object` | The item. The function modifies it in place. | +| `context` | `Object` | The current context. It contains any alterations made to items so far. | + +- **Returns** + + `func` may alternatively return a replacement `item` rather than `undefined`. This is a convenience feature which permits, for example, use of functions from the [Lodash](https://lodash.com/) library, as such functions tend to return new objects. diff --git a/src/hooks/transform/transform-data.test.ts b/src/hooks/transform-data/transform-data.test.ts similarity index 100% rename from src/hooks/transform/transform-data.test.ts rename to src/hooks/transform-data/transform-data.test.ts diff --git a/src/hooks/transform/transform-data.ts b/src/hooks/transform-data/transform-data.ts similarity index 100% rename from src/hooks/transform/transform-data.ts rename to src/hooks/transform-data/transform-data.ts diff --git a/src/hooks/transform-result/transform-result.md b/src/hooks/transform-result/transform-result.md new file mode 100644 index 00000000..6448ee93 --- /dev/null +++ b/src/hooks/transform-result/transform-result.md @@ -0,0 +1,9 @@ +--- +title: transformResult +description: Transform the result of a service method. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- diff --git a/src/hooks/transform/transform-result.test.ts b/src/hooks/transform-result/transform-result.test.ts similarity index 100% rename from src/hooks/transform/transform-result.test.ts rename to src/hooks/transform-result/transform-result.test.ts diff --git a/src/hooks/transform/transform-result.ts b/src/hooks/transform-result/transform-result.ts similarity index 100% rename from src/hooks/transform/transform-result.ts rename to src/hooks/transform-result/transform-result.ts diff --git a/src/hooks/traverse/traverse.md b/src/hooks/traverse/traverse.md new file mode 100644 index 00000000..0e20fb62 --- /dev/null +++ b/src/hooks/traverse/traverse.md @@ -0,0 +1,50 @@ +--- +title: traverse +description: Transform fields & objects in place in the record(s) using a recursive walk. Powerful. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- + +## Arguments + +- `{Function} transformer` +- `{Function} [ getObject ]` + +| Argument | Type | Default | Description | +| ------------- | :--------: | ----------------------------------------- | ----------------------------------------------------------------------------- | +| `transformer` | `Function` | | Called for every node in every record(s). May change the node in place. | +| `getObject` | `Function` | `context.data` or `context.result[.data]` | Function with signature `context => {}` which returns the object to traverse. | + +## Example + +```js +const { traverse } = require('feathers-hooks-common/index.js'); + +// Trim strings +const trimmer = function (node) { + if (typeof node === 'string') { + this.update(node.trim()); + } +}; + +// REST HTTP request may use the string 'null' in its query string. +// Replace these strings with the value null. +const nuller = function (node) { + if (node === 'null') { + this.update(null); + } +}; + +module.exports = { + before: { create: traverse(trimmer), find: traverse(nuller, context => context.params.query) }, +}; +``` + +## Details + +Traverse and transform objects in place by visiting every node on a recursive walk. Any object in the hook may be traversed, including the query object. + +> [traverse (NPM)](https://npmjs.com/package/traverse) documents the extensive methods and context available to the transformer function. diff --git a/src/hooks/traverse/traverse.ts b/src/hooks/traverse/traverse.ts index f8fe74f3..6571efd9 100755 --- a/src/hooks/traverse/traverse.ts +++ b/src/hooks/traverse/traverse.ts @@ -1,4 +1,4 @@ -import type { HookContext } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { traverse as _traverse } from '../../common/index.js' import type { SyncContextFunction } from '../../types.js' import { getItems } from '../../utils/index.js' @@ -12,11 +12,16 @@ export function traverse( transformer: (transformContext: any) => any, getObject?: SyncContextFunction, ) { - return (context: H) => { + return (context: H, next?: NextFunction) => { const items = typeof getObject === 'function' ? getObject(context) : getObject || getItems(context) _traverse(items, transformer) + + if (next) { + return next() + } + return context } } diff --git a/src/hooks/trim-data/trim-data.md b/src/hooks/trim-data/trim-data.md new file mode 100644 index 00000000..7fa9d7d6 --- /dev/null +++ b/src/hooks/trim-data/trim-data.md @@ -0,0 +1,9 @@ +--- +title: trimData +description: Trim whitespace from string fields in the result. +category: hooks +hook: + type: ['before', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- diff --git a/src/hooks/trim/trim-data.test.ts b/src/hooks/trim-data/trim-data.test.ts similarity index 100% rename from src/hooks/trim/trim-data.test.ts rename to src/hooks/trim-data/trim-data.test.ts diff --git a/src/hooks/trim/trim-data.ts b/src/hooks/trim-data/trim-data.ts similarity index 92% rename from src/hooks/trim/trim-data.ts rename to src/hooks/trim-data/trim-data.ts index 675d84c7..ab29f9e1 100755 --- a/src/hooks/trim/trim-data.ts +++ b/src/hooks/trim-data/trim-data.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformData } from '../transform/transform-data.js' +import { transformData } from '../transform-data/transform-data.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/trim-result/trim-result.md b/src/hooks/trim-result/trim-result.md new file mode 100644 index 00000000..c2791993 --- /dev/null +++ b/src/hooks/trim-result/trim-result.md @@ -0,0 +1,9 @@ +--- +title: trimResult +description: Trim string properties in the result. +category: hooks +hook: + type: ['before', 'after', 'around'] + method: ['find', 'get', 'create', 'update', 'patch', 'remove'] + multi: true +--- diff --git a/src/hooks/trim/trim-result.test.ts b/src/hooks/trim-result/trim-result.test.ts similarity index 100% rename from src/hooks/trim/trim-result.test.ts rename to src/hooks/trim-result/trim-result.test.ts diff --git a/src/hooks/trim/trim-result.ts b/src/hooks/trim-result/trim-result.ts similarity index 93% rename from src/hooks/trim/trim-result.ts rename to src/hooks/trim-result/trim-result.ts index 3bf0f0ce..f32e3fd0 100755 --- a/src/hooks/trim/trim-result.ts +++ b/src/hooks/trim-result/trim-result.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformResult } from '../transform/transform-result.js' +import { transformResult } from '../transform-data/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/unless/unless.md b/src/hooks/unless/unless.md new file mode 100644 index 00000000..3bca03fe --- /dev/null +++ b/src/hooks/unless/unless.md @@ -0,0 +1,42 @@ +--- +title: unless +description: Execute a series of hooks if a sync or async predicate is falsey. +category: hooks +hook: + type: ['before', 'after'] + method: ['all'] + multi: true +--- + +## Arguments + +- `{Boolean | Promise | Function} predicate` +- `{Array< Function >} hookFuncs` + +| Argument | Type | Default | Description | +| ----------- | :--------------------------------: | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `predicate` | `Boolean`, `Promise` or `Function` | | Run `hookFunc` if the `predicate` is false. If a function, `predicate` is called with the `context` as its param. It returns either a boolean or a Promise that evaluates to a boolean. | +| `hookFuncs` | `Array<` `Function >` | | Sync or async hook functions to run if `true`. They may include other conditional hooks. | + +## Example + +```js +const { isProvider, unless } = require('feathers-hooks-common/index.js'); + +module.exports = { + before: { + create: unless( + isProvider('server'), + hookA, + unless(isProvider('rest'), hook1, hook2, hook3), + hookB, + ), + }, +}; +``` + +## Details + +Resolve the predicate to a boolean. Run the hooks sequentially if the result is falsey. + +The predicate and hook functions will not be called with `this` set to the service, as is normal for hook functions. Use `hook.service` instead. diff --git a/src/hooks/iff/unless.test.ts b/src/hooks/unless/unless.test.ts similarity index 100% rename from src/hooks/iff/unless.test.ts rename to src/hooks/unless/unless.test.ts diff --git a/src/hooks/iff/unless.ts b/src/hooks/unless/unless.ts similarity index 89% rename from src/hooks/iff/unless.ts rename to src/hooks/unless/unless.ts index 3def32ba..cb735a7b 100755 --- a/src/hooks/iff/unless.ts +++ b/src/hooks/unless/unless.ts @@ -1,5 +1,5 @@ import type { HookContext } from '@feathersjs/feathers' -import { iffElse } from './iff-else.js' +import { iffElse } from '../iff-else/iff-else.js' import type { PredicateFn, HookFunction } from '../../types.js' /** diff --git a/src/predicates/every/every.md b/src/predicates/every/every.md new file mode 100644 index 00000000..78c9ee41 --- /dev/null +++ b/src/predicates/every/every.md @@ -0,0 +1,35 @@ +--- +title: every +description: Return the and of a series of sync or async predicate functions. +category: predicates +--- + +## Arguments + +- `{Array< Function >} predicates` + +| Argument | Type | Default | Description | +| ------------ | :-----------------: | ------- | ----------------------------------------------------------------------------- | +| `predicates` | `Array< Function >` | | Functions which take the current hook as a param and return a boolean result. | + +**Returns** + +- `{Boolean} result` + +| Name | Type | Description | +| ------ | ------- | ----------------------------- | +| result | Boolean | The logical and of predicates | + +## Example + +```js +const { iff, every } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { + create: iff(every(hook1, hook2, ...), hookA, hookB, ...) +} }; +``` + +## Details + +`every` is a predicate function for use in conditional hooks. The predicate functions are run in parallel, and `true` is returned if every predicate returns a truthy value. diff --git a/src/predicates/is-provider/is-provider.md b/src/predicates/is-provider/is-provider.md new file mode 100644 index 00000000..56dbcb6c --- /dev/null +++ b/src/predicates/is-provider/is-provider.md @@ -0,0 +1,40 @@ +--- +title: isProvider +description: Check which transport provided the service call. +category: predicates +--- + +## Arguments + +- `{Array< String >} transports` + +| Name | Type | Default | Description | +| ------------ | :---------------: | ------- | --------------------------------- | +| `transports` | `Array< String >` | | The transports you want to allow. | + +| `transports` | Value | Description | +| ------------ | :---------------------------------: | ----------- | +| `socketio` | Allow calls by Socket.IO transport. | +| `rest` | Allow calls by REST transport. | +| `external` | Allow calls other than from server. | +| `server` | Allow calls from server. | + +**Returns** + +- `{Boolean} result` + +| Name | Type | Description | +| ------ | ------- | ---------------------------------------------- | +| result | Boolean | If the call was made by one of the transports. | + +## Example + +```js +const { iff, isProvider, discard } = require('feathers-hooks-common/index.js'); + +module.exports = { after: { create: iff(isProvider('external'), discard('password')) } }; +``` + +## Details + +`isProvider` is a predicate function for use in conditional hooks. Its determines which transport provided the service call by checking `context.params.provider`. diff --git a/src/predicates/not/not.md b/src/predicates/not/not.md new file mode 100644 index 00000000..43d04024 --- /dev/null +++ b/src/predicates/not/not.md @@ -0,0 +1,36 @@ +--- +title: not +description: Negate a sync or async predicate function. +category: predicates +--- + +## Arguments + +- `{Function | Boolean} predicate` + +| Argument | Type | Default | Description | +| ----------- | :------------------: | ------- | --------------------------------------------------------------------------------------------- | +| `predicate` | `Function` `Boolean` | | A sync or async function which take the current hook as a param and returns a boolean result. | + +**Returns** + +- `{Boolean} result` + +| Name | Type | Description | +| ------ | ------- | -------------------- | +| result | Boolean | The not of predicate | + +## Example + +```js +const { iff, isNot, isProvider, discard } = require('feathers-hooks-common/index.js'); +const isRequestor = () => context => new Promise(resolve, reject) => ... ); + +module.exports = { after: { + create: iff(isNot(isRequestor()), discard('password')) +} }; +``` + +## Details + +`isNot` is a predicate function for use in conditional hooks. diff --git a/src/predicates/some/some.md b/src/predicates/some/some.md new file mode 100644 index 00000000..d4f60ff3 --- /dev/null +++ b/src/predicates/some/some.md @@ -0,0 +1,35 @@ +--- +title: some +description: Return the or of a series of sync or async predicate functions. +category: predicates +--- + +## Arguments + +- `{Array< Function >} predicates` + +| Argument | Type | Default | Description | +| ------------ | :-----------------: | ------- | ----------------------------------------------------------------------------- | +| `predicates` | `Array< Function >` | | Functions which take the current hook as a param and return a boolean result. | + +**Returns** + +- `{Boolean} result` + +| Name | Type | Description | +| ------ | ------- | ---------------------------- | +| result | Boolean | The logical or of predicates | + +## Example + +```js +const { iff, some } = require('feathers-hooks-common/index.js'); + +module.exports = { before: { + create: iff(some(hook1, hook2, ...), hookA, hookB, ...) +} }; +``` + +## Details + +`some` is a predicate function for use in conditional hooks. The predicate functions are run in parallel, and `true` is returned if any predicate returns a truthy value. diff --git a/src/resolvers/hooks/resolve-data.ts b/src/resolvers/hooks/resolve-data.ts index f473d5a9..fbc9ae73 100644 --- a/src/resolvers/hooks/resolve-data.ts +++ b/src/resolvers/hooks/resolve-data.ts @@ -10,7 +10,7 @@ export const resolveData = async (context: H, next?: NextFunction) => { await replaceData(context, item => resolve(resolverProperties, item, context)) - if (typeof next === 'function') { + if (next) { return next() } diff --git a/src/resolvers/hooks/resolve-query.ts b/src/resolvers/hooks/resolve-query.ts index 8efa72ec..65824b02 100644 --- a/src/resolvers/hooks/resolve-query.ts +++ b/src/resolvers/hooks/resolve-query.ts @@ -12,7 +12,9 @@ export const resolveQuery = query, } - if (typeof next === 'function') { + if (next) { return next() } + + return context } diff --git a/src/resolvers/hooks/resolve.ts b/src/resolvers/hooks/resolve.ts index 06ff2cd4..7942e131 100644 --- a/src/resolvers/hooks/resolve.ts +++ b/src/resolvers/hooks/resolve.ts @@ -38,7 +38,7 @@ export const resolve = < await Promise.all(promisesBefore) } - if (typeof next === 'function') { + if (next) { await next() } diff --git a/src/utils/check-context/check-context.md b/src/utils/check-context/check-context.md new file mode 100644 index 00000000..775a570c --- /dev/null +++ b/src/utils/check-context/check-context.md @@ -0,0 +1,43 @@ +--- +title: checkContext +description: Restrict a hook to run for certain methods and method types. +category: utils +--- + +## Arguments + +- `{Object} context` +- `{String | Array< String >} [ type ]` +- `{String | Array< String >} [ methods ]` +- `{String} [ label ]` + +| Argument | Type | Default | Description | +| --------- | :------: | ---------------- | --------------------------------- | --------------------------------------------------------------- | +| `context` | `Object` | | The hook context. | +| `type` | `String | Array< String >` | all types | The service type allowed - before, after, error. | +| `methods` | `String | Array< String >` | all methods | The service methods allowed - find, get, update, patch, remove. | +| `label` | `String` | `'anonymous'` | Name of hook to use with `throw`. | + +## Example + +```js +const { checkContext } = require('feathers-hooks-common/index.js'); + +function myHook(context) { + checkContext(context, 'after', ['create', 'remove']); + ... +} + +module.exports = { before: { + create: [ myHook ] // throws +} }; + +// checkContext(hook, 'before', ['update', 'patch'], 'hookName'); +// checkContext(hook, null, ['update', 'patch']); +// checkContext(hook, 'before', null, 'hookName'); +// checkContext(hook, 'before'); +``` + +## Details + +Its important to ensure the hook is being used as intended. `checkContext` let's you restrict the hook to a hook type and a set of service methods. diff --git a/src/utils/get-data-is-array/get-data-is-array.md b/src/utils/get-data-is-array/get-data-is-array.md new file mode 100644 index 00000000..a8ee3b66 --- /dev/null +++ b/src/utils/get-data-is-array/get-data-is-array.md @@ -0,0 +1,4 @@ +--- +title: getDataIsArray +category: utils +--- diff --git a/src/utils/get-exposed-methods/get-exposed-methods.md b/src/utils/get-exposed-methods/get-exposed-methods.md new file mode 100644 index 00000000..7405a0ba --- /dev/null +++ b/src/utils/get-exposed-methods/get-exposed-methods.md @@ -0,0 +1,4 @@ +--- +title: getExposedMethods +category: utils +--- diff --git a/src/utils/get-paginate/get-paginate.md b/src/utils/get-paginate/get-paginate.md new file mode 100644 index 00000000..ca19afa4 --- /dev/null +++ b/src/utils/get-paginate/get-paginate.md @@ -0,0 +1,4 @@ +--- +title: getPaginate +category: utils +--- diff --git a/src/utils/get-result-is-array/get-result-is-array.md b/src/utils/get-result-is-array/get-result-is-array.md new file mode 100644 index 00000000..0f9ed452 --- /dev/null +++ b/src/utils/get-result-is-array/get-result-is-array.md @@ -0,0 +1,4 @@ +--- +title: getResultIsArray +category: utils +--- diff --git a/src/utils/index.ts b/src/utils/index.ts index b6cd5530..ffb50ad4 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,17 +1,12 @@ export * from './calling-params/calling-params.js' export * from './check-context/check-context.js' export * from './check-context-if.js' -export * from './combine/combine.js' - export * from './get-items/get-items.js' export * from './get-data-is-array/get-data-is-array.js' export * from './get-result-is-array/get-result-is-array.js' - -export * from './params-for-server/params-for-server.js' - export * from './replace-items/replace-items.js' -export * from './replace-items/replace-data.js' -export * from './replace-items/replace-result.js' - +export * from './replace-data/replace-data.js' +export * from './replace-result/replace-result.js' export * from './get-paginate/get-paginate.js' export * from './skip-result/skip-result.js' +export * from './transform-params/transform-params.js' diff --git a/src/utils/params-for-server/params-for-server.test.ts b/src/utils/params-for-server/params-for-server.test.ts deleted file mode 100755 index ca89836b..00000000 --- a/src/utils/params-for-server/params-for-server.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { assert } from 'vitest' - -import { paramsForServer } from './params-for-server.js' - -describe('util paramsToServer', () => { - it('handles empty params', () => { - const res = paramsForServer() - assert.deepEqual(res, { query: { $client: {} } }) - }) - - it('handles params with query only', () => { - const res = paramsForServer({ query: { x: 'x', y: 1 } }) - assert.deepEqual(res, { query: { x: 'x', y: 1, $client: {} } }) - }) - - it('copies all params without query', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any) - assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }) - }) - - it('copies all params with query', () => { - const res: any = paramsForServer({ query: { x: 'x', y: 1 }, a: 'a', b: 1 } as any) - assert.deepEqual(res, { query: { x: 'x', y: 1, $client: { a: 'a', b: 1 } } }) - }) - - it('copies whitelist props', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'a', 'b') - assert.deepEqual(res, { query: { $client: { a: 'a', b: 1 } } }) - }) - - it('ignores non whitelist props', () => { - const res: any = paramsForServer({ a: 'a', b: 1 } as any, 'b') - assert.deepEqual(res, { query: { $client: { b: 1 } } }) - }) -}) diff --git a/src/utils/params-for-server/params-for-server.ts b/src/utils/params-for-server/params-for-server.ts deleted file mode 100755 index dbe225de..00000000 --- a/src/utils/params-for-server/params-for-server.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Params } from '@feathersjs/feathers' - -/** - * Pass an explicit context.params from client to server. Client-side. (Utility function.) - * - * @see https://hooks-common.feathersjs.com/utilities.html#paramsforserver - * - * @deprecated use the hook `paramsForServer2` instead - */ -export function paramsForServer(params?: Params, ...whitelist: string[]): Params { - const ifWhitelist = !!whitelist.length - const _params: Record = Object.assign({}, params) - - _params.query = _params.query || {} - _params.query.$client = _params.query.$client || {} - - Object.keys(_params).forEach(key => { - if (key !== 'query') { - if (!ifWhitelist || whitelist.includes(key)) { - _params.query.$client[key] = _params[key] - } - - delete _params[key] - } - }) - - return _params -} diff --git a/src/utils/replace-data/replace-data.md b/src/utils/replace-data/replace-data.md new file mode 100644 index 00000000..cd6a4d99 --- /dev/null +++ b/src/utils/replace-data/replace-data.md @@ -0,0 +1,4 @@ +--- +title: replaceData +category: utils +--- diff --git a/src/utils/replace-items/replace-data.ts b/src/utils/replace-data/replace-data.ts similarity index 100% rename from src/utils/replace-items/replace-data.ts rename to src/utils/replace-data/replace-data.ts diff --git a/src/utils/replace-result/replace-result.md b/src/utils/replace-result/replace-result.md new file mode 100644 index 00000000..18c317e3 --- /dev/null +++ b/src/utils/replace-result/replace-result.md @@ -0,0 +1,4 @@ +--- +title: replaceResult +category: utils +--- diff --git a/src/utils/replace-items/replace-result.test.ts b/src/utils/replace-result/replace-result.test.ts similarity index 100% rename from src/utils/replace-items/replace-result.test.ts rename to src/utils/replace-result/replace-result.test.ts diff --git a/src/utils/replace-items/replace-result.ts b/src/utils/replace-result/replace-result.ts similarity index 100% rename from src/utils/replace-items/replace-result.ts rename to src/utils/replace-result/replace-result.ts diff --git a/src/utils/skip-result/skip-result.md b/src/utils/skip-result/skip-result.md new file mode 100644 index 00000000..9a4a704a --- /dev/null +++ b/src/utils/skip-result/skip-result.md @@ -0,0 +1,4 @@ +--- +title: skipResult +category: utils +--- diff --git a/src/utils/transform-params/transform-params.md b/src/utils/transform-params/transform-params.md new file mode 100644 index 00000000..bbcc0f6c --- /dev/null +++ b/src/utils/transform-params/transform-params.md @@ -0,0 +1,4 @@ +--- +title: transformParams +category: utils +--- diff --git a/tsconfig.json b/tsconfig.json index c17a56f3..32894ae4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,9 @@ "esModuleInterop": true, "types": ["vitest/globals", "vitest/importMeta"], "declaration": true, + "paths": { + "feathers-commons": ["./src/index.ts"] + } }, "include": ["src/**/*"] } From 736a344229fdacb3ca73ce0650929b3dc8c2028b Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:24:40 +0200 Subject: [PATCH 12/15] fix: wrong imports --- src/hooks/index.ts | 1 + src/hooks/lowercase-result/lowercase-result.ts | 2 +- src/hooks/omit-result/omit-result.ts | 2 +- src/hooks/params-for-server/params-for-from-shared.ts | 1 + src/hooks/params-for-server/params-for-server.ts | 3 +-- src/hooks/params-from-client/params-from-client.ts | 2 +- src/hooks/pick-result/pick-result.ts | 2 +- src/hooks/set-now-result/set-now-result.ts | 2 +- src/hooks/throw-if-is-multi/throw-if-is-multi.ts | 2 +- src/hooks/throw-if-is-provider/throw-if-is-provider.ts | 4 ++-- src/hooks/transform-data/transform-data.ts | 2 +- src/hooks/transform-result/transform-result.ts | 2 +- src/hooks/trim-result/trim-result.ts | 2 +- test/index.test.ts | 6 ++++++ 14 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 src/hooks/params-for-server/params-for-from-shared.ts diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 96b98d23..42e0645d 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -11,6 +11,7 @@ export * from './lowercase-result/lowercase-result.js' export * from './omit-data/omit-data.js' export * from './omit-query/omit-query.js' export * from './omit-result/omit-result.js' +export * from './params-for-server/params-for-server.js' export * from './params-from-client/params-from-client.js' export * from './pick-data/pick-data.js' export * from './pick-query/pick-query.js' diff --git a/src/hooks/lowercase-result/lowercase-result.ts b/src/hooks/lowercase-result/lowercase-result.ts index d37c0fcd..de7950ce 100755 --- a/src/hooks/lowercase-result/lowercase-result.ts +++ b/src/hooks/lowercase-result/lowercase-result.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformResult } from '../transform-data/transform-result.js' +import { transformResult } from '../transform-result/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/omit-result/omit-result.ts b/src/hooks/omit-result/omit-result.ts index 0334052f..5d24c965 100755 --- a/src/hooks/omit-result/omit-result.ts +++ b/src/hooks/omit-result/omit-result.ts @@ -1,5 +1,5 @@ import _omit from 'lodash/omit.js' -import { transformResult } from '../transform-data/transform-result.js' +import { transformResult } from '../transform-result/transform-result.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' import type { DispatchOption } from '../../types.js' diff --git a/src/hooks/params-for-server/params-for-from-shared.ts b/src/hooks/params-for-server/params-for-from-shared.ts new file mode 100644 index 00000000..eae3bfe5 --- /dev/null +++ b/src/hooks/params-for-server/params-for-from-shared.ts @@ -0,0 +1 @@ +export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const diff --git a/src/hooks/params-for-server/params-for-server.ts b/src/hooks/params-for-server/params-for-server.ts index 48535f5e..91c6b141 100644 --- a/src/hooks/params-for-server/params-for-server.ts +++ b/src/hooks/params-for-server/params-for-server.ts @@ -1,8 +1,7 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' - -export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const +import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from './params-for-from-shared.js' export type ParamsForServerOptions = { /** diff --git a/src/hooks/params-from-client/params-from-client.ts b/src/hooks/params-from-client/params-from-client.ts index 746d2ce0..ce8b44b2 100644 --- a/src/hooks/params-from-client/params-from-client.ts +++ b/src/hooks/params-from-client/params-from-client.ts @@ -1,7 +1,7 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' -import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-server.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' +import { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-from-shared.js' export type paramsFromClientOptions = { /** diff --git a/src/hooks/pick-result/pick-result.ts b/src/hooks/pick-result/pick-result.ts index eec84b69..8ee0e37a 100755 --- a/src/hooks/pick-result/pick-result.ts +++ b/src/hooks/pick-result/pick-result.ts @@ -1,6 +1,6 @@ import _pick from 'lodash/pick.js' -import { transformResult } from '../transform-data/transform-result.js' +import { transformResult } from '../transform-result/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/src/hooks/set-now-result/set-now-result.ts b/src/hooks/set-now-result/set-now-result.ts index 10c978e3..602a5165 100755 --- a/src/hooks/set-now-result/set-now-result.ts +++ b/src/hooks/set-now-result/set-now-result.ts @@ -1,5 +1,5 @@ import _set from 'lodash/set.js' -import { transformResult } from '../transform-data/transform-result.js' +import { transformResult } from '../transform-result/transform-result.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' import type { DispatchOption } from '../../types.js' diff --git a/src/hooks/throw-if-is-multi/throw-if-is-multi.ts b/src/hooks/throw-if-is-multi/throw-if-is-multi.ts index 8af44714..eb68c46b 100644 --- a/src/hooks/throw-if-is-multi/throw-if-is-multi.ts +++ b/src/hooks/throw-if-is-multi/throw-if-is-multi.ts @@ -2,7 +2,7 @@ import type { HookContext } from '@feathersjs/feathers' import type { PredicateFn } from '../../types.js' import { type FeathersError } from '@feathersjs/errors' import { every, isMulti } from '../../predicates/index.js' -import { throwIf } from './throw-if.js' +import { throwIf } from '../throw-if/throw-if.js' export type ThrowIfIsMultiOptions = { filter?: PredicateFn diff --git a/src/hooks/throw-if-is-provider/throw-if-is-provider.ts b/src/hooks/throw-if-is-provider/throw-if-is-provider.ts index cd0fba40..4d7f6caa 100644 --- a/src/hooks/throw-if-is-provider/throw-if-is-provider.ts +++ b/src/hooks/throw-if-is-provider/throw-if-is-provider.ts @@ -1,7 +1,7 @@ import type { HookContext } from '@feathersjs/feathers' import type { PredicateFn, TransportName } from '../../types.js' -import type { ThrowIfOptions } from './throw-if.js' -import { throwIf } from './throw-if.js' +import type { ThrowIfOptions } from '../throw-if/throw-if.js' +import { throwIf } from '../throw-if/throw-if.js' import { toArray } from 'lodash' import { every, isProvider } from '../../predicates/index.js' import { MethodNotAllowed } from '@feathersjs/errors' diff --git a/src/hooks/transform-data/transform-data.ts b/src/hooks/transform-data/transform-data.ts index 57b42ace..687b9f74 100755 --- a/src/hooks/transform-data/transform-data.ts +++ b/src/hooks/transform-data/transform-data.ts @@ -1,5 +1,5 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' -import { replaceData } from '../../utils/replace-items/replace-data.js' +import { replaceData } from '../../utils/replace-data/replace-data.js' import { isPromise } from '../../common/index.js' /** diff --git a/src/hooks/transform-result/transform-result.ts b/src/hooks/transform-result/transform-result.ts index e3ac8201..88b64aeb 100755 --- a/src/hooks/transform-result/transform-result.ts +++ b/src/hooks/transform-result/transform-result.ts @@ -1,6 +1,6 @@ import type { HookContext, NextFunction } from '@feathersjs/feathers' import { isPromise } from '../../common/index.js' -import { replaceResult } from '../../utils/replace-items/replace-result.js' +import { replaceResult } from '../../utils/replace-result/replace-result.js' import type { DispatchOption } from '../../types.js' export type TransformResultOptions = { diff --git a/src/hooks/trim-result/trim-result.ts b/src/hooks/trim-result/trim-result.ts index f32e3fd0..d13c4bf0 100755 --- a/src/hooks/trim-result/trim-result.ts +++ b/src/hooks/trim-result/trim-result.ts @@ -1,7 +1,7 @@ import _get from 'lodash/get.js' import _set from 'lodash/set.js' import { BadRequest } from '@feathersjs/errors' -import { transformResult } from '../transform-data/transform-result.js' +import { transformResult } from '../transform-result/transform-result.js' import type { DispatchOption } from '../../types.js' import type { MaybeArray } from '../../internal.utils.js' import { toArray } from '../../internal.utils.js' diff --git a/test/index.test.ts b/test/index.test.ts index aee8014d..d83e5d8a 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -75,6 +75,12 @@ const members = [ 'getPaginate', 'skipResult', + + 'throwIf', + 'throwIfIsMulti', + 'throwIfIsProvider', + + 'transformParams', ].sort() describe('services exposed hooks', () => { From c4f0860b85751450ca233cc8950602b09e9d46d2 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:29:31 +0200 Subject: [PATCH 13/15] chore: rm pnpm lock --- pnpm-lock.yaml | 6667 ------------------------------------------------ 1 file changed, 6667 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index a59c02fa..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,6667 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@feathersjs/errors': - specifier: ^5.0.31 - version: 5.0.34 - fast-copy: - specifier: ^3.0.2 - version: 3.0.2 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - neotraverse: - specifier: ^0.6.18 - version: 0.6.18 - devDependencies: - '@feathers-community/eslint-config': - specifier: ^0.0.7 - version: 0.0.7(@types/estree@1.0.8)(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)(prettier@3.5.3)(typescript@5.8.3) - '@feathers-plus/cache': - specifier: ^1.4.0 - version: 1.4.0 - '@feathersjs/authentication': - specifier: ^5.0.31 - version: 5.0.34(typescript@5.8.3) - '@feathersjs/authentication-local': - specifier: ^5.0.31 - version: 5.0.34(typescript@5.8.3) - '@feathersjs/client': - specifier: ^5.0.31 - version: 5.0.34(typescript@5.8.3) - '@feathersjs/express': - specifier: ^5.0.31 - version: 5.0.34(typescript@5.8.3) - '@feathersjs/memory': - specifier: ^5.0.31 - version: 5.0.34 - '@feathersjs/socketio': - specifier: ^5.0.31 - version: 5.0.34 - '@feathersjs/socketio-client': - specifier: ^5.0.31 - version: 5.0.34 - '@shikijs/vitepress-twoslash': - specifier: ^3.6.0 - version: 3.6.0(typescript@5.8.3) - '@tsconfig/node22': - specifier: ^22.0.2 - version: 22.0.2 - '@types/lodash': - specifier: ^4.17.14 - version: 4.17.17 - '@types/node': - specifier: ^22.10.7 - version: 22.15.31 - '@vitest/coverage-v8': - specifier: ^3.0.3 - version: 3.2.3(vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2)) - dedent: - specifier: ^1.6.0 - version: 1.6.0 - eslint: - specifier: ^9.18.0 - version: 9.28.0(jiti@2.4.2) - glob: - specifier: ^11.0.2 - version: 11.0.3 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - npm-check-updates: - specifier: ^17.1.14 - version: 17.1.18 - prettier: - specifier: ^3.4.2 - version: 3.5.3 - shx: - specifier: ^0.3.4 - version: 0.3.4 - sift: - specifier: ^17.1.3 - version: 17.1.3 - tsdown: - specifier: ^0.12.7 - version: 0.12.7(typescript@5.8.3)(unplugin-unused@0.5.1) - typescript: - specifier: ^5.7.3 - version: 5.8.3 - unplugin-unused: - specifier: ^0.5.0 - version: 0.5.1 - vitepress: - specifier: ^2.0.0-alpha.6 - version: 2.0.0-alpha.6(@algolia/client-search@5.27.0)(@types/node@22.15.31)(jiti@2.4.2)(postcss@8.5.5)(search-insights@2.17.3)(typescript@5.8.3) - vitest: - specifier: ^3.0.3 - version: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2) - -packages: - - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.27.0': - resolution: {integrity: sha512-SITU5umoknxETtw67TxJu9njyMkWiH8pM+Bvw4dzfuIrIAT6Y1rmwV4y0A0didWoT+6xVuammIykbtBMolBcmg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.27.0': - resolution: {integrity: sha512-go1b9qIZK5vYEQ7jD2bsfhhhVsoh9cFxQ5xF8TzTsg2WOCZR3O92oXCkq15SOK0ngJfqDU6a/k0oZ4KuEnih1Q==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.27.0': - resolution: {integrity: sha512-tnFOzdNuMzsz93kOClj3fKfuYoF3oYaEB5bggULSj075GJ7HUNedBEm7a6ScrjtnOaOtipbnT7veUpHA4o4wEQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.27.0': - resolution: {integrity: sha512-y1qgw39qZijjQBXrqZTiwK1cWgWGRiLpJNWBv9w36nVMKfl9kInrfsYmdBAfmlhVgF/+Woe0y1jQ7pa4HyShAw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.27.0': - resolution: {integrity: sha512-XluG9qPZKEbiLoIfXTKbABsWDNOMPx0t6T2ImJTTeuX+U/zBdmfcqqgcgkqXp+vbXof/XX/4of9Eqo1JaqEmKw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.27.0': - resolution: {integrity: sha512-V8/To+SsAl2sdw2AAjeLJuCW1L+xpz+LAGerJK7HKqHzE5yQhWmIWZTzqYQcojkii4iBMYn0y3+uReWqT8XVSQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.27.0': - resolution: {integrity: sha512-EJJ7WmvmUXZdchueKFCK8UZFyLqy4Hz64snNp0cTc7c0MKaSeDGYEDxVsIJKp15r7ORaoGxSyS4y6BGZMXYuCg==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.27.0': - resolution: {integrity: sha512-xNCyWeqpmEo4EdmpG57Fs1fJIQcPwt5NnJ6MBdXnUdMVXF4f5PHgza+HQWQQcYpCsune96jfmR0v7us6gRIlCw==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.27.0': - resolution: {integrity: sha512-P0NDiEFyt9UYQLBI0IQocIT7xHpjMpoFN3UDeerbztlkH9HdqT0GGh1SHYmNWpbMWIGWhSJTtz6kSIWvFu4+pw==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.27.0': - resolution: {integrity: sha512-cqfTMF1d1cc7hg0vITNAFxJZas7MJ4Obc36WwkKpY23NOtGb+4tH9X7UKlQa2PmTgbXIANoJ/DAQTeiVlD2I4Q==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.27.0': - resolution: {integrity: sha512-ErenYTcXl16wYXtf0pxLl9KLVxIztuehqXHfW9nNsD8mz9OX42HbXuPzT7y6JcPiWJpc/UU/LY5wBTB65vsEUg==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.27.0': - resolution: {integrity: sha512-CNOvmXsVi+IvT7z1d+6X7FveVkgEQwTNgipjQCHTIbF9KSMfZR7tUsJC+NpELrm10ALdOMauah84ybs9rw1cKQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.27.0': - resolution: {integrity: sha512-Nx9EdLYZDsaYFTthqmc0XcVvsx6jqeEX8fNiYOB5i2HboQwl8pJPj1jFhGqoGd0KG7KFR+sdPO5/e0EDDAru2Q==} - engines: {node: '>= 14.0.0'} - - '@altano/repository-tools@0.1.1': - resolution: {integrity: sha512-5vbUs2A98CC3g1AlOBdkBE0BMukkLjLIsMHAtuxg6Pt9dQXxYWdLKOf66v6c/vIqtNcgTMv0oGtddLdMuH9X6w==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@docsearch/css@3.9.0': - resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} - - '@docsearch/js@3.9.0': - resolution: {integrity: sha512-4bKHcye6EkLgRE8ze0vcdshmEqxeiJM77M0JXjef7lrYZfSlMunrDOCqyLjiZyo1+c0BhUqA2QpFartIjuHIjw==} - - '@docsearch/react@3.9.0': - resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} - peerDependencies: - '@types/react': '>= 16.8.0 < 20.0.0' - react: '>= 16.8.0 < 20.0.0' - react-dom: '>= 16.8.0 < 20.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.0': - resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.28.0': - resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.2': - resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@feathers-community/eslint-config@0.0.7': - resolution: {integrity: sha512-HhZ08KT5SKzRvDQ3ZCoepc5ZOhrYTBbAsjnq1oBQ8qe4jWwGlfT8AFMFzQsqE/7mJq0dVYfLnj8Jx0+Tntee2Q==} - peerDependencies: - eslint: ^9.0.0 - - '@feathers-plus/cache@1.4.0': - resolution: {integrity: sha512-jkUCfrYX/aBrIZ3hKGnJGUELtSYTGVZFBo2MJvVeonW9BXCHTKwzY6HkmVbzMhzSRMAdeo98nvpsz1d2QbURdw==} - engines: {node: '>= 6.0.0'} - - '@feathersjs/adapter-commons@5.0.34': - resolution: {integrity: sha512-wc0HAZ0uov68p1ytBR5npyAePdNbFrRqr1fINSpLvIkrUkKDEcC6I/lOpk1TBpoI8so5IO/seZhkl25pqKM43A==} - engines: {node: '>= 12'} - - '@feathersjs/authentication-client@5.0.34': - resolution: {integrity: sha512-j+p88bnyZmOHelpiL3AbTee0gsEDF5G3/vyJm0x157Q3Y3vXsI4LU7n7Go3cbrjNkCpdqV0pn8CiaxFgQ2lteA==} - engines: {node: '>= 12'} - - '@feathersjs/authentication-local@5.0.34': - resolution: {integrity: sha512-3swHyoz/kW3lTAoGRNT1Y49PXy+wx1/bgw5AQpExLanLuXipevuKHapLvlDUh914bz8vw6FmC/5TnFwxrx8OOQ==} - engines: {node: '>= 12'} - - '@feathersjs/authentication@5.0.34': - resolution: {integrity: sha512-JnOoYJKx60SQDCj/JJAH9wzAL0EFFMaOjBN5Vh8JVTj1L4IrxUfy7uGathBumQc5vB2BqtyCy4BG8+/L49oQbA==} - engines: {node: '>= 12'} - - '@feathersjs/client@5.0.34': - resolution: {integrity: sha512-6ZFnETydjXH4wHwSB6TwiYUQ2qHhKhcw8finyA7A845yVSbQQYns5pTPNCHFG2GPpZpb43I6RZuP//HRfN5AIw==} - engines: {node: '>= 12'} - - '@feathersjs/commons@5.0.34': - resolution: {integrity: sha512-UfHzq7taVJx++TXxX5pmDSR72xRp+h5nler4xcUlcJWLLykCOYo8YCeW03S7T1p1NuFdy0qBmU+B+G89bjyGmg==} - engines: {node: '>= 12'} - - '@feathersjs/errors@5.0.34': - resolution: {integrity: sha512-C0t+pONnMvwlDW6iczcYmxaHzGvaGn3+BLhwlySEVYRciWOURIO8Eo5JVdN7cSM3Z7AxS3Dpk4DEhyFU/D2w6w==} - engines: {node: '>= 12'} - - '@feathersjs/express@5.0.34': - resolution: {integrity: sha512-TNy8vEIYnjB9eEwancP07C5wYnv5i1vXctKH9HhtIfa1xJ7KnGgIDT9LNO4gX0OeURzDcE+zFEB9Xnto6zKh4g==} - engines: {node: '>= 12'} - - '@feathersjs/feathers@5.0.34': - resolution: {integrity: sha512-jgeqKq/Uhsfeld42F8uimqzPv/uhtohkenpaWeD+NudJp2YZNYfA6gDZAL5UTpAvrTJFmK3QR1q1CnuL1mJdHg==} - engines: {node: '>= 12'} - - '@feathersjs/hooks@0.9.0': - resolution: {integrity: sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==} - engines: {node: '>= 14'} - - '@feathersjs/memory@5.0.34': - resolution: {integrity: sha512-VU9cMdUPNL89FogvkiVPH70cHnDwIBU8mJWz0HMxeehycN3iUIjqmVIUO8Qg6HH4O17oiU/nKqvXgEOdr+L9AQ==} - engines: {node: '>= 12'} - - '@feathersjs/rest-client@5.0.34': - resolution: {integrity: sha512-rWn47ZVLJ6igqbJeKyy6QleZceEjfPtmjR/DI+S1Ph7CAep0Ax2rqkwhSIWIoRnp4A7jFay1M3Jy3tA3Eyk7MQ==} - engines: {node: '>= 12'} - - '@feathersjs/schema@5.0.34': - resolution: {integrity: sha512-BpQxp46Vp0tH7l9jW4HIAGQerql7aJBeRXRggCVhBuqK48KoD1UhvYCWBmWwEouaYUnZ77HjQIMn9c1fK+dF2w==} - engines: {node: '>= 12'} - peerDependencies: - typescript: '>=5.8' - - '@feathersjs/socketio-client@5.0.34': - resolution: {integrity: sha512-7mejzCX/lotsKFZaRrL1KA/lIuI/m1iPxy+5I7Fb+PLpRQUWAdNcCJPk/TutyXm+ksFNliPe2hB6qiXpKeqg3Q==} - engines: {node: '>= 12'} - - '@feathersjs/socketio@5.0.34': - resolution: {integrity: sha512-uT94CeSRcnhOIThjiFg/wU30koVPoPrJUHyiQia3Q9sSB5wcaoWaJAIUcOEIZmGrgW2FNLPRw9THpAUTIgd4/w==} - engines: {node: '>= 12'} - - '@feathersjs/transport-commons@5.0.34': - resolution: {integrity: sha512-l+oQm1oIvfrxNUlidcqCtKfdWdKn1zHXGhEa13xIKiU5m2LFz1EYeMuq5vh/1pU0iECq3Oi+KdW53YnGl446cw==} - engines: {node: '>= 12'} - - '@floating-ui/core@1.7.1': - resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} - - '@floating-ui/dom@1.1.1': - resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==} - - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@iconify-json/simple-icons@1.2.38': - resolution: {integrity: sha512-mvMeFQgVjoHanQE9Q7ihmriEXAorjLZW+crUgQspDjFpzWuQp2RZMTppl1MN6TQztMVTsNFgF6LDKsp+v1RYRg==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@oxc-project/runtime@0.72.2': - resolution: {integrity: sha512-J2lsPDen2mFs3cOA1gIBd0wsHEhum2vTnuKIRwmj3HJJcIz/XgeNdzvgSOioIXOJgURIpcDaK05jwaDG1rhDwg==} - engines: {node: '>=6.9.0'} - - '@oxc-project/types@0.72.2': - resolution: {integrity: sha512-il5RF8AP85XC0CMjHF4cnVT9nT/v/ocm6qlZQpSiAR9qBbQMGkFKloBZwm7PcnOdiUX97yHgsKM7uDCCWCu3tg==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@quansync/fs@0.1.3': - resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} - engines: {node: '>=20.0.0'} - - '@rolldown/binding-darwin-arm64@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-Hlt/h+lOJ+ksC2wED2M9Hku/9CA2Hr17ENK82gNMmi3OqwcZLdZFqJDpASTli65wIOeT4p9rIUMdkfshCoJpYA==} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-Bnst+HBwhW2YrNybEiNf9TJkI1myDgXmiPBVIOS0apzrLCmByzei6PilTClOpTpNFYB+UviL3Ox2gKUmcgUjGw==} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-3jAxVmYDPc8vMZZOfZI1aokGB9cP6VNeU9XNCx0UJ6ShlSPK3qkAa0sWgueMhaQkgBVf8MOfGpjo47ohGd7QrA==} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-TpUltUdvcsAf2WvXXD8AVc3BozvhgazJ2gJLXp4DVV2V82m26QelI373Bzx8d/4hB167EEIg4wWW/7GXB/ltoQ==} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-eGvHnYQSdbdhsTdjdp/+83LrN81/7X9HD6y3jg7mEmdsicxEMEIt6CsP7tvYS/jn4489jgO/6mLxW/7Vg+B8pw==} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-0NJZWXJls83FpBRzkTbGBsXXstaQLsfodnyeOghxbnNdsjn+B4dcNPpMK5V3QDsjC0pNjDLaDdzB2jWKlZbP/Q==} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-9vXnu27r4zgS/BHP6RCLBOrJoV2xxtLYHT68IVpSOdCkBHGpf1oOJt6blv1y5NRRJBEfAFCvj5NmwSMhETF96w==} - cpu: [x64] - os: [linux] - - '@rolldown/binding-linux-x64-musl@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-e6tvsZbtHt4kzl82oCajOUxwIN8uMfjhuQ0qxIVRzPekRRjKEzyH9agYPW6toN0cnHpkhPsu51tyZKJOdUl7jg==} - cpu: [x64] - os: [linux] - - '@rolldown/binding-wasm32-wasi@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-nBQVizPoUQiViANhWrOyihXNf2booP2iq3S396bI1tmHftdgUXWKa6yAoleJBgP0oF0idXpTPU82ciaROUcjpg==} - engines: {node: '>=14.21.3'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-Rey/ECXKI/UEykrKfJX3oVAPXDH2k1p2BKzYGza0z3S2X5I3sTDOeBn2I0IQgyyf7U3+DCBhYjkDFnmSePrU/A==} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-LtuMKJe6iFH4iV55dy+gDwZ9v23Tfxx5cd7ZAxvhYFGoVNSvarxAgl844BvFGReERCnLTGRvo85FUR6fDHQX+A==} - cpu: [ia32] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-YY8UYfBm4dbWa4psgEPPD9T9X0nAvlYu0BOsQC5vDfCwzzU7IHT4jAfetvlQq+4+M6qWHSTr6v+/WX5EmlM1WA==} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-beta.11-commit.f051675': - resolution: {integrity: sha512-TAqMYehvpauLKz7v4TZOTUQNjxa5bUQWw2+51/+Zk3ItclBxgoSWhnZ31sXjdoX6le6OXdK2vZfV3KoyW/O/GA==} - - '@rollup/rollup-android-arm-eabi@4.43.0': - resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.43.0': - resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.43.0': - resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.43.0': - resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.43.0': - resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.43.0': - resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': - resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.43.0': - resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.43.0': - resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.43.0': - resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': - resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': - resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.43.0': - resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.43.0': - resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.43.0': - resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.43.0': - resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.43.0': - resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.43.0': - resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.43.0': - resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.43.0': - resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} - cpu: [x64] - os: [win32] - - '@shikijs/core@3.6.0': - resolution: {integrity: sha512-9By7Xb3olEX0o6UeJyPLI1PE1scC4d3wcVepvtv2xbuN9/IThYN4Wcwh24rcFeASzPam11MCq8yQpwwzCgSBRw==} - - '@shikijs/engine-javascript@3.6.0': - resolution: {integrity: sha512-7YnLhZG/TU05IHMG14QaLvTW/9WiK8SEYafceccHUSXs2Qr5vJibUwsDfXDLmRi0zHdzsxrGKpSX6hnqe0k8nA==} - - '@shikijs/engine-oniguruma@3.6.0': - resolution: {integrity: sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==} - - '@shikijs/langs@3.6.0': - resolution: {integrity: sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==} - - '@shikijs/themes@3.6.0': - resolution: {integrity: sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==} - - '@shikijs/transformers@3.6.0': - resolution: {integrity: sha512-PYkU54lYV0RCaUG8n2FNTF+YWiU3uPhcjLGq2x/C8lIrUX9GVnRb3bK+R5xtdFHbuctntATKm7ondp/H/dux9Q==} - - '@shikijs/twoslash@3.6.0': - resolution: {integrity: sha512-AxRxLWtmrVftwxN/2hSL6Hym+bannS+zuUEXpbNuo6BpG4jHTM0KEkICEH3B3Gm5ZNzGdI74NdDiAqAZ6WPJuQ==} - peerDependencies: - typescript: '>=5.5.0' - - '@shikijs/types@3.6.0': - resolution: {integrity: sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==} - - '@shikijs/vitepress-twoslash@3.6.0': - resolution: {integrity: sha512-pUoRj98UDV41CxfxPysrBryc1/1WdUL93ogcD/s156i4XcujnCfJJc+y5vR3W5Nc1R31VUacwWsI8HhaRRS/uA==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@tsconfig/node22@22.0.2': - resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} - - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/compression@1.8.1': - resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - - '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/jsonwebtoken@9.0.9': - resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} - - '@types/lodash@4.17.17': - resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/methods@1.1.4': - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node@22.15.31': - resolution: {integrity: sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - - '@types/superagent@8.1.9': - resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - - '@typescript-eslint/eslint-plugin@8.34.0': - resolution: {integrity: sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.34.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/parser@8.34.0': - resolution: {integrity: sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.34.0': - resolution: {integrity: sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/scope-manager@8.34.0': - resolution: {integrity: sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.34.0': - resolution: {integrity: sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/type-utils@8.34.0': - resolution: {integrity: sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/types@8.34.0': - resolution: {integrity: sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.34.0': - resolution: {integrity: sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@8.34.0': - resolution: {integrity: sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/visitor-keys@8.34.0': - resolution: {integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} - peerDependencies: - typescript: '*' - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@unrs/resolver-binding-android-arm-eabi@1.9.0': - resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==} - cpu: [arm] - os: [android] - - '@unrs/resolver-binding-android-arm64@1.9.0': - resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==} - cpu: [arm64] - os: [android] - - '@unrs/resolver-binding-darwin-arm64@1.9.0': - resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.9.0': - resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.9.0': - resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': - resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': - resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': - resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.9.0': - resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': - resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': - resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': - resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': - resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.9.0': - resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-linux-x64-musl@1.9.0': - resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-wasm32-wasi@1.9.0': - resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': - resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': - resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.9.0': - resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==} - cpu: [x64] - os: [win32] - - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - - '@vitest/coverage-v8@3.2.3': - resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} - peerDependencies: - '@vitest/browser': 3.2.3 - vitest: 3.2.3 - peerDependenciesMeta: - '@vitest/browser': - optional: true - - '@vitest/expect@3.2.3': - resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - - '@vitest/mocker@3.2.3': - resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@3.2.3': - resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - - '@vitest/runner@3.2.3': - resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - - '@vitest/snapshot@3.2.3': - resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - - '@vitest/spy@3.2.3': - resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - - '@vitest/utils@3.2.3': - resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} - - '@volar/language-core@2.4.14': - resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} - - '@volar/source-map@2.4.14': - resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} - - '@vue/compiler-core@3.5.16': - resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} - - '@vue/compiler-dom@3.5.16': - resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} - - '@vue/compiler-sfc@3.5.16': - resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} - - '@vue/compiler-ssr@3.5.16': - resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} - - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - - '@vue/devtools-api@7.7.6': - resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} - - '@vue/devtools-kit@7.7.6': - resolution: {integrity: sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==} - - '@vue/devtools-shared@7.7.6': - resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} - - '@vue/language-core@2.2.4': - resolution: {integrity: sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@vue/reactivity@3.5.16': - resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} - - '@vue/runtime-core@3.5.16': - resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} - - '@vue/runtime-dom@3.5.16': - resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} - - '@vue/server-renderer@3.5.16': - resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} - peerDependencies: - vue: 3.5.16 - - '@vue/shared@3.5.16': - resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} - - '@vueuse/core@13.3.0': - resolution: {integrity: sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg==} - peerDependencies: - vue: ^3.5.0 - - '@vueuse/integrations@13.3.0': - resolution: {integrity: sha512-h5mGRYPbiTZTFP/AKELLPGnUDBly7z7Qd1pgEQlT3ItQ0NlZM0vB+8SOQycpSBOBlgg72Zgw+mi2r+4O/G8RuQ==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 - vue: ^3.5.0 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - - '@vueuse/metadata@13.3.0': - resolution: {integrity: sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw==} - - '@vueuse/shared@13.3.0': - resolution: {integrity: sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA==} - peerDependencies: - vue: ^3.5.0 - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - algoliasearch@5.27.0: - resolution: {integrity: sha512-2PvAgvxxJzA3+dB+ERfS2JPdvUsxNf89Cc2GF5iCcFupTULOwmbfinvqrC4Qj9nHJJDNf494NqEN/1f9177ZTQ==} - engines: {node: '>= 14.0.0'} - - alien-signals@1.0.13: - resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} - engines: {node: '>=14'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-kit@2.1.0: - resolution: {integrity: sha512-ROM2LlXbZBZVk97crfw8PGDOBzzsJvN2uJCmwswvPUNyfH14eg90mSN3xNqsri1JS1G9cz0VzeDUhxJkTrr4Ew==} - engines: {node: '>=20.18.0'} - - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - bcryptjs@3.0.2: - resolution: {integrity: sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==} - hasBin: true - - birpc@2.3.0: - resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - builtin-modules@5.0.0: - resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} - engines: {node: '>=18.20'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001723: - resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - ci-info@4.2.0: - resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} - engines: {node: '>=8'} - - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} - engines: {node: '>= 0.8.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - confbox@0.2.2: - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - - core-js-compat@3.43.0: - resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} - - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} - engines: {node: '>=12.20'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - detect-newline@4.0.1: - resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} - engines: {node: '>=0.3.1'} - - dts-resolver@2.1.1: - resolution: {integrity: sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw==} - engines: {node: '>=20.18.0'} - peerDependencies: - oxc-resolver: '>=11.0.0' - peerDependenciesMeta: - oxc-resolver: - optional: true - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.167: - resolution: {integrity: sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - empathic@1.1.0: - resolution: {integrity: sha512-rsPft6CK3eHtrlp9Y5ALBb+hfK+DWnA4WFebbazxjWyx8vSm3rZeoM3z9irsjcqO3PYRzlfv27XIB4tz2DV7RA==} - engines: {node: '>=14'} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} - engines: {node: '>=10.2.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-fix-utils@0.2.1: - resolution: {integrity: sha512-vHvLGmqdgPhZgH+cymlAlAqVuV22auB+uk/mgFdg5zotEtMHAHcOzNzhr5XOrDzyKGEQY2uQHoT+tS8P36/2CQ==} - engines: {node: '>=18.3.0'} - peerDependencies: - '@types/estree': '>=1' - eslint: '>=8' - peerDependenciesMeta: - '@types/estree': - optional: true - - eslint-import-context@0.1.8: - resolution: {integrity: sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - peerDependencies: - unrs-resolver: ^1.0.0 - peerDependenciesMeta: - unrs-resolver: - optional: true - - eslint-import-resolver-typescript@4.4.3: - resolution: {integrity: sha512-elVDn1eWKFrWlzxlWl9xMt8LltjKl161Ix50JFC50tHXI5/TRP32SNEqlJ/bo/HV+g7Rou/tlPQU2AcRtIhrOg==} - engines: {node: ^16.17.0 || >=18.6.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-plugin-import-x@4.15.2: - resolution: {integrity: sha512-J5gx7sN6DTm0LRT//eP3rVVQ2Yi4hrX0B+DbWxa5er8PZ6JjLo9GUBwogIFvEDdwJaSqZplpQT+haK/cXhb7VQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/utils': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 - eslint-import-resolver-node: '*' - peerDependenciesMeta: - '@typescript-eslint/utils': - optional: true - eslint-import-resolver-node: - optional: true - - eslint-plugin-package-json@0.33.2: - resolution: {integrity: sha512-YhWRNeiR44jLCLHDsG2W0mcuHflF9lKG2fSSaN+UDt4lYPCWUzTkQrrKxapabUIobMN+OnM4zsgnPKX97l/N0g==} - engines: {node: '>=18'} - peerDependencies: - eslint: '>=8.0.0' - jsonc-eslint-parser: ^2.0.0 - - eslint-plugin-prettier@5.4.1: - resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-unicorn@59.0.1: - resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==} - engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} - peerDependencies: - eslint: '>=9.22.0' - - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.28.0: - resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - exsolve@1.0.5: - resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - fast-copy@3.0.2: - resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - find-up-simple@1.0.1: - resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} - engines: {node: '>=18'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - - floating-vue@5.2.2: - resolution: {integrity: sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==} - peerDependencies: - '@nuxt/kit': ^3.2.0 - vue: ^3.2.0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true - - focus-trap@7.6.5: - resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data@4.0.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - - git-hooks-list@4.1.1: - resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} - engines: {node: 20 || >=22} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@16.2.0: - resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} - engines: {node: '>=18'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - inflight@1.0.6: - resolution: {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. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-builtin-module@5.0.0: - resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} - engines: {node: '>=18.20'} - - is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-to-ts@3.1.1: - resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} - engines: {node: '>=16'} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} - - lru-cache@4.1.1: - resolution: {integrity: sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minisearch@7.1.2: - resolution: {integrity: sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - napi-postinstall@0.2.4: - resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - npm-check-updates@17.1.18: - resolution: {integrity: sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==} - engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} - hasBin: true - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - - oniguruma-to-es@4.3.3: - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-json-validator@0.10.2: - resolution: {integrity: sha512-i8qx/xfHdkzOzP39bNOtK6VauRrLdJoQf7L1lVRG2/evpLAd3vrj3EGNlzB9QiztBerxWAx5QXZh5z+Jfi0IvQ==} - engines: {node: '>=18'} - hasBin: true - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pkg-types@2.1.0: - resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - postcss@8.5.5: - resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} - engines: {node: ^10 || ^12 || >=14} - - preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} - hasBin: true - - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rolldown-plugin-dts@0.13.11: - resolution: {integrity: sha512-1TScN31JImk8xcq9kdm52z2W8/QX3zeDpEjFkyZmK+GcD0u8QqSWWARBsCEdfS99NyI6D9NIbUpsABXlcpZhig==} - engines: {node: '>=20.18.0'} - peerDependencies: - '@typescript/native-preview': '>=7.0.0-dev.20250601.1' - rolldown: ^1.0.0-beta.9 - typescript: ^5.0.0 - vue-tsc: ~2.2.0 - peerDependenciesMeta: - '@typescript/native-preview': - optional: true - typescript: - optional: true - vue-tsc: - optional: true - - rolldown@1.0.0-beta.11-commit.f051675: - resolution: {integrity: sha512-g8MCVkvg2GnrrG+j+WplOTx1nAmjSwYOMSOQI0qfxf8D4NmYZqJuG3f85yWK64XXQv6pKcXZsfMkOPs9B6B52A==} - hasBin: true - - rollup@4.43.0: - resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - shiki@3.6.0: - resolution: {integrity: sha512-tKn/Y0MGBTffQoklaATXmTqDU02zx8NYBGQ+F6gy87/YjKbizcLd+Cybh/0ZtOBX9r1NEnAy/GTRDKtOsc1L9w==} - - shx@0.3.4: - resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} - engines: {node: '>=6'} - hasBin: true - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - sift@17.1.3: - resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} - engines: {node: '>=10.2.0'} - - sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - - sort-package-json@3.2.1: - resolution: {integrity: sha512-rTfRdb20vuoAn7LDlEtCqOkYfl2X+Qze6cLbNOzcDpbmKEhJI30tTN44d5shbKJnXsvz24QQhlCm81Bag7EOKg==} - hasBin: true - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stable-hash-x@0.1.1: - resolution: {integrity: sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==} - engines: {node: '>=12.0.0'} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - - superjson@2.2.2: - resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} - engines: {node: '>=16'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} - engines: {node: ^14.18.0 || >=16.0.0} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - tinypool@1.1.0: - resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - ts-algebra@2.0.0: - resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - tsdown@0.12.7: - resolution: {integrity: sha512-VJjVaqJfIQuQwtOoeuEJMOJUf3MPDrfX0X7OUNx3nq5pQeuIl3h58tmdbM1IZcu8Dn2j8NQjLh+5TXa0yPb9zg==} - engines: {node: '>=18.0.0'} - hasBin: true - peerDependencies: - '@arethetypeswrong/core': ^0.18.1 - publint: ^0.3.0 - typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 - unplugin-unused: ^0.5.0 - peerDependenciesMeta: - '@arethetypeswrong/core': - optional: true - publint: - optional: true - typescript: - optional: true - unplugin-lightningcss: - optional: true - unplugin-unused: - optional: true - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - twoslash-protocol@0.3.1: - resolution: {integrity: sha512-BMePTL9OkuNISSyyMclBBhV2s9++DiOCyhhCoV5Kaht6eaWLwVjCCUJHY33eZJPsyKeZYS8Wzz0h+XI01VohVw==} - - twoslash-vue@0.3.1: - resolution: {integrity: sha512-9/PS0/iL2m8G6N2ILdI18sZ8l6ex+W2nN5jIaTpfFPlnY0MOX2G5UxEVs+AuNimM9SwEnwfiIuDY9ubDCIQpSQ==} - peerDependencies: - typescript: ^5.5.0 - - twoslash@0.3.1: - resolution: {integrity: sha512-OGqMTGvqXTcb92YQdwGfEdK0nZJA64Aj/ChLOelbl3TfYch2IoBST0Yx4C0LQ7Lzyqm9RpgcpgDxeXQIz4p2Kg==} - peerDependencies: - typescript: ^5.5.0 - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typescript-eslint@8.34.0: - resolution: {integrity: sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - unconfig@7.3.2: - resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unplugin-unused@0.5.1: - resolution: {integrity: sha512-USnsy4XsInQFcIb/kSt5HbTkwIIYfW1ujGN0jPanq76IvG7RsqHPk4kJqDoZSqCgDkTjolr72a/f7K1Hr2XmWg==} - engines: {node: '>=20.18.0'} - - unplugin@2.3.5: - resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} - engines: {node: '>=18.12.0'} - - unrs-resolver@1.9.0: - resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - validate-npm-package-name@6.0.1: - resolution: {integrity: sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==} - engines: {node: ^18.17.0 || >=20.5.0} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite-node@3.2.3: - resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - 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 - - vitepress@2.0.0-alpha.6: - resolution: {integrity: sha512-k58ZsFJi+ml0eHM6skEC3wSUm0piDJJmNJu2LSa9BhGMge69vSN07qTBDK5Ad87aDyYhmkbiIFW2AG6bboMFcg==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4 - oxc-minify: ^0.72.3 - postcss: ^8 - peerDependenciesMeta: - markdown-it-mathjax3: - optional: true - oxc-minify: - optional: true - postcss: - optional: true - - vitest@3.2.3: - resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.3 - '@vitest/ui': 3.2.3 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@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 - - vue-resize@2.0.0-alpha.1: - resolution: {integrity: sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==} - peerDependencies: - vue: ^3.0.0 - - vue@3.5.16: - resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) - '@algolia/client-search': 5.27.0 - algoliasearch: 5.27.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': - dependencies: - '@algolia/client-search': 5.27.0 - algoliasearch: 5.27.0 - - '@algolia/client-abtesting@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/client-analytics@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/client-common@5.27.0': {} - - '@algolia/client-insights@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/client-personalization@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/client-query-suggestions@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/client-search@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/ingestion@1.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/monitoring@1.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/recommend@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - '@algolia/requester-browser-xhr@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - - '@algolia/requester-fetch@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - - '@algolia/requester-node-http@5.27.0': - dependencies: - '@algolia/client-common': 5.27.0 - - '@altano/repository-tools@0.1.1': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/generator@7.27.5': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/parser@7.27.5': - dependencies: - '@babel/types': 7.27.6 - - '@babel/runtime@7.27.6': {} - - '@babel/types@7.27.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@bcoe/v8-coverage@1.0.2': {} - - '@docsearch/css@3.9.0': {} - - '@docsearch/js@3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3) - preact: 10.26.9 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) - '@docsearch/css': 3.9.0 - algoliasearch: 5.27.0 - optionalDependencies: - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@emnapi/core@1.4.3': - dependencies: - '@emnapi/wasi-threads': 1.0.2 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.4.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.0.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.5': - optional: true - - '@esbuild/android-arm64@0.25.5': - optional: true - - '@esbuild/android-arm@0.25.5': - optional: true - - '@esbuild/android-x64@0.25.5': - optional: true - - '@esbuild/darwin-arm64@0.25.5': - optional: true - - '@esbuild/darwin-x64@0.25.5': - optional: true - - '@esbuild/freebsd-arm64@0.25.5': - optional: true - - '@esbuild/freebsd-x64@0.25.5': - optional: true - - '@esbuild/linux-arm64@0.25.5': - optional: true - - '@esbuild/linux-arm@0.25.5': - optional: true - - '@esbuild/linux-ia32@0.25.5': - optional: true - - '@esbuild/linux-loong64@0.25.5': - optional: true - - '@esbuild/linux-mips64el@0.25.5': - optional: true - - '@esbuild/linux-ppc64@0.25.5': - optional: true - - '@esbuild/linux-riscv64@0.25.5': - optional: true - - '@esbuild/linux-s390x@0.25.5': - optional: true - - '@esbuild/linux-x64@0.25.5': - optional: true - - '@esbuild/netbsd-arm64@0.25.5': - optional: true - - '@esbuild/netbsd-x64@0.25.5': - optional: true - - '@esbuild/openbsd-arm64@0.25.5': - optional: true - - '@esbuild/openbsd-x64@0.25.5': - optional: true - - '@esbuild/sunos-x64@0.25.5': - optional: true - - '@esbuild/win32-arm64@0.25.5': - optional: true - - '@esbuild/win32-ia32@0.25.5': - optional: true - - '@esbuild/win32-x64@0.25.5': - optional: true - - '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': - dependencies: - eslint: 9.28.0(jiti@2.4.2) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.20.1': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.2.3': {} - - '@eslint/core@0.13.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.15.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.28.0': {} - - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.2.8': - dependencies: - '@eslint/core': 0.13.0 - levn: 0.4.1 - - '@eslint/plugin-kit@0.3.2': - dependencies: - '@eslint/core': 0.15.0 - levn: 0.4.1 - - '@feathers-community/eslint-config@0.0.7(@types/estree@1.0.8)(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0)(prettier@3.5.3)(typescript@5.8.3)': - dependencies: - '@eslint/js': 9.28.0 - '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) - eslint-import-resolver-typescript: 4.4.3(eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) - eslint-plugin-package-json: 0.33.2(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) - eslint-plugin-prettier: 5.4.1(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3) - eslint-plugin-unicorn: 59.0.1(eslint@9.28.0(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) - globals: 16.2.0 - typescript-eslint: 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - transitivePeerDependencies: - - '@types/eslint' - - '@types/estree' - - '@typescript-eslint/utils' - - eslint-import-resolver-node - - eslint-plugin-import - - jsonc-eslint-parser - - prettier - - supports-color - - typescript - - '@feathers-plus/cache@1.4.0': - dependencies: - lru-cache: 4.1.1 - - '@feathersjs/adapter-commons@5.0.34': - dependencies: - '@feathersjs/commons': 5.0.34 - '@feathersjs/errors': 5.0.34 - '@feathersjs/feathers': 5.0.34 - - '@feathersjs/authentication-client@5.0.34(typescript@5.8.3)': - dependencies: - '@feathersjs/authentication': 5.0.34(typescript@5.8.3) - '@feathersjs/commons': 5.0.34 - '@feathersjs/errors': 5.0.34 - '@feathersjs/feathers': 5.0.34 - transitivePeerDependencies: - - typescript - - '@feathersjs/authentication-local@5.0.34(typescript@5.8.3)': - dependencies: - '@feathersjs/authentication': 5.0.34(typescript@5.8.3) - '@feathersjs/commons': 5.0.34 - '@feathersjs/errors': 5.0.34 - '@feathersjs/feathers': 5.0.34 - bcryptjs: 3.0.2 - lodash: 4.17.21 - transitivePeerDependencies: - - typescript - - '@feathersjs/authentication@5.0.34(typescript@5.8.3)': - 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(typescript@5.8.3) - '@feathersjs/transport-commons': 5.0.34 - '@types/jsonwebtoken': 9.0.9 - jsonwebtoken: 9.0.2 - lodash: 4.17.21 - long-timeout: 0.1.1 - uuid: 11.1.0 - transitivePeerDependencies: - - typescript - - '@feathersjs/client@5.0.34(typescript@5.8.3)': - dependencies: - '@feathersjs/authentication-client': 5.0.34(typescript@5.8.3) - '@feathersjs/errors': 5.0.34 - '@feathersjs/feathers': 5.0.34 - '@feathersjs/rest-client': 5.0.34 - '@feathersjs/socketio-client': 5.0.34 - transitivePeerDependencies: - - typescript - - '@feathersjs/commons@5.0.34': {} - - '@feathersjs/errors@5.0.34': {} - - '@feathersjs/express@5.0.34(typescript@5.8.3)': - dependencies: - '@feathersjs/authentication': 5.0.34(typescript@5.8.3) - '@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.23 - '@types/express-serve-static-core': 4.19.6 - compression: 1.8.0 - cors: 2.8.5 - express: 4.21.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@feathersjs/feathers@5.0.34': - dependencies: - '@feathersjs/commons': 5.0.34 - '@feathersjs/hooks': 0.9.0 - events: 3.3.0 - - '@feathersjs/hooks@0.9.0': {} - - '@feathersjs/memory@5.0.34': - dependencies: - '@feathersjs/adapter-commons': 5.0.34 - '@feathersjs/commons': 5.0.34 - '@feathersjs/errors': 5.0.34 - sift: 17.1.3 - - '@feathersjs/rest-client@5.0.34': - 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 - - '@feathersjs/schema@5.0.34(typescript@5.8.3)': - 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(ajv@8.17.1) - json-schema-to-ts: 3.1.1 - typescript: 5.8.3 - - '@feathersjs/socketio-client@5.0.34': - dependencies: - '@feathersjs/feathers': 5.0.34 - '@feathersjs/transport-commons': 5.0.34 - - '@feathersjs/socketio@5.0.34': - dependencies: - '@feathersjs/commons': 5.0.34 - '@feathersjs/feathers': 5.0.34 - '@feathersjs/transport-commons': 5.0.34 - socket.io: 4.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@feathersjs/transport-commons@5.0.34': - dependencies: - '@feathersjs/commons': 5.0.34 - '@feathersjs/errors': 5.0.34 - '@feathersjs/feathers': 5.0.34 - encodeurl: 2.0.0 - lodash: 4.17.21 - - '@floating-ui/core@1.7.1': - dependencies: - '@floating-ui/utils': 0.2.9 - - '@floating-ui/dom@1.1.1': - dependencies: - '@floating-ui/core': 1.7.1 - - '@floating-ui/utils@0.2.9': {} - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@iconify-json/simple-icons@1.2.38': - dependencies: - '@iconify/types': 2.0.0 - - '@iconify/types@2.0.0': {} - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@napi-rs/wasm-runtime@0.2.11': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.9.0 - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@oxc-project/runtime@0.72.2': {} - - '@oxc-project/types@0.72.2': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/core@0.2.7': {} - - '@quansync/fs@0.1.3': - dependencies: - quansync: 0.2.10 - - '@rolldown/binding-darwin-arm64@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-beta.11-commit.f051675': - dependencies: - '@napi-rs/wasm-runtime': 0.2.11 - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.11-commit.f051675': - optional: true - - '@rolldown/pluginutils@1.0.0-beta.11-commit.f051675': {} - - '@rollup/rollup-android-arm-eabi@4.43.0': - optional: true - - '@rollup/rollup-android-arm64@4.43.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.43.0': - optional: true - - '@rollup/rollup-darwin-x64@4.43.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.43.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.43.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.43.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.43.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.43.0': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.43.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.43.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.43.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.43.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.43.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.43.0': - optional: true - - '@shikijs/core@3.6.0': - dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@3.6.0': - dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.3 - - '@shikijs/engine-oniguruma@3.6.0': - dependencies: - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@3.6.0': - dependencies: - '@shikijs/types': 3.6.0 - - '@shikijs/themes@3.6.0': - dependencies: - '@shikijs/types': 3.6.0 - - '@shikijs/transformers@3.6.0': - dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/types': 3.6.0 - - '@shikijs/twoslash@3.6.0(typescript@5.8.3)': - dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/types': 3.6.0 - twoslash: 0.3.1(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@shikijs/types@3.6.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vitepress-twoslash@3.6.0(typescript@5.8.3)': - dependencies: - '@shikijs/twoslash': 3.6.0(typescript@5.8.3) - floating-vue: 5.2.2(vue@3.5.16(typescript@5.8.3)) - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm: 3.1.0 - mdast-util-to-hast: 13.2.0 - shiki: 3.6.0 - twoslash: 0.3.1(typescript@5.8.3) - twoslash-vue: 0.3.1(typescript@5.8.3) - vue: 3.5.16(typescript@5.8.3) - transitivePeerDependencies: - - '@nuxt/kit' - - supports-color - - typescript - - '@shikijs/vscode-textmate@10.0.2': {} - - '@socket.io/component-emitter@3.1.2': {} - - '@tsconfig/node22@22.0.2': {} - - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.15.31 - - '@types/chai@5.2.2': - dependencies: - '@types/deep-eql': 4.0.2 - - '@types/compression@1.8.1': - dependencies: - '@types/express': 4.17.23 - '@types/node': 22.15.31 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.31 - - '@types/cookiejar@2.1.5': {} - - '@types/cors@2.8.19': - dependencies: - '@types/node': 22.15.31 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/deep-eql@4.0.2': {} - - '@types/estree@1.0.7': {} - - '@types/estree@1.0.8': {} - - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 22.15.31 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 - - '@types/express@4.17.23': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/http-errors@2.0.5': {} - - '@types/json-schema@7.0.15': {} - - '@types/jsonwebtoken@9.0.9': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 22.15.31 - - '@types/lodash@4.17.17': {} - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/methods@1.1.4': {} - - '@types/mime@1.3.5': {} - - '@types/ms@2.1.0': {} - - '@types/node@22.15.31': - dependencies: - undici-types: 6.21.0 - - '@types/qs@6.14.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/send@0.17.5': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.15.31 - - '@types/serve-static@1.15.8': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 22.15.31 - '@types/send': 0.17.5 - - '@types/superagent@8.1.9': - dependencies: - '@types/cookiejar': 2.1.5 - '@types/methods': 1.1.4 - '@types/node': 22.15.31 - form-data: 4.0.3 - - '@types/unist@3.0.3': {} - - '@types/web-bluetooth@0.0.21': {} - - '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/type-utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.0 - eslint: 9.28.0(jiti@2.4.2) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.34.0 - debug: 4.4.1 - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.34.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) - '@typescript-eslint/types': 8.34.0 - debug: 4.4.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.34.0': - dependencies: - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/visitor-keys': 8.34.0 - - '@typescript-eslint/tsconfig-utils@8.34.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - - '@typescript-eslint/type-utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.1 - eslint: 9.28.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.34.0': {} - - '@typescript-eslint/typescript-estree@8.34.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.34.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.34.0(typescript@5.8.3) - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/visitor-keys': 8.34.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.34.0 - '@typescript-eslint/types': 8.34.0 - '@typescript-eslint/typescript-estree': 8.34.0(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.34.0': - dependencies: - '@typescript-eslint/types': 8.34.0 - eslint-visitor-keys: 4.2.1 - - '@typescript/vfs@1.6.1(typescript@5.8.3)': - dependencies: - debug: 4.4.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@ungap/structured-clone@1.3.0': {} - - '@unrs/resolver-binding-android-arm-eabi@1.9.0': - optional: true - - '@unrs/resolver-binding-android-arm64@1.9.0': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.9.0': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.9.0': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.9.0': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.9.0': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.9.0': - dependencies: - '@napi-rs/wasm-runtime': 0.2.11 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.9.0': - optional: true - - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))(vue@3.5.16(typescript@5.8.3))': - dependencies: - vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) - vue: 3.5.16(typescript@5.8.3) - - '@vitest/coverage-v8@3.2.3(vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2))': - dependencies: - '@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 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@3.2.3': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - chai: 5.2.0 - tinyrainbow: 2.0.0 - - '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))': - dependencies: - '@vitest/spy': 3.2.3 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) - - '@vitest/pretty-format@3.2.3': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.2.3': - dependencies: - '@vitest/utils': 3.2.3 - pathe: 2.0.3 - strip-literal: 3.0.0 - - '@vitest/snapshot@3.2.3': - dependencies: - '@vitest/pretty-format': 3.2.3 - magic-string: 0.30.17 - pathe: 2.0.3 - - '@vitest/spy@3.2.3': - dependencies: - tinyspy: 4.0.3 - - '@vitest/utils@3.2.3': - dependencies: - '@vitest/pretty-format': 3.2.3 - loupe: 3.1.3 - tinyrainbow: 2.0.0 - - '@volar/language-core@2.4.14': - dependencies: - '@volar/source-map': 2.4.14 - - '@volar/source-map@2.4.14': {} - - '@vue/compiler-core@3.5.16': - dependencies: - '@babel/parser': 7.27.5 - '@vue/shared': 3.5.16 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.16': - dependencies: - '@vue/compiler-core': 3.5.16 - '@vue/shared': 3.5.16 - - '@vue/compiler-sfc@3.5.16': - dependencies: - '@babel/parser': 7.27.5 - '@vue/compiler-core': 3.5.16 - '@vue/compiler-dom': 3.5.16 - '@vue/compiler-ssr': 3.5.16 - '@vue/shared': 3.5.16 - estree-walker: 2.0.2 - magic-string: 0.30.17 - postcss: 8.5.5 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.16': - dependencies: - '@vue/compiler-dom': 3.5.16 - '@vue/shared': 3.5.16 - - '@vue/compiler-vue2@2.7.16': - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - '@vue/devtools-api@7.7.6': - dependencies: - '@vue/devtools-kit': 7.7.6 - - '@vue/devtools-kit@7.7.6': - 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 - - '@vue/devtools-shared@7.7.6': - dependencies: - rfdc: 1.4.1 - - '@vue/language-core@2.2.4(typescript@5.8.3)': - dependencies: - '@volar/language-core': 2.4.14 - '@vue/compiler-dom': 3.5.16 - '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.16 - alien-signals: 1.0.13 - minimatch: 9.0.5 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - optionalDependencies: - typescript: 5.8.3 - - '@vue/reactivity@3.5.16': - dependencies: - '@vue/shared': 3.5.16 - - '@vue/runtime-core@3.5.16': - dependencies: - '@vue/reactivity': 3.5.16 - '@vue/shared': 3.5.16 - - '@vue/runtime-dom@3.5.16': - dependencies: - '@vue/reactivity': 3.5.16 - '@vue/runtime-core': 3.5.16 - '@vue/shared': 3.5.16 - csstype: 3.1.3 - - '@vue/server-renderer@3.5.16(vue@3.5.16(typescript@5.8.3))': - dependencies: - '@vue/compiler-ssr': 3.5.16 - '@vue/shared': 3.5.16 - vue: 3.5.16(typescript@5.8.3) - - '@vue/shared@3.5.16': {} - - '@vueuse/core@13.3.0(vue@3.5.16(typescript@5.8.3))': - dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 13.3.0 - '@vueuse/shared': 13.3.0(vue@3.5.16(typescript@5.8.3)) - vue: 3.5.16(typescript@5.8.3) - - '@vueuse/integrations@13.3.0(focus-trap@7.6.5)(vue@3.5.16(typescript@5.8.3))': - dependencies: - '@vueuse/core': 13.3.0(vue@3.5.16(typescript@5.8.3)) - '@vueuse/shared': 13.3.0(vue@3.5.16(typescript@5.8.3)) - vue: 3.5.16(typescript@5.8.3) - optionalDependencies: - focus-trap: 7.6.5 - - '@vueuse/metadata@13.3.0': {} - - '@vueuse/shared@13.3.0(vue@3.5.16(typescript@5.8.3))': - dependencies: - vue: 3.5.16(typescript@5.8.3) - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - algoliasearch@5.27.0: - dependencies: - '@algolia/client-abtesting': 5.27.0 - '@algolia/client-analytics': 5.27.0 - '@algolia/client-common': 5.27.0 - '@algolia/client-insights': 5.27.0 - '@algolia/client-personalization': 5.27.0 - '@algolia/client-query-suggestions': 5.27.0 - '@algolia/client-search': 5.27.0 - '@algolia/ingestion': 1.27.0 - '@algolia/monitoring': 1.27.0 - '@algolia/recommend': 5.27.0 - '@algolia/requester-browser-xhr': 5.27.0 - '@algolia/requester-fetch': 5.27.0 - '@algolia/requester-node-http': 5.27.0 - - alien-signals@1.0.13: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - ansis@4.1.0: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-flatten@1.1.1: {} - - assertion-error@2.0.1: {} - - ast-kit@2.1.0: - dependencies: - '@babel/parser': 7.27.5 - pathe: 2.0.3 - - ast-v8-to-istanbul@0.3.3: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - estree-walker: 3.0.3 - js-tokens: 9.0.1 - - asynckit@0.4.0: {} - - balanced-match@1.0.2: {} - - base64id@2.0.0: {} - - bcryptjs@3.0.2: {} - - birpc@2.3.0: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.25.0: - dependencies: - caniuse-lite: 1.0.30001723 - electron-to-chromium: 1.5.167 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) - - buffer-equal-constant-time@1.0.1: {} - - builtin-modules@5.0.0: {} - - bytes@3.1.2: {} - - cac@6.7.14: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001723: {} - - ccount@2.0.1: {} - - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - check-error@2.1.1: {} - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - ci-info@4.2.0: {} - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - comma-separated-tokens@2.0.3: {} - - comment-parser@1.4.1: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.0: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - confbox@0.2.2: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.6: {} - - cookie@0.7.1: {} - - cookie@0.7.2: {} - - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - - core-js-compat@3.43.0: - dependencies: - browserslist: 4.25.0 - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.1.3: {} - - de-indent@1.0.2: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.1: - dependencies: - ms: 2.1.3 - - decode-named-character-reference@1.1.0: - dependencies: - character-entities: 2.0.2 - - dedent@1.6.0: {} - - deep-eql@5.0.2: {} - - deep-is@0.1.4: {} - - defu@6.1.4: {} - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detect-indent@6.1.0: {} - - detect-indent@7.0.1: {} - - detect-newline@3.1.0: {} - - detect-newline@4.0.1: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff@8.0.2: {} - - dts-resolver@2.1.1: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.167: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - empathic@1.1.0: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - engine.io-parser@5.2.3: {} - - engine.io@6.6.4: - dependencies: - '@types/cors': 2.8.19 - '@types/node': 22.15.31 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.5 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - entities@4.5.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - esbuild@0.25.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escape-string-regexp@5.0.0: {} - - eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)): - dependencies: - eslint: 9.28.0(jiti@2.4.2) - - eslint-fix-utils@0.2.1(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2)): - dependencies: - eslint: 9.28.0(jiti@2.4.2) - optionalDependencies: - '@types/estree': 1.0.8 - - eslint-import-context@0.1.8(unrs-resolver@1.9.0): - dependencies: - get-tsconfig: 4.10.1 - stable-hash-x: 0.1.1 - optionalDependencies: - unrs-resolver: 1.9.0 - - eslint-import-resolver-typescript@4.4.3(eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2)): - dependencies: - debug: 4.4.1 - eslint: 9.28.0(jiti@2.4.2) - eslint-import-context: 0.1.8(unrs-resolver@1.9.0) - get-tsconfig: 4.10.1 - is-bun-module: 2.0.0 - stable-hash-x: 0.1.1 - tinyglobby: 0.2.14 - unrs-resolver: 1.9.0 - optionalDependencies: - eslint-plugin-import-x: 4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import-x@4.15.2(@typescript-eslint/utils@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): - dependencies: - '@typescript-eslint/types': 8.34.0 - comment-parser: 1.4.1 - debug: 4.4.1 - eslint: 9.28.0(jiti@2.4.2) - eslint-import-context: 0.1.8(unrs-resolver@1.9.0) - is-glob: 4.0.3 - minimatch: 10.0.3 - semver: 7.7.2 - stable-hash-x: 0.1.1 - unrs-resolver: 1.9.0 - optionalDependencies: - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - transitivePeerDependencies: - - supports-color - - eslint-plugin-package-json@0.33.2(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0): - dependencies: - '@altano/repository-tools': 0.1.1 - detect-indent: 6.1.0 - detect-newline: 3.1.0 - eslint: 9.28.0(jiti@2.4.2) - eslint-fix-utils: 0.2.1(@types/estree@1.0.8)(eslint@9.28.0(jiti@2.4.2)) - jsonc-eslint-parser: 2.4.0 - package-json-validator: 0.10.2 - semver: 7.7.2 - sort-object-keys: 1.1.3 - sort-package-json: 3.2.1 - validate-npm-package-name: 6.0.1 - transitivePeerDependencies: - - '@types/estree' - - eslint-plugin-prettier@5.4.1(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@2.4.2)))(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3): - dependencies: - eslint: 9.28.0(jiti@2.4.2) - prettier: 3.5.3 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.8 - optionalDependencies: - eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@2.4.2)) - - eslint-plugin-unicorn@59.0.1(eslint@9.28.0(jiti@2.4.2)): - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@eslint/plugin-kit': 0.2.8 - ci-info: 4.2.0 - clean-regexp: 1.0.0 - core-js-compat: 3.43.0 - eslint: 9.28.0(jiti@2.4.2) - esquery: 1.6.0 - find-up-simple: 1.0.1 - globals: 16.2.0 - indent-string: 5.0.0 - is-builtin-module: 5.0.0 - jsesc: 3.1.0 - pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.12.0 - semver: 7.7.2 - strip-indent: 4.0.0 - - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2)): - dependencies: - eslint: 9.28.0(jiti@2.4.2) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - - eslint-scope@8.4.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint@9.28.0(jiti@2.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.14.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.28.0 - '@eslint/plugin-kit': 0.3.2 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.4.2 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 - - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - - esprima@4.0.1: {} - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - - esutils@2.0.3: {} - - etag@1.8.1: {} - - events@3.3.0: {} - - expect-type@1.2.1: {} - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - exsolve@1.0.5: {} - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - fast-copy@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.6: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-up-simple@1.0.1: {} - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - - flatted@3.3.3: {} - - floating-vue@5.2.2(vue@3.5.16(typescript@5.8.3)): - dependencies: - '@floating-ui/dom': 1.1.1 - vue: 3.5.16(typescript@5.8.3) - vue-resize: 2.0.0-alpha.1(vue@3.5.16(typescript@5.8.3)) - - focus-trap@7.6.5: - dependencies: - tabbable: 6.2.0 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data@4.0.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - get-caller-file@2.0.5: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - - git-hooks-list@4.1.1: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.3: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@14.0.0: {} - - globals@16.2.0: {} - - gopd@1.2.0: {} - - graphemer@1.4.0: {} - - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - - has-flag@4.0.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - he@1.2.0: {} - - hookable@5.5.3: {} - - html-escaper@2.0.2: {} - - html-void-elements@3.0.0: {} - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - indent-string@5.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - interpret@1.4.0: {} - - ipaddr.js@1.9.1: {} - - is-builtin-module@5.0.0: - dependencies: - builtin-modules: 5.0.0 - - is-bun-module@2.0.0: - dependencies: - semver: 7.7.2 - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-extendable@0.1.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@4.1.0: {} - - is-what@4.1.16: {} - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.1 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - - jiti@2.4.2: {} - - js-tokens@9.0.1: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@3.0.2: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-schema-to-ts@3.1.1: - dependencies: - '@babel/runtime': 7.27.6 - ts-algebra: 2.0.0 - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - jsonc-eslint-parser@2.4.0: - dependencies: - acorn: 8.15.0 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.7.2 - - jsonwebtoken@9.0.2: - 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.1.1 - ms: 2.1.3 - semver: 7.7.2 - - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@6.0.3: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - 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.merge@4.6.2: {} - - lodash.once@4.1.1: {} - - lodash@4.17.21: {} - - long-timeout@0.1.1: {} - - longest-streak@3.1.0: {} - - loupe@3.1.3: {} - - lru-cache@10.4.3: {} - - lru-cache@11.1.0: {} - - lru-cache@4.1.1: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magicast@0.3.5: - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - source-map-js: 1.2.1 - - make-dir@4.0.0: - dependencies: - semver: 7.7.2 - - mark.js@8.11.1: {} - - markdown-table@3.0.4: {} - - math-intrinsics@1.1.0: {} - - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - mdast-util-from-markdown@2.0.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - media-typer@0.3.0: {} - - merge-descriptors@1.0.3: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - micromark@4.0.2: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1 - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - min-indent@1.0.1: {} - - minimatch@10.0.3: - dependencies: - '@isaacs/brace-expansion': 5.0.0 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - minisearch@7.1.2: {} - - mitt@3.0.1: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - muggle-string@0.4.1: {} - - nanoid@3.3.11: {} - - napi-postinstall@0.2.4: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - neotraverse@0.6.18: {} - - node-releases@2.0.19: {} - - npm-check-updates@17.1.18: {} - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - oniguruma-parser@0.12.1: {} - - oniguruma-to-es@4.3.3: - dependencies: - oniguruma-parser: 0.12.1 - regex: 6.0.1 - regex-recursion: 6.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - package-json-from-dist@1.0.1: {} - - package-json-validator@0.10.2: - dependencies: - yargs: 17.7.2 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parseurl@1.3.3: {} - - path-browserify@1.0.1: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.0: - dependencies: - lru-cache: 11.1.0 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} - - pathe@2.0.3: {} - - pathval@2.0.0: {} - - perfect-debounce@1.0.0: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pkg-types@2.1.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.5 - pathe: 2.0.3 - - pluralize@8.0.0: {} - - postcss@8.5.5: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - preact@10.26.9: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@3.5.3: {} - - property-information@7.1.0: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - pseudomap@1.0.2: {} - - punycode@2.3.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - quansync@0.2.10: {} - - queue-microtask@1.2.3: {} - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - readdirp@4.1.2: {} - - rechoir@0.6.2: - dependencies: - resolve: 1.22.10 - - regex-recursion@6.0.2: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@6.0.1: - dependencies: - regex-utilities: 2.3.0 - - regexp-tree@0.1.27: {} - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.1.0: {} - - rfdc@1.4.1: {} - - rolldown-plugin-dts@0.13.11(rolldown@1.0.0-beta.11-commit.f051675)(typescript@5.8.3): - dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - ast-kit: 2.1.0 - birpc: 2.3.0 - debug: 4.4.1 - dts-resolver: 2.1.1 - get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.11-commit.f051675 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - oxc-resolver - - supports-color - - rolldown@1.0.0-beta.11-commit.f051675: - dependencies: - '@oxc-project/runtime': 0.72.2 - '@oxc-project/types': 0.72.2 - '@rolldown/pluginutils': 1.0.0-beta.11-commit.f051675 - ansis: 4.1.0 - optionalDependencies: - '@rolldown/binding-darwin-arm64': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-darwin-x64': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.11-commit.f051675 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.11-commit.f051675 - - rollup@4.43.0: - dependencies: - '@types/estree': 1.0.7 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.43.0 - '@rollup/rollup-android-arm64': 4.43.0 - '@rollup/rollup-darwin-arm64': 4.43.0 - '@rollup/rollup-darwin-x64': 4.43.0 - '@rollup/rollup-freebsd-arm64': 4.43.0 - '@rollup/rollup-freebsd-x64': 4.43.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 - '@rollup/rollup-linux-arm-musleabihf': 4.43.0 - '@rollup/rollup-linux-arm64-gnu': 4.43.0 - '@rollup/rollup-linux-arm64-musl': 4.43.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-gnu': 4.43.0 - '@rollup/rollup-linux-riscv64-musl': 4.43.0 - '@rollup/rollup-linux-s390x-gnu': 4.43.0 - '@rollup/rollup-linux-x64-gnu': 4.43.0 - '@rollup/rollup-linux-x64-musl': 4.43.0 - '@rollup/rollup-win32-arm64-msvc': 4.43.0 - '@rollup/rollup-win32-ia32-msvc': 4.43.0 - '@rollup/rollup-win32-x64-msvc': 4.43.0 - fsevents: 2.3.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - search-insights@2.17.3: {} - - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - - semver@7.7.2: {} - - send@0.19.0: - 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 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - setprototypeof@1.2.0: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - - shiki@3.6.0: - dependencies: - '@shikijs/core': 3.6.0 - '@shikijs/engine-javascript': 3.6.0 - '@shikijs/engine-oniguruma': 3.6.0 - '@shikijs/langs': 3.6.0 - '@shikijs/themes': 3.6.0 - '@shikijs/types': 3.6.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - shx@0.3.4: - dependencies: - minimist: 1.2.8 - shelljs: 0.8.5 - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - sift@17.1.3: {} - - siginfo@2.0.0: {} - - signal-exit@4.1.0: {} - - socket.io-adapter@2.5.5: - dependencies: - debug: 4.3.7 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - socket.io@4.8.1: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.6.4 - socket.io-adapter: 2.5.5 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - sort-object-keys@1.1.3: {} - - sort-package-json@3.2.1: - dependencies: - detect-indent: 7.0.1 - detect-newline: 4.0.1 - git-hooks-list: 4.1.1 - is-plain-obj: 4.1.0 - semver: 7.7.2 - sort-object-keys: 1.1.3 - tinyglobby: 0.2.14 - - source-map-js@1.2.1: {} - - space-separated-tokens@2.0.2: {} - - speakingurl@14.0.1: {} - - sprintf-js@1.0.3: {} - - stable-hash-x@0.1.1: {} - - stackback@0.0.2: {} - - statuses@2.0.1: {} - - std-env@3.9.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom-string@1.0.0: {} - - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} - - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - - superjson@2.2.2: - dependencies: - copy-anything: 3.0.5 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.11.8: - dependencies: - '@pkgr/core': 0.2.7 - - tabbable@6.2.0: {} - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - - tinybench@2.9.0: {} - - tinyexec@0.3.2: {} - - tinyexec@1.0.1: {} - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - - tinypool@1.1.0: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - trim-lines@3.0.1: {} - - ts-algebra@2.0.0: {} - - ts-api-utils@2.1.0(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - - tsdown@0.12.7(typescript@5.8.3)(unplugin-unused@0.5.1): - dependencies: - ansis: 4.1.0 - cac: 6.7.14 - chokidar: 4.0.3 - debug: 4.4.1 - diff: 8.0.2 - empathic: 1.1.0 - hookable: 5.5.3 - rolldown: 1.0.0-beta.11-commit.f051675 - rolldown-plugin-dts: 0.13.11(rolldown@1.0.0-beta.11-commit.f051675)(typescript@5.8.3) - semver: 7.7.2 - tinyexec: 1.0.1 - tinyglobby: 0.2.14 - unconfig: 7.3.2 - optionalDependencies: - typescript: 5.8.3 - unplugin-unused: 0.5.1 - transitivePeerDependencies: - - '@typescript/native-preview' - - oxc-resolver - - supports-color - - vue-tsc - - tslib@2.8.1: - optional: true - - twoslash-protocol@0.3.1: {} - - twoslash-vue@0.3.1(typescript@5.8.3): - dependencies: - '@vue/language-core': 2.2.4(typescript@5.8.3) - twoslash: 0.3.1(typescript@5.8.3) - twoslash-protocol: 0.3.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - twoslash@0.3.1(typescript@5.8.3): - dependencies: - '@typescript/vfs': 1.6.1(typescript@5.8.3) - twoslash-protocol: 0.3.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typescript-eslint@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.34.0(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.28.0(jiti@2.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - typescript@5.8.3: {} - - unconfig@7.3.2: - dependencies: - '@quansync/fs': 0.1.3 - defu: 6.1.4 - jiti: 2.4.2 - quansync: 0.2.10 - - undici-types@6.21.0: {} - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - unpipe@1.0.0: {} - - unplugin-unused@0.5.1: - dependencies: - js-tokens: 9.0.1 - picocolors: 1.1.1 - pkg-types: 2.1.0 - unplugin: 2.3.5 - - unplugin@2.3.5: - dependencies: - acorn: 8.15.0 - picomatch: 4.0.2 - webpack-virtual-modules: 0.6.2 - - unrs-resolver@1.9.0: - dependencies: - napi-postinstall: 0.2.4 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.9.0 - '@unrs/resolver-binding-android-arm64': 1.9.0 - '@unrs/resolver-binding-darwin-arm64': 1.9.0 - '@unrs/resolver-binding-darwin-x64': 1.9.0 - '@unrs/resolver-binding-freebsd-x64': 1.9.0 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0 - '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-arm64-musl': 1.9.0 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0 - '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0 - '@unrs/resolver-binding-linux-x64-gnu': 1.9.0 - '@unrs/resolver-binding-linux-x64-musl': 1.9.0 - '@unrs/resolver-binding-wasm32-wasi': 1.9.0 - '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0 - '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0 - '@unrs/resolver-binding-win32-x64-msvc': 1.9.0 - - update-browserslist-db@1.1.3(browserslist@4.25.0): - dependencies: - browserslist: 4.25.0 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - utils-merge@1.0.1: {} - - uuid@11.1.0: {} - - validate-npm-package-name@6.0.1: {} - - vary@1.1.2: {} - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite-node@3.2.3(@types/node@22.15.31)(jiti@2.4.2): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.5 - rollup: 4.43.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.15.31 - fsevents: 2.3.3 - jiti: 2.4.2 - - vitepress@2.0.0-alpha.6(@algolia/client-search@5.27.0)(@types/node@22.15.31)(jiti@2.4.2)(postcss@8.5.5)(search-insights@2.17.3)(typescript@5.8.3): - dependencies: - '@docsearch/css': 3.9.0 - '@docsearch/js': 3.9.0(@algolia/client-search@5.27.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.38 - '@shikijs/core': 3.6.0 - '@shikijs/transformers': 3.6.0 - '@shikijs/types': 3.6.0 - '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2))(vue@3.5.16(typescript@5.8.3)) - '@vue/devtools-api': 7.7.6 - '@vue/shared': 3.5.16 - '@vueuse/core': 13.3.0(vue@3.5.16(typescript@5.8.3)) - '@vueuse/integrations': 13.3.0(focus-trap@7.6.5)(vue@3.5.16(typescript@5.8.3)) - focus-trap: 7.6.5 - mark.js: 8.11.1 - minisearch: 7.1.2 - shiki: 3.6.0 - vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) - vue: 3.5.16(typescript@5.8.3) - optionalDependencies: - postcss: 8.5.5 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jiti - - jwt-decode - - less - - lightningcss - - nprogress - - qrcode - - react - - react-dom - - sass - - sass-embedded - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - tsx - - typescript - - universal-cookie - - yaml - - vitest@3.2.3(@types/debug@4.1.12)(@types/node@22.15.31)(jiti@2.4.2): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@22.15.31)(jiti@2.4.2)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.3 - '@vitest/snapshot': 3.2.3 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - 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.0 - tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.31)(jiti@2.4.2) - vite-node: 3.2.3(@types/node@22.15.31)(jiti@2.4.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 22.15.31 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vue-resize@2.0.0-alpha.1(vue@3.5.16(typescript@5.8.3)): - dependencies: - vue: 3.5.16(typescript@5.8.3) - - vue@3.5.16(typescript@5.8.3): - dependencies: - '@vue/compiler-dom': 3.5.16 - '@vue/compiler-sfc': 3.5.16 - '@vue/runtime-dom': 3.5.16 - '@vue/server-renderer': 3.5.16(vue@3.5.16(typescript@5.8.3)) - '@vue/shared': 3.5.16 - optionalDependencies: - typescript: 5.8.3 - - webpack-virtual-modules@0.6.2: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - ws@8.17.1: {} - - y18n@5.0.8: {} - - yallist@2.1.2: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yocto-queue@0.1.0: {} - - zwitch@2.0.4: {} From b56e8f74ab70eaf6c45da79bfcd130dddeac6a30 Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:36:22 +0200 Subject: [PATCH 14/15] fix: docs errors --- docs/.vitepress/plugins/markdownTransform.ts | 1 - docs/.vitepress/utilities.ts | 2 - docs/migrating.md | 44 -------------------- docs/overview.md | 12 ++---- src/hooks/index.ts | 3 ++ src/utils/index.ts | 9 ++-- 6 files changed, 11 insertions(+), 60 deletions(-) diff --git a/docs/.vitepress/plugins/markdownTransform.ts b/docs/.vitepress/plugins/markdownTransform.ts index 50125754..f2ede496 100644 --- a/docs/.vitepress/plugins/markdownTransform.ts +++ b/docs/.vitepress/plugins/markdownTransform.ts @@ -34,7 +34,6 @@ export function MarkdownTransform(options: MarkdownTransformOptions): Plugin { const utility = utilitiesList.find(x => x.pathMd === slug) if (!utility) { - console.warn(`Utility not found for slug: ${slug}`) return null } diff --git a/docs/.vitepress/utilities.ts b/docs/.vitepress/utilities.ts index 8b0fbe72..0f564a67 100644 --- a/docs/.vitepress/utilities.ts +++ b/docs/.vitepress/utilities.ts @@ -48,8 +48,6 @@ export async function discoverUtilities() { const slug = kebabCase(title) - console.log(`Processing ${filePath} -> ${slug}`) - const utility: Utility = { name: title, title, diff --git a/docs/migrating.md b/docs/migrating.md index 812547be..78c310af 100644 --- a/docs/migrating.md +++ b/docs/migrating.md @@ -1,45 +1 @@ # Migrating - -Version 5.0.0 of `feathers-hooks-common` is compatible with Feathers v4 and up. - -## Deprecations - -The following hooks and utilities have been deprecated and replaced with different named alternatives, Feathers v4 or Lodash functionality: - -### Hooks - -- `callback-to-promise` - Use `async/await`, native Promises or NodeJS [utils.promisify](https://nodejs.org/api/util.html#util_util_promisify_original) -- `client` - Use [paramsFromClient](hooks#paramsfromclient) instead -- `disable` - Use [disallow](hooks#disallow) instead -- `disable-multi-item-change` - Use the database adapter `multi` option instead. See the [Feathers v4 migration guide](https://docs.feathersjs.com/guides/migrating.html) for more information. -- disable-multi-item-create - Use the database adapter `multi` option instead. See the [Feathers v4 migration guide](https://docs.feathersjs.com/guides/migrating.html) for more information. -- `pluck` - Use `iff(isProvider('external'), keep(...fieldNames))` instead -- `pluckQuery` - Use [keepQuery](hooks#keepquery) instead -- promiseToCallback - No longer necessary since callbacks have been deprecated in Feathers v3 and later -- `removeQuery` - Use [discardQuery](hooks#discardquery) instead -- `setCreatedAt` - Use [setNow](hooks#setnow) instead -- `setUpdatedAt` - Use [setNow](hooks#setnow) instead -- `skipRemainingHooks` - Use conditional hook chains with [iff](hooks#iff) instead -- `skipRemainingHooksOnFlag` - Use conditional hook chains with [iff](hooks#iff) instead -- `softDelete2` - Use Feathers v4 database adapters and the new [softDelete](hooks#softdelete) instead - -### Utilities - -Several utility methods have been replaced by [Lodash](https://lodash.com) methods which are thoroughly tested and performance optimized in many different environments. - -- `existsByDot` - Use [\_.has()](https://lodash.com/docs/latest#has) -- `deleteByDot` - Use [\_.omit](https://lodash.com/docs/latest#omit) -- `getByDot` - Use [\_.get()](https://lodash.com/docs/latest#get) -- `setByDot` - Use [\_.set()](https://lodash.com/docs/latest#set) - -## Safe mutations - -Most hooks have been updated to safely delete or add properties by replacing the object on the context with a new object instead of mutating it. This should prevent difficult to debug situations where e.g. `params` or `params.query` get changes in nested hooks when passed along. - -## stashBefore - -## softDelete - -## setField - -Moved to [feathers-authentication-hooks](https://github.com/feathersjs-ecosystem/feathers-authentication-hooks#setfield) diff --git a/docs/overview.md b/docs/overview.md index 5d397c47..8f0a0b45 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -4,14 +4,8 @@ This documentation has several parts: -- [Hooks API](./hooks.md) - The API for the available hooks -- [Utilities API](./utilities.md) - The API for the available utility methods -- [Predicates](./predicates.md)- The API for the available predicates +- [Hooks API](./hooks/index.md) - The API for the available hooks +- [Utilities API](./utils/index.md) - The API for the available utility methods +- [Predicates](./predicates/index.md)- The API for the available predicates - [Migrating](./migrating.md) - Information on how to migrate to the latest version of `feathers-hooks-common` - [Guides](./guides.md) - More in-depth guides for some of the available hooks - -## Notable Changes - -### 6.1.0 - -- **new hook `setField`**: The `setField` hook allows to set a field on the hook context based on the value of another field on the hook context. [see docs](./hooks.md#setfield) diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 42e0645d..8235ba06 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,6 +1,7 @@ export * from './cache/cache.js' export * from './check-required/check-required.js' export * from './combine/combine.js' +export * from './create-related/create-related.js' export * from './debug/debug.js' export * from './disable-pagination/disable-pagination.js' export * from './disallow/disallow.js' @@ -27,6 +28,8 @@ export * from './stash-before/stash-before.js' export * from './throw-if-is-multi/throw-if-is-multi.js' export * from './throw-if-is-provider/throw-if-is-provider.js' export * from './throw-if/throw-if.js' +export * from './trim-data/trim-data.js' +export * from './trim-result/trim-result.js' export * from './transform-data/transform-data.js' export * from './transform-result/transform-result.js' export * from './traverse/traverse.js' diff --git a/src/utils/index.ts b/src/utils/index.ts index ffb50ad4..4d806186 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,12 +1,13 @@ export * from './calling-params/calling-params.js' -export * from './check-context/check-context.js' export * from './check-context-if.js' -export * from './get-items/get-items.js' +export * from './check-context/check-context.js' export * from './get-data-is-array/get-data-is-array.js' +export * from './get-exposed-methods/get-exposed-methods.js' +export * from './get-items/get-items.js' +export * from './get-paginate/get-paginate.js' export * from './get-result-is-array/get-result-is-array.js' -export * from './replace-items/replace-items.js' export * from './replace-data/replace-data.js' +export * from './replace-items/replace-items.js' export * from './replace-result/replace-result.js' -export * from './get-paginate/get-paginate.js' export * from './skip-result/skip-result.js' export * from './transform-params/transform-params.js' From cd5046877a95f38facedf5574b540e75130dc71a Mon Sep 17 00:00:00 2001 From: fratzinger <22286818+fratzinger@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:42:29 +0200 Subject: [PATCH 15/15] fix: test exports all fns --- test/index.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/index.test.ts b/test/index.test.ts index d83e5d8a..c121add6 100755 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -12,6 +12,7 @@ const members = [ 'checkContext', 'checkContextIf', 'combine', + 'createRelated', 'debug', 'disablePagination', 'disallow', @@ -76,10 +77,14 @@ const members = [ 'getPaginate', 'skipResult', + 'trimData', + 'trimResult', + 'throwIf', 'throwIfIsMulti', 'throwIfIsProvider', + 'getExposedMethods', 'transformParams', ].sort()