From eae0212a19501d9d365a6678ce054bf36b4ddcce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ko=CC=88nig?= Date: Tue, 3 Feb 2026 11:42:01 +0100 Subject: [PATCH] feat(DEV-1300): swapped eslint and prettier with oxlint and oxfmt --- .lintstagedrc.json | 12 +- .oxfmtrc.jsonc | 8 + .prettierignore | 1 - .prettierrc | 8 - eslint.config.mjs | 35 - oxlint.json | 20 + package-lock.json | 5265 +++++------------ package.json | 22 +- src/config.env.ts | 15 +- src/core.module.ts | 12 +- src/core/common/args/filter.args.ts | 2 +- src/core/common/args/pagination.args.ts | 2 +- .../decorators/translatable.decorator.ts | 2 +- .../filters/http-exception-log.filter.ts | 6 +- src/core/common/helpers/config.helper.ts | 2 +- src/core/common/helpers/db.helper.ts | 24 +- src/core/common/helpers/graphql.helper.ts | 2 +- src/core/common/helpers/input.helper.ts | 4 +- src/core/common/helpers/scim.helper.ts | 29 +- .../common/inputs/combined-filter.input.ts | 2 +- src/core/common/inputs/core-input.input.ts | 2 +- src/core/common/inputs/filter.input.ts | 26 +- src/core/common/inputs/single-filter.input.ts | 4 +- .../check-response.interceptor.ts | 4 +- ...ron-job-config-with-time-zone.interface.ts | 6 +- ...on-job-config-with-utc-offset.interface.ts | 6 +- .../scim-array-filter-node.interface.ts | 2 +- .../scim-condition-node.interface.ts | 2 +- .../interfaces/scim-logical-node.interface.ts | 2 +- .../interfaces/server-options.interface.ts | 9 +- src/core/common/scalars/any.scalar.ts | 2 +- src/core/common/scalars/json.scalar.ts | 6 +- src/core/common/services/config.service.ts | 22 +- .../common/services/core-cron-jobs.service.ts | 12 +- src/core/common/services/crud.service.ts | 4 +- src/core/common/services/mailjet.service.ts | 9 +- src/core/common/services/module.service.ts | 6 +- src/core/common/types/array-element.type.ts | 5 +- .../common/types/require-only-one.type.ts | 4 +- .../types/required-at-least-one.type.ts | 4 +- src/core/common/types/scim-comparator.type.ts | 2 +- .../types/scim-logical-operator.type.ts | 2 +- src/core/common/types/scim-node.type.ts | 2 +- src/core/modules/auth/guards/auth.guard.ts | 6 +- src/core/modules/auth/guards/roles.guard.ts | 9 +- src/core/modules/auth/tokens.decorator.ts | 6 +- src/core/modules/better-auth/ARCHITECTURE.md | 43 +- .../better-auth/INTEGRATION-CHECKLIST.md | 76 +- src/core/modules/better-auth/README.md | 472 +- .../better-auth/better-auth-token.service.ts | 13 +- .../modules/better-auth/better-auth.config.ts | 6 +- .../better-auth/better-auth.resolver.ts | 4 +- .../modules/better-auth/better-auth.types.ts | 4 +- .../core-better-auth-api.middleware.ts | 25 +- .../core-better-auth-challenge.service.ts | 4 +- .../core-better-auth-web.helper.ts | 10 +- .../core-better-auth.controller.ts | 34 +- .../core-better-auth.middleware.ts | 4 +- .../better-auth/core-better-auth.module.ts | 39 +- .../better-auth/core-better-auth.resolver.ts | 10 +- .../error-code/INTEGRATION-CHECKLIST.md | 49 +- src/core/modules/file/README.md | 22 +- .../modules/migrate/MIGRATION_FROM_NODEPIT.md | 30 +- src/core/modules/migrate/README.md | 58 +- src/core/modules/tus/INTEGRATION-CHECKLIST.md | 29 +- src/core/modules/tus/README.md | 94 +- src/server/modules/auth/auth.module.ts | 7 +- .../better-auth/better-auth.resolver.ts | 4 +- src/server/modules/error-code/README.md | 35 +- .../error-code/error-code.controller.ts | 5 +- src/server/modules/file/file.resolver.ts | 2 +- src/server/modules/user/user.resolver.ts | 2 +- src/test/test.helper.ts | 12 +- 73 files changed, 2135 insertions(+), 4595 deletions(-) create mode 100644 .oxfmtrc.jsonc delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 eslint.config.mjs create mode 100644 oxlint.json diff --git a/.lintstagedrc.json b/.lintstagedrc.json index aa84342f..9693478d 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,14 +1,10 @@ { "*.ts": [ - "prettier --write --ignore-unknown --log-level error", - "eslint --fix" + "oxfmt --write", + "oxlint --fix" ], "*.js": [ - "prettier --write --ignore-unknown --log-level error", - "eslint --fix" - ], - "*.html": [ - "prettier --write --ignore-unknown --log-level error", - "eslint --fix" + "oxfmt --write", + "oxlint --fix" ] } diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc new file mode 100644 index 00000000..b3a5f9df --- /dev/null +++ b/.oxfmtrc.jsonc @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "arrowParens": "always", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "ignorePatterns": ["node_modules", "dist", "schema.gql"] +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 341a44db..00000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -schema.gql diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 7a246f62..00000000 --- a/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "arrowParens": "always", - "plugins": [ - "./extras/prettier-imports.js" - ], - "printWidth": 120, - "singleQuote": true -} diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 57ecac06..00000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import baseConfig from '@lenne.tech/eslint-config-ts'; - -// Ignore templates - they contain placeholder code -const ignores = { - ignores: ['src/core/modules/migrate/templates/migration-project.template.ts'] -}; - -// Patch rules -const patched = baseConfig.map(config => { - if (config.rules?.['unused-imports/no-unused-vars']) { - config.rules['unused-imports/no-unused-vars'] = [ - 'warn', - { - argsIgnorePattern: '^_', - caughtErrors: 'none', - varsIgnorePattern: '^_', - }, - ]; - } - return config; -}); - -// Add new rule to an existing plugin -const customRules = patched.map(config => { - if (config.plugins?.['@typescript-eslint']) { - config.rules['@typescript-eslint/no-unused-expressions'] = [ - "warn", - { "allowShortCircuit": true, "allowTernary": true } - ]; - } - return config; -}); - -// Export the modified config with ignores at the beginning -export default [ignores, ...customRules]; diff --git a/oxlint.json b/oxlint.json new file mode 100644 index 00000000..8f374fa4 --- /dev/null +++ b/oxlint.json @@ -0,0 +1,20 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import"], + "env": { + "browser": false, + "node": true + }, + "rules": { + "eqeqeq": "warn", + "no-console": "off", + "no-unused-vars": "warn", + "@typescript-eslint/no-unused-expressions": ["warn", { "allowShortCircuit": true, "allowTernary": true }] + }, + "ignorePatterns": [ + "node_modules", + "dist", + "*.d.ts", + "src/core/modules/migrate/templates/migration-project.template.ts" + ] +} diff --git a/package-lock.json b/package-lock.json index c29d7e54..608b2c89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,6 @@ }, "devDependencies": { "@compodoc/compodoc": "1.2.1", - "@lenne.tech/eslint-config-ts": "2.1.4", "@nestjs/cli": "11.0.16", "@nestjs/schematics": "11.0.9", "@nestjs/testing": "11.1.12", @@ -78,14 +77,9 @@ "@types/nodemailer": "7.0.5", "@types/passport": "1.0.17", "@types/supertest": "6.0.3", - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", "@vitest/coverage-v8": "4.0.18", "@vitest/ui": "4.0.18", "ansi-colors": "4.1.3", - "eslint": "9.39.2", - "eslint-config-prettier": "10.1.8", - "eslint-plugin-unused-imports": "4.3.0", "find-file-up": "2.0.1", "grunt": "1.6.1", "grunt-bg-shell": "2.3.3", @@ -96,9 +90,9 @@ "nodemon": "3.1.11", "npm-watch": "0.13.0", "otpauth": "9.4.1", + "oxfmt": "0.26.0", + "oxlint": "0.17.0", "pm2": "6.0.14", - "prettier": "3.7.4", - "pretty-quick": "4.2.2", "rimraf": "6.1.2", "supertest": "7.2.2", "ts-jest": "29.4.6", @@ -268,6 +262,19 @@ "node": ">=8" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -308,6 +315,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular-devkit/schematics-cli/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, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -427,14 +444,22 @@ } } }, - "node_modules/@angular-devkit/schematics/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/@angular-devkit/schematics/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@angular-devkit/schematics/node_modules/readdirp": { @@ -887,47 +912,47 @@ } }, "node_modules/@aws-sdk/client-sesv2": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.971.0.tgz", - "integrity": "sha512-NP/lbf3mfY10Txzl0ml2YnTjnZwflp1+faOotMCrXi4fb6kInosdW0ZSHXNlNulFo9cW+llq07lD59Sw3nny+A==", + "version": "3.981.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.981.0.tgz", + "integrity": "sha512-2KckJDqgUDMiLeVqsWsEp5C/VGZG5WQTXl7gU51Zd9tQ1jyLL8MY+duxsDHAZUL36mZiN2iChW/SS0VBrO1sTg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.970.0", - "@aws-sdk/credential-provider-node": "3.971.0", - "@aws-sdk/middleware-host-header": "3.969.0", - "@aws-sdk/middleware-logger": "3.969.0", - "@aws-sdk/middleware-recursion-detection": "3.969.0", - "@aws-sdk/middleware-user-agent": "3.970.0", - "@aws-sdk/region-config-resolver": "3.969.0", - "@aws-sdk/signature-v4-multi-region": "3.970.0", - "@aws-sdk/types": "3.969.0", - "@aws-sdk/util-endpoints": "3.970.0", - "@aws-sdk/util-user-agent-browser": "3.969.0", - "@aws-sdk/util-user-agent-node": "3.971.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/credential-provider-node": "^3.972.4", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.5", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/signature-v4-multi-region": "3.981.0", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.981.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.3", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.20.6", + "@smithy/core": "^3.22.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.7", - "@smithy/middleware-retry": "^4.4.23", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/node-http-handler": "^4.4.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.22", - "@smithy/util-defaults-mode-node": "^4.2.25", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -939,45 +964,45 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.971.0.tgz", - "integrity": "sha512-Xx+w6DQqJxDdymYyIxyKJnRzPvVJ4e/Aw0czO7aC9L/iraaV7AG8QtRe93OGW6aoHSh72CIiinnpJJfLsQqP4g==", + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.980.0.tgz", + "integrity": "sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.970.0", - "@aws-sdk/middleware-host-header": "3.969.0", - "@aws-sdk/middleware-logger": "3.969.0", - "@aws-sdk/middleware-recursion-detection": "3.969.0", - "@aws-sdk/middleware-user-agent": "3.970.0", - "@aws-sdk/region-config-resolver": "3.969.0", - "@aws-sdk/types": "3.969.0", - "@aws-sdk/util-endpoints": "3.970.0", - "@aws-sdk/util-user-agent-browser": "3.969.0", - "@aws-sdk/util-user-agent-node": "3.971.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.5", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.980.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.3", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.20.6", + "@smithy/core": "^3.22.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.7", - "@smithy/middleware-retry": "^4.4.23", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/node-http-handler": "^4.4.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.22", - "@smithy/util-defaults-mode-node": "^4.2.25", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -988,21 +1013,38 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.980.0.tgz", + "integrity": "sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/core": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.970.0.tgz", - "integrity": "sha512-klpzObldOq8HXzDjDlY6K8rMhYZU6mXRz6P9F9N+tWnjoYFfeBMra8wYApydElTUYQKP1O7RLHwH1OKFfKcqIA==", + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.5.tgz", + "integrity": "sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", - "@aws-sdk/xml-builder": "3.969.0", - "@smithy/core": "^3.20.6", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.2", + "@smithy/core": "^3.22.0", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.8", @@ -1014,14 +1056,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.970.0.tgz", - "integrity": "sha512-rtVzXzEtAfZBfh+lq3DAvRar4c3jyptweOAJR2DweyXx71QSMY+O879hjpMwES7jl07a3O1zlnFIDo4KP/96kQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.3.tgz", + "integrity": "sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -1031,19 +1073,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.970.0.tgz", - "integrity": "sha512-CjDbWL7JxjLc9ZxQilMusWSw05yRvUJKRpz59IxDpWUnSMHC9JMMUUkOy5Izk8UAtzi6gupRWArp4NG4labt9Q==", + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.5.tgz", + "integrity": "sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/types": "^3.973.1", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/node-http-handler": "^4.4.8", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-stream": "^4.5.10", "tslib": "^2.6.2" @@ -1053,21 +1095,21 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.971.0.tgz", - "integrity": "sha512-c0TGJG4xyfTZz3SInXfGU8i5iOFRrLmy4Bo7lMyH+IpngohYMYGYl61omXqf2zdwMbDv+YJ9AviQTcCaEUKi8w==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.3.tgz", + "integrity": "sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/credential-provider-env": "3.970.0", - "@aws-sdk/credential-provider-http": "3.970.0", - "@aws-sdk/credential-provider-login": "3.971.0", - "@aws-sdk/credential-provider-process": "3.970.0", - "@aws-sdk/credential-provider-sso": "3.971.0", - "@aws-sdk/credential-provider-web-identity": "3.971.0", - "@aws-sdk/nested-clients": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/credential-provider-env": "^3.972.3", + "@aws-sdk/credential-provider-http": "^3.972.5", + "@aws-sdk/credential-provider-login": "^3.972.3", + "@aws-sdk/credential-provider-process": "^3.972.3", + "@aws-sdk/credential-provider-sso": "^3.972.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.3", + "@aws-sdk/nested-clients": "3.980.0", + "@aws-sdk/types": "^3.973.1", "@smithy/credential-provider-imds": "^4.2.8", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -1079,15 +1121,15 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.971.0.tgz", - "integrity": "sha512-yhbzmDOsk0RXD3rTPhZra4AWVnVAC4nFWbTp+sUty1hrOPurUmhuz8bjpLqYTHGnlMbJp+UqkQONhS2+2LzW2g==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.3.tgz", + "integrity": "sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/nested-clients": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/nested-clients": "3.980.0", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -1099,19 +1141,19 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.971.0.tgz", - "integrity": "sha512-epUJBAKivtJqalnEBRsYIULKYV063o/5mXNJshZfyvkAgNIzc27CmmKRXTN4zaNOZg8g/UprFp25BGsi19x3nQ==", + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.4.tgz", + "integrity": "sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.970.0", - "@aws-sdk/credential-provider-http": "3.970.0", - "@aws-sdk/credential-provider-ini": "3.971.0", - "@aws-sdk/credential-provider-process": "3.970.0", - "@aws-sdk/credential-provider-sso": "3.971.0", - "@aws-sdk/credential-provider-web-identity": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/credential-provider-env": "^3.972.3", + "@aws-sdk/credential-provider-http": "^3.972.5", + "@aws-sdk/credential-provider-ini": "^3.972.3", + "@aws-sdk/credential-provider-process": "^3.972.3", + "@aws-sdk/credential-provider-sso": "^3.972.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.3", + "@aws-sdk/types": "^3.973.1", "@smithy/credential-provider-imds": "^4.2.8", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -1123,14 +1165,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.970.0.tgz", - "integrity": "sha512-0XeT8OaT9iMA62DFV9+m6mZfJhrD0WNKf4IvsIpj2Z7XbaYfz3CoDDvNoALf3rPY9NzyMHgDxOspmqdvXP00mw==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.3.tgz", + "integrity": "sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", "@smithy/types": "^4.12.0", @@ -1141,16 +1183,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.971.0.tgz", - "integrity": "sha512-dY0hMQ7dLVPQNJ8GyqXADxa9w5wNfmukgQniLxGVn+dMRx3YLViMp5ZpTSQpFhCWNF0oKQrYAI5cHhUJU1hETw==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.3.tgz", + "integrity": "sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.971.0", - "@aws-sdk/core": "3.970.0", - "@aws-sdk/token-providers": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/client-sso": "3.980.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/token-providers": "3.980.0", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", "@smithy/types": "^4.12.0", @@ -1161,15 +1203,15 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.971.0.tgz", - "integrity": "sha512-F1AwfNLr7H52T640LNON/h34YDiMuIqW/ZreGzhRR6vnFGaSPtNSKAKB2ssAMkLM8EVg8MjEAYD3NCUiEo+t/w==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.3.tgz", + "integrity": "sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/nested-clients": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/nested-clients": "3.980.0", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", "@smithy/types": "^4.12.0", @@ -1180,13 +1222,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.969.0.tgz", - "integrity": "sha512-AWa4rVsAfBR4xqm7pybQ8sUNJYnjyP/bJjfAw34qPuh3M9XrfGbAHG0aiAfQGrBnmS28jlO6Kz69o+c6PRw1dw==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", + "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -1196,13 +1238,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.969.0.tgz", - "integrity": "sha512-xwrxfip7Y2iTtCMJ+iifN1E1XMOuhxIHY9DreMCvgdl4r7+48x2S1bCYPWH3eNY85/7CapBWdJ8cerpEl12sQQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", + "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -1211,13 +1253,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.969.0.tgz", - "integrity": "sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", + "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", @@ -1228,20 +1270,20 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.970.0.tgz", - "integrity": "sha512-v/Y5F1lbFFY7vMeG5yYxuhnn0CAshz6KMxkz1pDyPxejNE9HtA0w8R6OTBh/bVdIm44QpjhbI7qeLdOE/PLzXQ==", + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.5.tgz", + "integrity": "sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/types": "3.969.0", - "@aws-sdk/util-arn-parser": "3.968.0", - "@smithy/core": "^3.20.6", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/core": "^3.22.0", "@smithy/node-config-provider": "^4.3.8", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.8", @@ -1254,16 +1296,16 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.970.0.tgz", - "integrity": "sha512-dnSJGGUGSFGEX2NzvjwSefH+hmZQ347AwbLhAsi0cdnISSge+pcGfOFrJt2XfBIypwFe27chQhlfuf/gWdzpZg==", + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.5.tgz", + "integrity": "sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/types": "3.969.0", - "@aws-sdk/util-endpoints": "3.970.0", - "@smithy/core": "^3.20.6", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.980.0", + "@smithy/core": "^3.22.0", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -1272,46 +1314,63 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.980.0.tgz", + "integrity": "sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.971.0.tgz", - "integrity": "sha512-TWaILL8GyYlhGrxxnmbkazM4QsXatwQgoWUvo251FXmUOsiXDFDVX3hoGIfB3CaJhV2pJPfebHUNJtY6TjZ11g==", + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.980.0.tgz", + "integrity": "sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.970.0", - "@aws-sdk/middleware-host-header": "3.969.0", - "@aws-sdk/middleware-logger": "3.969.0", - "@aws-sdk/middleware-recursion-detection": "3.969.0", - "@aws-sdk/middleware-user-agent": "3.970.0", - "@aws-sdk/region-config-resolver": "3.969.0", - "@aws-sdk/types": "3.969.0", - "@aws-sdk/util-endpoints": "3.970.0", - "@aws-sdk/util-user-agent-browser": "3.969.0", - "@aws-sdk/util-user-agent-node": "3.971.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.5", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.980.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.3", "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.20.6", + "@smithy/core": "^3.22.0", "@smithy/fetch-http-handler": "^5.3.9", "@smithy/hash-node": "^4.2.8", "@smithy/invalid-dependency": "^4.2.8", "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.7", - "@smithy/middleware-retry": "^4.4.23", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", "@smithy/middleware-serde": "^4.2.9", "@smithy/middleware-stack": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/node-http-handler": "^4.4.8", "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.10.8", + "@smithy/smithy-client": "^4.11.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.22", - "@smithy/util-defaults-mode-node": "^4.2.25", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", "@smithy/util-endpoints": "^3.2.8", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -1322,14 +1381,31 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.980.0.tgz", + "integrity": "sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.969.0.tgz", - "integrity": "sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", + "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@smithy/config-resolver": "^4.4.6", "@smithy/node-config-provider": "^4.3.8", "@smithy/types": "^4.12.0", @@ -1340,14 +1416,14 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.970.0.tgz", - "integrity": "sha512-z3syXfuK/x/IsKf/AeYmgc2NT7fcJ+3fHaGO+fkghkV9WEba3fPyOwtTBX4KpFMNb2t50zDGZwbzW1/5ighcUQ==", + "version": "3.981.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.981.0.tgz", + "integrity": "sha512-T/+h9df0DALAXXP+YfZ8bgmH6cEN7HAg6BqHe3t38GhHgQ1HULXwK5XMhiLWiHpytDdhLqiVH41SRgW8ynBl6Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.970.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/middleware-sdk-s3": "^3.972.5", + "@aws-sdk/types": "^3.973.1", "@smithy/protocol-http": "^5.3.8", "@smithy/signature-v4": "^5.3.8", "@smithy/types": "^4.12.0", @@ -1358,15 +1434,15 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.971.0.tgz", - "integrity": "sha512-4hKGWZbmuDdONMJV0HJ+9jwTDb0zLfKxcCLx2GEnBY31Gt9GeyIQ+DZ97Bb++0voawj6pnZToFikXTyrEq2x+w==", + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.980.0.tgz", + "integrity": "sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.970.0", - "@aws-sdk/nested-clients": "3.971.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/nested-clients": "3.980.0", + "@aws-sdk/types": "^3.973.1", "@smithy/property-provider": "^4.2.8", "@smithy/shared-ini-file-loader": "^4.4.3", "@smithy/types": "^4.12.0", @@ -1377,9 +1453,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.969.0.tgz", - "integrity": "sha512-7IIzM5TdiXn+VtgPdVLjmE6uUBUtnga0f4RiSEI1WW10RPuNvZ9U+pL3SwDiRDAdoGrOF9tSLJOFZmfuwYuVYQ==", + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1391,9 +1467,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.968.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.968.0.tgz", - "integrity": "sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==", + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", + "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1404,13 +1480,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.970.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.970.0.tgz", - "integrity": "sha512-TZNZqFcMUtjvhZoZRtpEGQAdULYiy6rcGiXAbLU7e9LSpIYlRqpLa207oMNfgbzlL2PnHko+eVg8rajDiSOYCg==", + "version": "3.981.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.981.0.tgz", + "integrity": "sha512-a8nXh/H3/4j+sxhZk+N3acSDlgwTVSZbX9i55dx41gI1H+geuonuRG+Shv3GZsCb46vzc08RK2qC78ypO8uRlg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@smithy/types": "^4.12.0", "@smithy/url-parser": "^4.2.8", "@smithy/util-endpoints": "^3.2.8", @@ -1421,9 +1497,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.2.tgz", - "integrity": "sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==", + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1434,27 +1510,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.969.0.tgz", - "integrity": "sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", + "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.969.0", + "@aws-sdk/types": "^3.973.1", "@smithy/types": "^4.12.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.971.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.971.0.tgz", - "integrity": "sha512-Eygjo9mFzQYjbGY3MYO6CsIhnTwAMd3WmuFalCykqEmj2r5zf0leWrhPaqvA5P68V5JdGfPYgj7vhNOd6CtRBQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.3.tgz", + "integrity": "sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.970.0", - "@aws-sdk/types": "3.969.0", + "@aws-sdk/middleware-user-agent": "^3.972.5", + "@aws-sdk/types": "^3.973.1", "@smithy/node-config-provider": "^4.3.8", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" @@ -1472,14 +1548,14 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.969.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.969.0.tgz", - "integrity": "sha512-BSe4Lx/qdRQQdX8cSSI7Et20vqBspzAjBy8ZmXVoyLkol3y4sXBXzn+BiLtR+oh60ExQn6o2DU4QjdOZbXaKIQ==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.3.tgz", + "integrity": "sha512-bCk63RsBNCWW4tt5atv5Sbrh+3J3e8YzgyF6aZb1JeXcdzG4k5SlPLeTMFOIXFuuFHIwgphUhn4i3uS/q49eww==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.2.5", + "fast-xml-parser": "5.3.4", "tslib": "^2.6.2" }, "engines": { @@ -1497,9 +1573,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -1512,9 +1588,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { @@ -1564,14 +1640,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1903,13 +1979,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -2304,15 +2380,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", - "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -2494,9 +2570,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", - "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { @@ -2709,16 +2785,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -2745,14 +2821,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2947,9 +3023,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", - "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { @@ -3279,18 +3355,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -3298,9 +3374,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -3547,19 +3623,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/@compodoc/live-server/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/@compodoc/live-server/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4149,18 +4212,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/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==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", @@ -4170,84 +4221,24 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "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==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "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": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4279,15 +4270,6 @@ "concat-map": "0.0.1" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "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", @@ -4307,37 +4289,12 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@getbrevo/brevo": { @@ -4473,28 +4430,6 @@ "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==", "license": "MIT" }, - "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==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -4552,19 +4487,6 @@ "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", @@ -5056,20 +4978,6 @@ "node": ">=6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", @@ -5084,69 +4992,27 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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/@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==", + "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -5401,22 +5267,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/reporters/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/@jest/reporters/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -5630,270 +5480,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@lenne.tech/eslint-config-ts": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@lenne.tech/eslint-config-ts/-/eslint-config-ts-2.1.4.tgz", - "integrity": "sha512-Wxsxo38o7QqmH9WRvUBQ+0GlTDB2LO9A68orssqu/x48u0tswa8+3VPENgHkmRYBYGjQUk8Qj6Prf80BML/UsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@stylistic/eslint-plugin": "5.4.0", - "@typescript-eslint/eslint-plugin": "8.46.1", - "@typescript-eslint/parser": "8.46.1", - "eslint-config-prettier": "10.1.8", - "eslint-plugin-eslint-comments": "3.2.0", - "eslint-plugin-import": "2.32.0", - "eslint-plugin-jsonc": "2.21.0", - "eslint-plugin-markdown": "5.1.0", - "eslint-plugin-no-only-tests": "3.3.0", - "eslint-plugin-perfectionist": "4.15.1", - "eslint-plugin-unused-imports": "4.2.0", - "eslint-plugin-yml": "1.19.0" - }, - "peerDependencies": { - "eslint": ">=9.26.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.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 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.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": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@lenne.tech/eslint-config-ts/node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", - "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/@levischuck/tiny-cbor": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz", @@ -6411,6 +5997,19 @@ "node": ">=8" } }, + "node_modules/@nestjs/cli/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@nestjs/cli/node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -6461,6 +6060,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@nestjs/cli/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, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/@nestjs/cli/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -6823,6 +6432,19 @@ "node": ">=6.6.0" } }, + "node_modules/@nestjs/platform-express/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==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/@nestjs/platform-express/node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -6966,6 +6588,19 @@ "node": ">=8" } }, + "node_modules/@nestjs/schematics/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@nestjs/schematics/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -7006,6 +6641,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@nestjs/schematics/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, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/@nestjs/schematics/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -7327,16 +6972,240 @@ "npm": ">=5.10.0" } }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "node_modules/@oxfmt/darwin-arm64": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/darwin-arm64/-/darwin-arm64-0.26.0.tgz", + "integrity": "sha512-AAGc+8CffkiWeVgtWf4dPfQwHEE5c/j/8NWH7VGVxxJRCZFdmWcqCXprvL2H6qZFewvDLrFbuSPRCqYCpYGaTQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxfmt/darwin-x64": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/darwin-x64/-/darwin-x64-0.26.0.tgz", + "integrity": "sha512-xFx5ijCTjw577wJvFlZEMmKDnp3HSCcbYdCsLRmC5i3TZZiDe9DEYh3P46uqhzj8BkEw1Vm1ZCWdl48aEYAzvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxfmt/linux-arm64-gnu": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/linux-arm64-gnu/-/linux-arm64-gnu-0.26.0.tgz", + "integrity": "sha512-GubkQeQT5d3B/Jx/IiR7NMkSmXrCZcVI0BPh1i7mpFi8HgD1hQ/LbhiBKAMsMqs5bbugdQOgBEl8bOhe8JhW1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxfmt/linux-arm64-musl": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/linux-arm64-musl/-/linux-arm64-musl-0.26.0.tgz", + "integrity": "sha512-OEypUwK69bFPj+aa3/LYCnlIUPgoOLu//WNcriwpnWNmt47808Ht7RJSg+MNK8a7pSZHpXJ5/E6CRK/OTwFdaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxfmt/linux-x64-gnu": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/linux-x64-gnu/-/linux-x64-gnu-0.26.0.tgz", + "integrity": "sha512-xO6iEW2bC6ZHyOTPmPWrg/nM6xgzyRPaS84rATy6F8d79wz69LdRdJ3l/PXlkqhi7XoxhvX4ExysA0Nf10ZZEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxfmt/linux-x64-musl": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/linux-x64-musl/-/linux-x64-musl-0.26.0.tgz", + "integrity": "sha512-Z3KuZFC+MIuAyFCXBHY71kCsdRq1ulbsbzTe71v+hrEv7zVBn6yzql+/AZcgfIaKzWO9OXNuz5WWLWDmVALwow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxfmt/win32-arm64": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/win32-arm64/-/win32-arm64-0.26.0.tgz", + "integrity": "sha512-3zRbqwVWK1mDhRhTknlQFpRFL9GhEB5GfU6U7wawnuEwpvi39q91kJ+SRJvJnhyPCARkjZBd1V8XnweN5IFd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxfmt/win32-x64": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@oxfmt/win32-x64/-/win32-x64-0.26.0.tgz", + "integrity": "sha512-m8TfIljU22i9UEIkD+slGPifTFeaCwIUfxszN3E6ABWP1KQbtwSw9Ak0TdoikibvukF/dtbeyG3WW63jv9DnEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/darwin-arm64": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-0.17.0.tgz", + "integrity": "sha512-py/N0yTMbdy5Kd1RFMMgFqzO5Qwc5MbHSCA0BvSx/GnC3n7yPstcEFSSdZzb+HaANI00xn4dwjYo6HVEFHhuWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint/darwin-x64": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-0.17.0.tgz", + "integrity": "sha512-rQUFu6Ci8gmBHTgb2EMKYNZWCmBB8sSW7SAxBes9k0esonKsioDNjT51CsfKZhXyaMtaM70hiVhSCBc0NqUEJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint/linux-arm64-gnu": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-0.17.0.tgz", + "integrity": "sha512-NoAWscdfVj6Sci3NdbHHc1OivSSKpwtkLff5SoAM8XgJ9t7flf+zW7XOy3OeSgZAxNbcF4QGruv+XcBLR7tWMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-arm64-musl": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-0.17.0.tgz", + "integrity": "sha512-VQRmSdbuc0rpSZoLqdhKJG9nUjJmEymOU60dO3lKlCT5YXME4dxA+jf1AigtnmJS5FgOxQm54ECF9lh6dyP0ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-gnu": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-0.17.0.tgz", + "integrity": "sha512-KcaXWkBfqt7weerU1EXJysEupEHB8AtJytufBOQMuLE5vx2OoAbjAk0vt2V14W8Lss9Sz+ET7nXo6ZAEku4vCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-musl": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-0.17.0.tgz", + "integrity": "sha512-yWbFXWKKTrH4zR0FI1V6KDJp5NqOLFe1LZbKNeaoS1wtq5/aFPeM+d9dttGLoA5u6G9uhIK/nSnrPmtuNLPU4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/win32-arm64": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-0.17.0.tgz", + "integrity": "sha512-zdoB3mbvcx3eGOh6ElPJ01S2MOzyZo/gijeHw7yb2PXcRis+3clVje6kpnG7/TN69zoHv7WwDX6poJu8FURTqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/win32-x64": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.17.0.tgz", + "integrity": "sha512-gxVYAOy/8IAWgmsaXDxRJvOr7l61DUDj6s7tXImzXqBAH/An6yJZGr1tR+5BsACVw/3hcCPOUbotXGS4+vZNZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@paralleldrive/cuid2/node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -7970,9 +7839,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz", - "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -7984,9 +7853,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz", - "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -7998,9 +7867,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz", - "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -8012,9 +7881,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz", - "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -8026,9 +7895,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz", - "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -8040,9 +7909,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz", - "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -8054,9 +7923,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz", - "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -8068,9 +7937,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz", - "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -8082,9 +7951,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz", - "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -8096,9 +7965,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz", - "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -8110,9 +7979,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz", - "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -8124,9 +7993,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz", - "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -8138,9 +8007,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz", - "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -8152,9 +8021,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz", - "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -8166,9 +8035,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz", - "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -8180,9 +8049,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz", - "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -8194,9 +8063,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz", - "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -8208,9 +8077,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz", - "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -8222,9 +8091,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz", - "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -8236,9 +8105,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz", - "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -8250,9 +8119,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz", - "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -8264,9 +8133,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz", - "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -8278,9 +8147,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz", - "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -8292,9 +8161,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz", - "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -8306,9 +8175,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz", - "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -8319,13 +8188,6 @@ "win32" ] }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, "node_modules/@scarf/scarf": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", @@ -8359,9 +8221,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.34.47", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", - "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "dev": true, "license": "MIT" }, @@ -8431,9 +8293,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.20.7", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.7.tgz", - "integrity": "sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.1.tgz", + "integrity": "sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8443,7 +8305,7 @@ "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.10", + "@smithy/util-stream": "^4.5.11", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -8545,13 +8407,13 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.8.tgz", - "integrity": "sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.13.tgz", + "integrity": "sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.7", + "@smithy/core": "^3.22.1", "@smithy/middleware-serde": "^4.2.9", "@smithy/node-config-provider": "^4.3.8", "@smithy/shared-ini-file-loader": "^4.4.3", @@ -8565,16 +8427,16 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.24", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.24.tgz", - "integrity": "sha512-yiUY1UvnbUFfP5izoKLtfxDSTRv724YRRwyiC/5HYY6vdsVDcDOXKSXmkJl/Hovcxt5r+8tZEUAdrOaCJwrl9Q==", + "version": "4.4.30", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.30.tgz", + "integrity": "sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.3.8", "@smithy/protocol-http": "^5.3.8", "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.10.9", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "@smithy/util-middleware": "^4.2.8", "@smithy/util-retry": "^4.2.8", @@ -8631,9 +8493,9 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", - "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.9.tgz", + "integrity": "sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8752,18 +8614,18 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.10.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.9.tgz", - "integrity": "sha512-Je0EvGXVJ0Vrrr2lsubq43JGRIluJ/hX17aN/W/A0WfE+JpoMdI8kwk2t9F0zTX9232sJDGcoH4zZre6m6f/sg==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.2.tgz", + "integrity": "sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.7", - "@smithy/middleware-endpoint": "^4.4.8", + "@smithy/core": "^3.22.1", + "@smithy/middleware-endpoint": "^4.4.13", "@smithy/middleware-stack": "^4.2.8", "@smithy/protocol-http": "^5.3.8", "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.10", + "@smithy/util-stream": "^4.5.11", "tslib": "^2.6.2" }, "engines": { @@ -8867,14 +8729,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.23", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.23.tgz", - "integrity": "sha512-mMg+r/qDfjfF/0psMbV4zd7F/i+rpyp7Hjh0Wry7eY15UnzTEId+xmQTGDU8IdZtDfbGQxuWNfgBZKBj+WuYbA==", + "version": "4.3.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.29.tgz", + "integrity": "sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.10.9", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -8883,9 +8745,9 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.26.tgz", - "integrity": "sha512-EQqe/WkbCinah0h1lMWh9ICl0Ob4lyl20/10WTB35SC9vDQfD8zWsOT+x2FIOXKAoZQ8z/y0EFMoodbcqWJY/w==", + "version": "4.2.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.32.tgz", + "integrity": "sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8893,7 +8755,7 @@ "@smithy/credential-provider-imds": "^4.2.8", "@smithy/node-config-provider": "^4.3.8", "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.10.9", + "@smithy/smithy-client": "^4.11.2", "@smithy/types": "^4.12.0", "tslib": "^2.6.2" }, @@ -8959,14 +8821,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", - "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "version": "4.5.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.11.tgz", + "integrity": "sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.8", + "@smithy/node-http-handler": "^4.4.9", "@smithy/types": "^4.12.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", @@ -9024,27 +8886,6 @@ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.44.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0" - } - }, "node_modules/@swc/cli": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.7.9.tgz", @@ -9663,6 +9504,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "devOptional": true, "license": "MIT" }, "node_modules/@types/express": { @@ -9700,9 +9542,9 @@ "license": "MIT" }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "dev": true, "license": "MIT" }, @@ -9744,12 +9586,6 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "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, "license": "MIT" }, @@ -9782,16 +9618,6 @@ "integrity": "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==", "license": "MIT" }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -9918,13 +9744,6 @@ "@types/superagent": "^8.1.0" } }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/validator": { "version": "13.15.10", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", @@ -9963,255 +9782,33 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", - "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.53.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, - "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", - "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", - "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", - "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", - "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", - "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.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 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", - "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", - "dev": true, - "license": "MIT", - "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": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", - "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", - "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", - "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.53.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, @@ -10536,16 +10133,6 @@ } } }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/pretty-format": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", @@ -10588,16 +10175,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/spy": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", @@ -11933,23 +11510,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -11960,29 +11520,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -12000,88 +11537,6 @@ "dev": true, "license": "MIT" }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -12127,21 +11582,21 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", - "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.11.tgz", + "integrity": "sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "js-tokens": "^10.0.0" } }, "node_modules/ast-v8-to-istanbul/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==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, @@ -12151,16 +11606,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -12192,9 +11637,9 @@ } }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -12417,9 +11862,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.15", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", - "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==", + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -13104,9 +12549,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001765", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", - "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", + "version": "1.0.30001767", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", + "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", "dev": true, "funding": [ { @@ -13160,39 +12605,6 @@ "node": ">=10" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chardet": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", @@ -13286,9 +12698,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -13356,13 +12768,13 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13582,9 +12994,9 @@ } }, "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -13881,9 +13293,9 @@ "license": "MIT" }, "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -13891,6 +13303,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cosmiconfig": { @@ -14033,60 +13449,6 @@ "node": ">= 14" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -14254,24 +13616,6 @@ "node": ">=8" } }, - "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, - "license": "MIT", - "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_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", @@ -14372,27 +13716,16 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dom-serializer": { @@ -14532,9 +13865,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "dev": true, "license": "ISC" }, @@ -14672,75 +14005,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "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-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.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", - "stop-iteration-iterator": "^1.1.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.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -14793,37 +14057,6 @@ "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es6-shim": { "version": "0.35.8", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.8.tgz", @@ -14935,282 +14168,177 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.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": "^8.0.0", + "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" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-compat-utils": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", - "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", - "dev": true, - "license": "MIT", + "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==", + "license": "BSD-2-Clause", "dependencies": { - "semver": "^7.5.4" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=6.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "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==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-json-compat-utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz", - "integrity": "sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "esquery": "^1.6.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": "*", - "jsonc-eslint-parser": "^2.4.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependenciesMeta": { - "@eslint/json": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=8" } }, - "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==", - "dev": true, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, + "node_modules/eslint/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==", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.5.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-eslint-comments/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": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-eslint-comments/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-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", + "node_modules/eslint/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==", + "license": "ISC", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.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" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=10.13.0" } }, - "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, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } + "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==", + "license": "MIT" }, - "node_modules/eslint-plugin-import/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, + "node_modules/eslint/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==", "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "p-locate": "^5.0.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { + "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" @@ -15219,244 +14347,45 @@ "node": "*" } }, - "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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/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, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/eslint-plugin-jsonc": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.0.tgz", - "integrity": "sha512-HttlxdNG5ly3YjP1cFMP62R4qKLxJURfBZo2gnMY+yQojZxkLyOpY1H1KRTKBmvQeSG9pIpSGEhDjE17vvYosg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.5.1", - "diff-sequences": "^27.5.1", - "eslint-compat-utils": "^0.6.4", - "eslint-json-compat-utils": "^0.2.1", - "espree": "^9.6.1 || ^10.3.0", - "graphemer": "^1.4.0", - "jsonc-eslint-parser": "^2.4.0", - "natural-compare": "^1.4.0", - "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-markdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-5.1.0.tgz", - "integrity": "sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==", - "deprecated": "Please use @eslint/markdown instead", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^0.8.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", - "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-perfectionist": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.1.tgz", - "integrity": "sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "^8.38.0", - "@typescript-eslint/utils": "^8.38.0", - "natural-orderby": "^5.0.0" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "eslint": ">=8.45.0" - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz", - "integrity": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==", - "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-plugin-yml": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.0.tgz", - "integrity": "sha512-S+4GbcCWksFKAvFJtf0vpdiCkZZvDJCV4Zsi9ahmYkYOYcf+LRqqzvzkb/ST7vTYV6sFwXOvawzYyL/jFT2nQA==", - "dev": true, + "node_modules/eslint/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==", "license": "MIT", "dependencies": { - "debug": "^4.3.2", - "diff-sequences": "^27.5.1", - "escape-string-regexp": "4.0.0", - "eslint-compat-utils": "^0.6.0", - "natural-compare": "^1.4.0", - "yaml-eslint-parser": "^1.2.1" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "p-limit": "^3.0.2" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "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==", - "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==", - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "*" + "node": ">=8" } }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -15828,18 +14757,6 @@ "node": ">=8.6.0" } }, - "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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -15883,9 +14800,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", + "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", "dev": true, "funding": [ { @@ -15966,15 +14883,15 @@ "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", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-type": { @@ -16092,19 +15009,17 @@ } }, "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==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/find-versions": { @@ -16167,16 +15082,76 @@ } }, "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/flat-cache/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", + "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/flat-cache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/flatted": { @@ -16505,37 +15480,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "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, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gaze": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", @@ -16549,16 +15493,6 @@ "node": ">= 4.0.0" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -16662,24 +15596,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-uri": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", @@ -16737,15 +15653,15 @@ } }, "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==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob-to-regexp": { @@ -16817,32 +15733,18 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globrex": { @@ -17536,19 +16438,6 @@ "node": ">=0.10.0" } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "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", @@ -17570,22 +16459,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -17672,9 +16545,9 @@ "license": "MIT" }, "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -17687,14 +16560,14 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -17911,10 +16784,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" @@ -18040,21 +16912,6 @@ "kind-of": "^6.0.2" } }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", @@ -18120,43 +16977,31 @@ "node": ">=0.10.0" } }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "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": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "binary-extensions": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=8" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, + "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==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, "engines": { "node": ">= 0.4" }, @@ -18164,25 +17009,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/is-core-module": { + "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": { - "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" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -18191,140 +17025,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "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.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "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.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { @@ -18336,22 +17050,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "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", @@ -18371,26 +17069,6 @@ "node": ">=6" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -18403,17 +17081,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -18427,32 +17094,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -18462,23 +17103,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -18517,25 +17141,6 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -18549,35 +17154,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "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", @@ -18591,41 +17167,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -18667,70 +17208,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" @@ -18844,6 +17339,22 @@ "node": ">=6" } }, + "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/jake": { "version": "10.9.4", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", @@ -19042,22 +17553,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-config/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/jest-config/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -19389,22 +17884,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-runtime/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/jest-runtime/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -19681,57 +18160,6 @@ "node": ">=6" } }, - "node_modules/jsonc-eslint-parser": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", - "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", - "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/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": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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", - "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/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -19832,9 +18260,9 @@ } }, "node_modules/kysely": { - "version": "0.28.10", - "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.28.10.tgz", - "integrity": "sha512-ksNxfzIW77OcZ+QWSAPC7yDqUSaIVwkTWnTPNiIy//vifNbwsSgQ57OkkncHxxpcBHM3LRfLAZVEh7kjq5twVA==", + "version": "0.28.11", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.28.11.tgz", + "integrity": "sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==", "license": "MIT", "peer": true, "engines": { @@ -19865,9 +18293,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.34", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.34.tgz", - "integrity": "sha512-v/Ip8k8eYdp7bINpzqDh46V/PaQ8sK+qi97nMQgjZzFlb166YFqlR/HVI+MzsI9JqcyyVWCOipmmretiaSyQyw==", + "version": "1.12.36", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", + "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", "license": "MIT" }, "node_modules/liftup": { @@ -19964,18 +18392,16 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/lodash": { @@ -20206,9 +18632,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -20244,13 +18670,13 @@ } }, "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, + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { @@ -20370,35 +18796,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -20465,27 +18862,6 @@ "node": ">= 0.6" } }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -20687,9 +19063,9 @@ } }, "node_modules/mongodb-connection-string-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.0.tgz", - "integrity": "sha512-irhhjRVLE20hbkRl4zpAYLnDMM+zIZnp0IDB9akAFFUZp/3XdOfwwddc7y6cNvF2WCEtfTYRwYbIfYa2kVY0og==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", + "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", "license": "Apache-2.0", "dependencies": { "@types/whatwg-url": "^13.0.0", @@ -20786,16 +19162,6 @@ "node": ">=20.19.0" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -20940,16 +19306,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, - "node_modules/natural-orderby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", - "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/needle": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", @@ -21208,19 +19564,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/nodemon/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/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -21470,16 +19813,6 @@ "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, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object-path": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", @@ -21489,27 +19822,6 @@ "node": ">= 10.12.0" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -21526,40 +19838,6 @@ "node": ">=0.10.0" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -21587,25 +19865,6 @@ "node": ">=0.10.0" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", @@ -21745,23 +20004,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ora/node_modules/cli-spinners": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", - "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", "dev": true, "license": "MIT", "dependencies": { @@ -21850,22 +20096,60 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "node_modules/oxfmt": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.26.0.tgz", + "integrity": "sha512-UDD1wFNwfeorMm2ZY0xy1KRAAvJ5NjKBfbDmiMwGP7baEHTq65cYpC0aPP+BGHc8weXUbSZaK8MdGyvuRUvS4Q==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" + "tinypool": "2.0.0" + }, + "bin": { + "oxfmt": "bin/oxfmt" }, "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxfmt/darwin-arm64": "0.26.0", + "@oxfmt/darwin-x64": "0.26.0", + "@oxfmt/linux-arm64-gnu": "0.26.0", + "@oxfmt/linux-arm64-musl": "0.26.0", + "@oxfmt/linux-x64-gnu": "0.26.0", + "@oxfmt/linux-x64-musl": "0.26.0", + "@oxfmt/win32-arm64": "0.26.0", + "@oxfmt/win32-x64": "0.26.0" + } + }, + "node_modules/oxlint": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-0.17.0.tgz", + "integrity": "sha512-LCXomDhPGbDUZ/T+ScFA0tjh7A5QgYwPRCw7XFlJxRD2URBV8wj2lLvepbQ9yS/Q6SGhVfHQMpziQytajl8NcQ==", + "dev": true, + "license": "MIT", + "bin": { + "oxc_language_server": "bin/oxc_language_server", + "oxlint": "bin/oxlint" + }, + "engines": { + "node": ">=8.*" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/darwin-arm64": "0.17.0", + "@oxlint/darwin-x64": "0.17.0", + "@oxlint/linux-arm64-gnu": "0.17.0", + "@oxlint/linux-arm64-musl": "0.17.0", + "@oxlint/linux-x64-gnu": "0.17.0", + "@oxlint/linux-x64-musl": "0.17.0", + "@oxlint/win32-arm64": "0.17.0", + "@oxlint/win32-x64": "0.17.0" } }, "node_modules/p-cancelable": { @@ -21894,15 +20178,29 @@ } }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21978,25 +20276,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -22338,62 +20617,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -22585,19 +20808,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pm2/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/pm2/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -22729,23 +20939,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/pretty-format": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", @@ -22774,34 +20967,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-quick": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.2.2.tgz", - "integrity": "sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.7", - "ignore": "^7.0.5", - "mri": "^1.2.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.2", - "tinyexec": "^0.3.2", - "tslib": "^2.8.1" - }, - "bin": { - "pretty-quick": "lib/cli.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://opencollective.com/pretty-quick" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -23158,29 +21323,6 @@ "license": "Apache-2.0", "peer": true }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -23201,27 +21343,6 @@ "node": ">=4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", @@ -23329,425 +21450,128 @@ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true, "license": "MIT" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rewire": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rewire/-/rewire-7.0.0.tgz", - "integrity": "sha512-DyyNyzwMtGYgu0Zl/ya0PR/oaunM+VuCuBxCuhYJHHaV0V+YvYa3bBGxb5OZ71vndgmp1pYY8F4YOwQo1siRGw==", - "license": "MIT", - "dependencies": { - "eslint": "^8.47.0" - } - }, - "node_modules/rewire/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/rewire/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/rewire/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", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/rewire/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rewire/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rewire/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/rewire/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/rewire/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==", - "license": "BSD-2-Clause", + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/rewire/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==", - "license": "Apache-2.0", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/rewire/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==", - "license": "BSD-2-Clause", + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10.0" } }, - "node_modules/rewire/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==", + "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==", "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=4" } }, - "node_modules/rewire/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "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, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "lowercase-keys": "^3.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rewire/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", - "license": "ISC", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "*" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rewire/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rewire/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/rewire/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==", - "license": "MIT" - }, - "node_modules/rewire/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { - "node": "*" - } - }, - "node_modules/rewire/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/rewire/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==", + "node_modules/rewire": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-7.0.0.tgz", + "integrity": "sha512-DyyNyzwMtGYgu0Zl/ya0PR/oaunM+VuCuBxCuhYJHHaV0V+YvYa3bBGxb5OZ71vndgmp1pYY8F4YOwQo1siRGw==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "eslint": "^8.47.0" } }, "node_modules/rfdc": { @@ -23777,9 +21601,9 @@ } }, "node_modules/rollup": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.2.tgz", - "integrity": "sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "devOptional": true, "license": "MIT", "peer": true, @@ -23794,31 +21618,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.2", - "@rollup/rollup-android-arm64": "4.55.2", - "@rollup/rollup-darwin-arm64": "4.55.2", - "@rollup/rollup-darwin-x64": "4.55.2", - "@rollup/rollup-freebsd-arm64": "4.55.2", - "@rollup/rollup-freebsd-x64": "4.55.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.2", - "@rollup/rollup-linux-arm-musleabihf": "4.55.2", - "@rollup/rollup-linux-arm64-gnu": "4.55.2", - "@rollup/rollup-linux-arm64-musl": "4.55.2", - "@rollup/rollup-linux-loong64-gnu": "4.55.2", - "@rollup/rollup-linux-loong64-musl": "4.55.2", - "@rollup/rollup-linux-ppc64-gnu": "4.55.2", - "@rollup/rollup-linux-ppc64-musl": "4.55.2", - "@rollup/rollup-linux-riscv64-gnu": "4.55.2", - "@rollup/rollup-linux-riscv64-musl": "4.55.2", - "@rollup/rollup-linux-s390x-gnu": "4.55.2", - "@rollup/rollup-linux-x64-gnu": "4.55.2", - "@rollup/rollup-linux-x64-musl": "4.55.2", - "@rollup/rollup-openbsd-x64": "4.55.2", - "@rollup/rollup-openharmony-arm64": "4.55.2", - "@rollup/rollup-win32-arm64-msvc": "4.55.2", - "@rollup/rollup-win32-ia32-msvc": "4.55.2", - "@rollup/rollup-win32-x64-gnu": "4.55.2", - "@rollup/rollup-win32-x64-msvc": "4.55.2", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, @@ -23897,26 +21721,6 @@ "tslib": "^2.1.0" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "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", @@ -23943,41 +21747,6 @@ "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", "dev": true }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "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", @@ -24150,22 +21919,26 @@ } }, "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.4", + "accepts": "~1.3.8", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-index/node_modules/accepts": { @@ -24203,28 +21976,22 @@ } }, "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, "node_modules/serve-index/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -24265,13 +22032,6 @@ "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -24305,51 +22065,20 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "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==", - "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.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.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" @@ -24768,20 +22497,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-combiner": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", @@ -24939,65 +22654,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", @@ -25281,9 +22937,9 @@ } }, "node_modules/systeminformation": { - "version": "5.30.5", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.5.tgz", - "integrity": "sha512-DpWmpCckhwR3hG+6udb6/aQB7PpiqVnvSljrjbKxNSvTRsGsg7NVE3/vouoYf96xgwMxXFKcS4Ux+cnkFwYM7A==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.7.tgz", + "integrity": "sha512-33B/cftpaWdpvH+Ho9U1b08ss8GQuLxrWHelbJT1yw4M48Taj8W3ezcPuaLoIHZz5V6tVHuQPr5BprEfnBLBMw==", "dev": true, "license": "MIT", "optional": true, @@ -25636,11 +23292,14 @@ "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==", - "dev": true, - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -25659,6 +23318,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.0.0.tgz", + "integrity": "sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, "node_modules/tinyrainbow": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", @@ -25774,19 +23443,6 @@ "node": ">=6" } }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ts-jest": { "version": "29.4.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", @@ -26128,69 +23784,6 @@ "node": ">= 0.4" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -26250,25 +23843,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -26312,9 +23886,9 @@ } }, "node_modules/undici": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", - "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.20.0.tgz", + "integrity": "sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==", "dev": true, "license": "MIT", "engines": { @@ -26371,20 +23945,6 @@ "node": ">=4" } }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -26905,26 +24465,6 @@ } } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/vitest/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/vizion": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", @@ -27265,73 +24805,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", @@ -27724,16 +25197,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/yalc/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/yalc/node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", @@ -27843,52 +25306,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yaml-eslint-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", - "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.0.0", - "yaml": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/yaml-eslint-parser/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": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 197d9084..3c8d5c0a 100755 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "docs": "npm run docs:ci && open http://127.0.0.1:8080/ && open ./public/index.html && compodoc -p tsconfig.json -s ", "docs:bootstrap": "node extras/update-spectaql-version.mjs && node scripts/run-spectaql.mjs", "docs:ci": "ts-node ./scripts/init-server.ts && npm run docs:bootstrap && compodoc -p tsconfig.json", - "format": "prettier --write 'src/**/*.ts'", - "format:staged": "pretty-quick --staged", + "format": "oxfmt --write src/", + "format:check": "oxfmt --check src/", "jest": "npm run jest:e2e", "jest:ci": "NODE_ENV=local jest --config jest-e2e.json --ci --forceExit", "jest:cov": "NODE_ENV=local jest --coverage", @@ -33,8 +33,8 @@ "jest:e2e-cov": "NODE_ENV=local jest --config jest-e2e.json --coverage --forceExit", "jest:e2e-doh": "NODE_ENV=local jest --config jest-e2e.json --forceExit --detectOpenHandles", "jest:watch": "NODE_ENV=local jest --watch", - "lint": "eslint '{src,apps,libs,tests}/**/*.{ts,js}' --cache", - "lint:fix": "eslint '{src,apps,libs,tests}/**/*.{ts,js}' --fix --cache", + "lint": "oxlint src/ tests/", + "lint:fix": "oxlint --fix src/ tests/", "prestart:prod": "npm run build", "reinit": "rimraf package-lock.json && rimraf node_modules && npm i && npm run lint && npm run test:e2e && npm run test:ci && npm run build", "reinit:clean": "rimraf package-lock.json && rimraf node_modules && npm cache clean --force && npm i && npm run test:e2e && npm run build", @@ -63,9 +63,7 @@ "vitest:unit": "vitest run --config vitest.config.ts", "test:unit:watch": "vitest --config vitest.config.ts", "test:types": "tsc --noEmit --skipLibCheck -p tests/types/tsconfig.json", - "watch": "npm-watch", - "link:eslint": "yalc add @lenne.tech/eslint-config-ts && yalc link @lenne.tech/eslint-config-ts && npm install", - "unlink:eslint": "yalc remove @lenne.tech/eslint-config-ts && npm install" + "watch": "npm-watch" }, "repository": { "type": "git", @@ -127,7 +125,6 @@ }, "devDependencies": { "@compodoc/compodoc": "1.2.1", - "@lenne.tech/eslint-config-ts": "2.1.4", "@nestjs/cli": "11.0.16", "@nestjs/schematics": "11.0.9", "@nestjs/testing": "11.1.12", @@ -143,14 +140,9 @@ "@types/nodemailer": "7.0.5", "@types/passport": "1.0.17", "@types/supertest": "6.0.3", - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", "@vitest/coverage-v8": "4.0.18", "@vitest/ui": "4.0.18", "ansi-colors": "4.1.3", - "eslint": "9.39.2", - "eslint-config-prettier": "10.1.8", - "eslint-plugin-unused-imports": "4.3.0", "find-file-up": "2.0.1", "grunt": "1.6.1", "grunt-bg-shell": "2.3.3", @@ -162,8 +154,8 @@ "npm-watch": "0.13.0", "otpauth": "9.4.1", "pm2": "6.0.14", - "prettier": "3.7.4", - "pretty-quick": "4.2.2", + "oxfmt": "0.26.0", + "oxlint": "0.17.0", "rimraf": "6.1.2", "supertest": "7.2.2", "ts-jest": "29.4.6", diff --git a/src/config.env.ts b/src/config.env.ts index 97f6143a..ea90f43e 100644 --- a/src/config.env.ts +++ b/src/config.env.ts @@ -263,11 +263,20 @@ const config: { [env: string]: IServerOptions } = { automaticObjectIdFiltering: true, baseUrl: process.env.BASE_URL, betterAuth: { - rateLimit: { enabled: process.env.RATE_LIMIT_ENABLED !== 'false', max: parseInt(process.env.RATE_LIMIT_MAX || '10', 10) }, + rateLimit: { + enabled: process.env.RATE_LIMIT_ENABLED !== 'false', + max: parseInt(process.env.RATE_LIMIT_MAX || '10', 10), + }, secret: process.env.BETTER_AUTH_SECRET, socialProviders: { - github: { clientId: process.env.SOCIAL_GITHUB_CLIENT_ID || '', clientSecret: process.env.SOCIAL_GITHUB_CLIENT_SECRET || '' }, - google: { clientId: process.env.SOCIAL_GOOGLE_CLIENT_ID || '', clientSecret: process.env.SOCIAL_GOOGLE_CLIENT_SECRET || '' }, + github: { + clientId: process.env.SOCIAL_GITHUB_CLIENT_ID || '', + clientSecret: process.env.SOCIAL_GITHUB_CLIENT_SECRET || '', + }, + google: { + clientId: process.env.SOCIAL_GOOGLE_CLIENT_ID || '', + clientSecret: process.env.SOCIAL_GOOGLE_CLIENT_SECRET || '', + }, }, twoFactor: { appName: process.env.TWO_FACTOR_APP_NAME || 'Nest Server' }, }, diff --git a/src/core.module.ts b/src/core.module.ts index ef43534c..b9dd69f6 100755 --- a/src/core.module.ts +++ b/src/core.module.ts @@ -255,16 +255,14 @@ export class CoreModule implements NestModule { // Determine if BetterAuth is explicitly disabled // In IAM-only mode: enabled by default (undefined = true), only false or { enabled: false } disables // In Legacy mode: disabled by default (undefined = false), must be explicitly enabled - const isExplicitlyDisabled = betterAuthConfig === false || - (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false); - const isExplicitlyEnabled = betterAuthConfig === true || - (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false); + const isExplicitlyDisabled = + betterAuthConfig === false || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false); + const isExplicitlyEnabled = + betterAuthConfig === true || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false); // IAM-only mode: enabled unless explicitly disabled // Legacy mode: enabled only if explicitly enabled - const isBetterAuthEnabled = isIamOnlyMode - ? !isExplicitlyDisabled - : isExplicitlyEnabled; + const isBetterAuthEnabled = isIamOnlyMode ? !isExplicitlyDisabled : isExplicitlyEnabled; const isAutoRegister = typeof betterAuthConfig === 'object' && betterAuthConfig?.autoRegister === true; diff --git a/src/core/common/args/filter.args.ts b/src/core/common/args/filter.args.ts index 93935191..1c7e3f48 100644 --- a/src/core/common/args/filter.args.ts +++ b/src/core/common/args/filter.args.ts @@ -40,7 +40,7 @@ export class FilterArgs extends PaginationArgs { ): this { super.map(data, options); this.filter = data.filter ? FilterInput.map(data.filter, options) : undefined; - Object.keys(this).forEach(key => this[key] === undefined && delete this[key]); + Object.keys(this).forEach((key) => this[key] === undefined && delete this[key]); return this; } } diff --git a/src/core/common/args/pagination.args.ts b/src/core/common/args/pagination.args.ts index c9cf2f8d..665f5d0c 100644 --- a/src/core/common/args/pagination.args.ts +++ b/src/core/common/args/pagination.args.ts @@ -75,7 +75,7 @@ export class PaginationArgs extends CoreInput { ): this { super.map(data, options); this.sort = maps(data.sort, SortInput, options.cloneDeep); - Object.keys(this).forEach(key => this[key] === undefined && delete this[key]); + Object.keys(this).forEach((key) => this[key] === undefined && delete this[key]); return this; } } diff --git a/src/core/common/decorators/translatable.decorator.ts b/src/core/common/decorators/translatable.decorator.ts index 4ff86d95..aa7f8814 100644 --- a/src/core/common/decorators/translatable.decorator.ts +++ b/src/core/common/decorators/translatable.decorator.ts @@ -55,7 +55,7 @@ export function updateLanguage, K extends readonly } input._translations = input._translations ?? {}; input._translations[language] = { - ...(input._translations[language] ?? {}), + ...input._translations[language], ...changedFields, }; return input; diff --git a/src/core/common/filters/http-exception-log.filter.ts b/src/core/common/filters/http-exception-log.filter.ts index 9295ba4d..dcd27fd6 100644 --- a/src/core/common/filters/http-exception-log.filter.ts +++ b/src/core/common/filters/http-exception-log.filter.ts @@ -21,8 +21,8 @@ export class HttpExceptionLogFilter implements ExceptionFilter { const ctx = host.switchToHttp(); const res = ctx.getResponse(); const status = exception.getStatus(); - res.status(status).json( - exception instanceof ServiceUnavailableException ? ({ ...exception } as any).response : { ...exception }, - ); + res + .status(status) + .json(exception instanceof ServiceUnavailableException ? ({ ...exception } as any).response : { ...exception }); } } diff --git a/src/core/common/helpers/config.helper.ts b/src/core/common/helpers/config.helper.ts index ffaf56c9..d00ae545 100644 --- a/src/core/common/helpers/config.helper.ts +++ b/src/core/common/helpers/config.helper.ts @@ -139,7 +139,7 @@ export function getEnvironmentObject(options?: { const adjustedKey = key.slice(config.prefix?.length || 0); // Convert key to path - const path = adjustedKey.split('__').map(part => + const path = adjustedKey.split('__').map((part) => part .split('_') .map((s, i) => (i === 0 ? s.toLowerCase() : s[0].toUpperCase() + s.slice(1).toLowerCase())) diff --git a/src/core/common/helpers/db.helper.ts b/src/core/common/helpers/db.helper.ts index 1d3030c2..abcd5388 100644 --- a/src/core/common/helpers/db.helper.ts +++ b/src/core/common/helpers/db.helper.ts @@ -55,10 +55,10 @@ export function addIds( if (ids.length) { // Add autoconverted ID if ( - result.length - && convert === 'auto' - && ((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId)) - || (typeof result[0] === 'string' && typeof ids !== 'string')) + result.length && + convert === 'auto' && + ((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId)) || + (typeof result[0] === 'string' && typeof ids !== 'string')) ) { const converted = result[0] instanceof Types.ObjectId ? getObjectIds(ids) : getStringIds(ids); result.push(...(converted as any)); @@ -108,7 +108,7 @@ export function equalIds(...ids: IdsType[]): boolean { if (!compare) { return false; } - return ids.every(id => getStringIds(id) === compare); + return ids.every((id) => getStringIds(id) === compare); } /** @@ -153,7 +153,7 @@ export function getElementsViaIds( // Unique elements if (config.unique) { return elements.filter((value, index, self) => { - return self.findIndex(e => getStringIds(e)) === index; + return self.findIndex((e) => getStringIds(e)) === index; }); } @@ -259,7 +259,7 @@ export function getObjectIds(ids: any[]): Types.ObjectId[]; export function getObjectIds(ids: any): Types.ObjectId; export function getObjectIds(ids: T): Types.ObjectId | Types.ObjectId[] { if (Array.isArray(ids)) { - return ids.map(id => new Types.ObjectId(getStringId(id))); + return ids.map((id) => new Types.ObjectId(getStringId(id))); } return new Types.ObjectId(getStringId(ids)); } @@ -421,7 +421,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap = n // Process array if (Array.isArray(element)) { - return element.map(e => objectIdsToStrings(e, prepared)); + return element.map((e) => objectIdsToStrings(e, prepared)); } // Process object @@ -458,8 +458,8 @@ export async function popAndMap( const ignoreSelections = options?.ignoreSelections; if (populate) { if ( - Array.isArray(populate) - && (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string') + Array.isArray(populate) && + (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string') ) { populateOptions = populate as PopulateOptions[]; } else if (Array.isArray(populate) && typeof (populate as SelectionNode[])[0]?.kind === 'string') { @@ -558,7 +558,7 @@ export function removeUnresolvedReferences( // Process array if (Array.isArray(populated)) { - populated.forEach(p => removeUnresolvedReferences(p, populatedOptions, false)); + populated.forEach((p) => removeUnresolvedReferences(p, populatedOptions, false)); return populated; } @@ -566,7 +566,7 @@ export function removeUnresolvedReferences( if (typeof populated === 'object') { // populatedOptions is an array if (Array.isArray(populatedOptions)) { - populatedOptions.forEach(po => + populatedOptions.forEach((po) => removeUnresolvedReferences(populated, ignoreFirst && typeof po === 'object' ? po.populate : po, false), ); return populated; diff --git a/src/core/common/helpers/graphql.helper.ts b/src/core/common/helpers/graphql.helper.ts index cef7e719..7e02e90c 100644 --- a/src/core/common/helpers/graphql.helper.ts +++ b/src/core/common/helpers/graphql.helper.ts @@ -201,7 +201,7 @@ export function getArguments(ast: FieldNode) { const valueNode = argument.value; const argumentValue = !isListValueNode(valueNode) ? (valueNode as any).value - : (valueNode as any).values.map(value => value.value); + : (valueNode as any).values.map((value) => value.value); return { [argument.name.value]: { diff --git a/src/core/common/helpers/input.helper.ts b/src/core/common/helpers/input.helper.ts index 637d8e05..9ee08fcd 100644 --- a/src/core/common/helpers/input.helper.ts +++ b/src/core/common/helpers/input.helper.ts @@ -380,7 +380,7 @@ export function clone(object: any, options?: { checkResult?: boolean; circles?: console.debug(e, config, object, 'automatic try to use rfdc with circles'); } try { - const clonedWithCircles = rfdc({ ...config, ...{ circles: true } })(object); + const clonedWithCircles = rfdc({ ...config, circles: true })(object); if (config.checkResult && !util.isDeepStrictEqual(object, clonedWithCircles)) { throw new Error('Cloned object differs from original object'); } @@ -533,7 +533,7 @@ export function isDate(parameter: Date, falseFunction: (...params) => any = erro * Check if parameter is a valid email address */ export function isEmail(parameter: string, falseFunction: (...params) => any = errorFunction): boolean { - const regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/; + const regex = /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,})+$/; return regex.test(parameter) ? true : falseFunction(isEmail); } diff --git a/src/core/common/helpers/scim.helper.ts b/src/core/common/helpers/scim.helper.ts index d536cfa1..f72ddb25 100644 --- a/src/core/common/helpers/scim.helper.ts +++ b/src/core/common/helpers/scim.helper.ts @@ -3,7 +3,6 @@ import type { LogicalOperator } from '../types/scim-logical-operator.type'; import { ScimNode } from '../types/scim-node.type'; - export function scimToMongo(scim: string): any { if (!scim) { return {}; @@ -51,7 +50,8 @@ function parseTokens(tokens: string[]): ScimNode { /** Parses a single term: either a nested expression, array filter, or condition */ function parseTerm(): ScimNode { - if (tokens[pos] === '(') { // Start of a nested filter + if (tokens[pos] === '(') { + // Start of a nested filter pos++; // skip '(' const expr = parseExpression(); if (tokens[pos] !== ')') { @@ -60,7 +60,8 @@ function parseTokens(tokens: string[]): ScimNode { pos++; // skip ')' return expr; } - if (tokens[pos + 1] === '[') { // Start of an array Filter + if (tokens[pos + 1] === '[') { + // Start of an array Filter const path = tokens[pos++]; pos++; // skip '[' const expr = parseExpression(); @@ -83,7 +84,8 @@ function parseTokens(tokens: string[]): ScimNode { let value: any = null; - if (op !== 'pr') { // "Is Present" doesnt require a value + if (op !== 'pr') { + // "Is Present" doesnt require a value let rawValue = tokens[pos++]; // Third token is the value if (!attr || !op || rawValue === undefined) { throw new Error(`Invalid condition syntax at token ${pos}`); @@ -106,8 +108,7 @@ function parseTokens(tokens: string[]): ScimNode { return parseExpression(); } - - /** Converts string values to appropriate types (number, boolean, or string) */ +/** Converts string values to appropriate types (number, boolean, or string) */ function parseValue(value: string): any { if (value === null || value === undefined) { return value; @@ -132,9 +133,9 @@ function parseValue(value: string): any { } /** - * Tokenizes a SCIM filter string into meaningful parts. - * e.g., 'userName eq "john"' → ['userName', 'eq', '"john"'] - */ + * Tokenizes a SCIM filter string into meaningful parts. + * e.g., 'userName eq "john"' → ['userName', 'eq', '"john"'] + */ function tokenize(input: string): string[] { // Space out brackets, but not inside quoted strings let result = ''; @@ -153,10 +154,12 @@ function tokenize(input: string): string[] { } } - return result - .replace(/\s+/g, ' ') // Normalise whitespaces - .trim() - .match(/\[|]|\(|\)|[a-zA-Z0-9_.]+|"(?:[^"\\]|\\.)*"/g) || []; // Match tokens: brackets, identifiers, quoted strings + return ( + result + .replace(/\s+/g, ' ') // Normalise whitespaces + .trim() + .match(/\[|]|\(|\)|[a-zA-Z0-9_.]+|"(?:[^"\\]|\\.)*"/g) || [] + ); // Match tokens: brackets, identifiers, quoted strings } /** Converts the parsed SCIM AST to an equivalent MongoDB query object */ diff --git a/src/core/common/inputs/combined-filter.input.ts b/src/core/common/inputs/combined-filter.input.ts index 7f8676b5..4bc01d89 100644 --- a/src/core/common/inputs/combined-filter.input.ts +++ b/src/core/common/inputs/combined-filter.input.ts @@ -51,7 +51,7 @@ export class CombinedFilterInput extends CoreInput { ): this { super.map(data, options); this.filters = maps(data.filters, FilterInput, options.cloneDeep); - Object.keys(this).forEach(key => this[key] === undefined && delete this[key]); + Object.keys(this).forEach((key) => this[key] === undefined && delete this[key]); return this; } } diff --git a/src/core/common/inputs/core-input.input.ts b/src/core/common/inputs/core-input.input.ts index b42b553a..9b48dfb9 100644 --- a/src/core/common/inputs/core-input.input.ts +++ b/src/core/common/inputs/core-input.input.ts @@ -30,7 +30,7 @@ export abstract class CoreInput extends CoreModel { ...options, }; const coreInput = map(data, this, config); - Object.keys(coreInput).forEach(key => coreInput[key] === undefined && delete coreInput[key]); + Object.keys(coreInput).forEach((key) => coreInput[key] === undefined && delete coreInput[key]); return coreInput; } } diff --git a/src/core/common/inputs/filter.input.ts b/src/core/common/inputs/filter.input.ts index 9cbb01f5..e062e4d6 100644 --- a/src/core/common/inputs/filter.input.ts +++ b/src/core/common/inputs/filter.input.ts @@ -18,23 +18,23 @@ export class FilterInput extends CoreInput { /** * Combination of multiple filters via logical operator */ - @UnifiedField({ - description: 'Filter for a single property', - isOptional: true, - roles: RoleEnum.S_EVERYONE, - type: CombinedFilterInput, - }) + @UnifiedField({ + description: 'Filter for a single property', + isOptional: true, + roles: RoleEnum.S_EVERYONE, + type: CombinedFilterInput, + }) combinedFilter?: CombinedFilterInput = undefined; /** * Filter for a single property */ - @UnifiedField({ - description: 'Filter for a single property', - isOptional: true, - roles: RoleEnum.S_EVERYONE, - type: SingleFilterInput, - }) + @UnifiedField({ + description: 'Filter for a single property', + isOptional: true, + roles: RoleEnum.S_EVERYONE, + type: SingleFilterInput, + }) singleFilter?: SingleFilterInput = undefined; // =================================================================================================================== @@ -55,7 +55,7 @@ export class FilterInput extends CoreInput { super.map(data, options); this.combinedFilter = data.combinedFilter ? CombinedFilterInput.map(data.combinedFilter, options) : undefined; this.singleFilter = data.singleFilter ? SingleFilterInput.map(data.singleFilter, options) : undefined; - Object.keys(this).forEach(key => this[key] === undefined && delete this[key]); + Object.keys(this).forEach((key) => this[key] === undefined && delete this[key]); return this; } } diff --git a/src/core/common/inputs/single-filter.input.ts b/src/core/common/inputs/single-filter.input.ts index 44214ca5..b73736a0 100644 --- a/src/core/common/inputs/single-filter.input.ts +++ b/src/core/common/inputs/single-filter.input.ts @@ -69,8 +69,8 @@ export class SingleFilterInput extends CoreInput { */ @UnifiedField({ description: - '[Options](https://docs.mongodb.com/manual/reference/operator/query/regex/#op._S_options) for ' - + '[REGEX](https://docs.mongodb.com/manual/reference/operator/query/regex/) operator', + '[Options](https://docs.mongodb.com/manual/reference/operator/query/regex/#op._S_options) for ' + + '[REGEX](https://docs.mongodb.com/manual/reference/operator/query/regex/) operator', isOptional: true, roles: RoleEnum.S_EVERYONE, }) diff --git a/src/core/common/interceptors/check-response.interceptor.ts b/src/core/common/interceptors/check-response.interceptor.ts index 8f791244..5130b77a 100644 --- a/src/core/common/interceptors/check-response.interceptor.ts +++ b/src/core/common/interceptors/check-response.interceptor.ts @@ -42,8 +42,8 @@ export class CheckResponseInterceptor implements NestInterceptor { const start = Date.now(); const result = checkRestricted(data, currentUser, this.config); if ( - this.config.debug - && Date.now() - start >= (typeof this.config.debug === 'number' ? this.config.debug : 100) + this.config.debug && + Date.now() - start >= (typeof this.config.debug === 'number' ? this.config.debug : 100) ) { console.warn( `Duration for CheckResponseInterceptor is too long: ${Date.now() - start}ms`, diff --git a/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts b/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts index dd53de4d..3e6ea9ff 100644 --- a/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts +++ b/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts @@ -8,8 +8,10 @@ import { CronJobConfig } from './cron-job-config.interface'; * This config can define timezone but not utcOffset, * if you want to use utcOffset, you have to use the CronJobConfigWithUtcOffset */ -export interface CronJobConfigWithTimeZone - extends CronJobConfig { +export interface CronJobConfigWithTimeZone< + OC extends CronOnCompleteCommand | null = null, + C = null, +> extends CronJobConfig { /** * Specify the timezone for the execution. This will modify the actual time relative to your timezone. * If the timezone is invalid, an error is thrown. Can be any string accepted by luxon's `DateTime.setZone()` diff --git a/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts b/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts index b9f2d201..cf66407a 100644 --- a/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts +++ b/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts @@ -8,8 +8,10 @@ import { CronJobConfig } from './cron-job-config.interface'; * This config can define utcOffset but not timezone, * if you want to use timezone, you have to use the CronJobConfigWithTimezone */ -export interface CronJobConfigWithUtcOffset - extends CronJobConfig { +export interface CronJobConfigWithUtcOffset< + OC extends CronOnCompleteCommand | null = null, + C = null, +> extends CronJobConfig { /** * Specify the timezone for the execution. This will modify the actual time relative to your timezone. * If the timezone is invalid, an error is thrown. Can be any string accepted by luxon's `DateTime.setZone()` diff --git a/src/core/common/interfaces/scim-array-filter-node.interface.ts b/src/core/common/interfaces/scim-array-filter-node.interface.ts index d1982159..ee6b65a8 100644 --- a/src/core/common/interfaces/scim-array-filter-node.interface.ts +++ b/src/core/common/interfaces/scim-array-filter-node.interface.ts @@ -5,4 +5,4 @@ export interface ArrayFilterNode { expr: ScimNode; path: string; type: 'array'; -} \ No newline at end of file +} diff --git a/src/core/common/interfaces/scim-condition-node.interface.ts b/src/core/common/interfaces/scim-condition-node.interface.ts index 02a94dab..40caf5b1 100644 --- a/src/core/common/interfaces/scim-condition-node.interface.ts +++ b/src/core/common/interfaces/scim-condition-node.interface.ts @@ -6,4 +6,4 @@ export interface ConditionNode { comparator: Comparator; type: 'condition'; value?: string; -} \ No newline at end of file +} diff --git a/src/core/common/interfaces/scim-logical-node.interface.ts b/src/core/common/interfaces/scim-logical-node.interface.ts index 9890054a..f434627e 100644 --- a/src/core/common/interfaces/scim-logical-node.interface.ts +++ b/src/core/common/interfaces/scim-logical-node.interface.ts @@ -6,4 +6,4 @@ export interface LogicalNode { left: ScimNode; operator: LogicalOperator; right: ScimNode; -} \ No newline at end of file +} diff --git a/src/core/common/interfaces/server-options.interface.ts b/src/core/common/interfaces/server-options.interface.ts index eabea3b6..f13beb52 100644 --- a/src/core/common/interfaces/server-options.interface.ts +++ b/src/core/common/interfaces/server-options.interface.ts @@ -1707,10 +1707,7 @@ interface IBetterAuthBase { * }; * ``` */ -type IBetterAuthPasskeyDisabled = - | false - | (Omit & { enabled: false }) - | undefined; +type IBetterAuthPasskeyDisabled = false | (Omit & { enabled: false }) | undefined; /** * Passkey configuration that is considered "enabled". @@ -1720,9 +1717,7 @@ type IBetterAuthPasskeyDisabled = * - `{ enabled: true, ... }` (explicit enabled) * - `{ rpName: 'My App', ... }` (config without explicit enabled = defaults to true) */ -type IBetterAuthPasskeyEnabled = - | (Omit & { enabled?: true }) - | true; +type IBetterAuthPasskeyEnabled = (Omit & { enabled?: true }) | true; /** * BetterAuth configuration WITHOUT Passkey (or Passkey disabled). diff --git a/src/core/common/scalars/any.scalar.ts b/src/core/common/scalars/any.scalar.ts index 4202534d..29b21a06 100644 --- a/src/core/common/scalars/any.scalar.ts +++ b/src/core/common/scalars/any.scalar.ts @@ -38,7 +38,7 @@ export class Any implements CustomScalar { case Kind.INT: return parseFloat(ast.value); case Kind.LIST: - return ast.values.map(n => this.parseLiteral(n, variables)); + return ast.values.map((n) => this.parseLiteral(n, variables)); case Kind.NULL: return null; case Kind.OBJECT: { diff --git a/src/core/common/scalars/json.scalar.ts b/src/core/common/scalars/json.scalar.ts index 44ebe92b..ffd8cbb1 100644 --- a/src/core/common/scalars/json.scalar.ts +++ b/src/core/common/scalars/json.scalar.ts @@ -9,8 +9,8 @@ export class JSON implements CustomScalar { /** * Description of the scalar */ - description - = 'JSON scalar type. Information on the exact schema of the JSON object is contained in the description of the field.'; + description = + 'JSON scalar type. Information on the exact schema of the JSON object is contained in the description of the field.'; /** * Parse value from the client input variables @@ -39,7 +39,7 @@ export class JSON implements CustomScalar { case Kind.INT: return parseFloat(ast.value); case Kind.LIST: - return ast.values.map(n => this.parseLiteral(n, variables)); + return ast.values.map((n) => this.parseLiteral(n, variables)); case Kind.NULL: return null; case Kind.OBJECT: { diff --git a/src/core/common/services/config.service.ts b/src/core/common/services/config.service.ts index 4a89931d..e8b2a6a8 100644 --- a/src/core/common/services/config.service.ts +++ b/src/core/common/services/config.service.ts @@ -38,14 +38,14 @@ export class ConfigService { /** * BehaviorSubject for config */ - protected static _configSubject$: BehaviorSubject & { [key: string]: any }> - = new BehaviorSubject(undefined); + protected static _configSubject$: BehaviorSubject & { [key: string]: any }> = + new BehaviorSubject(undefined); /** * BehaviorSubject for frozen config */ - protected static _frozenConfigSubject$: BehaviorSubject & { [key: string]: any }> - = new BehaviorSubject(undefined); + protected static _frozenConfigSubject$: BehaviorSubject & { [key: string]: any }> = + new BehaviorSubject(undefined); /** * Singleton instance of ConfigService @@ -82,8 +82,8 @@ export class ConfigService { // Set config before setting instance if (typeof configObject === 'object') { isInitialized - ? ConfigService.mergeConfig(configObject, { ...config, ...{ init: false } }) - : ConfigService.setConfig(configObject, { ...config, ...{ init: false } }); + ? ConfigService.mergeConfig(configObject, { ...config, init: false }) + : ConfigService.setConfig(configObject, { ...config, init: false }); } // Set instance if not yet initialized @@ -181,8 +181,8 @@ export class ConfigService { */ static get observable() { return ConfigService._configSubject$.asObservable().pipe( - filter(config => !config), - map(config => clone(config, { circles: false })), + filter((config) => !config), + map((config) => clone(config, { circles: false })), ); } @@ -197,7 +197,7 @@ export class ConfigService { * Get observable for faster but read-only deep-frozen configuration */ static get observableFastButReadOnly() { - return ConfigService._frozenConfigSubject$.asObservable().pipe(filter(config => !config)); + return ConfigService._frozenConfigSubject$.asObservable().pipe(filter((config) => !config)); } /** @@ -343,8 +343,8 @@ export class ConfigService { // Check for unintentional overwriting if (!firstInitialization && !config.reInit) { throw new Error( - 'Unintentional overwriting of the configuration. ' - + 'If overwriting is desired, please set `reInit` in setConfig of ConfigService to `true`.', + 'Unintentional overwriting of the configuration. ' + + 'If overwriting is desired, please set `reInit` in setConfig of ConfigService to `true`.', ); } diff --git a/src/core/common/services/core-cron-jobs.service.ts b/src/core/common/services/core-cron-jobs.service.ts index 8bce9abb..0aee34dc 100644 --- a/src/core/common/services/core-cron-jobs.service.ts +++ b/src/core/common/services/core-cron-jobs.service.ts @@ -68,8 +68,8 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap { for (const [name, CronExpressionOrConfig] of Object.entries(this.cronJobs)) { // Check config if ( - !CronExpressionOrConfig - || (typeof CronExpressionOrConfig === 'object' && (CronExpressionOrConfig as CronJobConfigWithTimeZone).disabled) + !CronExpressionOrConfig || + (typeof CronExpressionOrConfig === 'object' && (CronExpressionOrConfig as CronJobConfigWithTimeZone).disabled) ) { continue; } @@ -116,8 +116,8 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap { // Check if parallel execution is allowed and if so how many can run in parallel if ( - dates?.length - && (!config.runParallel || (typeof config.runParallel === 'number' && dates.length >= config.runParallel)) + dates?.length && + (!config.runParallel || (typeof config.runParallel === 'number' && dates.length >= config.runParallel)) ) { return; } @@ -134,7 +134,7 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap { await this[name](); } catch (e) { // Remove job from running list - this.runningJobs[name] = this.runningJobs[name].filter(item => item !== date); + this.runningJobs[name] = this.runningJobs[name].filter((item) => item !== date); if (config.throwException) { throw e; } else { @@ -143,7 +143,7 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap { } // Remove job from running list - this.runningJobs[name] = this.runningJobs[name].filter(item => item !== date); + this.runningJobs[name] = this.runningJobs[name].filter((item) => item !== date); }, null, true, diff --git a/src/core/common/services/crud.service.ts b/src/core/common/services/crud.service.ts index 061e516b..ed508376 100644 --- a/src/core/common/services/crud.service.ts +++ b/src/core/common/services/crud.service.ts @@ -313,7 +313,7 @@ export abstract class CrudService< async findAndCountForce( filter?: FilterArgs | { filterQuery?: QueryFilter; queryOptions?: QueryOptions; samples?: number }, serviceOptions: ServiceOptions = {}, - ): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number; }> { + ): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number }> { serviceOptions.raw = true; return this.findAndCount(filter, serviceOptions); } @@ -325,7 +325,7 @@ export abstract class CrudService< async findAndCountRaw( filter?: FilterArgs | { filterQuery?: QueryFilter; queryOptions?: QueryOptions; samples?: number }, serviceOptions: ServiceOptions = {}, - ): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number; }> { + ): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number }> { serviceOptions = serviceOptions || {}; serviceOptions.raw = true; return this.findAndCountForce(filter, serviceOptions); diff --git a/src/core/common/services/mailjet.service.ts b/src/core/common/services/mailjet.service.ts index 3f134f3a..dad5b949 100644 --- a/src/core/common/services/mailjet.service.ts +++ b/src/core/common/services/mailjet.service.ts @@ -3,7 +3,6 @@ const Mailjet = require('node-mailjet'); import { ConfigService } from './config.service'; - /** * Mailjet service */ @@ -83,8 +82,8 @@ export class MailjetService { }); } catch (e) { if ( - this.configService.getFastButReadOnly('email.mailjet.api_key_public') - && this.configService.getFastButReadOnly('email.mailjet.api_key_private') + this.configService.getFastButReadOnly('email.mailjet.api_key_public') && + this.configService.getFastButReadOnly('email.mailjet.api_key_private') ) { throw new HttpException('Cannot connect to mailjet.', 502); } @@ -95,8 +94,8 @@ export class MailjetService { this.configService.getFastButReadOnly('email.mailjet.api_key_private') || 'missing', 'email.mailjet.api_key_public': this.configService.getFastButReadOnly('email.mailjet.api_key_public') || 'missing', - 'info': 'Mailjet credentials are missing', - 'templateData': templateData, + info: 'Mailjet credentials are missing', + templateData: templateData, }, null, 2, diff --git a/src/core/common/services/module.service.ts b/src/core/common/services/module.service.ts index aafecfef..486ac2f6 100644 --- a/src/core/common/services/module.service.ts +++ b/src/core/common/services/module.service.ts @@ -96,7 +96,7 @@ export abstract class ModuleService { processFieldSelection: {}, pubSub: true, setCreateOrUpdateUserId: false, - ...(options?.serviceOptions || {}), + ...options?.serviceOptions, }; // Note raw configuration @@ -143,8 +143,8 @@ export abstract class ModuleService { const preparedInput = await this.prepareInput(config.input, config); new Promise(() => { if ( - inputJSON?.replace(/"password":\s*"[^"]*"/, '') - !== JSON.stringify(preparedInput)?.replace(/"password":\s*"[^"]*"/, '') + inputJSON?.replace(/"password":\s*"[^"]*"/, '') !== + JSON.stringify(preparedInput)?.replace(/"password":\s*"[^"]*"/, '') ) { console.debug( 'CheckSecurityInterceptor: securityCheck changed input of type', diff --git a/src/core/common/types/array-element.type.ts b/src/core/common/types/array-element.type.ts index a89a3bb0..e42400ec 100644 --- a/src/core/common/types/array-element.type.ts +++ b/src/core/common/types/array-element.type.ts @@ -1,5 +1,6 @@ /** * Get type of array elements */ -export type ArrayElement = - ArrayType extends readonly (infer ElementType)[] ? ElementType : ArrayType; +export type ArrayElement = ArrayType extends readonly (infer ElementType)[] + ? ElementType + : ArrayType; diff --git a/src/core/common/types/require-only-one.type.ts b/src/core/common/types/require-only-one.type.ts index 48bb465c..c720d5d6 100644 --- a/src/core/common/types/require-only-one.type.ts +++ b/src/core/common/types/require-only-one.type.ts @@ -4,5 +4,5 @@ */ export type RequireOnlyOne = Pick> & { - [K in Keys]-?: Partial, undefined>> & Required>; -}[Keys]; + [K in Keys]-?: Partial, undefined>> & Required>; + }[Keys]; diff --git a/src/core/common/types/required-at-least-one.type.ts b/src/core/common/types/required-at-least-one.type.ts index b2223a32..de0c3e04 100644 --- a/src/core/common/types/required-at-least-one.type.ts +++ b/src/core/common/types/required-at-least-one.type.ts @@ -4,5 +4,5 @@ */ export type RequireAtLeastOne = Pick> & { - [K in Keys]-?: Partial>> & Required>; -}[Keys]; + [K in Keys]-?: Partial>> & Required>; + }[Keys]; diff --git a/src/core/common/types/scim-comparator.type.ts b/src/core/common/types/scim-comparator.type.ts index fe8953e5..8d883be2 100644 --- a/src/core/common/types/scim-comparator.type.ts +++ b/src/core/common/types/scim-comparator.type.ts @@ -1,2 +1,2 @@ /** Supported SCIM comparison operators */ -export type Comparator = 'aco' | 'co' | 'eq' | 'ew' | 'ge' | 'gt' | 'le' | 'lt' | 'pr' | 'sw'; \ No newline at end of file +export type Comparator = 'aco' | 'co' | 'eq' | 'ew' | 'ge' | 'gt' | 'le' | 'lt' | 'pr' | 'sw'; diff --git a/src/core/common/types/scim-logical-operator.type.ts b/src/core/common/types/scim-logical-operator.type.ts index 641ab00e..de08e3ca 100644 --- a/src/core/common/types/scim-logical-operator.type.ts +++ b/src/core/common/types/scim-logical-operator.type.ts @@ -1 +1 @@ -export type LogicalOperator = 'and' | 'or'; \ No newline at end of file +export type LogicalOperator = 'and' | 'or'; diff --git a/src/core/common/types/scim-node.type.ts b/src/core/common/types/scim-node.type.ts index 357c4166..2d9d05cc 100644 --- a/src/core/common/types/scim-node.type.ts +++ b/src/core/common/types/scim-node.type.ts @@ -3,4 +3,4 @@ import { ConditionNode } from '../interfaces/scim-condition-node.interface'; import { LogicalNode } from '../interfaces/scim-logical-node.interface'; /** Union type representing any valid SCIM node */ -export type ScimNode = ArrayFilterNode | ConditionNode | LogicalNode; \ No newline at end of file +export type ScimNode = ArrayFilterNode | ConditionNode | LogicalNode; diff --git a/src/core/modules/auth/guards/auth.guard.ts b/src/core/modules/auth/guards/auth.guard.ts index 5152814d..f2e6cf0b 100644 --- a/src/core/modules/auth/guards/auth.guard.ts +++ b/src/core/modules/auth/guards/auth.guard.ts @@ -139,8 +139,10 @@ function createAuthGuard(type?: AuthGuardStrategy | string | string[]): Type - this.handleRequest(err, currentUser, info, context), + const user = await passportFn( + type || this.options?.defaultStrategy, + options, + (err: any, currentUser: any, info: any) => this.handleRequest(err, currentUser, info, context), ); request[options.property || defaultOptions.property] = user; return true; diff --git a/src/core/modules/auth/guards/roles.guard.ts b/src/core/modules/auth/guards/roles.guard.ts index a2a36150..5e56d42f 100644 --- a/src/core/modules/auth/guards/roles.guard.ts +++ b/src/core/modules/auth/guards/roles.guard.ts @@ -1,4 +1,11 @@ -import { ExecutionContext, ForbiddenException, Injectable, Logger, Optional, UnauthorizedException } from '@nestjs/common'; +import { + ExecutionContext, + ForbiddenException, + Injectable, + Logger, + Optional, + UnauthorizedException, +} from '@nestjs/common'; import { ModuleRef, Reflector } from '@nestjs/core'; import { GqlExecutionContext } from '@nestjs/graphql'; import { firstValueFrom, isObservable } from 'rxjs'; diff --git a/src/core/modules/auth/tokens.decorator.ts b/src/core/modules/auth/tokens.decorator.ts index c6c4a72c..de42a2c0 100644 --- a/src/core/modules/auth/tokens.decorator.ts +++ b/src/core/modules/auth/tokens.decorator.ts @@ -14,9 +14,9 @@ export const Tokens = createParamDecorator( const context = getContextData(ctx); // Get token from cookie or authorization header - const token - = context?.request?.cookies?.['token'] - || context?.request + const token = + context?.request?.cookies?.['token'] || + context?.request ?.get('Authorization') ?.replace(/bearer/i, '') .trim(); diff --git a/src/core/modules/better-auth/ARCHITECTURE.md b/src/core/modules/better-auth/ARCHITECTURE.md index b4554bfa..e189f40a 100644 --- a/src/core/modules/better-auth/ARCHITECTURE.md +++ b/src/core/modules/better-auth/ARCHITECTURE.md @@ -5,6 +5,7 @@ The `CoreBetterAuthController` implements custom endpoints instead of directly u ## 1. Hybrid-Auth-System (Legacy + Better-Auth) The nest-server supports bidirectional authentication: + - **Legacy Auth → Better-Auth**: Users created via Legacy Auth can sign in via Better-Auth - **Better-Auth → Legacy Auth**: Users created via Better-Auth can sign in via Legacy Auth @@ -14,14 +15,14 @@ This requires custom logic that cannot be implemented via Better-Auth hooks alon Better-Auth hooks have fundamental limitations that prevent full implementation of our requirements: -| Requirement | Hook Support | Reason | -|-------------|--------------|--------| -| Legacy user migration | ⚠️ Partial | Requires global DB access outside NestJS DI | -| Password sync to Legacy | ❌ No | **After-hooks don't have access to plaintext password** | -| Custom response format | ❌ No | **Hooks cannot modify HTTP response** | -| Multi-cookie setting | ❌ No | **Hooks cannot set cookies** | -| User mapping with roles | ❌ No | Requires NestJS Dependency Injection | -| Session token injection | ❌ No | Before-hooks cannot inject tokens into requests | +| Requirement | Hook Support | Reason | +| ----------------------- | ------------ | ------------------------------------------------------- | +| Legacy user migration | ⚠️ Partial | Requires global DB access outside NestJS DI | +| Password sync to Legacy | ❌ No | **After-hooks don't have access to plaintext password** | +| Custom response format | ❌ No | **Hooks cannot modify HTTP response** | +| Multi-cookie setting | ❌ No | **Hooks cannot set cookies** | +| User mapping with roles | ❌ No | Requires NestJS Dependency Injection | +| Session token injection | ❌ No | Before-hooks cannot inject tokens into requests | ## 3. Hook Limitations Explained @@ -68,35 +69,37 @@ export const auth = betterAuth({ ## 4. What Custom Endpoints Do -| Endpoint | Custom Logic | Why Required | -|----------|--------------|--------------| +| Endpoint | Custom Logic | Why Required | +| ---------------- | ------------------------------------------------ | ---------------------------------- | | `/sign-in/email` | Legacy migration, PW normalization, 2FA handling | Migration needs plaintext password | -| `/sign-up/email` | PW normalization, Legacy sync, User linking | Sync needs plaintext password | -| `/sign-out` | Multi-cookie clearing | Response modification | -| `/session` | User mapping with roles | NestJS service access | -| Plugin routes | Session token injection | Request modification | +| `/sign-up/email` | PW normalization, Legacy sync, User linking | Sync needs plaintext password | +| `/sign-out` | Multi-cookie clearing | Response modification | +| `/session` | User mapping with roles | NestJS service access | +| Plugin routes | Session token injection | Request modification | ## 5. Native Handler Where Possible Despite custom endpoints, we use Better-Auth's native handler where appropriate: + - **Plugin routes** (Passkey, 2FA, OAuth) → `authInstance.handler()` - **2FA verification flow** → Native handler for correct cookie setting - **Passkey authentication** → Native WebAuthn handling ## 6. Alternative Approaches Considered -| Approach | Evaluation | -|----------|------------| -| **Full Hook Approach** | ❌ Not feasible - missing plaintext password, no response modification | -| **Hybrid with Global DB** | ⚠️ Possible but anti-pattern - bypasses NestJS DI, harder to test | -| **Custom Controller (current)** | ✅ Best balance - NestJS DI access, testable, maintainable | +| Approach | Evaluation | +| ------------------------------- | ---------------------------------------------------------------------- | +| **Full Hook Approach** | ❌ Not feasible - missing plaintext password, no response modification | +| **Hybrid with Global DB** | ⚠️ Possible but anti-pattern - bypasses NestJS DI, harder to test | +| **Custom Controller (current)** | ✅ Best balance - NestJS DI access, testable, maintainable | ## Conclusion The custom controller architecture is **necessary complexity**, not unnecessary overhead. It enables: + - ✅ Legacy Auth compatibility - ✅ Bidirectional password synchronization - ✅ Multi-cookie support - ✅ Custom user mapping with roles - ✅ Proper 2FA cookie handling -- ✅ Full NestJS Dependency Injection access +- ✅ Full NestJS Dependency Injection access \ No newline at end of file diff --git a/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md b/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md index 7515068a..ea642cec 100644 --- a/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +++ b/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md @@ -8,10 +8,10 @@ ## Choose Your Scenario -| Scenario | Use When | CoreModule Signature | Steps | -|----------|----------|---------------------|-------| -| **New Project (IAM-Only)** | Starting fresh, no legacy users | `CoreModule.forRoot(envConfig)` | 1-6 | -| **Existing Project (Migration)** | Have legacy users to migrate | `CoreModule.forRoot(AuthService, AuthModule, envConfig)` | 1-6 | +| Scenario | Use When | CoreModule Signature | Steps | +| -------------------------------- | ------------------------------- | -------------------------------------------------------- | ----- | +| **New Project (IAM-Only)** | Starting fresh, no legacy users | `CoreModule.forRoot(envConfig)` | 1-6 | +| **Existing Project (Migration)** | Have legacy users to migrate | `CoreModule.forRoot(AuthService, AuthModule, envConfig)` | 1-6 | **Key difference:** New projects disable Legacy endpoints, existing projects keep them enabled during migration. @@ -22,6 +22,7 @@ All files you need to create are already implemented as reference in the package: **Local (in your node_modules):** + ``` node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/ ``` @@ -30,6 +31,7 @@ node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/ https://github.com/lenneTech/nest-server/tree/develop/src/server/modules/better-auth **Also see the UserService integration:** + - Local: `node_modules/@lenne.tech/nest-server/src/server/modules/user/user.service.ts` - GitHub: https://github.com/lenneTech/nest-server/blob/develop/src/server/modules/user/user.service.ts @@ -38,18 +40,21 @@ https://github.com/lenneTech/nest-server/tree/develop/src/server/modules/better- ## Required Files (Create in Order) ### 1. BetterAuth Module + **Create:** `src/server/modules/better-auth/better-auth.module.ts` **Copy from:** `node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/better-auth.module.ts` --- ### 2. BetterAuth Controller + **Create:** `src/server/modules/better-auth/better-auth.controller.ts` **Copy from:** `node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/better-auth.controller.ts` --- ### 3. BetterAuth Resolver (CRITICAL!) + **Create:** `src/server/modules/better-auth/better-auth.resolver.ts` **Copy from:** `node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/better-auth.resolver.ts` @@ -61,17 +66,20 @@ GraphQL schema is built from decorators at compile time. The parent class (`Core --- ### 4. Update UserService (CRITICAL!) + **Modify:** `src/server/modules/user/user.service.ts` **Reference:** `node_modules/@lenne.tech/nest-server/src/server/modules/user/user.service.ts` **Required changes:** 1. Add import: + ```typescript import { CoreBetterAuthUserMapper } from '@lenne.tech/nest-server'; ``` 2. Add constructor parameter: + ```typescript @Optional() private readonly betterAuthUserMapper?: CoreBetterAuthUserMapper, ``` @@ -83,6 +91,7 @@ GraphQL schema is built from decorators at compile time. The parent class (`Core **WHY is this critical?** The `CoreBetterAuthUserMapper` enables bidirectional password synchronization: + - User signs up via BetterAuth → password synced to Legacy Auth (bcrypt hash) - User changes password → synced between both systems - **Without this, users can only authenticate via ONE system!** @@ -90,14 +99,16 @@ The `CoreBetterAuthUserMapper` enables bidirectional password synchronization: --- ### 5. Update ServerModule + **Modify:** `src/server/server.module.ts` **Reference:** `node_modules/@lenne.tech/nest-server/src/server/server.module.ts` #### For New Projects (IAM-Only) - Recommended: + ```typescript @Module({ imports: [ - CoreModule.forRoot(envConfig), // Simplified signature + CoreModule.forRoot(envConfig), // Simplified signature BetterAuthModule.forRoot({ config: envConfig.betterAuth, fallbackSecrets: [envConfig.jwt?.secret], @@ -112,6 +123,7 @@ export class ServerModule {} **Note:** Since 11.10.3, `registerRolesGuardGlobally` defaults to `true`. You don't need to set it explicitly. #### For Existing Projects (Migration): + ```typescript @Module({ imports: [ @@ -129,10 +141,12 @@ export class ServerModule {} --- ### 6. Update config.env.ts + **Modify:** `src/config.env.ts` **Reference:** `node_modules/@lenne.tech/nest-server/src/config.env.ts` #### Zero-Config (Default): + BetterAuth is **enabled by default** with JWT + 2FA. No configuration required! ```typescript @@ -152,11 +166,12 @@ const config = { ``` #### With Passkey (auto-detected from baseUrl): + ```typescript const config = { // Passkey is auto-activated when URLs can be resolved // Option 1: Set root-level baseUrl (production) - baseUrl: 'https://api.example.com', // rpId, origin, trustedOrigins auto-detected + baseUrl: 'https://api.example.com', // rpId, origin, trustedOrigins auto-detected env: 'production', // Option 2: Use env: 'local'/'ci'/'e2e' (development) @@ -165,10 +180,11 @@ const config = { ``` #### Disabling Features: + ```typescript const config = { betterAuth: { - jwt: false, // Disable JWT (use cookies only) + jwt: false, // Disable JWT (use cookies only) twoFactor: false, // Disable 2FA }, // OR disable BetterAuth completely: @@ -190,6 +206,7 @@ After integration, verify: - [ ] Sign-in via BetterAuth works correctly ### Additional checks for Migration scenario: + - [ ] Sign-in via Legacy Auth works for BetterAuth-created users - [ ] Sign-in via BetterAuth works for Legacy-created users - [ ] `betterAuthMigrationStatus` query shows correct counts @@ -198,14 +215,14 @@ After integration, verify: ## Common Mistakes -| Mistake | Symptom | Fix | -|---------|---------|-----| -| Forgot to re-declare decorators in Resolver | GraphQL endpoints missing (404) | Copy resolver from reference, keep ALL decorators | -| Forgot `CoreBetterAuthUserMapper` in UserService | Auth systems not synced, users can't cross-authenticate | Add `@Optional()` parameter and pass to super() | -| Missing `fallbackSecrets` in ServerModule | Session issues without explicit secret | Add `fallbackSecrets: [envConfig.jwt?.secret, ...]` | -| Wrong `basePath` in config | 404 on BetterAuth endpoints | Ensure basePath matches controller (default: `/iam`) | -| Using wrong CoreModule signature | Build errors or missing features | New projects: 1-parameter, Existing: 3-parameter | -| AuthResolver override missing `checkLegacyGraphQLEnabled()` | Legacy endpoint disabling doesn't work (no HTTP 410) | Call `this.checkLegacyGraphQLEnabled('signIn')` in overrides | +| Mistake | Symptom | Fix | +| ----------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ | +| Forgot to re-declare decorators in Resolver | GraphQL endpoints missing (404) | Copy resolver from reference, keep ALL decorators | +| Forgot `CoreBetterAuthUserMapper` in UserService | Auth systems not synced, users can't cross-authenticate | Add `@Optional()` parameter and pass to super() | +| Missing `fallbackSecrets` in ServerModule | Session issues without explicit secret | Add `fallbackSecrets: [envConfig.jwt?.secret, ...]` | +| Wrong `basePath` in config | 404 on BetterAuth endpoints | Ensure basePath matches controller (default: `/iam`) | +| Using wrong CoreModule signature | Build errors or missing features | New projects: 1-parameter, Existing: 3-parameter | +| AuthResolver override missing `checkLegacyGraphQLEnabled()` | Legacy endpoint disabling doesn't work (no HTTP 410) | Call `this.checkLegacyGraphQLEnabled('signIn')` in overrides | --- @@ -242,7 +259,7 @@ import { sha256 } from '~/utils/crypto'; const baseClient = createAuthClient({ baseURL: import.meta.env.VITE_API_URL, - basePath: '/iam', // Must match server config + basePath: '/iam', // Must match server config fetchOptions: { credentials: 'include', // Required for cross-origin cookie handling }, @@ -401,10 +418,10 @@ async function onPasskeyLogin() { In JWT mode (`cookies: false`), the server stores WebAuthn challenges in the database instead of cookies. The server returns a `challengeId` in the generate-options response, which must be sent back in the verify request. The `authenticateWithPasskey()` composable function handles this automatically. -| Mode | Challenge Storage | Client Approach | -|------|------------------|-----------------| -| Cookie (`cookies: true` or not set) | Cookie (`better-auth.better-auth-passkey`) | Either approach works | -| JWT (`cookies: false`) | Database with `challengeId` mapping (auto-enabled) | **Must use composable** | +| Mode | Challenge Storage | Client Approach | +| ----------------------------------- | -------------------------------------------------- | ----------------------- | +| Cookie (`cookies: true` or not set) | Cookie (`better-auth.better-auth-passkey`) | Either approach works | +| JWT (`cookies: false`) | Database with `challengeId` mapping (auto-enabled) | **Must use composable** | **Note:** Database challenge storage is automatically enabled when `options.cookies: false` is set. No additional configuration is required. @@ -476,17 +493,18 @@ nest-server implements custom REST endpoints instead of relying solely on Better ### Hook Limitations Summary -| Limitation | Impact | -|------------|--------| -| **After-hooks cannot access plaintext password** | Cannot sync password to Legacy Auth after sign-up | -| **Hooks cannot modify HTTP response** | Cannot customize response format or add custom fields | -| **Hooks cannot set cookies** | Cannot implement multi-cookie auth strategy | -| **No NestJS Dependency Injection** | Cannot access services like UserService, EmailService | -| **Before-hooks cannot inject tokens** | Cannot add session tokens to request headers | +| Limitation | Impact | +| ------------------------------------------------ | ----------------------------------------------------- | +| **After-hooks cannot access plaintext password** | Cannot sync password to Legacy Auth after sign-up | +| **Hooks cannot modify HTTP response** | Cannot customize response format or add custom fields | +| **Hooks cannot set cookies** | Cannot implement multi-cookie auth strategy | +| **No NestJS Dependency Injection** | Cannot access services like UserService, EmailService | +| **Before-hooks cannot inject tokens** | Cannot add session tokens to request headers | ### What You CAN Do with Hooks Better-Auth hooks are suitable for: + - ✅ Logging and analytics (side effects only) - ✅ Sending notifications after events - ✅ Simple validation in before-hooks @@ -495,6 +513,7 @@ Better-Auth hooks are suitable for: ### What You CANNOT Do with Hooks Do NOT try to implement these via hooks: + - ❌ Password synchronization between auth systems - ❌ Custom response formats - ❌ Setting authentication cookies @@ -549,5 +568,6 @@ See README.md section "Architecture: Why Custom Controllers?" for detailed expla ## Detailed Documentation For complete configuration options, API reference, and advanced topics: + - **README.md:** `node_modules/@lenne.tech/nest-server/src/core/modules/better-auth/README.md` -- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/better-auth/README.md +- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/better-auth/README.md \ No newline at end of file diff --git a/src/core/modules/better-auth/README.md b/src/core/modules/better-auth/README.md index 381ed6c5..5b664b0f 100644 --- a/src/core/modules/better-auth/README.md +++ b/src/core/modules/better-auth/README.md @@ -76,6 +76,7 @@ const config = { A complete working implementation exists in this package: **Local (in your node_modules):** + ``` node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/ ``` @@ -84,6 +85,7 @@ node_modules/@lenne.tech/nest-server/src/server/modules/better-auth/ https://github.com/lenneTech/nest-server/tree/develop/src/server/modules/better-auth **UserService integration:** + - Local: `node_modules/@lenne.tech/nest-server/src/server/modules/user/user.service.ts` - GitHub: https://github.com/lenneTech/nest-server/blob/develop/src/server/modules/user/user.service.ts @@ -92,10 +94,12 @@ https://github.com/lenneTech/nest-server/tree/develop/src/server/modules/better- ## Project Integration Guide (Required Steps) ### Step 1: Create BetterAuth Module + **Create:** `src/server/modules/better-auth/better-auth.module.ts` **Copy from:** Reference implementation (see above) ### Step 2: Create BetterAuth Resolver (CRITICAL!) + **Create:** `src/server/modules/better-auth/better-auth.resolver.ts` **Copy from:** Reference implementation @@ -105,21 +109,25 @@ GraphQL schema is built from decorators at compile time. The parent class (`Core **Note:** `@UseGuards(AuthGuard(JWT))` is NOT needed when using `@Roles(S_USER)` or `@Roles(ADMIN)` because `RolesGuard` already extends `AuthGuard(JWT)` internally. ### Step 3: Create BetterAuth Controller + **Create:** `src/server/modules/better-auth/better-auth.controller.ts` **Copy from:** Reference implementation ### Step 4: Inject BetterAuthUserMapper in UserService (CRITICAL!) + **Modify:** `src/server/modules/user/user.service.ts` **Reference:** See UserService in reference implementation **Required changes:** 1. Add import: + ```typescript import { CoreBetterAuthUserMapper } from '@lenne.tech/nest-server'; ``` 2. Add constructor parameter: + ```typescript @Optional() private readonly betterAuthUserMapper?: CoreBetterAuthUserMapper, ``` @@ -131,11 +139,13 @@ GraphQL schema is built from decorators at compile time. The parent class (`Core **Why is this critical?** The `CoreBetterAuthUserMapper` enables bidirectional password synchronization: + - User signs up via BetterAuth → password synced to Legacy Auth (bcrypt hash) - User changes password → synced between both systems - **Without this, users can only authenticate via ONE system!** ### Step 5: Import in ServerModule + **Modify:** `src/server/server.module.ts` **Reference:** See ServerModule in reference implementation @@ -149,6 +159,7 @@ CoreBetterAuthModule.forRoot({ ``` ### Step 6: Configure in config.env.ts + **Modify:** `src/config.env.ts` **Reference:** See config.env.ts in reference implementation @@ -159,6 +170,7 @@ Add `betterAuth` configuration block. See reference for all available options in ## Quick Reference **Configuration formats:** + ```typescript betterAuth: true // Enable with all defaults (JWT enabled) betterAuth: false // Disable completely @@ -180,7 +192,7 @@ To **explicitly disable** Better-Auth: ```typescript const config = { - betterAuth: false, // or betterAuth: { enabled: false } + betterAuth: false, // or betterAuth: { enabled: false } }; ``` @@ -239,11 +251,11 @@ Read the security section below for production deployments. ### Configuration Summary -| Setting | Technical Purpose | Impact of Wrong Value | -| ----------------- | ---------------------- | ---------------------------- | -| `baseUrl` | Email links, OAuth | Links point to wrong server | -| `basePath` | Endpoint routing | 404 on API calls | -| `passkey.origin` | WebAuthn security | Passkey auth fails | +| Setting | Technical Purpose | Impact of Wrong Value | +| ---------------- | ------------------ | --------------------------- | +| `baseUrl` | Email links, OAuth | Links point to wrong server | +| `basePath` | Endpoint routing | 404 on API calls | +| `passkey.origin` | WebAuthn security | Passkey auth fails | **For Development:** The defaults (`http://localhost:3000`, `/iam`) are correct. @@ -264,11 +276,12 @@ const config = { // OR for local development - env: 'local' uses localhost defaults: const localConfig = { - env: 'local', // Uses API=localhost:3000, App=localhost:3001 + env: 'local', // Uses API=localhost:3000, App=localhost:3001 }; ``` **Benefits:** + - **One config per stage**: Only set `BASE_URL` in your environment - **No duplication**: Passkey values derived automatically - **Graceful Degradation**: If auto-detection fails (no baseUrl), Passkey is disabled with a warning - other auth methods (Email/Password, 2FA) continue to work @@ -288,7 +301,7 @@ For production scenarios where you need full control: ```typescript const config = { - baseUrl: 'https://api.your-domain.com', // Root-level + baseUrl: 'https://api.your-domain.com', // Root-level betterAuth: { passkey: { origin: 'https://your-domain.com', // Frontend domain (if different from API) @@ -349,11 +362,11 @@ export BETTER_AUTH_SECRET="your-generated-secret-here" ### Secret Requirements -| Requirement | Value | -| ----------------- | --------------------------------------------------------- | -| Minimum length | 32 characters | -| Recommended | 44+ characters (32 bytes base64) | -| Character types | At least 2 of: lowercase, uppercase, numbers, special | +| Requirement | Value | +| --------------- | ----------------------------------------------------- | +| Minimum length | 32 characters | +| Recommended | 44+ characters (32 bytes base64) | +| Character types | At least 2 of: lowercase, uppercase, numbers, special | ### Configuration Examples @@ -382,16 +395,17 @@ const config = { The following table shows which features are active based on your configuration: -| Configuration | BetterAuth | JWT | 2FA | Passkey | -|---------------|:----------:|:---:|:---:|:-------:| -| *not set* (no URLs) | ✅ | ✅ | ✅ | ⚠️ disabled | -| `env: 'local'/'ci'/'e2e'` (auto URLs) | ✅ | ✅ | ✅ | ✅ auto | -| `baseUrl` set | ✅ | ✅ | ✅ | ✅ auto | -| `betterAuth: false` | ❌ | ❌ | ❌ | ❌ | -| `{ passkey: false }` | ✅ | ✅ | ✅ | ❌ | -| `{ twoFactor: false }` | ✅ | ✅ | ❌ | ✅ auto | +| Configuration | BetterAuth | JWT | 2FA | Passkey | +| ------------------------------------- | :--------: | :-: | :-: | :---------: | +| _not set_ (no URLs) | ✅ | ✅ | ✅ | ⚠️ disabled | +| `env: 'local'/'ci'/'e2e'` (auto URLs) | ✅ | ✅ | ✅ | ✅ auto | +| `baseUrl` set | ✅ | ✅ | ✅ | ✅ auto | +| `betterAuth: false` | ❌ | ❌ | ❌ | ❌ | +| `{ passkey: false }` | ✅ | ✅ | ✅ | ❌ | +| `{ twoFactor: false }` | ✅ | ✅ | ❌ | ✅ auto | **Key points:** + - **BetterAuth** is enabled by default (zero-config) - **JWT** is enabled by default (stateless authentication) - **2FA/TOTP** is enabled by default (users can optionally set up 2FA) @@ -403,20 +417,22 @@ The following table shows which features are active based on your configuration: ### URL Configuration (Important for Passkey!) **Typical Architecture:** + - **API**: `https://api.example.com` (NestJS server) - **App**: `https://example.com` (Frontend where browser runs) **URL Resolution:** -| Config | `baseUrl` (API) | `appUrl` (Frontend) | Passkey | -|--------|-----------------|---------------------|---------| -| `env: 'local'/'ci'/'e2e'` | `http://localhost:3000` | `http://localhost:3001` | ✅ auto | -| `baseUrl: 'https://api.example.com'` | as set | `https://example.com` (auto-derived) | ✅ auto | -| `baseUrl: 'https://example.com'` | as set | `https://example.com` (same) | ✅ auto | -| `appUrl: 'https://app.example.com'` | - | as set | ✅ auto | -| Neither set | - | - | ⚠️ disabled | +| Config | `baseUrl` (API) | `appUrl` (Frontend) | Passkey | +| ------------------------------------ | ----------------------- | ------------------------------------ | ----------- | +| `env: 'local'/'ci'/'e2e'` | `http://localhost:3000` | `http://localhost:3001` | ✅ auto | +| `baseUrl: 'https://api.example.com'` | as set | `https://example.com` (auto-derived) | ✅ auto | +| `baseUrl: 'https://example.com'` | as set | `https://example.com` (same) | ✅ auto | +| `appUrl: 'https://app.example.com'` | - | as set | ✅ auto | +| Neither set | - | - | ⚠️ disabled | **Auto-Detection Logic:** + 1. `appUrl` is derived from `baseUrl` by removing `api.` prefix 2. `rpId` is extracted from `appUrl` (e.g., `example.com`) 3. `origin` = `appUrl` (e.g., `https://example.com`) @@ -442,14 +458,14 @@ export default { // JWT Plugin - ENABLED BY DEFAULT (no config needed) // Only add this block to customize or explicitly disable jwt: { - expiresIn: '30m', // Default: '15m' + expiresIn: '30m', // Default: '15m' // enabled: false, // Uncomment to disable JWT }, // Two-Factor Authentication - ENABLED BY DEFAULT // Only add this block to customize or explicitly disable twoFactor: { - appName: 'My Application', // Default: 'Nest Server' + appName: 'My Application', // Default: 'Nest Server' // enabled: false, // Uncomment to disable 2FA }, @@ -625,11 +641,11 @@ Better-Auth provides a rich plugin ecosystem. This module uses a **hybrid approa ### Built-in Plugins -| Plugin | Default State | Config to Disable | Default Values | -| ------------------ | ------------- | ------------------------ | --------------------------------------------------------------------------------- | -| **JWT** | **ENABLED** | `jwt: false` | `expiresIn: '15m'` | -| **Two-Factor** | **ENABLED** | `twoFactor: false` | `appName: 'Nest Server'` | -| **Passkey** | **ENABLED** | `passkey: false` | Auto-detected from `baseUrl`/`appUrl`, `rpName: 'Nest Server'` | +| Plugin | Default State | Config to Disable | Default Values | +| -------------- | ------------- | ------------------ | -------------------------------------------------------------- | +| **JWT** | **ENABLED** | `jwt: false` | `expiresIn: '15m'` | +| **Two-Factor** | **ENABLED** | `twoFactor: false` | `appName: 'Nest Server'` | +| **Passkey** | **ENABLED** | `passkey: false` | Auto-detected from `baseUrl`/`appUrl`, `rpName: 'Nest Server'` | **All three plugins are enabled by default** - no configuration needed. Passkey requires resolvable URLs to function (via `baseUrl`, `appUrl`, or `env: 'local'/'ci'/'e2e'`). If URLs cannot be resolved, Passkey is disabled with a warning (graceful degradation). @@ -638,14 +654,14 @@ Better-Auth provides a rich plugin ecosystem. This module uses a **hybrid approa ```typescript const config = { // JWT and 2FA are enabled automatically with BetterAuth - betterAuth: true, // or betterAuth: {} + betterAuth: true, // or betterAuth: {} // Passkey is auto-activated when URLs can be resolved: // Option 1: Set root-level baseUrl (production) - baseUrl: 'https://api.example.com', // Passkey values auto-detected from this + baseUrl: 'https://api.example.com', // Passkey values auto-detected from this // Option 2: Use env: 'local'/'ci'/'e2e' (development) - env: 'local', // Uses localhost defaults: API=:3000, App=:3001 + env: 'local', // Uses localhost defaults: API=:3000, App=:3001 }; ``` @@ -670,9 +686,9 @@ const config = { ```typescript const config = { betterAuth: { - jwt: false, // Disable JWT (or jwt: { enabled: false }) - twoFactor: false, // Disable 2FA (or twoFactor: { enabled: false }) - passkey: false, // Disable Passkey (or passkey: { enabled: false }) + jwt: false, // Disable JWT (or jwt: { enabled: false }) + twoFactor: false, // Disable 2FA (or twoFactor: { enabled: false }) + passkey: false, // Disable Passkey (or passkey: { enabled: false }) }, }; ``` @@ -714,16 +730,16 @@ const config = { ### Available Better-Auth Plugins -| Plugin | Use Case | Recommendation | -| ------------------ | --------------------------------------------- | --------------------------- | -| **organization** | Multi-tenant apps, teams, member management | Common for SaaS/B2B | -| **admin** | User impersonation, banning, user management | Common for admin panels | -| **multiSession** | Multiple active sessions per user | Account switching apps | -| **apiKey** | API key based authentication | Public APIs | -| **sso** | Single Sign-On (OIDC, SAML 2.0) | Enterprise apps | -| **oidcProvider** | Build your own identity provider | Identity platforms | -| **genericOAuth** | Custom OAuth providers | Special OAuth integrations | -| **polar** | Usage-based billing with Polar | SaaS billing | +| Plugin | Use Case | Recommendation | +| ---------------- | -------------------------------------------- | -------------------------- | +| **organization** | Multi-tenant apps, teams, member management | Common for SaaS/B2B | +| **admin** | User impersonation, banning, user management | Common for admin panels | +| **multiSession** | Multiple active sessions per user | Account switching apps | +| **apiKey** | API key based authentication | Public APIs | +| **sso** | Single Sign-On (OIDC, SAML 2.0) | Enterprise apps | +| **oidcProvider** | Build your own identity provider | Identity platforms | +| **genericOAuth** | Custom OAuth providers | Special OAuth integrations | +| **polar** | Usage-based billing with Polar | SaaS billing | For the complete list of plugins, see: @@ -796,10 +812,10 @@ const config = { ### Why This Hybrid Approach? -| Approach | Pros | Cons | -| --------------------------------- | -------------------------------------------------- | --------------------------------- | -| **Built-in** (jwt, 2fa, passkey) | TypeScript types, IDE autocomplete, documentation | Package update needed for changes | -| **Dynamic** (plugins array) | Any plugin works immediately, future-proof | No typed config in IBetterAuth | +| Approach | Pros | Cons | +| -------------------------------- | ------------------------------------------------- | --------------------------------- | +| **Built-in** (jwt, 2fa, passkey) | TypeScript types, IDE autocomplete, documentation | Package update needed for changes | +| **Dynamic** (plugins array) | Any plugin works immediately, future-proof | No typed config in IBetterAuth | **Best of both worlds:** @@ -847,9 +863,9 @@ To explicitly disable Better-Auth: ```typescript const config = { - betterAuth: false, // Simple boolean + betterAuth: false, // Simple boolean // or - betterAuth: { enabled: false }, // Allows pre-configuration + betterAuth: { enabled: false }, // Allows pre-configuration }; ``` @@ -857,28 +873,30 @@ const config = { When enabled, Better-Auth exposes the following endpoints at the configured `basePath` (default: `/iam`): -| Endpoint | Method | Description | -| --------------------------- | ------ | ---------------------------- | -| `/iam/sign-up/email` | POST | Register new user | -| `/iam/sign-in/email` | POST | Sign in with email/password | -| `/iam/sign-out` | GET | Sign out (invalidate session)| -| `/iam/session` | GET | Get current session | -| `/iam/token` | GET | Get fresh JWT token | -| `/iam/forgot-password` | POST | Request password reset | -| `/iam/reset-password` | POST | Reset password with token | -| `/iam/verify-email` | POST | Verify email address | +| Endpoint | Method | Description | +| ---------------------- | ------ | ----------------------------- | +| `/iam/sign-up/email` | POST | Register new user | +| `/iam/sign-in/email` | POST | Sign in with email/password | +| `/iam/sign-out` | GET | Sign out (invalidate session) | +| `/iam/session` | GET | Get current session | +| `/iam/token` | GET | Get fresh JWT token | +| `/iam/forgot-password` | POST | Request password reset | +| `/iam/reset-password` | POST | Reset password with token | +| `/iam/verify-email` | POST | Verify email address | ### JWT Token Endpoint The `/iam/token` endpoint returns a fresh JWT token for the current session. Use this when your JWT has expired but your session is still valid. **Request:** + ```bash curl -X GET https://api.example.com/iam/token \ -H "Cookie: better-auth.session_token=..." ``` **Response:** + ```json { "token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6Ii4uLiJ9..." @@ -889,36 +907,36 @@ curl -X GET https://api.example.com/iam/token \ ### Social Login Endpoints -| Endpoint | Method | Description | -| -------------------------- | ------ | --------------------- | -| `/iam/sign-in/social` | POST | Initiate social login | -| `/iam/callback/:provider` | GET | OAuth callback | +| Endpoint | Method | Description | +| ------------------------- | ------ | --------------------- | +| `/iam/sign-in/social` | POST | Initiate social login | +| `/iam/callback/:provider` | GET | OAuth callback | ### Two-Factor Authentication Endpoints (Native Better Auth) These endpoints are handled by Better Auth's native `twoFactor` plugin: -| Endpoint | Method | Description | -| ----------------------------------- | ------ | ------------------------------ | -| `/iam/two-factor/enable` | POST | Enable 2FA, get TOTP URI | -| `/iam/two-factor/disable` | POST | Disable 2FA | -| `/iam/two-factor/verify-totp` | POST | Verify TOTP code | -| `/iam/two-factor/generate-backup-codes` | POST | Generate backup codes | -| `/iam/two-factor/verify-backup-code`| POST | Verify backup code | +| Endpoint | Method | Description | +| --------------------------------------- | ------ | ------------------------ | +| `/iam/two-factor/enable` | POST | Enable 2FA, get TOTP URI | +| `/iam/two-factor/disable` | POST | Disable 2FA | +| `/iam/two-factor/verify-totp` | POST | Verify TOTP code | +| `/iam/two-factor/generate-backup-codes` | POST | Generate backup codes | +| `/iam/two-factor/verify-backup-code` | POST | Verify backup code | ### Passkey Endpoints (Native Better Auth) These endpoints are handled by Better Auth's native `passkey` plugin: -| Endpoint | Method | Description | -| ----------------------------------------- | ------ | ----------------------------------- | -| `/iam/passkey/generate-register-options` | POST | Get WebAuthn registration options | -| `/iam/passkey/verify-registration` | POST | Verify and store passkey | -| `/iam/passkey/generate-authenticate-options` | POST | Get WebAuthn authentication options | -| `/iam/passkey/verify-authentication` | POST | Verify passkey authentication | -| `/iam/passkey/list-user-passkeys` | POST | List user's passkeys | -| `/iam/passkey/delete-passkey` | POST | Delete a passkey | -| `/iam/passkey/update-passkey` | POST | Update passkey name | +| Endpoint | Method | Description | +| -------------------------------------------- | ------ | ----------------------------------- | +| `/iam/passkey/generate-register-options` | POST | Get WebAuthn registration options | +| `/iam/passkey/verify-registration` | POST | Verify and store passkey | +| `/iam/passkey/generate-authenticate-options` | POST | Get WebAuthn authentication options | +| `/iam/passkey/verify-authentication` | POST | Verify passkey authentication | +| `/iam/passkey/list-user-passkeys` | POST | List user's passkeys | +| `/iam/passkey/delete-passkey` | POST | Delete a passkey | +| `/iam/passkey/update-passkey` | POST | Update passkey name | ## GraphQL API @@ -926,40 +944,40 @@ In addition to REST endpoints, Better-Auth provides GraphQL queries and mutation ### Queries -| Query | Arguments | Return Type | Description | -| ------------------------ | --------- | ---------------------------- | --------------------------------- | -| `betterAuthEnabled` | - | `Boolean` | Check if Better-Auth is enabled | -| `betterAuthFeatures` | - | `BetterAuthFeaturesModel` | Get enabled features status | -| `betterAuthSession` | - | `BetterAuthSessionModel` | Get current session (auth req.) | -| `betterAuthToken` | - | `String` | Get fresh JWT token (auth req.) | -| `betterAuthListPasskeys` | - | `[BetterAuthPasskeyModel]` | List user's passkeys (auth req.) | -| `betterAuthMigrationStatus` | - | `BetterAuthMigrationStatusModel` | Migration status (admin only) | +| Query | Arguments | Return Type | Description | +| --------------------------- | --------- | -------------------------------- | -------------------------------- | +| `betterAuthEnabled` | - | `Boolean` | Check if Better-Auth is enabled | +| `betterAuthFeatures` | - | `BetterAuthFeaturesModel` | Get enabled features status | +| `betterAuthSession` | - | `BetterAuthSessionModel` | Get current session (auth req.) | +| `betterAuthToken` | - | `String` | Get fresh JWT token (auth req.) | +| `betterAuthListPasskeys` | - | `[BetterAuthPasskeyModel]` | List user's passkeys (auth req.) | +| `betterAuthMigrationStatus` | - | `BetterAuthMigrationStatusModel` | Migration status (admin only) | ### Mutations #### Authentication -| Mutation | Arguments | Return Type | Description | -| --------------------- | ---------------------------- | -------------------- | ------------------------- | -| `betterAuthSignIn` | `email`, `password` | `BetterAuthAuthModel`| Sign in with email/pass | -| `betterAuthSignUp` | `email`, `password`, `name?` | `BetterAuthAuthModel`| Register new account | -| `betterAuthSignOut` | - | `Boolean` | Sign out (requires auth) | -| `betterAuthVerify2FA` | `code` | `BetterAuthAuthModel`| Verify 2FA code | +| Mutation | Arguments | Return Type | Description | +| --------------------- | ---------------------------- | --------------------- | ------------------------ | +| `betterAuthSignIn` | `email`, `password` | `BetterAuthAuthModel` | Sign in with email/pass | +| `betterAuthSignUp` | `email`, `password`, `name?` | `BetterAuthAuthModel` | Register new account | +| `betterAuthSignOut` | - | `Boolean` | Sign out (requires auth) | +| `betterAuthVerify2FA` | `code` | `BetterAuthAuthModel` | Verify 2FA code | #### 2FA Management (requires authentication) -| Mutation | Arguments | Return Type | Description | -| ------------------------------ | ---------- | ------------------------ | ------------------------------ | -| `betterAuthEnable2FA` | `password` | `BetterAuth2FASetupModel`| Enable 2FA, get TOTP URI | -| `betterAuthDisable2FA` | `password` | `Boolean` | Disable 2FA for user | -| `betterAuthGenerateBackupCodes`| - | `[String]` | Generate new backup codes | +| Mutation | Arguments | Return Type | Description | +| ------------------------------- | ---------- | ------------------------- | ------------------------- | +| `betterAuthEnable2FA` | `password` | `BetterAuth2FASetupModel` | Enable 2FA, get TOTP URI | +| `betterAuthDisable2FA` | `password` | `Boolean` | Disable 2FA for user | +| `betterAuthGenerateBackupCodes` | - | `[String]` | Generate new backup codes | #### Passkey Management (requires authentication) -| Mutation | Arguments | Return Type | Description | -| ------------------------------ | ----------- | -------------------------------- | --------------------------- | -| `betterAuthGetPasskeyChallenge`| - | `BetterAuthPasskeyChallengeModel`| Get WebAuthn challenge | -| `betterAuthDeletePasskey` | `passkeyId` | `Boolean` | Delete a passkey | +| Mutation | Arguments | Return Type | Description | +| ------------------------------- | ----------- | --------------------------------- | ---------------------- | +| `betterAuthGetPasskeyChallenge` | - | `BetterAuthPasskeyChallengeModel` | Get WebAuthn challenge | +| `betterAuthDeletePasskey` | `passkeyId` | `Boolean` | Delete a passkey | ### Response Types @@ -1056,11 +1074,7 @@ mutation { # Sign up mutation { - betterAuthSignUp( - email: "newuser@example.com" - password: "securePassword123" - name: "New User" - ) { + betterAuthSignUp(email: "newuser@example.com", password: "securePassword123", name: "New User") { success user { id @@ -1172,22 +1186,22 @@ export class MyService { ### Available Methods -| Method | Description | -| ----------------------------------- | -------------------------------------------- | -| `isEnabled()` | Check if Better-Auth is enabled | -| `getInstance()` | Get the Better-Auth instance | -| `getApi()` | Get the Better-Auth API | -| `getConfig()` | Get the current configuration | -| `isJwtEnabled()` | Check if JWT plugin is enabled | -| `isTwoFactorEnabled()` | Check if 2FA is enabled | -| `isPasskeyEnabled()` | Check if Passkey is enabled | -| `getEnabledSocialProviders()` | Get list of enabled social providers | -| `getBasePath()` | Get the base path for endpoints | -| `getBaseUrl()` | Get the base URL | -| `getSession(req)` | Get current session from request | -| `revokeSession(token)` | Revoke a session (logout) | -| `isSessionExpiringSoon(session, t?)`| Check if session is expiring soon | -| `getSessionTimeRemaining(session)` | Get remaining session time in seconds | +| Method | Description | +| ------------------------------------ | ------------------------------------- | +| `isEnabled()` | Check if Better-Auth is enabled | +| `getInstance()` | Get the Better-Auth instance | +| `getApi()` | Get the Better-Auth API | +| `getConfig()` | Get the current configuration | +| `isJwtEnabled()` | Check if JWT plugin is enabled | +| `isTwoFactorEnabled()` | Check if 2FA is enabled | +| `isPasskeyEnabled()` | Check if Passkey is enabled | +| `getEnabledSocialProviders()` | Get list of enabled social providers | +| `getBasePath()` | Get the base path for endpoints | +| `getBaseUrl()` | Get the base URL | +| `getSession(req)` | Get current session from request | +| `revokeSession(token)` | Revoke a session (logout) | +| `isSessionExpiringSoon(session, t?)` | Check if session is expiring soon | +| `getSessionTimeRemaining(session)` | Get remaining session time in seconds | ## Security Integration @@ -1207,12 +1221,12 @@ async findAllUsers() { ### Special Roles -| Role | Description | -| ------------- | ------------------------------------- | -| `S_EVERYONE` | Accessible by everyone (no auth req.) | -| `S_USER` | Any authenticated user | -| `S_VERIFIED` | Users with verified email | -| `S_NO_ONE` | Never accessible | +| Role | Description | +| ------------ | ------------------------------------- | +| `S_EVERYONE` | Accessible by everyone (no auth req.) | +| `S_USER` | Any authenticated user | +| `S_VERIFIED` | Users with verified email | +| `S_NO_ONE` | Never accessible | ### How It Works @@ -1253,17 +1267,17 @@ export class MyService { ### Mapped User Properties -| Property | Type | Description | -| ----------------------------- | ---------- | ----------------------------------------------------- | -| `id` | string | User ID (from database or Better-Auth ID as fallback) | -| `iamId` | string | IAM provider user ID (e.g., Better-Auth) | -| `email` | string | User email | -| `name` | string | User display name | -| `roles` | string[] | User roles from database | -| `verified` | boolean | Whether user is verified | -| `emailVerified` | boolean | Better-Auth email verification status | -| `hasRole(roles)` | function | Check if user has any of the specified roles | -| `_authenticatedViaBetterAuth` | true | Marker for Better-Auth authenticated users | +| Property | Type | Description | +| ----------------------------- | -------- | ----------------------------------------------------- | +| `id` | string | User ID (from database or Better-Auth ID as fallback) | +| `iamId` | string | IAM provider user ID (e.g., Better-Auth) | +| `email` | string | User email | +| `name` | string | User display name | +| `roles` | string[] | User roles from database | +| `verified` | boolean | Whether user is verified | +| `emailVerified` | boolean | Better-Auth email verification status | +| `hasRole(roles)` | function | Check if user has any of the specified roles | +| `_authenticatedViaBetterAuth` | true | Marker for Better-Auth authenticated users | ## CoreModule.forRoot() Signatures @@ -1286,11 +1300,13 @@ export class ServerModule {} ``` **Features:** + - Simplified setup - no Legacy Auth overhead - GraphQL Subscription authentication via BetterAuth sessions - BetterAuthModule is auto-registered when using this signature **Requirements:** + - Create BetterAuthModule, Resolver, and Controller in your project - Inject BetterAuthUserMapper in UserService - Set `auth.legacyEndpoints.enabled: false` in config @@ -1315,6 +1331,7 @@ export class ServerModule {} > Use the single-parameter signature for new projects. **Features:** + - Both Legacy Auth and BetterAuth run in parallel - Bidirectional password synchronization - Gradual user migration to IAM @@ -1327,11 +1344,11 @@ Better-Auth is designed as the successor to Legacy Auth. This section describes ### Scenario Overview -| Scenario | Signature | Description | -|----------|-----------|-------------| +| Scenario | Signature | Description | +| ------------------ | ----------- | ------------------------------------- | | **1. Legacy Only** | 3-parameter | Existing projects, no IAM integration | -| **2. Migration** | 3-parameter | Legacy + IAM parallel operation | -| **3. IAM Only** | 1-parameter | New projects, BetterAuth only | +| **2. Migration** | 3-parameter | Legacy + IAM parallel operation | +| **3. IAM Only** | 1-parameter | New projects, BetterAuth only | ### Migration Steps (Scenario 2) @@ -1340,6 +1357,7 @@ Better-Auth is designed as the successor to Legacy Auth. This section describes - Both systems run in parallel 2. **Monitor Migration Progress** + ```graphql query { betterAuthMigrationStatus { @@ -1351,33 +1369,36 @@ Better-Auth is designed as the successor to Legacy Auth. This section describes } } ``` + Users migrate automatically when signing in via BetterAuth (IAM). 3. **Disable Legacy Endpoints** (when `canDisableLegacyAuth: true`) + ```typescript // config.env.ts auth: { legacyEndpoints: { - enabled: false // Disables signIn, signUp, logout, refreshToken + enabled: false; // Disables signIn, signUp, logout, refreshToken } } ``` 4. **Switch to IAM-Only Signature** (optional) + ```typescript // Before (deprecated) - CoreModule.forRoot(AuthService, AuthModule.forRoot(envConfig.jwt), envConfig) + CoreModule.forRoot(AuthService, AuthModule.forRoot(envConfig.jwt), envConfig); // After (recommended) - CoreModule.forRoot(envConfig) + CoreModule.forRoot(envConfig); ``` ### Why No Automatic Migration Script? -| System | Password Hash Algorithm | -|--------|------------------------| +| System | Password Hash Algorithm | +| ----------- | -------------------------- | | Legacy Auth | `bcrypt(sha256(password))` | -| BetterAuth | `scrypt(sha256(password))` | +| BetterAuth | `scrypt(sha256(password))` | These are **one-way hashes** - there's no way to convert between them without the plain password. Users must sign in at least once via BetterAuth to create a compatible hash. @@ -1413,19 +1434,19 @@ const legacyToken = await authService.signIn({ email, password }); ### Compatibility Matrix -| Scenario | Result | -| ---------------------------------- | ---------------------------------- | -| Legacy user → Legacy login | Works | -| Legacy user → Better-Auth login | Works (bcrypt compatible) | -| Better-Auth user → Better-Auth | Works | -| Better-Auth user → Legacy login | Works (password field preserved) | -| Social-only user → Legacy login | Fails (no password field) | +| Scenario | Result | +| ------------------------------- | -------------------------------- | +| Legacy user → Legacy login | Works | +| Legacy user → Better-Auth login | Works (bcrypt compatible) | +| Better-Auth user → Better-Auth | Works | +| Better-Auth user → Legacy login | Works (password field preserved) | +| Social-only user → Legacy login | Fails (no password field) | ### User Database Fields -| Field | Purpose | -| ---------- | ------------------------------------------------- | -| `password` | Password hash (bcrypt) - used by both systems | +| Field | Purpose | +| ---------- | ----------------------------------------------------- | +| `password` | Password hash (bcrypt) - used by both systems | | `iamId` | IAM provider user ID (set on first Better-Auth login) | **No migration is required** - users can authenticate with either system immediately. @@ -1438,13 +1459,13 @@ When both Legacy Auth and BetterAuth (IAM) are active, passwords are automatical ### How Password Sync Works -| Scenario | Source | Target | Auto-Synced? | -|----------|--------|--------|--------------| -| Sign up via BetterAuth | IAM | Legacy | ✅ Yes | -| Sign up via Legacy Auth | Legacy | IAM | ⚠️ On first IAM sign-in | -| Password reset via Legacy | Legacy | IAM | ✅ Yes | -| Password reset via BetterAuth | IAM | Legacy | ⚠️ See below | -| Password change via user update | Legacy | IAM | ✅ Yes | +| Scenario | Source | Target | Auto-Synced? | +| ------------------------------- | ------ | ------ | ----------------------- | +| Sign up via BetterAuth | IAM | Legacy | ✅ Yes | +| Sign up via Legacy Auth | Legacy | IAM | ⚠️ On first IAM sign-in | +| Password reset via Legacy | Legacy | IAM | ✅ Yes | +| Password reset via BetterAuth | IAM | Legacy | ⚠️ See below | +| Password change via user update | Legacy | IAM | ✅ Yes | #### IAM Password Reset → Legacy Sync @@ -1466,16 +1487,21 @@ When a user resets their password via BetterAuth's native `/iam/reset-password` The following sync operations happen automatically when `CoreBetterAuthUserMapper` is injected in `UserService`: #### 1. IAM Sign-Up → Legacy + When a user signs up via BetterAuth (`/iam/sign-up/email`), the password is hashed with bcrypt and stored in `users.password`, enabling Legacy Auth sign-in. #### 2. Legacy Password Reset → IAM + When a user resets their password via `CoreUserService.resetPassword()`, the new password is synced to the BetterAuth `account` collection (if the user has a credential account). #### 3. Legacy Password Update → IAM + When a user changes their password via `UserService.update()`, the new password is synced to BetterAuth (if the user has a credential account). #### 4. Legacy → IAM Migration (On First Sign-In) + When a legacy user signs in via BetterAuth for the first time, their account is migrated: + - Their `iamId` is set - A credential account is created in the `account` collection with the scrypt hash @@ -1513,10 +1539,10 @@ betterAuth: { ### Password Hashing Algorithms -| System | Algorithm | Format | -|--------|-----------|--------| -| Legacy Auth | bcrypt(sha256(password)) | `$2b$10$...` (60 chars) | -| BetterAuth (IAM) | scrypt | `salt:hash` (hex encoded) | +| System | Algorithm | Format | +| ---------------- | ------------------------ | ------------------------- | +| Legacy Auth | bcrypt(sha256(password)) | `$2b$10$...` (60 chars) | +| BetterAuth (IAM) | scrypt | `salt:hash` (hex encoded) | **Important:** These hashes are NOT interchangeable. Password sync requires re-hashing the plain password with the target algorithm. @@ -1524,25 +1550,26 @@ betterAuth: { Email changes are also synchronized bidirectionally: -| Scenario | Effect | -|----------|--------| +| Scenario | Effect | +| ------------------------------------------------- | ----------------------------------------- | | Email changed via Legacy (`UserService.update()`) | IAM sessions invalidated (forces re-auth) | -| Email changed via IAM | Legacy refresh tokens cleared | +| Email changed via IAM | Legacy refresh tokens cleared | ### User Deletion Cleanup When a user is deleted: -| Via | Effect | -|-----|--------| +| Via | Effect | +| ------------------------------- | ---------------------------------------- | | Legacy (`UserService.delete()`) | IAM accounts and sessions are cleaned up | -| IAM | Legacy user record is removed | +| IAM | Legacy user record is removed | ### Troubleshooting Password Sync #### Password not syncing to IAM 1. Verify `CoreBetterAuthUserMapper` is injected in `UserService`: + ```typescript constructor( @Optional() private readonly betterAuthUserMapper?: CoreBetterAuthUserMapper, @@ -1552,9 +1579,10 @@ When a user is deleted: ``` 2. Check if user has an IAM credential account: + ```javascript // MongoDB query - db.account.findOne({ userId: ObjectId("..."), providerId: "credential" }) + db.account.findOne({ userId: ObjectId('...'), providerId: 'credential' }); ``` 3. Check server logs for sync warnings: @@ -1723,14 +1751,14 @@ const config = { ### Configuration Options -| Option | Type | Default | Description | -| ----------------- | -------- | -------------------------- | ------------------------------------- | -| `enabled` | boolean | `false` | Enable/disable rate limiting | -| `max` | number | `10` | Maximum requests per time window | -| `windowSeconds` | number | `60` | Time window in seconds | -| `message` | string | `'Too many requests...'` | Error message when limit exceeded | -| `strictEndpoints` | string[] | See below | Endpoints with half the normal limit | -| `skipEndpoints` | string[] | See below | Endpoints that skip rate limiting | +| Option | Type | Default | Description | +| ----------------- | -------- | ------------------------ | ------------------------------------ | +| `enabled` | boolean | `false` | Enable/disable rate limiting | +| `max` | number | `10` | Maximum requests per time window | +| `windowSeconds` | number | `60` | Time window in seconds | +| `message` | string | `'Too many requests...'` | Error message when limit exceeded | +| `strictEndpoints` | string[] | See below | Endpoints with half the normal limit | +| `skipEndpoints` | string[] | See below | Endpoints that skip rate limiting | ### Default Strict Endpoints @@ -1752,12 +1780,12 @@ These endpoints bypass rate limiting entirely: When rate limiting is enabled, the following headers are added to responses: -| Header | Description | -| ---------------------- | ---------------------------------------- | -| `X-RateLimit-Limit` | Maximum requests allowed in the window | -| `X-RateLimit-Remaining`| Remaining requests in current window | -| `X-RateLimit-Reset` | Seconds until the rate limit resets | -| `Retry-After` | (429 only) Seconds to wait before retry | +| Header | Description | +| ----------------------- | --------------------------------------- | +| `X-RateLimit-Limit` | Maximum requests allowed in the window | +| `X-RateLimit-Remaining` | Remaining requests in current window | +| `X-RateLimit-Reset` | Seconds until the rate limit resets | +| `Retry-After` | (429 only) Seconds to wait before retry | ### Rate Limit Exceeded Response @@ -1858,21 +1886,21 @@ override async betterAuthSignUp( All methods in `CoreBetterAuthResolver` can be overridden: -| Method | Description | -| ------ | ----------- | -| `betterAuthSignIn(email, password, ctx)` | Sign in with email/password | -| `betterAuthSignUp(email, password, name?)` | Register new user | -| `betterAuthSignOut(ctx)` | Sign out current session | -| `betterAuthVerify2FA(code, ctx)` | Verify 2FA code | -| `betterAuthEnable2FA(password, ctx)` | Enable 2FA for user | -| `betterAuthDisable2FA(password, ctx)` | Disable 2FA for user | -| `betterAuthGenerateBackupCodes(ctx)` | Generate new backup codes | -| `betterAuthGetPasskeyChallenge(ctx)` | Get WebAuthn challenge | -| `betterAuthListPasskeys(ctx)` | List user's passkeys | -| `betterAuthDeletePasskey(passkeyId, ctx)` | Delete a passkey | -| `betterAuthSession(ctx)` | Get current session | -| `betterAuthEnabled()` | Check if Better-Auth is enabled | -| `betterAuthFeatures()` | Get enabled features | +| Method | Description | +| ------------------------------------------ | ------------------------------- | +| `betterAuthSignIn(email, password, ctx)` | Sign in with email/password | +| `betterAuthSignUp(email, password, name?)` | Register new user | +| `betterAuthSignOut(ctx)` | Sign out current session | +| `betterAuthVerify2FA(code, ctx)` | Verify 2FA code | +| `betterAuthEnable2FA(password, ctx)` | Enable 2FA for user | +| `betterAuthDisable2FA(password, ctx)` | Disable 2FA for user | +| `betterAuthGenerateBackupCodes(ctx)` | Generate new backup codes | +| `betterAuthGetPasskeyChallenge(ctx)` | Get WebAuthn challenge | +| `betterAuthListPasskeys(ctx)` | List user's passkeys | +| `betterAuthDeletePasskey(passkeyId, ctx)` | Delete a passkey | +| `betterAuthSession(ctx)` | Get current session | +| `betterAuthEnabled()` | Check if Better-Auth is enabled | +| `betterAuthFeatures()` | Get enabled features | ### Helper Methods (Protected) @@ -1905,16 +1933,16 @@ For frontend integration with Better-Auth, see the **[Integration Checklist](./I ### Quick Reference -| Feature | Client Method | Server Endpoint | -|---------|---------------|-----------------| -| Email Sign-In | `authClient.signIn.email()` | `POST /iam/sign-in/email` | -| Passkey Sign-In | `authClient.signIn.passkey()` | `POST /iam/passkey/verify-authentication` | -| 2FA Verify | `authClient.twoFactor.verifyTotp()` | `POST /iam/two-factor/verify-totp` | -| Session Validation | `authClient.$fetch('/session')` | `GET /iam/session` | +| Feature | Client Method | Server Endpoint | +| ------------------ | ----------------------------------- | ----------------------------------------- | +| Email Sign-In | `authClient.signIn.email()` | `POST /iam/sign-in/email` | +| Passkey Sign-In | `authClient.signIn.passkey()` | `POST /iam/passkey/verify-authentication` | +| 2FA Verify | `authClient.twoFactor.verifyTotp()` | `POST /iam/two-factor/verify-totp` | +| Session Validation | `authClient.$fetch('/session')` | `GET /iam/session` | ### Key Points 1. **Password Hashing**: Always hash passwords with SHA256 client-side before sending 2. **2FA Redirect**: Check for `twoFactorRedirect: true` in sign-in response 3. **Passkey Session**: Passkey auth returns session without user - call `validateSession()` to fetch user data -4. **Credentials**: Use `credentials: 'include'` for cross-origin cookie handling +4. **Credentials**: Use `credentials: 'include'` for cross-origin cookie handling \ No newline at end of file diff --git a/src/core/modules/better-auth/better-auth-token.service.ts b/src/core/modules/better-auth/better-auth-token.service.ts index 9af4f419..be8445f3 100644 --- a/src/core/modules/better-auth/better-auth-token.service.ts +++ b/src/core/modules/better-auth/better-auth-token.service.ts @@ -165,7 +165,10 @@ export class BetterAuthTokenService { * @param payload - JWT payload with sub (user ID or iamId) * @returns User object with hasRole method, or null if not found */ - private async loadUserFromPayload(payload: { [key: string]: unknown; sub: string }): Promise { + private async loadUserFromPayload(payload: { + [key: string]: unknown; + sub: string; + }): Promise { if (!this.connection) { return null; } @@ -190,7 +193,9 @@ export class BetterAuthTokenService { return this.createUserWithHasRole(user); } catch (error) { - this.logger.debug(`Failed to load user from payload: ${error instanceof Error ? error.message : 'Unknown error'}`); + this.logger.debug( + `Failed to load user from payload: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); return null; } } @@ -234,7 +239,9 @@ export class BetterAuthTokenService { return this.createUserWithHasRole(user); } catch (error) { - this.logger.debug(`Failed to load user from session: ${error instanceof Error ? error.message : 'Unknown error'}`); + this.logger.debug( + `Failed to load user from session: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); return null; } } diff --git a/src/core/modules/better-auth/better-auth.config.ts b/src/core/modules/better-auth/better-auth.config.ts index b966f37f..2d76cf95 100644 --- a/src/core/modules/better-auth/better-auth.config.ts +++ b/src/core/modules/better-auth/better-auth.config.ts @@ -619,7 +619,11 @@ function normalizePasskeyConfig(config: IBetterAuth, resolvedUrls: ResolvedUrls) // Resolve values: explicit config > resolved URLs const finalRpId = rawConfig.rpId || resolvedUrls.rpId; const finalOrigin = rawConfig.origin || resolvedUrls.appUrl; - const finalTrustedOrigins = config.trustedOrigins?.length ? config.trustedOrigins : resolvedUrls.appUrl ? [resolvedUrls.appUrl] : undefined; + const finalTrustedOrigins = config.trustedOrigins?.length + ? config.trustedOrigins + : resolvedUrls.appUrl + ? [resolvedUrls.appUrl] + : undefined; // Check if we have all required values for Passkey const hasRequiredConfig = finalRpId && finalOrigin && finalTrustedOrigins?.length; diff --git a/src/core/modules/better-auth/better-auth.resolver.ts b/src/core/modules/better-auth/better-auth.resolver.ts index 69446e40..2a3e8f71 100644 --- a/src/core/modules/better-auth/better-auth.resolver.ts +++ b/src/core/modules/better-auth/better-auth.resolver.ts @@ -91,7 +91,9 @@ export class DefaultBetterAuthResolver extends CoreBetterAuthResolver { nullable: true, }) @Roles(RoleEnum.S_USER) - override async betterAuthListPasskeys(@Context() ctx: { req: Request }): Promise { + override async betterAuthListPasskeys( + @Context() ctx: { req: Request }, + ): Promise { return super.betterAuthListPasskeys(ctx); } diff --git a/src/core/modules/better-auth/better-auth.types.ts b/src/core/modules/better-auth/better-auth.types.ts index 48724b42..6c521349 100644 --- a/src/core/modules/better-auth/better-auth.types.ts +++ b/src/core/modules/better-auth/better-auth.types.ts @@ -107,7 +107,9 @@ export interface BetterAuthSignUpResponse { * Preserves the original type while asserting session is defined * Includes optional token for Better Auth session authentication */ -export function hasSession(response: T): response is T & { session: { expiresAt: Date; id: string; token?: string } } { +export function hasSession( + response: T, +): response is T & { session: { expiresAt: Date; id: string; token?: string } } { return ( response !== null && typeof response === 'object' && diff --git a/src/core/modules/better-auth/core-better-auth-api.middleware.ts b/src/core/modules/better-auth/core-better-auth-api.middleware.ts index 82a90752..2a8cade7 100644 --- a/src/core/modules/better-auth/core-better-auth-api.middleware.ts +++ b/src/core/modules/better-auth/core-better-auth-api.middleware.ts @@ -19,28 +19,17 @@ import { CoreBetterAuthService } from './core-better-auth.service'; * All other paths (Passkey, 2FA, etc.) go directly to Better Auth's * native handler via this middleware for maximum compatibility. */ -const CONTROLLER_HANDLED_PATHS = [ - '/sign-in/email', - '/sign-up/email', - '/sign-out', - '/session', -]; +const CONTROLLER_HANDLED_PATHS = ['/sign-in/email', '/sign-up/email', '/sign-out', '/session']; /** * Passkey paths that generate challenges */ -const PASSKEY_GENERATE_PATHS = [ - '/passkey/generate-register-options', - '/passkey/generate-authenticate-options', -]; +const PASSKEY_GENERATE_PATHS = ['/passkey/generate-register-options', '/passkey/generate-authenticate-options']; /** * Passkey paths that verify challenges */ -const PASSKEY_VERIFY_PATHS = [ - '/passkey/verify-registration', - '/passkey/verify-authentication', -]; +const PASSKEY_VERIFY_PATHS = ['/passkey/verify-registration', '/passkey/verify-authentication']; /** * Middleware that forwards Better Auth API requests to the native Better Auth handler. @@ -134,7 +123,9 @@ export class CoreBetterAuthApiMiddleware implements NestMiddleware { let challengeIdToDelete: string | undefined; if (isPasskeyVerify && this.challengeService) { const challengeId = req.body?.challengeId; - this.logger.debug(`Passkey verify: challengeId=${challengeId ? `${challengeId.substring(0, 8)}...` : 'MISSING'}, body keys=${Object.keys(req.body || {}).join(', ')}`); + this.logger.debug( + `Passkey verify: challengeId=${challengeId ? `${challengeId.substring(0, 8)}...` : 'MISSING'}, body keys=${Object.keys(req.body || {}).join(', ')}`, + ); if (challengeId) { const verificationToken = await this.challengeService.getVerificationToken(challengeId); if (verificationToken) { @@ -264,9 +255,7 @@ export class CoreBetterAuthApiMiddleware implements NestMiddleware { // Send error response if headers not sent if (!res.headersSent) { - const message = this.isProd - ? 'Authentication error' - : (error instanceof Error ? error.message : 'Unknown error'); + const message = this.isProd ? 'Authentication error' : error instanceof Error ? error.message : 'Unknown error'; res.status(500).json({ error: 'Authentication handler error', message, diff --git a/src/core/modules/better-auth/core-better-auth-challenge.service.ts b/src/core/modules/better-auth/core-better-auth-challenge.service.ts index b0e75104..dab4fc3f 100644 --- a/src/core/modules/better-auth/core-better-auth-challenge.service.ts +++ b/src/core/modules/better-auth/core-better-auth-challenge.service.ts @@ -128,7 +128,9 @@ export class CoreBetterAuthChallengeService implements OnModuleInit { this.logger.log('WebAuthn challenge storage initialized (database mode)'); } catch (error) { - this.logger.error(`Failed to initialize challenge storage: ${error instanceof Error ? error.message : 'Unknown error'}`); + this.logger.error( + `Failed to initialize challenge storage: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); } } diff --git a/src/core/modules/better-auth/core-better-auth-web.helper.ts b/src/core/modules/better-auth/core-better-auth-web.helper.ts index 03e27bd1..315fd3ac 100644 --- a/src/core/modules/better-auth/core-better-auth-web.helper.ts +++ b/src/core/modules/better-auth/core-better-auth-web.helper.ts @@ -200,10 +200,7 @@ export function signCookieValue(value: string, secret: string): string { throw new Error('Cannot sign cookie: Better Auth secret is not configured'); } - const signature = crypto - .createHmac('sha256', secret) - .update(value) - .digest('base64'); + const signature = crypto.createHmac('sha256', secret).update(value).digest('base64'); const signedValue = `${value}.${signature}`; return encodeURIComponent(signedValue); } @@ -274,10 +271,7 @@ export async function toWebRequest(req: Request, options: ToWebRequestOptions): // Cookie names that need signed tokens const primaryCookieName = `${normalizedBasePath}.session_token`; - const sessionCookieNames = [ - primaryCookieName, - BETTER_AUTH_COOKIE_NAMES.BETTER_AUTH_SESSION, - ]; + const sessionCookieNames = [primaryCookieName, BETTER_AUTH_COOKIE_NAMES.BETTER_AUTH_SESSION]; // Parse existing cookies const existingCookies = parseCookieHeader(existingCookieString); diff --git a/src/core/modules/better-auth/core-better-auth.controller.ts b/src/core/modules/better-auth/core-better-auth.controller.ts index f6c1f65c..e3dd7fae 100644 --- a/src/core/modules/better-auth/core-better-auth.controller.ts +++ b/src/core/modules/better-auth/core-better-auth.controller.ts @@ -13,7 +13,15 @@ import { Res, UnauthorizedException, } from '@nestjs/common'; -import { ApiBody, ApiCreatedResponse, ApiExcludeEndpoint, ApiOkResponse, ApiOperation, ApiProperty, ApiTags } from '@nestjs/swagger'; +import { + ApiBody, + ApiCreatedResponse, + ApiExcludeEndpoint, + ApiOkResponse, + ApiOperation, + ApiProperty, + ApiTags, +} from '@nestjs/swagger'; import { Request, Response } from 'express'; import { Roles } from '../../common/decorators/roles.decorator'; @@ -263,7 +271,9 @@ export class CoreBetterAuthController { // When 2FA is required, we need to use the native Better Auth handler // because api.signInEmail() doesn't return the session token needed for 2FA verification if (requires2FA(response)) { - this.logger.debug(`2FA required for ${maskEmail(input.email)}, forwarding to native handler for cookie handling`); + this.logger.debug( + `2FA required for ${maskEmail(input.email)}, forwarding to native handler for cookie handling`, + ); // Forward to native Better Auth handler which sets the session cookie correctly // We need to modify the request body to use the normalized password @@ -288,7 +298,7 @@ export class CoreBetterAuthController { body: modifiedBody, headers: new Headers({ 'Content-Type': 'application/json', - 'Origin': req.headers.origin || baseUrl, + Origin: req.headers.origin || baseUrl, }), method: 'POST', }); @@ -599,7 +609,9 @@ export class CoreBetterAuthController { * NOTE: The session token is intentionally NOT included in the response. * It is set as an httpOnly cookie for security. */ - protected mapSession(session: null | undefined | { expiresAt: Date; id: string; token?: string }): CoreBetterAuthSessionInfo | undefined { + protected mapSession( + session: null | undefined | { expiresAt: Date; id: string; token?: string }, + ): CoreBetterAuthSessionInfo | undefined { if (!session) return undefined; return { expiresAt: session.expiresAt instanceof Date ? session.expiresAt.toISOString() : String(session.expiresAt), @@ -613,7 +625,7 @@ export class CoreBetterAuthController { * @param sessionUser - The user from Better-Auth session * @param _mappedUser - The synced user from legacy system (available for override customization) */ - + protected mapUser(sessionUser: BetterAuthSessionUser, _mappedUser: any): CoreBetterAuthUserResponse { return { email: sessionUser.email, @@ -647,7 +659,11 @@ export class CoreBetterAuthController { * @param result - The CoreBetterAuthResponse to return * @param sessionToken - Optional session token to set in cookies (if not provided, uses result.token) */ - protected processCookies(res: Response, result: CoreBetterAuthResponse, sessionToken?: string): CoreBetterAuthResponse { + protected processCookies( + res: Response, + result: CoreBetterAuthResponse, + sessionToken?: string, + ): CoreBetterAuthResponse { // Check if cookie handling is activated if (this.configService.getFastButReadOnly('cookies')) { const cookieOptions = { httpOnly: true, sameSite: 'lax' as const, secure: process.env.NODE_ENV === 'production' }; @@ -770,7 +786,11 @@ export class CoreBetterAuthController { this.logger.error(`Better Auth handler error: ${error instanceof Error ? error.message : 'Unknown error'}`); // Re-throw NestJS exceptions - if (error instanceof BadRequestException || error instanceof UnauthorizedException || error instanceof InternalServerErrorException) { + if ( + error instanceof BadRequestException || + error instanceof UnauthorizedException || + error instanceof InternalServerErrorException + ) { throw error; } diff --git a/src/core/modules/better-auth/core-better-auth.middleware.ts b/src/core/modules/better-auth/core-better-auth.middleware.ts index 97ef516f..30ae3b80 100644 --- a/src/core/modules/better-auth/core-better-auth.middleware.ts +++ b/src/core/modules/better-auth/core-better-auth.middleware.ts @@ -181,7 +181,9 @@ export class CoreBetterAuthMiddleware implements NestMiddleware { // Use getSessionByToken to validate session directly from database const sessionResult = await this.betterAuthService.getSessionByToken(sessionToken); - this.logger.debug(`[MIDDLEWARE] getSessionByToken result: user=${maskEmail(sessionResult?.user?.email)}, session=${!!sessionResult?.session}`); + this.logger.debug( + `[MIDDLEWARE] getSessionByToken result: user=${maskEmail(sessionResult?.user?.email)}, session=${!!sessionResult?.session}`, + ); if (sessionResult?.user && sessionResult?.session) { this.logger.debug(`[MIDDLEWARE] Session validated for user: ${maskEmail(sessionResult.user.email)}`); diff --git a/src/core/modules/better-auth/core-better-auth.module.ts b/src/core/modules/better-auth/core-better-auth.module.ts index 56da82f0..f9101201 100644 --- a/src/core/modules/better-auth/core-better-auth.module.ts +++ b/src/core/modules/better-auth/core-better-auth.module.ts @@ -258,8 +258,8 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit { if (CoreBetterAuthModule.rolesGuardExplicitlyDisabled && !RolesGuardRegistry.isRegistered()) { CoreBetterAuthModule.logger.warn( '⚠️ SECURITY WARNING: registerRolesGuardGlobally is explicitly set to false, ' + - 'but no RolesGuard is registered globally. @Roles() decorators will NOT enforce access control! ' + - 'Either set registerRolesGuardGlobally: true, or ensure CoreAuthModule (Legacy) is imported.', + 'but no RolesGuard is registered globally. @Roles() decorators will NOT enforce access control! ' + + 'Either set registerRolesGuardGlobally: true, or ensure CoreAuthModule (Legacy) is imported.', ); } } @@ -351,11 +351,9 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit { const effectiveRawConfig = rawConfig ?? globalConfig?.betterAuth; // Auto-detect fallbackSecrets from ConfigService if not explicitly provided - const effectiveFallbackSecrets = fallbackSecrets ?? ( - globalConfig?.jwt - ? [globalConfig.jwt.secret, globalConfig.jwt.refresh?.secret].filter(Boolean) - : undefined - ); + const effectiveFallbackSecrets = + fallbackSecrets ?? + (globalConfig?.jwt ? [globalConfig.jwt.secret, globalConfig.jwt.refresh?.secret].filter(Boolean) : undefined); // Auto-detect server URLs from ConfigService if not explicitly provided const effectiveServerAppUrl = serverAppUrl ?? globalConfig?.appUrl; @@ -385,7 +383,14 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit { this.logger.debug('BetterAuth is disabled - skipping initialization'); this.betterAuthEnabled = false; return { - exports: [BETTER_AUTH_INSTANCE, CoreBetterAuthService, CoreBetterAuthUserMapper, CoreBetterAuthRateLimiter, BetterAuthTokenService, CoreBetterAuthChallengeService], + exports: [ + BETTER_AUTH_INSTANCE, + CoreBetterAuthService, + CoreBetterAuthUserMapper, + CoreBetterAuthRateLimiter, + BetterAuthTokenService, + CoreBetterAuthChallengeService, + ], module: CoreBetterAuthModule, providers: [ { @@ -428,7 +433,14 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit { static forRootAsync(): DynamicModule { return { controllers: [this.getControllerClass()], - exports: [BETTER_AUTH_INSTANCE, CoreBetterAuthService, CoreBetterAuthUserMapper, CoreBetterAuthRateLimiter, BetterAuthTokenService, CoreBetterAuthChallengeService], + exports: [ + BETTER_AUTH_INSTANCE, + CoreBetterAuthService, + CoreBetterAuthUserMapper, + CoreBetterAuthRateLimiter, + BetterAuthTokenService, + CoreBetterAuthChallengeService, + ], imports: [], module: CoreBetterAuthModule, providers: [ @@ -564,7 +576,14 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit { ): DynamicModule { return { controllers: [this.getControllerClass()], - exports: [BETTER_AUTH_INSTANCE, CoreBetterAuthService, CoreBetterAuthUserMapper, CoreBetterAuthRateLimiter, BetterAuthTokenService, CoreBetterAuthChallengeService], + exports: [ + BETTER_AUTH_INSTANCE, + CoreBetterAuthService, + CoreBetterAuthUserMapper, + CoreBetterAuthRateLimiter, + BetterAuthTokenService, + CoreBetterAuthChallengeService, + ], module: CoreBetterAuthModule, providers: [ { diff --git a/src/core/modules/better-auth/core-better-auth.resolver.ts b/src/core/modules/better-auth/core-better-auth.resolver.ts index 8c7a5f71..5cbcb122 100644 --- a/src/core/modules/better-auth/core-better-auth.resolver.ts +++ b/src/core/modules/better-auth/core-better-auth.resolver.ts @@ -197,7 +197,7 @@ export class CoreBetterAuthResolver { async betterAuthSignIn( @Args('email') email: string, @Args('password') password: string, - + @Context() _ctx: { req: Request; res: Response }, ): Promise { this.ensureEnabled(); @@ -230,12 +230,16 @@ export class CoreBetterAuthResolver { body: { email, password }, })) as BetterAuthSignInResponse | null; - this.logger.debug(`[SignIn] API response for ${maskEmail(email)}: ${JSON.stringify(response)?.substring(0, 200)}`); + this.logger.debug( + `[SignIn] API response for ${maskEmail(email)}: ${JSON.stringify(response)?.substring(0, 200)}`, + ); // Check if response indicates an error (Better-Auth returns error objects, not throws) const responseAny = response as any; if (responseAny?.error || responseAny?.code === 'CREDENTIAL_ACCOUNT_NOT_FOUND') { - this.logger.debug(`[SignIn] API returned error for ${maskEmail(email)}: ${responseAny?.error || responseAny?.code}`); + this.logger.debug( + `[SignIn] API returned error for ${maskEmail(email)}: ${responseAny?.error || responseAny?.code}`, + ); throw new Error(responseAny?.error || responseAny?.code || 'Credential account not found'); } diff --git a/src/core/modules/error-code/INTEGRATION-CHECKLIST.md b/src/core/modules/error-code/INTEGRATION-CHECKLIST.md index f5f93611..f302a1c1 100644 --- a/src/core/modules/error-code/INTEGRATION-CHECKLIST.md +++ b/src/core/modules/error-code/INTEGRATION-CHECKLIST.md @@ -8,11 +8,11 @@ ## Choose Your Scenario -| Scenario | Use When | Configuration | Complexity | -|----------|----------|---------------|------------| -| **A. additionalErrorRegistry** | Simple error code addition | Config in `config.env.ts` | Minimal | -| **B. Custom Service** | Need custom locales or logic | Service inheritance | Low | -| **C. Custom Controller** | Need custom controller/routes | Service + Controller | Medium | +| Scenario | Use When | Configuration | Complexity | +| ------------------------------ | ----------------------------- | ------------------------- | ---------- | +| **A. additionalErrorRegistry** | Simple error code addition | Config in `config.env.ts` | Minimal | +| **B. Custom Service** | Need custom locales or logic | Service inheritance | Low | +| **C. Custom Controller** | Need custom controller/routes | Service + Controller | Medium | **Recommendation:** Start with **Scenario A**. Only use B or C if you need customization beyond adding error codes. @@ -23,6 +23,7 @@ All files are available as reference in the package: **Local (in your node_modules):** + ``` node_modules/@lenne.tech/nest-server/src/server/modules/error-code/ ``` @@ -92,6 +93,7 @@ const config = { ## Scenario B: Custom Service (For Custom Locales) Use this when you need: + - Additional locales (e.g., French, Spanish) - Custom logic in the service @@ -105,6 +107,7 @@ Same as Scenario A, Step 1. **Copy from:** `node_modules/@lenne.tech/nest-server/src/server/modules/error-code/error-code.service.ts` **Optional customization - add locales:** + ```typescript @Injectable() export class ErrorCodeService extends CoreErrorCodeService { @@ -160,6 +163,7 @@ export class ServerModule {} ## Scenario C: Custom Controller (For Custom Routes) Use this when you need: + - Custom controller endpoints (e.g., `/codes` listing) - Different route paths - Additional REST endpoints @@ -171,6 +175,7 @@ Use this when you need: **Copy from:** `node_modules/@lenne.tech/nest-server/src/server/modules/error-code/` Files needed: + - `error-codes.ts` - Your error definitions - `error-code.service.ts` - Service extending CoreErrorCodeService - `error-code.controller.ts` - Controller (**standalone**, not extending) @@ -222,20 +227,21 @@ After integration, verify: - [ ] Translations include placeholders where needed (`{param}`) ### For Scenario C only: + - [ ] `GET /api/i18n/errors/codes` returns all error codes (if implemented) --- ## Common Mistakes -| Mistake | Symptom | Fix | -|---------|---------|-----| -| Forgot `autoRegister: false` | Project errors not appearing | Add `errorCode: { autoRegister: false }` to config | -| Wrong error code format | Validation errors | Use `PREFIX_XXXX` format (4 digits) | -| Missing translations | Runtime errors | Ensure all locales have translations | -| Controller extends CoreErrorCodeController | `/codes` returns 404 | Use standalone controller | -| Duplicate error codes | Unpredictable behavior | Ensure unique codes across all registries | -| Forgot to import module | No error translations | Import ErrorCodeModule in ServerModule | +| Mistake | Symptom | Fix | +| ------------------------------------------ | ---------------------------- | -------------------------------------------------- | +| Forgot `autoRegister: false` | Project errors not appearing | Add `errorCode: { autoRegister: false }` to config | +| Wrong error code format | Validation errors | Use `PREFIX_XXXX` format (4 digits) | +| Missing translations | Runtime errors | Ensure all locales have translations | +| Controller extends CoreErrorCodeController | `/codes` returns 404 | Use standalone controller | +| Duplicate error codes | Unpredictable behavior | Ensure unique codes across all registries | +| Forgot to import module | No error translations | Import ErrorCodeModule in ServerModule | --- @@ -245,7 +251,7 @@ After integration, verify: import { ErrorCode, Errors } from '@lenne.tech/nest-server'; // Type-safe error code access -const code = ErrorCode.userNotFound; // Returns '#LTNS_0001: User not found' +const code = ErrorCode.userNotFound; // Returns '#LTNS_0001: User not found' // Factory functions with parameters throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' })); @@ -254,7 +260,7 @@ throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' }) // Project-specific errors (after registration) import { ErrorCode as ProjectErrorCode } from './common/errors/project-errors'; -const orderCode = ProjectErrorCode.ORDER_NOT_FOUND; // '#PROJ_0001: Order not found' +const orderCode = ProjectErrorCode.ORDER_NOT_FOUND; // '#PROJ_0001: Order not found' ``` --- @@ -263,10 +269,10 @@ const orderCode = ProjectErrorCode.ORDER_NOT_FOUND; // '#PROJ_0001: Order not f ### REST Endpoints -| Endpoint | Method | Description | -|----------|--------|-------------| -| `/api/i18n/errors/:locale` | GET | Get translations for locale (de, en, ...) | -| `/api/i18n/errors/codes` | GET | Get all error codes (Scenario C only) | +| Endpoint | Method | Description | +| -------------------------- | ------ | ----------------------------------------- | +| `/api/i18n/errors/:locale` | GET | Get translations for locale (de, en, ...) | +| `/api/i18n/errors/codes` | GET | Get all error codes (Scenario C only) | ### Response Format (Nuxt i18n compatible) @@ -280,12 +286,13 @@ const orderCode = ProjectErrorCode.ORDER_NOT_FOUND; // '#PROJ_0001: Order not f } ``` -> **Note:** Core LTNS_* translations are user-friendly messages without placeholders. Project-specific errors (PROJ_*) may include placeholders like `{orderId}` if defined in your `ProjectErrors` registry. +> **Note:** Core LTNS*\* translations are user-friendly messages without placeholders. Project-specific errors (PROJ*\*) may include placeholders like `{orderId}` if defined in your `ProjectErrors` registry. --- ## Detailed Documentation For complete API reference and advanced topics: + - **Core Error Codes:** `node_modules/@lenne.tech/nest-server/src/core/modules/error-code/error-codes.ts` -- **Interfaces:** `node_modules/@lenne.tech/nest-server/src/core/modules/error-code/interfaces/error-code.interfaces.ts` +- **Interfaces:** `node_modules/@lenne.tech/nest-server/src/core/modules/error-code/interfaces/error-code.interfaces.ts` \ No newline at end of file diff --git a/src/core/modules/file/README.md b/src/core/modules/file/README.md index 7449655b..e7c8b8aa 100644 --- a/src/core/modules/file/README.md +++ b/src/core/modules/file/README.md @@ -6,10 +6,10 @@ File upload and download functionality with MongoDB GridFS storage. ### Public Endpoints (via CoreFileController) -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/files/id/:id` | Download file by ID | -| GET | `/files/:filename` | Download file by filename | +| Method | Endpoint | Description | +| ------ | ------------------ | ------------------------- | +| GET | `/files/id/:id` | Download file by ID | +| GET | `/files/:filename` | Download file by filename | **Note:** These endpoints are public (`S_EVERYONE`) by default. Projects can restrict access by extending `CoreFileController`. @@ -17,11 +17,11 @@ File upload and download functionality with MongoDB GridFS storage. Projects typically add admin-only endpoints like: -| Method | Endpoint | Description | -|--------|----------|-------------| -| POST | `/files/upload` | Upload file (multipart/form-data) | -| GET | `/files/info/:id` | Get file metadata | -| DELETE | `/files/:id` | Delete file | +| Method | Endpoint | Description | +| ------ | ----------------- | --------------------------------- | +| POST | `/files/upload` | Upload file (multipart/form-data) | +| GET | `/files/info/:id` | Get file metadata | +| DELETE | `/files/:id` | Delete file | --- @@ -139,6 +139,7 @@ GET /files/ Files are stored in MongoDB GridFS with the following structure: **fs.files collection:** + ```json { "_id": ObjectId, @@ -154,6 +155,7 @@ Files are stored in MongoDB GridFS with the following structure: ``` **fs.chunks collection:** + - Binary file data split into 255KB chunks - Automatically managed by GridFS @@ -162,4 +164,4 @@ Files are stored in MongoDB GridFS with the following structure: ## Related Documentation - [TUS Module](../tus/README.md) - Resumable upload protocol -- [CoreFileService](./core-file.service.ts) - File service implementation +- [CoreFileService](./core-file.service.ts) - File service implementation \ No newline at end of file diff --git a/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md b/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md index 0f2e4b9c..f10fe065 100644 --- a/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md +++ b/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md @@ -5,6 +5,7 @@ This guide provides step-by-step instructions to migrate from `@nodepit/migrate- ## Prerequisites Current state of nest-server-starter projects: + - Using `@nodepit/migrate-state-store-mongodb` for state storage - Using external `migrate` package for CLI - Custom migration utilities in `migrations-utils/` @@ -16,11 +17,13 @@ Current state of nest-server-starter projects: **File:** `package.json` Remove old migration packages: + ```bash npm uninstall migrate @nodepit/migrate-state-store-mongodb ts-migrate-mongoose ``` Ensure latest nest-server is installed: + ```bash npm install @lenne.tech/nest-server@latest ``` @@ -32,6 +35,7 @@ The `migrate` CLI is now provided by `@lenne.tech/nest-server` - no external pac **File:** `migrations-utils/migrate.js` **Before:** + ```javascript import config from '../src/config.env'; const migrate = require('migrate'); @@ -48,13 +52,14 @@ module.exports = class MyMongoStateStore extends MongoStateStore { ``` **After:** + ```javascript const { createMigrationStore } = require('@lenne.tech/nest-server'); const config = require('../src/config.env'); module.exports = createMigrationStore( config.default.mongoose.uri, - 'migrations' // optional, default is 'migrations' + 'migrations', // optional, default is 'migrations' ); ``` @@ -79,6 +84,7 @@ export { createMigrationStore, getDb, uploadFileToGridFS } from '@lenne.tech/nes **Option B: Delete and update all migrations** (Not recommended) Delete the file and update all existing migration files to import directly from `@lenne.tech/nest-server`: + ```typescript // Old (in migrations) import { getDb } from '../migrations-utils/db'; @@ -90,12 +96,15 @@ import { getDb } from '@lenne.tech/nest-server'; **We recommend Option A** to maintain backwards compatibility with existing migrations. #### ❌ Delete `migrations-utils/template.ts` + Use the built-in project template from nest-server instead. #### ❌ Delete `migrations-utils/ts-compiler.js` + The TypeScript compiler is now provided by nest-server. **Files to keep:** + - ✅ `migrations-utils/migrate.js` (project-specific configuration) - ✅ `migrations-utils/db.ts` (optional proxy for backwards compatibility) @@ -106,6 +115,7 @@ The TypeScript compiler is now provided by nest-server. **IMPORTANT:** The CLI syntax has changed. The command must come FIRST, then the options. **Before (WRONG):** + ```json { "scripts": { @@ -116,6 +126,7 @@ The TypeScript compiler is now provided by nest-server. ``` **After (CORRECT):** + ```json { "scripts": { @@ -132,6 +143,7 @@ The TypeScript compiler is now provided by nest-server. ``` **Key changes:** + - ✅ Command (`up`, `down`, `create`, `list`) comes FIRST - ✅ Use `ts:./path` instead of `"ts:./path"` for compiler - ✅ Remove quotes around paths (not needed) @@ -177,18 +189,22 @@ rm migrations/*-test-migration.ts ## What Changes ### Files Removed (2 files) + - ❌ `migrations-utils/template.ts` - **DELETED** (use nest-server template) - ❌ `migrations-utils/ts-compiler.js` - **DELETED** (use nest-server compiler) ### Files Updated (2 files) + - ✅ `migrations-utils/migrate.js` - simplified from ~14 lines to ~7 lines - ✅ `migrations-utils/db.ts` - converted to simple re-export proxy (~5 lines) ### Files Kept + - ✅ `migrations-utils/migrate.js` - **REQUIRED** (project-specific configuration) - ✅ `migrations-utils/db.ts` - **OPTIONAL** (backwards compatibility proxy) ### Other Changes + - ✅ package.json scripts syntax updated - ✅ CLI comes from nest-server instead of external package @@ -232,20 +248,14 @@ export const up = async () => { const db: Db = await getDb(MONGO_URL); // Your migration code here - await db.collection('users').updateMany( - { email: { $exists: false } }, - { $set: { email: '' } } - ); + await db.collection('users').updateMany({ email: { $exists: false } }, { $set: { email: '' } }); }; export const down = async () => { const db: Db = await getDb(MONGO_URL); // Your rollback code here - await db.collection('users').updateMany( - {}, - { $unset: { email: '' } } - ); + await db.collection('users').updateMany({}, { $unset: { email: '' } }); }; ``` @@ -254,6 +264,7 @@ export const down = async () => { ## Support If issues occur during migration: + - Check that `@lenne.tech/nest-server` is at version 11.3.0 or higher - Verify `ts-node` is installed as devDependency - Ensure `migrations-utils/migrate.js` exports the state store correctly @@ -293,6 +304,7 @@ migrate list --store --migrations-dir --compiler ts: ``` **Key points:** + - Command (`create`, `up`, `down`, `list`) comes FIRST - Options use `--option value` format (not `--option=value`) - Compiler format: `ts:./path` (not `"ts:./path"`) \ No newline at end of file diff --git a/src/core/modules/migrate/README.md b/src/core/modules/migrate/README.md index a1ee2832..1aac1ab0 100644 --- a/src/core/modules/migrate/README.md +++ b/src/core/modules/migrate/README.md @@ -25,11 +25,13 @@ npm uninstall @nodepit/migrate-state-store-mongodb ### 2. Update your imports **Before:** + ```typescript import { MongoStateStore, synchronizedUp } from '@nodepit/migrate-state-store-mongodb'; ``` **After:** + ```typescript import { MongoStateStore, synchronizedUp } from '@lenne.tech/nest-server'; ``` @@ -58,7 +60,7 @@ const stateStore = new MongoStateStore('mongodb://localhost/mydb'); const stateStore = new MongoStateStore({ uri: 'mongodb://localhost/mydb', collectionName: 'custom_migrations', // optional, defaults to 'migrations' - lockCollectionName: 'migration_lock' // optional, for cluster environments + lockCollectionName: 'migration_lock', // optional, for cluster environments }); ``` @@ -76,10 +78,8 @@ stateStore.load((err, state) => { // Save migration state const migrationState = { - migrations: [ - { title: '1234-my-migration.js', timestamp: Date.now() } - ], - lastRun: '1234-my-migration.js' + migrations: [{ title: '1234-my-migration.js', timestamp: Date.now() }], + lastRun: '1234-my-migration.js', }; stateStore.save(migrationState, (err) => { @@ -121,9 +121,9 @@ import { MongoStateStore, synchronizedMigration, synchronizedUp } from '@lenne.t const migrationOptions = { stateStore: new MongoStateStore({ uri: 'mongodb://localhost/mydb', - lockCollectionName: 'migration_lock' // Required for synchronized migrations + lockCollectionName: 'migration_lock', // Required for synchronized migrations }), - migrationsDirectory: './migrations' + migrationsDirectory: './migrations', }; // Custom migration logic @@ -148,6 +148,7 @@ new MongoStateStore(options: string | MongoStateStoreOptions) ``` **Parameters:** + - `options`: MongoDB URI string or configuration object - `uri`: MongoDB connection URI (required) - `collectionName`: Name of the collection to store migration state (default: 'migrations') @@ -196,8 +197,8 @@ Wraps migrations with a lock to prevent simultaneous execution in clustered envi ```typescript async function synchronizedMigration( opts: MigrationOptions, - callback: (set: MigrationSet) => Promise -): Promise + callback: (set: MigrationSet) => Promise, +): Promise; ``` #### synchronizedUp @@ -205,7 +206,7 @@ async function synchronizedMigration( Convenience function that executes all pending migrations in a synchronized manner. ```typescript -async function synchronizedUp(opts: MigrationOptions): Promise +async function synchronizedUp(opts: MigrationOptions): Promise; ``` ## How It Works @@ -260,10 +261,10 @@ module.exports.up = function (next) { callbackify(async () => { const client = await MongoClient.connect(mongoUrl); try { - await client.db().collection('users').updateMany( - { email: { $exists: false } }, - { $set: { email: '' } } - ); + await client + .db() + .collection('users') + .updateMany({ email: { $exists: false } }, { $set: { email: '' } }); } finally { await client.close(); } @@ -274,10 +275,10 @@ module.exports.down = function (next) { callbackify(async () => { const client = await MongoClient.connect(mongoUrl); try { - await client.db().collection('users').updateMany( - {}, - { $unset: { email: '' } } - ); + await client + .db() + .collection('users') + .updateMany({}, { $unset: { email: '' } }); } finally { await client.close(); } @@ -295,9 +296,9 @@ async function runMigrations() { const migrationOptions = { stateStore: new MongoStateStore({ uri: process.env.MONGODB_URL || 'mongodb://localhost/mydb', - lockCollectionName: 'migration_lock' + lockCollectionName: 'migration_lock', }), - migrationsDirectory: path.join(__dirname, 'migrations') + migrationsDirectory: path.join(__dirname, 'migrations'), }; try { @@ -357,8 +358,8 @@ const config = require('../src/config.env'); module.exports = createMigrationStore( config.default.mongoose.uri, - 'migrations', // optional collection name - 'migration_lock' // optional lock collection for clusters + 'migrations', // optional collection name + 'migration_lock', // optional lock collection for clusters ); ``` @@ -380,11 +381,10 @@ Helper function to upload files to GridFS during migrations: ```typescript import { uploadFileToGridFS } from '@lenne.tech/nest-server'; -const fileId = await uploadFileToGridFS( - 'mongodb://localhost/mydb', - '../assets/image.png', - { bucketName: 'images', filename: 'logo.png' } -); +const fileId = await uploadFileToGridFS('mongodb://localhost/mydb', '../assets/image.png', { + bucketName: 'images', + filename: 'logo.png', +}); ``` ### Migration Templates @@ -417,6 +417,7 @@ For a complete step-by-step guide on migrating from @nodepit/migrate-state-store 4. Run migrations using the built-in CLI **Example package.json scripts:** + ```json { "scripts": { @@ -449,5 +450,6 @@ MIT ## Support For issues and questions: + - GitHub: https://github.com/lenneTech/nest-server/issues -- Documentation: https://nest-server.lenne.tech +- Documentation: https://nest-server.lenne.tech \ No newline at end of file diff --git a/src/core/modules/tus/INTEGRATION-CHECKLIST.md b/src/core/modules/tus/INTEGRATION-CHECKLIST.md index 72757f35..06ad222a 100644 --- a/src/core/modules/tus/INTEGRATION-CHECKLIST.md +++ b/src/core/modules/tus/INTEGRATION-CHECKLIST.md @@ -8,18 +8,19 @@ ## Do You Need This Checklist? -| Scenario | Checklist Needed? | -|----------|-------------------| -| Use TUS with defaults (everyone can upload) | No - works automatically | -| Require authentication for uploads | Yes - Step 1 | -| Custom upload handling (notifications, etc.) | Yes - Step 2 | -| Disable TUS completely | No - just use `TusModule.forRoot({ config: false })` | +| Scenario | Checklist Needed? | +| -------------------------------------------- | ---------------------------------------------------- | +| Use TUS with defaults (everyone can upload) | No - works automatically | +| Require authentication for uploads | Yes - Step 1 | +| Custom upload handling (notifications, etc.) | Yes - Step 2 | +| Disable TUS completely | No - just use `TusModule.forRoot({ config: false })` | --- ## Reference Implementation **Local (in your node_modules):** + ``` node_modules/@lenne.tech/nest-server/src/server/server.module.ts ``` @@ -116,13 +117,13 @@ TusModule.forRoot({ path: '/uploads', expiration: { expiresIn: '12h' }, }, -}) +}); ``` ### Disable TUS ```typescript -TusModule.forRoot({ config: false }) +TusModule.forRoot({ config: false }); ``` --- @@ -140,11 +141,11 @@ TusModule.forRoot({ config: false }) ## Common Mistakes -| Mistake | Symptom | Fix | -|---------|---------|-----| -| Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot() | -| Custom controller missing @Roles | No authentication required | Add `@Roles(RoleEnum.S_USER)` to controller class | -| Using wrong endpoint path | 404 on upload | Ensure client uses same path as config | +| Mistake | Symptom | Fix | +| ------------------------------------ | ------------------------------ | ------------------------------------------------- | +| Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot() | +| Custom controller missing @Roles | No authentication required | Add `@Roles(RoleEnum.S_USER)` to controller class | +| Using wrong endpoint path | 404 on upload | Ensure client uses same path as config | --- @@ -173,4 +174,4 @@ upload.start(); ## Detailed Documentation - **README.md:** `node_modules/@lenne.tech/nest-server/src/core/modules/tus/README.md` -- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md +- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md \ No newline at end of file diff --git a/src/core/modules/tus/README.md b/src/core/modules/tus/README.md index 2764f507..57e4a36b 100644 --- a/src/core/modules/tus/README.md +++ b/src/core/modules/tus/README.md @@ -12,12 +12,12 @@ Integration of the [tus.io](https://tus.io) resumable upload protocol with @lenn TusModule.forRoot({ config: { maxSize: 100 * 1024 * 1024, // 100 MB instead of 50 GB default - path: '/uploads', // Custom path instead of /tus + path: '/uploads', // Custom path instead of /tus }, -}) +}); // To disable: -TusModule.forRoot({ config: false }) +TusModule.forRoot({ config: false }); ``` **Quick Links:** [Integration Checklist](./INTEGRATION-CHECKLIST.md) | [Endpoints](#endpoints) | [Configuration](#configuration) | [Client Usage](#client-usage) @@ -47,14 +47,14 @@ TusModule.forRoot({ config: false }) ### TUS Protocol Extensions (All Enabled by Default) -| Extension | Description | -|-----------|-------------| -| **creation** | Create new uploads via POST | -| **creation-with-upload** | Include data in creation request | -| **termination** | Delete incomplete uploads | -| **expiration** | Auto-cleanup of abandoned uploads | -| **checksum** | Verify data integrity | -| **concatenation** | Combine multiple uploads | +| Extension | Description | +| ------------------------ | --------------------------------- | +| **creation** | Create new uploads via POST | +| **creation-with-upload** | Include data in creation request | +| **termination** | Delete incomplete uploads | +| **expiration** | Auto-cleanup of abandoned uploads | +| **checksum** | Verify data integrity | +| **concatenation** | Combine multiple uploads | --- @@ -87,13 +87,13 @@ TUS is **enabled by default** with the following configuration: All endpoints are handled by the TUS protocol via `@tus/server`: -| Method | Endpoint | Description | -|--------|----------|-------------| -| OPTIONS | `/tus` | Get server capabilities | -| POST | `/tus` | Create new upload | -| HEAD | `/tus/:id` | Get upload status/offset | -| PATCH | `/tus/:id` | Continue upload | -| DELETE | `/tus/:id` | Terminate upload | +| Method | Endpoint | Description | +| ------- | ---------- | ------------------------ | +| OPTIONS | `/tus` | Get server capabilities | +| POST | `/tus` | Create new upload | +| HEAD | `/tus/:id` | Get upload status/offset | +| PATCH | `/tus/:id` | Continue upload | +| DELETE | `/tus/:id` | Terminate upload | ### CORS Headers @@ -115,10 +115,10 @@ The TUS server automatically handles CORS headers for browser-based clients: ```typescript // In server.module.ts -TusModule.forRoot({ config: false }) +TusModule.forRoot({ config: false }); // Or via environment config -tus: false +tus: false; ``` ### Custom Configuration @@ -148,29 +148,30 @@ TusModule.forRoot({ expiresIn: '12h', // Cleanup after 12 hours }, }, -}) +}); ``` ### Configuration Options -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `enabled` | boolean | `true` | Enable/disable TUS | -| `path` | string | `/tus` | Endpoint path | -| `maxSize` | number | 50 GB | Maximum file size in bytes | -| `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) | -| `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) | -| `uploadDir` | string | `uploads/tus` | Temporary upload directory | -| `creation` | boolean | `true` | Enable creation extension | -| `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension | -| `termination` | boolean | `true` | Enable termination extension | -| `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration | -| `checksum` | boolean | `true` | Enable checksum extension | -| `concatenation` | boolean | `true` | Enable concatenation extension | +| Option | Type | Default | Description | +| -------------------- | ----------------- | ---------------------- | -------------------------------------------------------- | +| `enabled` | boolean | `true` | Enable/disable TUS | +| `path` | string | `/tus` | Endpoint path | +| `maxSize` | number | 50 GB | Maximum file size in bytes | +| `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) | +| `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) | +| `uploadDir` | string | `uploads/tus` | Temporary upload directory | +| `creation` | boolean | `true` | Enable creation extension | +| `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension | +| `termination` | boolean | `true` | Enable termination extension | +| `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration | +| `checksum` | boolean | `true` | Enable checksum extension | +| `concatenation` | boolean | `true` | Enable concatenation extension | **Note on `allowedHeaders`:** `@tus/server` already includes all TUS protocol headers by default: + - Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size - Tus-Resumable, Tus-Version, Upload-Concat, Upload-Defer-Length - Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override @@ -281,7 +282,7 @@ Then register with custom controller: // server.module.ts TusModule.forRoot({ controller: TusController, -}) +}); ``` ### Custom Upload Handler @@ -346,13 +347,13 @@ query { The following metadata is stored with each GridFS file: -| Field | Source | -|-------|--------| -| `filename` | From TUS `Upload-Metadata` header | -| `contentType` | From TUS `filetype` metadata | -| `tusUploadId` | Original TUS upload ID | -| `originalMetadata` | All TUS metadata | -| `uploadedAt` | Completion timestamp | +| Field | Source | +| ------------------ | --------------------------------- | +| `filename` | From TUS `Upload-Metadata` header | +| `contentType` | From TUS `filetype` metadata | +| `tusUploadId` | Original TUS upload ID | +| `originalMetadata` | All TUS metadata | +| `uploadedAt` | Completion timestamp | --- @@ -363,6 +364,7 @@ The following metadata is stored with each GridFS file: **Cause:** TUS server not initialized **Solutions:** + 1. Check if TUS is disabled in config (`tus: false`) 2. Verify MongoDB connection is established 3. Check server logs for initialization errors @@ -372,6 +374,7 @@ The following metadata is stored with each GridFS file: **Cause:** Upload expired or server restarted **Solutions:** + 1. Check expiration configuration (default: 24h) 2. Increase `expiration.expiresIn` if needed 3. Client should handle `onError` and create new upload @@ -381,6 +384,7 @@ The following metadata is stored with each GridFS file: **Cause:** Missing or incorrect CORS configuration **Solutions:** + 1. Verify client sends correct headers 2. Check that `Tus-Resumable` header is included 3. Ensure server CORS allows TUS headers @@ -390,6 +394,7 @@ The following metadata is stored with each GridFS file: **Cause:** Upload incomplete or migration failed **Solutions:** + 1. Verify upload completed (check `onSuccess` callback) 2. Check server logs for migration errors 3. Verify MongoDB GridFS bucket exists (`fs.files`, `fs.chunks`) @@ -399,6 +404,7 @@ The following metadata is stored with each GridFS file: **Cause:** File exceeds `maxSize` limit **Solutions:** + 1. Increase `maxSize` in configuration 2. Check for proxy/nginx upload limits 3. Verify client `chunkSize` is reasonable @@ -436,4 +442,4 @@ The following metadata is stored with each GridFS file: - [tus.io Protocol](https://tus.io/protocols/resumable-upload) - [tus-js-client](https://github.com/tus/tus-js-client) - [@tus/server](https://github.com/tus/tus-node-server) -- [FileModule Documentation](../file/README.md) +- [FileModule Documentation](../file/README.md) \ No newline at end of file diff --git a/src/server/modules/auth/auth.module.ts b/src/server/modules/auth/auth.module.ts index 5a297dda..22f78664 100644 --- a/src/server/modules/auth/auth.module.ts +++ b/src/server/modules/auth/auth.module.ts @@ -25,10 +25,9 @@ export class AuthModule { imports: [ CoreAuthModule.forRoot(UserModule, UserService, { ...options, - ...{ - // imports: [], // Integrate additional Services here to resolve dependencies - // providers: [] // Integrate additional Providers here to resolve dependencies - }, + + // imports: [], // Integrate additional Services here to resolve dependencies + // providers: [] // Integrate additional Providers here to resolve dependencies, }), ], module: AuthModule, diff --git a/src/server/modules/better-auth/better-auth.resolver.ts b/src/server/modules/better-auth/better-auth.resolver.ts index 576953a8..abfbc08d 100644 --- a/src/server/modules/better-auth/better-auth.resolver.ts +++ b/src/server/modules/better-auth/better-auth.resolver.ts @@ -97,7 +97,9 @@ export class BetterAuthResolver extends CoreBetterAuthResolver { nullable: true, }) @Roles(RoleEnum.S_USER) - override async betterAuthListPasskeys(@Context() ctx: { req: Request }): Promise { + override async betterAuthListPasskeys( + @Context() ctx: { req: Request }, + ): Promise { return super.betterAuthListPasskeys(ctx); } diff --git a/src/server/modules/error-code/README.md b/src/server/modules/error-code/README.md index 05fe4bed..9e9a5d4f 100644 --- a/src/server/modules/error-code/README.md +++ b/src/server/modules/error-code/README.md @@ -5,6 +5,7 @@ This directory contains the reference implementation for extending the ErrorCode ## Purpose Demonstrates **Scenario C: Custom Service + Controller via forRoot()** where a project: + 1. Defines its own error codes with a unique prefix (`SRV_*`) 2. Creates a custom service extending `CoreErrorCodeService` 3. Creates a **standalone** controller (not extending CoreErrorCodeController - see below) @@ -14,12 +15,12 @@ Demonstrates **Scenario C: Custom Service + Controller via forRoot()** where a p ## Files -| File | Description | -|------|-------------| -| `error-codes.ts` | Server-specific error definitions (`SRV_*` prefix) | -| `error-code.service.ts` | Custom service registering `ServerErrors` | -| `error-code.controller.ts` | Custom controller with `/codes` endpoint | -| `index.ts` | Module exports | +| File | Description | +| -------------------------- | -------------------------------------------------- | +| `error-codes.ts` | Server-specific error definitions (`SRV_*` prefix) | +| `error-code.service.ts` | Custom service registering `ServerErrors` | +| `error-code.controller.ts` | Custom controller with `/codes` endpoint | +| `index.ts` | Module exports | ## Architecture @@ -73,7 +74,7 @@ import { ErrorCode } from './modules/error-code/error-codes'; import { Errors } from '@lenne.tech/nest-server'; // Access error codes -console.log(ErrorCode.DEMO_ERROR); // '#SRV_0001: Demo error for testing' +console.log(ErrorCode.DEMO_ERROR); // '#SRV_0001: Demo error for testing' // Use factory functions throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' })); @@ -82,11 +83,13 @@ throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' }) ## When to Use This Pattern Use Scenario C when you need: + - Custom REST endpoints (like `/codes`) - Different route paths - Complex controller logic For simpler cases, see: + - **Scenario A**: `additionalErrorRegistry` in config (simplest) - **Scenario B**: Custom service via inheritance @@ -106,21 +109,21 @@ static routes (`/codes`), even if you re-declare the methods. // DOES NOT WORK - parent route registered first! @Controller('api/i18n/errors') export class ErrorCodeController extends CoreErrorCodeController { - @Get('codes') // Registered AFTER parent's :locale - getAllCodes(): string[] { } + @Get('codes') // Registered AFTER parent's :locale + getAllCodes(): string[] {} - @Get(':locale') // Parent already registered this - override getTranslations() { } + @Get(':locale') // Parent already registered this + override getTranslations() {} } // WORKS - standalone ensures correct order @Controller('api/i18n/errors') export class ErrorCodeController { - @Get('codes') // Registered first - getAllCodes(): string[] { } + @Get('codes') // Registered first + getAllCodes(): string[] {} - @Get(':locale') // Registered second - getTranslations() { } + @Get(':locale') // Registered second + getTranslations() {} } ``` @@ -128,4 +131,4 @@ export class ErrorCodeController { ### Why is `autoRegister: false` required? -NestJS `@Global()` modules use "first wins" for provider registration. Without `autoRegister: false`, CoreModule registers its ErrorCodeModule first, and your custom service is ignored. +NestJS `@Global()` modules use "first wins" for provider registration. Without `autoRegister: false`, CoreModule registers its ErrorCodeModule first, and your custom service is ignored. \ No newline at end of file diff --git a/src/server/modules/error-code/error-code.controller.ts b/src/server/modules/error-code/error-code.controller.ts index 37c2821a..2e70e2a0 100644 --- a/src/server/modules/error-code/error-code.controller.ts +++ b/src/server/modules/error-code/error-code.controller.ts @@ -2,7 +2,10 @@ import { Controller, Get, NotFoundException, Param } from '@nestjs/common'; import { Roles } from '../../../core/common/decorators/roles.decorator'; import { RoleEnum } from '../../../core/common/enums/role.enum'; -import { IErrorTranslationResponse, SupportedLocale } from '../../../core/modules/error-code/interfaces/error-code.interfaces'; +import { + IErrorTranslationResponse, + SupportedLocale, +} from '../../../core/modules/error-code/interfaces/error-code.interfaces'; import { ErrorCodeService } from './error-code.service'; /** diff --git a/src/server/modules/file/file.resolver.ts b/src/server/modules/file/file.resolver.ts index 505389c1..004594d9 100644 --- a/src/server/modules/file/file.resolver.ts +++ b/src/server/modules/file/file.resolver.ts @@ -71,7 +71,7 @@ export class FileResolver { createReadStream() .pipe(createWriteStream(`./uploads/${filename}`)) .on('finish', () => resolve(true)) - .on('error', error => reject(error)), + .on('error', (error) => reject(error)), ), ); } diff --git a/src/server/modules/user/user.resolver.ts b/src/server/modules/user/user.resolver.ts index cd3dd316..19d965fa 100644 --- a/src/server/modules/user/user.resolver.ts +++ b/src/server/modules/user/user.resolver.ts @@ -166,7 +166,7 @@ export class UserResolver { filter(this: UserResolver, payload, variables, context) { return context?.user?.hasRole?.(RoleEnum.ADMIN); }, - resolve: user => user, + resolve: (user) => user, }) async userCreated() { return this.pubSub.asyncIterableIterator('userCreated'); diff --git a/src/test/test.helper.ts b/src/test/test.helper.ts index dbf5664f..6b598f70 100644 --- a/src/test/test.helper.ts +++ b/src/test/test.helper.ts @@ -253,8 +253,8 @@ export class TestHelper { // Convert string to TestGraphQLConfig if ( - (typeof graphql === 'string' || graphql instanceof String) - && /^(?![a-zA-Z]+$).*$/.test((graphql as string).trim()) + (typeof graphql === 'string' || graphql instanceof String) && + /^(?![a-zA-Z]+$).*$/.test((graphql as string).trim()) ) { // Use input as query query = (graphql as string).trim(); @@ -325,7 +325,7 @@ export class TestHelper { }); } } else { - query = query.replace(/(?<=[:\[,]\s*)"([A-Z0-9_]+)"(?=\s*[,\]\}])/g, (match, group1) => { + query = query.replace(/(?<=[:[,]\s*)"([A-Z0-9_]+)"(?=\s*[,\]}])/g, (match, group1) => { // If group1 only contains digits, the original string is returned if (/^\d+$/.test(group1)) { return match; @@ -459,7 +459,7 @@ export class TestHelper { } if (Array.isArray(args)) { objects.set(args, args); - return args.map(item => this.prepareArguments(item, objects)); + return args.map((item) => this.prepareArguments(item, objects)); } if (typeof args === 'object') { objects.set(args, args); @@ -530,7 +530,7 @@ export class TestHelper { ): Promise { // Token if (token) { - requestConfig.headers = { authorization: `Bearer ${token}`, ...(requestConfig.headers || {}) }; + requestConfig.headers = { authorization: `Bearer ${token}`, ...requestConfig.headers }; } // Init response @@ -682,7 +682,7 @@ export class TestHelper { async getSubscription(graphql: TestGraphQLConfig, query: string, options?: TestGraphQLOptions) { // Check url if (!this.subscriptionUrl) { - throw new Error('Missing subscriptionUrl in TestHelper: new TestHelper(app, \'ws://localhost:3030/graphql\')'); + throw new Error("Missing subscriptionUrl in TestHelper: new TestHelper(app, 'ws://localhost:3030/graphql')"); } // Prepare subscription