diff --git a/.eslintrc.yaml b/.eslintrc.yaml deleted file mode 100644 index 16241901..00000000 --- a/.eslintrc.yaml +++ /dev/null @@ -1,18 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-cli' - - '@code-style/eslint-config-jest' - - '@code-style/eslint-config-typescript' - - '@code-style/eslint-config-esmodule' -ignorePatterns: - - '.prettierrc.mjs' - - '**/test/*/**' - - 'packages/code-style' - - 'packages/create-configs' - - 'packages/eslint-config' - - 'packages/eslint-config-typescript' - - 'packages/eslint-plugin-nest' - - 'packages/jest-configs' - - 'utils' diff --git a/.github/workflows/build-publish.yaml b/.github/workflows/build-publish.yaml index 27c7b30b..447bf84b 100644 --- a/.github/workflows/build-publish.yaml +++ b/.github/workflows/build-publish.yaml @@ -51,14 +51,17 @@ jobs: with: install-modules: false + - name: 'Get package version 🔖' + id: 'get-package-version' + run: 'echo "version=v$(npm pkg get version | jq --raw-output)" >> "$GITHUB_OUTPUT"' + - name: 'Publish to NPM 🚀' env: NODE_AUTH_TOKEN: '${{ secrets.NPM_AUTH_TOKEN }}' + # keep prereleases off the `latest` dist-tag + npm_config_tag: "${{ contains(steps.get-package-version.outputs.version, '-') && 'next' || 'latest' }}" uses: 'dudeofawesome/actions/npm-publish@a850bdff4354bdb891a86116f0378f8a890e2c16' # v1 - - name: 'Get package version 🔖' - id: 'get-package-version' - run: 'echo "version=v$(npm pkg get version | jq --raw-output)" >> "$GITHUB_OUTPUT"' - name: 'Build jsonschema 🏗️' run: 'npm run build:jsonschema --workspace packages/code-style' - name: 'Publish files to Github Releases 🚀' diff --git a/.gitignore b/.gitignore index 8e9a01e5..612cc8b9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ code-style-*-*.*.*.tgz # caches .eslintcache +*.tsbuildinfo diff --git a/.vscode/settings.json b/.vscode/settings.json index 4abbee03..7b2fcde2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -46,13 +46,11 @@ } ], "material-icon-theme.files.associations": { - "eslint-config*/*.yaml": "eslint", "styleint-config/*.yaml": "stylelint", "typescript-configs/**/*.json": "tsconfig", "javascript-configs/**/*.json": "jsconfig" }, "yaml.schemas": { - "https://json.schemastore.org/eslintrc": ["eslint-config*/**/*.yaml"], "https://json.schemastore.org/stylelintrc.json": ["stylelint-config/*.yaml"] }, "cSpell.words": ["esmodule"] diff --git a/README.md b/README.md index 06b626d0..f944900d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ See [create-configs](/packages/create-configs/README.md) for usage information. +To add your own rules on top, see [docs/customizing-eslint.md](/docs/customizing-eslint.md). + +Upgrading from v2? See [docs/migrating-v2-to-v3.md](/docs/migrating-v2-to-v3.md). + ## Contributing See [`CONTRIBUTING.md`](./CONTRIBUTING.md) diff --git a/code-style.code-workspace b/code-style.code-workspace index 9cbee577..b820ea8c 100644 --- a/code-style.code-workspace +++ b/code-style.code-workspace @@ -73,13 +73,11 @@ }, ], "material-icon-theme.files.associations": { - "eslint-config*/*.yaml": "eslint", "styleint-config/*.yaml": "stylelint", "typescript-configs/**/*.json": "tsconfig", "javascript-configs/**/*.json": "jsconfig", }, "yaml.schemas": { - "https://json.schemastore.org/eslintrc": ["eslint-config*/**/*.yaml"], "https://json.schemastore.org/stylelintrc.json": [ "stylelint-config/*.yaml", ], diff --git a/docs/customizing-eslint.md b/docs/customizing-eslint.md new file mode 100644 index 00000000..f7fac179 --- /dev/null +++ b/docs/customizing-eslint.md @@ -0,0 +1,37 @@ +# Customizing the ESLint configs + +Add your own changes after the `@code-style` configs in your `eslint.config.mjs`. Later configs win. + +```js +import { defineConfig, globalIgnores } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { + config as typescript, + files as typescript_files, +} from '@code-style/eslint-config-typescript'; + +export default defineConfig( + globalIgnores(['generated/']), + base, + node, + typescript, + { + rules: { + 'max-lines': ['error', { max: 500 }], + }, + }, + { + files: typescript_files, + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + }, + }, +); +``` + +- **Scope changes to `@typescript-eslint/*` and `jest/*` rules with the config's `files`.** `@code-style/eslint-config-typescript` and `@code-style/eslint-config-jest` only load their plugins for the files they lint, so changing one of their rules for every file fails with `Could not find plugin`. Both packages export their `files`. Turning a rule `'off'` works without them. +- **Setting only a severity keeps the rule's options, but setting options replaces all of them.** `'max-lines': 'warn'` keeps `max: 2000`, while `['error', { max: 500 }]` also drops `skipBlankLines` and `skipComments`, so restate any options you want to keep. +- **Order matters.** Put each `/lenient` config right after the config it relaxes, and `@code-style/eslint-config-esmodule` after `@code-style/eslint-config-node`. [create-configs](../packages/create-configs/README.md) writes them in the right order. +- **To find where a rule's setting comes from**, run `npx eslint --inspect-config`. Each config is named after its package (eg: `@code-style/eslint-config/rule-sets/footguns`). diff --git a/docs/migrating-v2-to-v3.md b/docs/migrating-v2-to-v3.md new file mode 100644 index 00000000..9b27fd64 --- /dev/null +++ b/docs/migrating-v2-to-v3.md @@ -0,0 +1,32 @@ +# Migrating from v2 to v3 + +v3 replaces the `.eslintrc` configs with [flat configs](https://eslint.org/docs/latest/use/configure/configuration-files) for **ESLint 10**, which requires Node `^20.19.0 || ^22.13.0 || >=24`. + +The easiest way to migrate is to re-run [create-configs](../packages/create-configs/README.md) with `overwrite` enabled. It replaces your `.eslintrc` & `.eslintignore` with an `eslint.config.mjs`, carrying over your rules, ignore patterns, and overrides' rules. It warns about any other settings (eg: `env`), which you'll need to add yourself. + +To migrate by hand: + +1. Replace your `.eslintrc.yaml` with an `eslint.config.mjs` that layers the same configs in the same order. + + ```js + import { defineConfig } from 'eslint/config'; + + import { config as base } from '@code-style/eslint-config'; + import { config as node } from '@code-style/eslint-config-node'; + import { config as node_lenient } from '@code-style/eslint-config-node/lenient'; + + export default defineConfig(base, node, node_lenient); + ``` + +1. Move any `.eslintignore` patterns into `globalIgnores([...])` from `eslint/config`. +1. Install `eslint` as a dev dependency, and remove `@rushstack/eslint-patch`, `@types/eslint`, `eslint-plugin-import`, `@typescript-eslint/eslint-plugin`, and `@typescript-eslint/parser`. +1. Remove `--ext` from your `eslint` scripts. + +`eslint-plugin-react` and `eslint-plugin-jsx-a11y` don't yet declare ESLint 10 support, so if you use `@code-style/eslint-config-react`, add the following to your `package.json`: + +```json +"overrides": { + "eslint-plugin-react": { "eslint": "$eslint" }, + "eslint-plugin-jsx-a11y": { "eslint": "$eslint" } +} +``` diff --git a/docs/upgrading-to-eslint-flat-config.md b/docs/upgrading-to-eslint-flat-config.md deleted file mode 100644 index c33eb091..00000000 --- a/docs/upgrading-to-eslint-flat-config.md +++ /dev/null @@ -1,15 +0,0 @@ -# Upgrading to ESLint v9 flat configs - -## Dependencies that have yet to add support for flat configs - -- [ ] [eslint-plugin-import / eslint-plugin-i](https://github.com/import-js/eslint-plugin-import/issues/2948) -- [x] [eslint-plugin-json-files](https://github.com/kellyselden/eslint-plugin-json-files) - no config provided -- [x] eslint-plugin-prettier -- [ ] [eslint-plugin-promise](https://github.com/eslint-community/eslint-plugin-promise/issues/449) -- [x] eslint-plugin-jest -- [x] eslint-plugin-n -- [ ] [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/pull/891) -- [x] eslint-plugin-react -- [ ] [eslint-plugin-react-hooks](https://github.com/facebook/react/issues/28313) -- [x] @typescript-eslint/\* -- [x] [@eslint-community/eslint-plugin-eslint-comments](https://github.com/eslint-community/eslint-plugin-eslint-comments/issues/182) diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..9a037b37 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,29 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as cli } from '@code-style/eslint-config-cli'; +import { config as jest } from '@code-style/eslint-config-jest'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; + +export default defineConfig( + globalIgnores([ + '.prettierrc.mjs', + '**/test/*/**', + // these packages lint themselves with their own eslint.config.mjs + 'packages/code-style/', + 'packages/create-configs/', + 'packages/eslint-config/', + 'packages/eslint-config-typescript/', + 'packages/eslint-plugin-nest/', + 'packages/jest-configs/', + 'utils/', + ]), + base, + node, + cli, + jest, + typescript, + esmodule, +); diff --git a/package-lock.json b/package-lock.json index e23ed5e0..411d30df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "upgrade-packages": "scripts/upgrade-packages.sh" }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.8.4", + "eslint": "^10.0.0", "glob": "^10.3.12", "tsx": "^4.9.4", "yargs": "^17.7.2" }, "engines": { - "node": ">=20" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -241,9 +241,10 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -541,6 +542,7 @@ "version": "7.24.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -613,6 +615,62 @@ "integrity": "sha512-qR9FwI8QKIveDnUYutvfzbC21UZJJryYrLuZGjeZ/VGz+vXelUkK+xgkOHsvPEdYEdxtgUUq4313N8QtOehJ1Q==", "peer": true }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", @@ -809,12 +867,44 @@ } }, "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/JounQin" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { @@ -1163,18 +1253,31 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.3.0.tgz", - "integrity": "sha512-6e93KtgsndNkvwCCa07LOQJSwzzLLxwrFll3+huyFoiiQXWG0KBcmo0Q1bVgYQQDLfWOOZl2VPBsXqZL6vHIBQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.8.1.tgz", + "integrity": "sha512-vafrdi15JHBFh1qWOAucyJwlEEuhdoMof28jOdKdgnwZ7bXwd6v4wzHYSmAVLwnx0yc7bqAtfJ0EZQV1WAzV/Q==", + "license": "MIT", "dependencies": { "escape-string-regexp": "^4.0.0", - "ignore": "^5.2.4" + "ignore": "^7.0.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.13.tgz", + "integrity": "sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==", + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1192,56 +1295,183 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", - "dev": true, - "peer": true, + "node_modules/@eslint/compat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.1.1.tgz", + "integrity": "sha512-rMcy8GSrwNzcISX/BlTDY/GLB4eCopEuy9woIls3To+15OLxykZrxxq+WUcylCPCQ6F4MujjBM1DX5V1aqI3Vw==", + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^8.40 || 9 || 10" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1264,10 +1494,18 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" + "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/checkbox": { "version": "2.3.1", @@ -1976,6 +2214,12 @@ "integrity": "sha512-1TGJL0UAkNUjOKgoexNEMmfkRNu430ufebhYPBtZMCt+EEbbFn66FZx9DP+hLIqddOu58lfMf2vd75InlL4+kg==", "dev": true }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "license": "MIT" + }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", @@ -1985,6 +2229,27 @@ "node": ">=8" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.5.tgz", + "integrity": "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, "node_modules/@nestjs/common": { "version": "10.3.7", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.7.tgz", @@ -2058,57 +2323,6 @@ "integrity": "sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==", "peer": true }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.1.tgz", - "integrity": "sha512-Fp+mthEBjkn8r9qd6o4JgxKp0IDEzW0VYHD8ZC05xS5/lFNwHKuOdr2kVhWG7BQCO9L6eeepshM1Wbs2T+LgSg==", - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.1", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.1.tgz", @@ -2437,11 +2651,6 @@ "prettier": "^3.0.0" } }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", - "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -2725,6 +2934,16 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "devOptional": true }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2768,21 +2987,17 @@ "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "devOptional": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "devOptional": true + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" }, "node_modules/@types/glob": { "version": "7.2.0", @@ -2841,11 +3056,12 @@ } }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/npmcli__package-json": { @@ -2870,11 +3086,6 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -2899,242 +3110,982 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.72.0.tgz", + "integrity": "sha512-aysKgysPX9XOv/dk95UkvUDe++Q3n3dJPG9CEWT3RUccxfkPJ+Qn6nhKPDhZXU6Ofo9kgwGWwKyQCnZIXTgngg==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.72.0", + "@typescript-eslint/type-utils": "8.72.0", + "@typescript-eslint/utils": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.72.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.0.tgz", + "integrity": "sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/rule-tester": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-7.8.0.tgz", - "integrity": "sha512-f1wXWeZx8XJB/z9Oyjx0ZLmhvcFelSJ0CVvOurCkrISOZhre+imIj5FQQz1rBy/Ips0dCbVl5G4MWTuzlzj5QQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "ajv": "^6.12.6", - "lodash.merge": "4.6.2", - "semver": "^7.6.0" - }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.0.tgz", + "integrity": "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.13.tgz", + "integrity": "sha512-2E8Q6rh+1RRSq/YdaGsNfXsEZy9FVqv6BSSrkmZJP7BnaoPnRfKL+YaofPvP+5rzdk144qSm6i4+hvPgUcbV4Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, "peerDependencies": { - "@eslint/eslintrc": ">=2", - "eslint": "^8.56.0" + "typescript": ">=4.8.4" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "node_modules/@typescript-eslint/parser": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.72.0.tgz", + "integrity": "sha512-0O+x3ynciD6zuXb1CKSu165haQV6ey53DKhHHUnujP7U+XlltJG+/keT0Xhd1HXCze+IHf7Tvt39ovyepX/LNw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.72.0", + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0", + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.0.tgz", + "integrity": "sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "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/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.0.tgz", + "integrity": "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.72.0.tgz", + "integrity": "sha512-bzHngBbmIgzj6TsTjVUCntGx6FFLgE7mPjpO0PzHycOaZHXqS43XnrkFIHRS16LLr/xO6FHSXG3GJFo/F4bSBQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.72.0", + "@typescript-eslint/types": "^8.72.0", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "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/project-service/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/project-service/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/rule-tester": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.72.0.tgz", + "integrity": "sha512-3DkhIwJJ1EgssS9r613P8mqraY/c0uSg9e5rQdYPKf71poFqIrN/6agYEtTzI9SvVLgFqfbCwpKLr0zRBij0UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/parser": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.0", + "@typescript-eslint/utils": "8.72.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.7.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/rule-tester/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.72.0.tgz", + "integrity": "sha512-0vbxCf7xLVPSjcOdm6eQbgViH8EDJ8xnl1laLT9yoqSz2YmcSfSg5Vdl0JUvZf6rcuJ0ZivJIuMD4edTg8obaA==", + "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.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.72.0.tgz", + "integrity": "sha512-gEXxmmbSTSOVTC37IYYvremOM31v+UN2W772bJxmVYPhAOPSUxtacyb7wkm1EhkYKU6KzFJsdU44DCV4to0LWw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.0", + "@typescript-eslint/utils": "8.72.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "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/type-utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.72.0.tgz", + "integrity": "sha512-gwLfFgWcw15tN2KXDCJvxEOQjPn+P3j/n3eSqkZ5sX4VpW9Cosodr+tWwBZRvJT3TcKx6HnPRGZMCNAiP1Xhug==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.72.0", + "@typescript-eslint/tsconfig-utils": "8.72.0", + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.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.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "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/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.0.tgz", + "integrity": "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.72.0.tgz", + "integrity": "sha512-0up3oArJZBYnzOaEXKo8DmI43QvMZyPoFEt9LWzRJcyl/RcJjfKKPebknN1VbTgXBf3M/KggUh5uUMdURLnseg==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.72.0", + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.0.tgz", + "integrity": "sha512-JewPyJOYcXBSAS7PIgufscHOwZqhTGyBRiQJhhuDln66tMchxvvt7nJ90JKKIoOelmdHA3kAQbm9cEUHc4JSEA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "@typescript-eslint/visitor-keys": "8.72.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "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/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.0.tgz", + "integrity": "sha512-E2mroviasaWecDzTGiGMtuEguuLVOeRggnrIn93CJuxYJzQBHbyymlT08aVQydbBal5538o+JkBKXh2sRuCyIA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3146,6 +4097,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3163,6 +4115,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3234,11 +4187,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dependencies": { - "dequal": "^2.0.3" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/arr-diff": { @@ -3266,12 +4220,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -3334,25 +4289,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -3387,42 +4323,35 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "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==", + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "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" @@ -3452,6 +4381,15 @@ "node": ">=8" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -3467,6 +4405,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3478,19 +4417,21 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.14.0.tgz", + "integrity": "sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==", + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/babel-jest": { @@ -3635,24 +4576,6 @@ "node": ">=0.10.0" } }, - "node_modules/better-ajv-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-1.2.0.tgz", - "integrity": "sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@humanwhocodes/momoa": "^2.0.2", - "chalk": "^4.1.2", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0 < 4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "peerDependencies": { - "ajv": "4.11.8 - 8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3773,16 +4696,67 @@ "node": ">=0.10.0" } }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -4006,6 +4980,15 @@ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, + "node_modules/comment-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.9.tgz", + "integrity": "sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==", + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -4184,10 +5167,11 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -4195,13 +5179,14 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4211,27 +5196,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -4352,14 +5339,6 @@ "node": ">=0.10.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -4405,14 +5384,29 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/eastasianwidth": { @@ -4450,12 +5444,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -4483,56 +5478,65 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "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.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "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.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "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.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "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.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "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" @@ -4541,13 +5545,29 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { + "node_modules/es-abstract-get": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "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", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4561,33 +5581,37 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -4596,13 +5620,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4617,13 +5643,17 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4884,63 +5914,68 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.13.0.tgz", + "integrity": "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", "@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", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "11.1.5 || >11.1.6 <12", "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", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", - "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "license": "MIT", "dependencies": { "semver": "^7.5.4" }, @@ -4952,353 +5987,429 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.5.tgz", + "integrity": "sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==", + "license": "ISC", "dependencies": { - "ms": "^2.1.1" + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "node_modules/eslint-import-resolver-typescript/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "ms": "^2.1.3" }, "engines": { - "node": ">=4" + "node": ">=6.0" }, "peerDependenciesMeta": { - "eslint": { + "supports-color": { "optional": true } } }, - "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==", - "dependencies": { - "ms": "^2.1.1" - } + "node_modules/eslint-import-resolver-typescript/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/eslint-plugin-es-x": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", - "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.5.0" + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, "peerDependencies": { "eslint": ">=8" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/eslint-plugin-import-x": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.17.1.tgz", + "integrity": "sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==", + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "@typescript-eslint/types": "^8.56.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "minimatch": "^9.0.3 || ^10.1.2", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "@typescript-eslint/utils": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } } }, - "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==", - "dependencies": { - "ms": "^2.1.1" + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.0.tgz", + "integrity": "sha512-Adfoy59kxNEjT5E5fnyrp7GpHYuWs8ONbdohu4ez6IU46qDq8LltG90tLmkucZB2uhYL8mqBjtXqGd8yhfjXqQ==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, + "node_modules/eslint-plugin-import-x/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "18 || 20 || >=22" } }, - "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==", - "bin": { - "semver": "bin/semver.js" + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, - "node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "node_modules/eslint-plugin-import-x/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.10.0" + "ms": "^2.1.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" + "node": ">=6.0" }, "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { + "supports-color": { "optional": true } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "18 || 20 || >=22" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/eslint-plugin-import-x/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=10" } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/eslint-plugin-jest": { + "version": "29.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.17.0.tgz", + "integrity": "sha512-6jtpU6MhYKbagkES02TupWAUUooJpZtKg94Ax0b8HhUorv3InSTBU8RRtlSBe0LocOcShXOpyec3PHzPDkJCSg==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@typescript-eslint/utils": "^8.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "jest": "*", + "typescript": ">=4.8.4 <8.0.0" }, "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + }, "typescript": { "optional": true } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eslint-plugin-n": { + "version": "18.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.5.0.tgz", + "integrity": "sha512-M7uF6MTN/An+AXqvyIbXq7npJIZOkd5eKo8iMMvWrcDVNyZVdA6TF2lw01aKQfCEidRfpnR78GhAjZorlXNHiw==", + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "js-yaml": "^5.4.1", + "semver": "^7.6.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": ">=8.57.1", + "ts-declaration-location": "^1.0.6", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "ts-declaration-location": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "node_modules/eslint-plugin-n/node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "url": "https://opencollective.com/eslint" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/eslint-plugin-jest/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } + "node_modules/eslint-plugin-n/node_modules/argparse": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.3.tgz", + "integrity": "sha512-Sn98ftV3KfsO8xfLPHG6oT8y+b0yvbrLgZjgPDXsharNY15tTAjqIsIju4S32nl6/iEUNNE4v+yL2Zhm8ooP3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" }, - "node_modules/eslint-plugin-json-files": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-json-files/-/eslint-plugin-json-files-4.2.0.tgz", - "integrity": "sha512-4IiZY93WTSCOoNXQaHUTIgFK9sVNk3z+g8Z0xUADGjq4quGBkzxHTcEPA6lPdtEwPa3psdzVARpzbMT3RC9avA==", - "dependencies": { - "ajv": "^8.2.0", - "better-ajv-errors": "^1.2.0", - "fast-glob": "^3.3.2", - "requireindex": "^1.2.0", - "semver": "^7.0.0", - "sort-package-json": "^1.22.1" - }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", "engines": { - "node": ">=18.12" + "node": ">=18" }, - "peerDependencies": { - "eslint": ">=5" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-json-files/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "node_modules/eslint-plugin-n/node_modules/js-yaml": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.5.0.tgz", + "integrity": "sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "argparse": "^3.0.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "js-yaml": "bin/js-yaml.mjs" } }, - "node_modules/eslint-plugin-json-files/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=10" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.7.tgz", + "integrity": "sha512-WjHyn3GrFd+ZR0rzsLiM4zJZ35PZMOE0SUIxzGmnWNG0126yNfJKJzObmmkYDwHJfGlkz3PSlzyG9ez/LJntwg==", + "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.12.3" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5309,7 +6420,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -5322,67 +6433,108 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.3.0.tgz", + "integrity": "sha512-6uGiOR0INuujr6PEQmeSSP7GbIMJ/ebEXXiEzb/nOj68LknH5Pxzb/AbZivmr6VE6TkTE8rTjRK9zhKpK6HsRA==", + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/eslint-plugin-react/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==", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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==", + "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/eslint-plugin-react/node_modules/resolve": { @@ -5410,15 +6562,18 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5435,37 +6590,29 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/eslint/node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "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" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/eslint/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==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "node_modules/eslint/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" }, @@ -5473,57 +6620,108 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/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/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "20 || >=22" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", - "dev": true, - "peer": true, + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "peer": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5542,9 +6740,10 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -5831,6 +7030,22 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "peer": true }, + "node_modules/fast-uri": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -5856,14 +7071,12 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "flat-cache": "^6.1.23" } }, "node_modules/fill-range": { @@ -5893,29 +7106,35 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/for-in": { @@ -5979,14 +7198,20 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6003,6 +7228,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6020,15 +7254,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6045,6 +7285,19 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", @@ -6068,13 +7321,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6084,9 +7338,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -6199,25 +7454,14 @@ "which": "bin/which" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6250,12 +7494,19 @@ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==" }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "license": "MIT" + }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6266,15 +7517,14 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6299,9 +7549,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6310,9 +7564,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6392,10 +7647,23 @@ "node": ">=0.10.0" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6403,6 +7671,27 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", @@ -6458,9 +7747,10 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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" } @@ -6532,13 +7822,14 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6556,12 +7847,14 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6576,11 +7869,16 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "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==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "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" }, "engines": { "node": ">= 0.4" @@ -6590,23 +7888,28 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6620,10 +7923,32 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "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" }, @@ -6670,10 +7995,13 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "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==", + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -6684,11 +8012,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6709,6 +8039,21 @@ "node": ">= 0.4" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -6740,11 +8085,15 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6767,11 +8116,16 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6795,6 +8149,7 @@ "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==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6822,11 +8177,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "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==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6835,14 +8192,6 @@ "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", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -6860,12 +8209,15 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6878,6 +8230,7 @@ "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==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6886,11 +8239,12 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -6911,11 +8265,13 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6925,11 +8281,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6939,11 +8298,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -6961,6 +8321,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6969,23 +8330,28 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7005,7 +8371,8 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", @@ -7091,15 +8458,20 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -7716,9 +9088,20 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7893,7 +9276,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -7965,6 +9349,15 @@ "node": ">=0.10.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -8024,9 +9417,10 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8124,6 +9518,22 @@ "node": ">=0.10.0" } }, + "node_modules/napi-postinstall": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.7.tgz", + "integrity": "sha512-jyU4cU4kVAmy/3qjP+DcoQTNXfINHc+dFw54gGqWC8nu0mpV0kOnk7kff+J+Q18SbX0k3Np8Rm7yFjd3phatNQ==", + "license": "MIT", + "bin": { + "napi-patch": "lib/patch.js", + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8350,9 +9760,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8377,13 +9791,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -8394,13 +9811,15 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -8423,35 +9842,6 @@ "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==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dependencies": { - "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.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -8525,6 +9915,24 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -8678,9 +10086,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8769,9 +10178,10 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -8912,9 +10322,10 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -9147,6 +10558,24 @@ } ] }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9170,6 +10599,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -9202,17 +10632,19 @@ "peer": true }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "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" @@ -9224,7 +10656,8 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true }, "node_modules/regex-not": { "version": "1.0.2", @@ -9239,14 +10672,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9390,39 +10826,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -9462,13 +10865,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -9478,6 +10883,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "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": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -9487,13 +10908,14 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -10224,6 +11646,20 @@ "node": ">= 0.4" } }, + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -10297,14 +11733,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -10632,6 +12123,15 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -10686,6 +12186,19 @@ "node": ">= 0.4" } }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -10734,23 +12247,39 @@ "node": ">=8" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz", + "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "es-object-atoms": "^1.1.2", + "get-intrinsic": "^1.3.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.4", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -10759,15 +12288,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10777,13 +12321,18 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11212,18 +12761,31 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" }, "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.12.3.tgz", + "integrity": "sha512-U+/AXT6LWsxnj2vz9HeUuPWBNgdWxjyIEjEPdbJARC9txmgPzo2VEdqnFo4hHaNyMPtycyVJrSaQYeQv/PoyyA==", + "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@dual-bundle/import-meta-resolve": "^4.2.1", + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/synckit/node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, "node_modules/table": { @@ -11262,11 +12824,16 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/test-exclude": { @@ -11301,10 +12868,50 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/tmp": { "version": "0.0.33", @@ -11392,17 +12999,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "node_modules/ts-jest": { "version": "29.1.2", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", @@ -11488,51 +13084,11 @@ } } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/tsx": { "version": "4.9.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.9.4.tgz", @@ -11989,28 +13545,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "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==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -12020,16 +13578,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", + "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -12039,16 +13598,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -12066,9 +13626,10 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12077,6 +13638,29 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.72.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.72.0.tgz", + "integrity": "sha512-r26Fkc8As+mZvqp7SLsMmNFyYUup/6CjK7/eHBHmhOw6GH6n6YFxHVFrG0jN1c5CMpDzelLPxvgeCOzx7BjN+A==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.72.0", + "@typescript-eslint/parser": "8.72.0", + "@typescript-eslint/typescript-estree": "8.72.0", + "@typescript-eslint/utils": "8.72.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/typescript-json-schema": { "version": "0.63.0", "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.63.0.tgz", @@ -12097,10 +13681,11 @@ } }, "node_modules/typescript-json-schema/node_modules/@types/node": { - "version": "16.18.96", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.96.tgz", - "integrity": "sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==", - "dev": true + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "dev": true, + "license": "MIT" }, "node_modules/typescript-json-schema/node_modules/glob": { "version": "7.2.3", @@ -12148,23 +13733,28 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^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/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, "node_modules/union-value": { "version": "1.0.1", @@ -12188,6 +13778,43 @@ "node": ">=0.10.0" } }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -12385,37 +14012,43 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "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.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "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==", + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "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.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -12428,6 +14061,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -12442,14 +14076,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -12588,6 +14225,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "packages/code-style": { "name": "@code-style/code-style", "version": "2.0.0-35", @@ -12616,6 +14274,7 @@ "license": "MIT", "dependencies": { "@code-style/code-style": "^2.0.0-35", + "@eslint/config-helpers": "^0.7.0", "@inquirer/prompts": "^5.0.0", "@npmcli/package-json": "^5.1.0", "chalk": "^5.3.0", @@ -12650,7 +14309,7 @@ "typescript": "^5.4.5" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" } }, "packages/create-configs/node_modules/chalk": { @@ -12681,14 +14340,15 @@ "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", - "@rushstack/eslint-patch": "^1.10.2", - "eslint": "^8.49.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-json-files": "^4.1.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1" + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.0", + "@eslint/compat": "^2.1.1", + "@eslint/js": "^10.0.0", + "eslint-config-prettier": "^10.1.0", + "eslint-plugin-import-x": "^4.17.0", + "eslint-plugin-json-files": "^5.1.0", + "eslint-plugin-prettier": "^5.5.0", + "eslint-plugin-promise": "^7.3.0", + "globals": "^16.0.0" }, "devDependencies": { "@code-style/code-style": "^2.0.0-35", @@ -12698,7 +14358,6 @@ "@code-style/eslint-config-node": "^2.0.0-35", "@code-style/eslint-config-typescript": "^2.0.0-35", "@code-style/typescript-configs": "^2.0.0-35", - "@types/eslint": "^8.44.2", "@types/node": "^20.12.11", "concurrently": "^8.2.2", "esbuild": "^0.21.1", @@ -12707,9 +14366,10 @@ "typescript": "^5.4.5" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { + "eslint": "^10.0.0", "prettier": "^3.1.0" } }, @@ -12717,14 +14377,30 @@ "name": "@code-style/eslint-config-browser", "version": "2.0.0-35", "license": "MIT", + "dependencies": { + "globals": "^16.0.0" + }, "devDependencies": { + "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" + } + }, + "packages/eslint-config-browser/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "packages/eslint-config-cli": { @@ -12732,35 +14408,29 @@ "version": "2.0.0-35", "license": "MIT", "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" } }, "packages/eslint-config-esmodule": { "name": "@code-style/eslint-config-esmodule", "version": "2.0.0-35", "license": "MIT", - "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-import": "^2.28.1" - }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" } }, "packages/eslint-config-jest": { @@ -12768,17 +14438,16 @@ "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-jest": "^27.4.0" + "eslint-plugin-jest": "^29.16.0" }, "devDependencies": { "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "jest": "*" } }, @@ -12787,35 +14456,17 @@ "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@code-style/eslint-plugin-nest": "2.0.0-32" + "@code-style/eslint-plugin-nest": "^2.0.0-35" }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^8.49.0" - } - }, - "packages/eslint-config-nest/node_modules/@code-style/eslint-plugin-nest": { - "version": "2.0.0-32", - "resolved": "https://registry.npmjs.org/@code-style/eslint-plugin-nest/-/eslint-plugin-nest-2.0.0-32.tgz", - "integrity": "sha512-DntwtzyfFEglq8vBz+CIk5wShLKnptV3ZwtoJ7/2YE4Ob8apZ1oE2OQKknIqECuS6zyEozXgwJEVzrSV7GqqvQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "^7.0.0", - "@typescript-eslint/utils": "^7.0.0" - }, - "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "@nestjs/core": "*", - "eslint": "^8.49.0" + "eslint": "^10.0.0" } }, "packages/eslint-config-nextjs": { @@ -12823,97 +14474,126 @@ "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "^14.1.1", - "@rushstack/eslint-patch": "^1.10.2" + "@next/eslint-plugin-next": "^16.3.0" }, "devDependencies": { - "@types/react": "^18.2.23", - "react": "^18.2.0", + "@types/react": "^19.0.0", + "react": "^19.0.0", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "next": "*" } }, - "packages/eslint-config-node": { - "name": "@code-style/eslint-config-node", - "version": "2.0.0-35", + "packages/eslint-config-nextjs/node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-n": "^17.4.0" - }, - "devDependencies": { - "@types/eslint": "^8.56.10", - "@types/node": "^20.6.3", - "tsx": "^4.9.4" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "packages/eslint-config-node/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "packages/eslint-config-nextjs/node_modules/@next/eslint-plugin-next": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.4.2.tgz", + "integrity": "sha512-gCTWlw0e+Y6kajpFyKKgA195jUJCRhlzJE0lV7ufe8a+ghIsANWZ0/FiJwg6DuOG1+OvRbcZDcFBoRh3mNJx0g==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@eslint-community/eslint-utils": "4.9.1", + "fast-glob": "3.3.1" } }, - "packages/eslint-config-node/node_modules/eslint-plugin-n": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.4.0.tgz", - "integrity": "sha512-RtgGgNpYxECwE9dFr+D66RtbN0B8r/fY6ZF8EVsmK2YnZxE8/n9LNQhgnkL9z37UFZjYVmvMuC32qu7fQBsLVQ==", + "packages/eslint-config-nextjs/node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "enhanced-resolve": "^5.15.0", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^15.0.0", - "ignore": "^5.2.4", - "minimatch": "^9.0.0", - "semver": "^7.5.3" + "csstype": "^3.2.2" + } + }, + "packages/eslint-config-nextjs/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.6.0" + } + }, + "packages/eslint-config-nextjs/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" }, - "peerDependencies": { - "eslint": ">=8.23.0" + "engines": { + "node": ">= 6" } }, - "packages/eslint-config-node/node_modules/globals": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.1.0.tgz", - "integrity": "sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==", + "packages/eslint-config-nextjs/node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "packages/eslint-config-node/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "packages/eslint-config-node": { + "name": "@code-style/eslint-config-node", + "version": "2.0.0-35", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "eslint-plugin-n": "^18.3.0", + "globals": "^16.0.0" + }, + "devDependencies": { + "@types/node": "^20.6.3", + "tsx": "^4.9.4" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "eslint": "^10.0.0" + } + }, + "packages/eslint-config-node/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "packages/eslint-config-react": { @@ -12921,150 +14601,161 @@ "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "@eslint/compat": "^2.1.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1" }, "devDependencies": { - "@types/react": "^18.2.23", - "react": "^18.2.0", + "@types/react": "^19.0.0", + "react": "^19.0.0", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "react": ">=16.8", "react-dom": ">=16.8" } }, + "packages/eslint-config-react/node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "packages/eslint-config-react/node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "packages/eslint-config-typescript": { "name": "@code-style/eslint-config-typescript", "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "eslint-plugin-import": "^2.29.1" + "eslint-import-resolver-typescript": "^4.4.5", + "eslint-plugin-import-x": "^4.17.0", + "typescript-eslint": "^8.67.0" }, "devDependencies": { "@types/common-tags": "^1.8.4", - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "common-tags": "^1.8.2", "tsx": "^4.9.4" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "typescript": ">=5.0.0" } }, - "packages/eslint-npm-hoist-packages": { - "name": "@code-style/eslint-npm-hoist-packages", - "version": "2.0.0-32", - "extraneous": true, + "packages/eslint-config/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-json-files": "^4.1.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "packages/eslint-npm-hoist-packages-esmodule": { - "name": "@code-style/eslint-npm-hoist-packages-esmodule", - "version": "2.0.0-32", - "extraneous": true, + "packages/eslint-config/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { - "eslint-plugin-import": "^2.28.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/eslint-npm-hoist-packages-jest": { - "name": "@code-style/eslint-npm-hoist-packages-jest", - "version": "2.0.0-32", - "extraneous": true, - "license": "MIT", + "packages/eslint-config/node_modules/better-ajv-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.4.tgz", + "integrity": "sha512-ezhaIONGpRAPg9FeAovIXHdFXxdkVBqn7+KWOmIrWEAJmcKGj6xBTyM2KfC+hnKE4vNpq061Qf4zq0ocWOuC4Q==", + "license": "Apache-2.0", "dependencies": { - "eslint-plugin-jest": "^27.4.0" + "@babel/code-frame": "^7.27.1", + "@humanwhocodes/momoa": "^2.0.4", + "chalk": "^4.1.2", + "jsonpointer": "^5.0.1", + "leven": "^3.1.0 < 4" }, "engines": { - "node": ">=18" - } - }, - "packages/eslint-npm-hoist-packages-nextjs": { - "name": "@code-style/eslint-npm-hoist-packages-nextjs", - "version": "2.0.0-32", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "^14.1.1" + "node": ">= 18.20.6" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "ajv": "4.11.8 - 8" } }, - "packages/eslint-npm-hoist-packages-node": { - "name": "@code-style/eslint-npm-hoist-packages-node", - "version": "2.0.0-32", - "extraneous": true, + "packages/eslint-config/node_modules/eslint-plugin-json-files": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-json-files/-/eslint-plugin-json-files-5.1.4.tgz", + "integrity": "sha512-nXB+Mx0ll9e5KJx/4sB3r4UYj1l3Y4VfxZEYY6R8Hsz61AjYrRMnALBi64PFYM6w5/PYgXk8MZ037hU4clgSFg==", "license": "MIT", "dependencies": { - "eslint-plugin-n": "^17.4.0" + "ajv": "^8.2.0", + "better-ajv-errors": "^2.0.0", + "fast-glob": "^3.3.2", + "requireindex": "^1.2.0", + "semver": "^7.0.0", + "sort-package-json": "^1.22.1" }, "engines": { - "node": ">=18" - } - }, - "packages/eslint-npm-hoist-packages-react": { - "name": "@code-style/eslint-npm-hoist-packages-react", - "version": "2.0.0-32", - "extraneous": true, - "license": "MIT", - "dependencies": { - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "node": ">=20.9" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "eslint": ">=5" } }, - "packages/eslint-npm-hoist-packages-typescript": { - "name": "@code-style/eslint-npm-hoist-packages-typescript", - "version": "2.0.0-32", - "extraneous": true, + "packages/eslint-config/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "eslint-plugin-import": "^2.28.1" - }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/eslint-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "packages/eslint-plugin-nest": { "name": "@code-style/eslint-plugin-nest", "version": "2.0.0-35", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "^7.0.0", - "@typescript-eslint/utils": "^7.0.0" + "@typescript-eslint/utils": "^8.67.0" }, "devDependencies": { "@code-style/eslint-config": "^2.0.0-35", @@ -13072,20 +14763,19 @@ "@code-style/eslint-config-typescript": "^2.0.0-32", "@code-style/jest-configs": "^2.0.0-35", "@code-style/typescript-configs": "^2.0.0-32", - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", - "@typescript-eslint/rule-tester": "^7.0.0", + "@typescript-eslint/rule-tester": "^8.67.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "tsx": "^4.9.4", "typescript": "^5.2.2" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { "@nestjs/core": "*", - "eslint": "^8.49.0" + "eslint": "^10.0.0" } }, "packages/jest-configs": { @@ -13125,19 +14815,6 @@ } } }, - "packages/rubocop-config": { - "name": "@code-style/rubocop-configs", - "version": "2.0.0-32", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@types/node": "^20.6.3", - "tsm": "^2.3.0" - }, - "engines": { - "node": ">=18" - } - }, "packages/rubocop-configs": { "name": "@code-style/rubocop-configs", "version": "2.0.0-35", @@ -13273,7 +14950,7 @@ "name": "@code-style/utils", "version": "2.0.0-35", "dependencies": { - "eslint": "^8.56.0", + "eslint": "^10.0.0", "stylelint": "^16.3.1" }, "devDependencies": { @@ -13281,7 +14958,7 @@ "common-tags": "^1.8.2" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" } } } diff --git a/package.json b/package.json index 78d11936..b378f666 100644 --- a/package.json +++ b/package.json @@ -34,20 +34,28 @@ "bump": "scripts/bump.ts", "prelint": "npm run build", "lint": "scripts/concurrently-ws.ts lint 'npm:lint:*' && echo 'All lint passed.'", - "lint:js": "eslint . --ext ts,js,json", + "lint:js": "eslint .", "lint:types": "tsc --noEmit --pretty", "pretest": "npm run build", "test": "scripts/concurrently-ws.ts test && echo 'All tests passed.'", "upgrade-packages": "scripts/upgrade-packages.sh" }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.8.4", + "eslint": "^10.0.0", "glob": "^10.3.12", "tsx": "^4.9.4", "yargs": "^17.7.2" }, "engines": { - "node": ">=20" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "overrides": { + "eslint-plugin-react": { + "eslint": "$eslint" + }, + "eslint-plugin-jsx-a11y": { + "eslint": "$eslint" + } } } diff --git a/packages/code-style/.eslintrc.yaml b/packages/code-style/.eslintrc.yaml deleted file mode 100644 index 3bc2cae6..00000000 --- a/packages/code-style/.eslintrc.yaml +++ /dev/null @@ -1,14 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/node' - - '@code-style/esmodule' - - '@code-style/typescript' - -ignorePatterns: - - '/prettierrc.*' - - '/config-types.*' - -rules: - import/no-default-export: 'off' - n/no-sync: 'off' diff --git a/packages/code-style/eslint.config.mjs b/packages/code-style/eslint.config.mjs new file mode 100644 index 00000000..51206f33 --- /dev/null +++ b/packages/code-style/eslint.config.mjs @@ -0,0 +1,20 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as typescript } from '@code-style/eslint-config-typescript'; + +export default defineConfig( + globalIgnores(['prettierrc.*', 'config-types.*']), + base, + node, + esmodule, + typescript, + { + rules: { + 'import/no-default-export': 'off', + 'n/no-sync': 'off', + }, + }, +); diff --git a/packages/code-style/package.json b/packages/code-style/package.json index 37aa380a..662746c2 100644 --- a/packages/code-style/package.json +++ b/packages/code-style/package.json @@ -40,7 +40,7 @@ "build": "concurrently --group --prefix none \"npm:build:*\"", "build:jsonschema": "typescript-json-schema src/config-types.ts CodeStyleRCFile > codestylerc.schema.json", "build:ts": "tsc", - "lint": "eslint . --ext ts,mts,cts,js,json", + "lint": "eslint .", "prepublishOnly": "npm run build", "test": "echo 'No tests'; exit 0" }, diff --git a/packages/code-style/src/prettierrc.mts b/packages/code-style/src/prettierrc.mts index 81497fb8..157a7620 100644 --- a/packages/code-style/src/prettierrc.mts +++ b/packages/code-style/src/prettierrc.mts @@ -40,6 +40,7 @@ function resolve_plugin( * so we resolve the package's path here instead. */ return ( + // eslint-disable-next-line n/no-unsupported-features/node-builtins -- only runs in vscode's bundled node import.meta .resolve(plugin) /** diff --git a/packages/create-configs/.eslintrc.yaml b/packages/create-configs/.eslintrc.yaml deleted file mode 100644 index 0ea3dfb2..00000000 --- a/packages/create-configs/.eslintrc.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# In order to update the config, update: -# @code-style/eslint-config -# @code-style/eslint-config-node -# @code-style/eslint-config-cli -# @code-style/eslint-config-typescript -# @code-style/eslint-config-jest -# @code-style/eslint-config-esmodule -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-cli' - - '@code-style/eslint-config-typescript' - - '@code-style/eslint-config-jest' - - '@code-style/eslint-config-esmodule' -parserOptions: - ecmaVersion: 2022 -ignorePatterns: - - '/bin/' diff --git a/packages/create-configs/eslint.config.mjs b/packages/create-configs/eslint.config.mjs new file mode 100644 index 00000000..bbc87d1a --- /dev/null +++ b/packages/create-configs/eslint.config.mjs @@ -0,0 +1,25 @@ +// In order to update the config, update: +// @code-style/eslint-config +// @code-style/eslint-config-node +// @code-style/eslint-config-cli +// @code-style/eslint-config-typescript +// @code-style/eslint-config-jest +// @code-style/eslint-config-esmodule +import { defineConfig, globalIgnores } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as cli } from '@code-style/eslint-config-cli'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as jest } from '@code-style/eslint-config-jest'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; + +export default defineConfig( + globalIgnores(['bin/']), + base, + node, + cli, + typescript, + jest, + esmodule, +); diff --git a/packages/create-configs/package.json b/packages/create-configs/package.json index 81f2ac20..d7227a22 100644 --- a/packages/create-configs/package.json +++ b/packages/create-configs/package.json @@ -26,11 +26,11 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*' ) --outdir=dist --sourcemap=inline --platform=node --target=node18 --format=esm", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*' ) --outdir=dist --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "check": "concurrently --raw --group 'npm:test' 'npm:lint'", "lint": "concurrently --raw --group 'npm:lint:*'", - "lint:js": "eslint . --ext ts,js,json --cache", + "lint:js": "eslint . --cache", "lint:types": "tsc --noEmit --pretty", "prepublishOnly": "npm run build", "start": "node bin/create-configs.js", @@ -39,6 +39,7 @@ }, "dependencies": { "@code-style/code-style": "^2.0.0-35", + "@eslint/config-helpers": "^0.7.0", "@inquirer/prompts": "^5.0.0", "@npmcli/package-json": "^5.1.0", "chalk": "^5.3.0", @@ -70,7 +71,7 @@ "typescript": "^5.4.5" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/create-configs/src/build.ts b/packages/create-configs/src/build.ts index 0d456a26..d46dfde7 100644 --- a/packages/create-configs/src/build.ts +++ b/packages/create-configs/src/build.ts @@ -28,10 +28,10 @@ export async function build({ builder, input_dir = 'src', output_dir = 'dist', - technologies = [], - library = false, - lenient = false, - overwrite = false, + technologies, + library, + lenient, + overwrite, }: SetupOptions) { const options: Required = { project_type, @@ -80,8 +80,8 @@ export async function build({ ? create_jest_config(options).then(merge_deps(deps)) : null, ] - .filter(Boolean) - .flat(), + .flat() + .filter((task) => task != null), ); await install_dependencies({ dependencies: deps, runtime }); diff --git a/packages/create-configs/src/steps/dependencies.ts b/packages/create-configs/src/steps/dependencies.ts index 42041075..a357de44 100644 --- a/packages/create-configs/src/steps/dependencies.ts +++ b/packages/create-configs/src/steps/dependencies.ts @@ -22,8 +22,11 @@ export async function uninstall_duplicate_dependencies({ 'eslint-plugin-jsx-a11y', 'eslint-plugin-react', 'eslint-plugin-react-hooks', + 'eslint-plugin-import-x', '@typescript-eslint/eslint-plugin', '@typescript-eslint/parser', + '@types/eslint', + '@rushstack/eslint-patch', 'tslib', 'typescript', 'ts-jest', diff --git a/packages/create-configs/src/steps/editor.ts b/packages/create-configs/src/steps/editor.ts index af105797..ccbba463 100644 --- a/packages/create-configs/src/steps/editor.ts +++ b/packages/create-configs/src/steps/editor.ts @@ -33,91 +33,82 @@ export async function create_vscode_config({ languages, technologies, output_dir, - overwrite = false, + overwrite, }: CreateVSCodeConfigOptions): Promise { const deps = new Dependencies(); await mkdir('.vscode/').catch(() => {}); await Promise.allSettled([ - Promise.resolve('.vscode/settings.json') - .then((path) => - verify_missing({ path, remove: false, reject: true }).then(() => path), - ) - .then(async (path) => - create_file( + Promise.resolve('.vscode/settings.json').then(async (path) => + create_file( + path, + await prettify( path, - await prettify( - path, - JSON.stringify({ - // bring in existing settings - ...(await readFile(path) - .catch(() => '{}') - .then((buf) => buf.toString()) - .then((str) => json5.parse>(str)) - .catch(() => ({}) as Record)), - - ...{ - 'editor.formatOnSave': true, - 'editor.formatOnType': true, - 'editor.formatOnPaste': true, - 'editor.defaultFormatter': 'esbenp.prettier-vscode', - 'eslint.validate': [ - 'typescript', - 'javascript', - 'typescriptreact', - 'javascriptreact', - 'json', - 'jsonc', - ], - - 'files.exclude': { - ...(output_dir != null - ? { [`**/${output_dir}/`]: true } - : {}), - ...(technologies.includes('nextjs') - ? { '.next/': true } - : {}), - '**/coverage/': true, - }, + JSON.stringify({ + // bring in existing settings + ...(await readFile(path) + .catch(() => '{}') + .then((buf) => buf.toString()) + .then((str) => json5.parse>(str)) + .catch((): Record => ({}))), + + ...{ + 'editor.formatOnSave': true, + 'editor.formatOnType': true, + 'editor.formatOnPaste': true, + 'editor.defaultFormatter': 'esbenp.prettier-vscode', + 'eslint.validate': [ + 'typescript', + 'javascript', + 'typescriptreact', + 'javascriptreact', + 'json', + 'jsonc', + ], + + 'files.exclude': { + ...(output_dir != null ? { [`**/${output_dir}/`]: true } : {}), + ...(technologies.includes('nextjs') ? { '.next/': true } : {}), + '**/coverage/': true, }, - - ...(languages.includes('js') || languages.includes('ts') - ? { - 'typescript.format.enable': false, - 'javascript.format.enable': false, - - 'typescript.tsdk': `./node_modules/${deps.d.depend('typescript')}/lib`, - - ...(languages.includes('ts') && - technologies.includes('jest') - ? {} - : { - 'nodejs-testing.extensions': [ - { - extensions: ['mjs', 'cjs', 'js'], - parameters: [], - }, - { - extensions: ['mts', 'cts', 'ts'], - parameters: [`--import=${deps.d.depend('tsx')}`], - }, - ], - }), - } - : {}), - ...(languages.includes('rb') - ? { - '[ruby]': { - 'editor.defaultFormatter': 'esbenp.prettier-vscode', - }, - } - : {}), - }), - ), - overwrite, + }, + + ...(languages.includes('js') || languages.includes('ts') + ? { + 'typescript.format.enable': false, + 'javascript.format.enable': false, + + 'typescript.tsdk': `./node_modules/${deps.d.depend('typescript')}/lib`, + + ...(languages.includes('ts') && technologies.includes('jest') + ? {} + : { + 'nodejs-testing.extensions': [ + { + extensions: ['mjs', 'cjs', 'js'], + parameters: [], + }, + { + extensions: ['mts', 'cts', 'ts'], + parameters: [`--import=${deps.d.depend('tsx')}`], + }, + ], + }), + } + : {}), + ...(languages.includes('rb') + ? { + '[ruby]': { + 'editor.defaultFormatter': 'esbenp.prettier-vscode', + }, + } + : {}), + }), ), + overwrite, ), + ), Promise.resolve('.vscode/extensions.json') .then((path) => @@ -163,27 +154,23 @@ export async function create_vscode_config({ ), ), - Promise.resolve('.vscode/launch.json') - .then((path) => - verify_missing({ path, remove: false, reject: true }).then(() => path), - ) - .then(async (path) => { - // bring in existing settings - const existing = await readFile(path) - .catch(() => '{}') - .then((buf) => buf.toString()) - .then((str) => json5.parse(str)) - .catch(() => ({}) as LaunchJson); - - function is_attach(cfg: LaunchConfiguration): boolean { - return cfg.name === 'Attach'; - } - - return create_file( + Promise.resolve('.vscode/launch.json').then(async (path) => { + // bring in existing settings + const existing = await readFile(path) + .catch(() => '{}') + .then((buf) => buf.toString()) + .then((str) => json5.parse(str)) + .catch((): LaunchJson => ({})); + + function is_attach(cfg: LaunchConfiguration): boolean { + return cfg.name === 'Attach'; + } + + return create_file( + path, + await prettify( path, - await prettify( - path, - stripIndent` + stripIndent` // https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations ${JSON.stringify({ ...existing, @@ -204,12 +191,12 @@ export async function create_vscode_config({ ] : []), ], - } as LaunchJson)} + })} `, - ), - overwrite, - ); - }), + ), + overwrite, + ); + }), ]); return deps; diff --git a/packages/create-configs/src/steps/language-configuration.ts b/packages/create-configs/src/steps/language-configuration.ts index 0268e017..899c99e9 100644 --- a/packages/create-configs/src/steps/language-configuration.ts +++ b/packages/create-configs/src/steps/language-configuration.ts @@ -142,7 +142,7 @@ export async function create_ts_config({ library, input_dir, output_dir, - overwrite = true, + overwrite, lenient, }: CreateTSConfigOptions): Promise { const base = 'tsconfig.json'; @@ -181,7 +181,7 @@ export async function create_ts_config({ export async function set_package_type({ technologies, library, - overwrite = true, + overwrite, }: Pick) { if (overwrite || (await exec(`npm pkg get type`)).stdout === '{}') { const type: 'commonjs' | 'module' = diff --git a/packages/create-configs/src/steps/lint-configuration.spec.ts b/packages/create-configs/src/steps/lint-configuration.spec.ts index 1333b34a..0fb6dd84 100644 --- a/packages/create-configs/src/steps/lint-configuration.spec.ts +++ b/packages/create-configs/src/steps/lint-configuration.spec.ts @@ -1,8 +1,13 @@ import { describe, it, expect, beforeAll, afterAll, jest } from '@jest/globals'; -import { parse } from 'yaml'; import '@code-style/utils/testing/assert/matchers'; import * as utils from '../utils.js'; +function import_specifiers(content: string): string[] { + return [...content.matchAll(/^import .* from '([^']+)';$/gmu)].flatMap( + (match) => match[1] ?? [], + ); +} + describe('lint-configuration', () => { beforeAll(() => { jest.unstable_mockModule('../utils', () => { @@ -28,26 +33,25 @@ describe('lint-configuration', () => { technologies: ['jest'], lenient: false, }); - // ensure output is valid YAML - expect(() => parse(output.content) as unknown).not.toThrow(); - const parsed: { root: boolean; extends: string[] } = parse( - output.content, - ) as typeof parsed; // ensure we have a leading comment - expect(output.content).toMatch(/^#/u); - // ensure config is set to root - expect(parsed.root).toBe(true); - // ensure we include relevant configs - const dependencies = [ + expect(output.content).toMatch(/^\/\/ In order to update the config/u); + // ensure the config composes the relevant packages, in order + const config_packages = [ '@code-style/eslint-config', '@code-style/eslint-config-browser', '@code-style/eslint-config-typescript', '@code-style/eslint-config-jest', ]; - expect(parsed.extends).toStrictEqual(dependencies); + expect(import_specifiers(output.content)).toStrictEqual([ + 'eslint/config', + ...config_packages, + ]); + expect(output.content).toContain( + 'export default defineConfig(base, browser, typescript, jest);', + ); expect(output.dependencies.development).toEqual( - new Set(dependencies.map((d) => `${d}@mock`)), + new Set([...config_packages.map((d) => `${d}@mock`), 'eslint']), ); }); @@ -62,18 +66,12 @@ describe('lint-configuration', () => { technologies: ['jest'], lenient: true, }); - // ensure output is valid YAML - expect(() => parse(output.content) as unknown).not.toThrow(); - const parsed: { root: boolean; extends: string[] } = parse( - output.content, - ) as typeof parsed; // ensure we have a leading comment - expect(output.content).toMatch(/^#/u); - // ensure config is set to root - expect(parsed.root).toBe(true); - // ensure we include relevant configs - expect(parsed.extends).toEqual([ + expect(output.content).toMatch(/^\/\/ In order to update the config/u); + // ensure the config composes the relevant packages, in order + expect(import_specifiers(output.content)).toStrictEqual([ + 'eslint/config', '@code-style/eslint-config', '@code-style/eslint-config/lenient', '@code-style/eslint-config-browser', @@ -82,33 +80,107 @@ describe('lint-configuration', () => { '@code-style/eslint-config-jest', '@code-style/eslint-config-jest/lenient', ]); + expect(output.content).toContain( + 'export default defineConfig(base, base_lenient, browser, typescript, typescript_lenient, jest, jest_lenient);', + ); expect(output.dependencies.development).toEqual( new Set([ '@code-style/eslint-config@mock', '@code-style/eslint-config-browser@mock', '@code-style/eslint-config-typescript@mock', '@code-style/eslint-config-jest@mock', + 'eslint', ]), ); }); + + it(`should generate cli lenient config`, async () => { + const { _generate_eslint_config } = await import( + './lint-configuration.js' + ); + + const output = _generate_eslint_config({ + project_type: 'cli', + languages: ['js'], + technologies: [], + lenient: true, + }); + + // eslint-config-cli has no lenient config + expect(import_specifiers(output.content)).toStrictEqual([ + 'eslint/config', + '@code-style/eslint-config', + '@code-style/eslint-config/lenient', + '@code-style/eslint-config-node', + '@code-style/eslint-config-node/lenient', + '@code-style/eslint-config-cli', + ]); + expect(output.content).toContain( + 'export default defineConfig(base, base_lenient, node, node_lenient, cli);', + ); + }); }); - describe('_transform_eslint_package_name', () => { - it(`should transform eslint package names`, async () => { - const { _transform_eslint_package_name } = await import( + describe('_convert_legacy_eslint_config', () => { + it(`should carry over rules, ignores, and overrides`, async () => { + const { _convert_legacy_eslint_config } = await import( './lint-configuration.js' ); - expect(_transform_eslint_package_name('foo')).toEqual( - 'eslint-config-foo', + const output = _convert_legacy_eslint_config( + { + root: true, + extends: ['@code-style/eslint-config'], + env: { node: true }, + ignorePatterns: ['/generated/'], + rules: { 'no-console': 'off' }, + overrides: [ + { + files: ['*.test.ts', 'src/legacy/**'], + excludedFiles: 'src/legacy/keep.ts', + rules: { 'max-lines': 'off' }, + }, + ], + }, + '# build output\ndist\n', ); - expect(_transform_eslint_package_name('@foo')).toEqual( - '@foo/eslint-config', + expect(output.ignores).toStrictEqual(['generated/', '**/dist']); + // (the set matcher compares array entries by reference, so check each config) + expect(output.configs).toHaveLength(2); + expect(output.configs[0]).toEqual({ rules: { 'no-console': 'off' } }); + expect(output.configs[1]).toEqual({ + files: ['**/*.test.ts', 'src/legacy/**'], + ignores: ['src/legacy/keep.ts'], + rules: { 'max-lines': 'off' }, + }); + // `root` & `extends` are replaced by the generated config + expect(output.unmigrated).toStrictEqual(['env']); + }); + }); + + describe('_generate_eslint_config with a legacy config', () => { + it(`should include the carried over config`, async () => { + const { _generate_eslint_config } = await import( + './lint-configuration.js' ); - expect(_transform_eslint_package_name('@foo/bar')).toEqual( - '@foo/eslint-config-bar', + const output = _generate_eslint_config( + { + project_type: 'backend', + languages: ['js'], + technologies: [], + lenient: false, + }, + { ignores: ['**/dist'], configs: [{ rules: { 'no-console': 'off' } }] }, + ); + + expect(import_specifiers(output.content)[0]).toBe('eslint/config'); + expect(output.content).toContain( + `import { defineConfig, globalIgnores } from 'eslint/config';`, + ); + expect(output.content).toContain( + `export default defineConfig(globalIgnores(["**/dist"]), base, node, {"rules":{"no-console":"off"}});`, ); }); }); diff --git a/packages/create-configs/src/steps/lint-configuration.ts b/packages/create-configs/src/steps/lint-configuration.ts index b594f2df..ee677566 100644 --- a/packages/create-configs/src/steps/lint-configuration.ts +++ b/packages/create-configs/src/steps/lint-configuration.ts @@ -1,5 +1,8 @@ -import { stringify } from 'yaml'; -import type { ESLint } from 'eslint'; +import { readFile } from 'node:fs/promises'; +import { convertIgnorePatternToMinimatch } from '@eslint/config-helpers'; +import chalk from 'chalk'; +import type { Linter } from 'eslint'; +import { parse, stringify } from 'yaml'; import type { Config } from 'stylelint'; import { CodeStyleSetupOptions as SetupOptions, @@ -15,139 +18,199 @@ import { version as v, } from '../utils.js'; -/** @private */ -export function _transform_eslint_package_name(extend: string): string { - if (extend.includes('eslint-config')) return extend; - - if (extend.startsWith('@')) { - return extend - .replace(/^(@[^/]+)\/(\S+)$/iu, '$1/eslint-config-$2') - .replace(/^(@[^/]+)$/iu, '$1/eslint-config'); - } else { - return extend.replace(/^([^@/]+)$/iu, 'eslint-config-$1'); - } +interface EslintConfigEntry { + /** package the config array comes from */ + pkg: string; + /** subpath within the package */ + subpath?: 'lenient'; + /** identifier the import is bound to */ + alias: string; } -/** @private */ -export function _generate_dependency_list(config: ESLint.ConfigData): string[] { - if (Array.isArray(config.extends)) { - return config.extends.map(_transform_eslint_package_name); - } else if (typeof config.extends === 'string') { - return [_transform_eslint_package_name(config.extends)]; - } else { - return []; - } +/** Config carried over from an existing eslintrc config. */ +interface LegacyConfig { + ignores: string[]; + configs: Linter.Config[]; } /** @private */ -export function _generate_eslint_config({ - project_type, - languages, - technologies, - lenient, -}: Pick< - SetupOptions, - 'project_type' | 'languages' | 'technologies' | 'lenient' ->): ConfigFile { +export function _generate_eslint_config( + { + project_type, + languages, + technologies, + lenient, + }: Pick< + SetupOptions, + 'project_type' | 'languages' | 'technologies' | 'lenient' + >, + legacy: LegacyConfig = { ignores: [], configs: [] }, +): ConfigFile { const deps = new Dependencies(); - const config: ESLint.ConfigData & { extends: string[] } = { - root: true, - extends: [deps.d.depend('@code-style/eslint-config', { v })], - parserOptions: { - ecmaVersion: 2022, - }, - }; - if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config', { v })}/lenient`, - ); + const entries: EslintConfigEntry[] = []; + + function add(pkg: string, alias: string, subpath?: 'lenient'): void { + deps.d.depend(pkg, { v }); + entries.push({ + pkg, + subpath, + alias: subpath == null ? alias : `${alias}_${subpath}`, + }); + } + + add('@code-style/eslint-config', 'base'); + if (lenient) add('@code-style/eslint-config', 'base', 'lenient'); switch (project_type) { case 'web-app': - config.extends.push( - deps.d.depend('@code-style/eslint-config-browser', { v }), - ); + add('@code-style/eslint-config-browser', 'browser'); if (technologies.includes('react') || technologies.includes('nextjs')) { deps.p.add(['react', 'react-dom']); - config.extends.push( - deps.d.depend('@code-style/eslint-config-react', { v }), - ); + add('@code-style/eslint-config-react', 'react'); } if (technologies.includes('nextjs')) { deps.p.add(['react', 'react-dom']); - config.extends.push( - deps.d.depend('@code-style/eslint-config-nextjs', { v }), - ); + add('@code-style/eslint-config-nextjs', 'nextjs'); } break; case 'backend': - config.extends.push( - deps.d.depend('@code-style/eslint-config-node', { v }), - ); - if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config-node', { v })}/lenient`, - ); + add('@code-style/eslint-config-node', 'node'); + if (lenient) add('@code-style/eslint-config-node', 'node', 'lenient'); if (technologies.includes('nestjs')) { - config.extends.push( - deps.d.depend('@code-style/eslint-config-nest', { v }), - ); + add('@code-style/eslint-config-nest', 'nest'); } break; case 'cli': - config.extends.push( - deps.d.depend('@code-style/eslint-config-node', { v }), - ); - if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config-node', { v })}/lenient`, - ); - - config.extends.push( - deps.d.depend('@code-style/eslint-config-cli', { v }), - ); - if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config-cli', { v })}/lenient`, - ); + add('@code-style/eslint-config-node', 'node'); + if (lenient) add('@code-style/eslint-config-node', 'node', 'lenient'); + + add('@code-style/eslint-config-cli', 'cli'); break; } if (languages.includes('ts')) { - config.extends.push( - deps.d.depend('@code-style/eslint-config-typescript', { v }), - ); + add('@code-style/eslint-config-typescript', 'typescript'); if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config-typescript', { v })}/lenient`, - ); + add('@code-style/eslint-config-typescript', 'typescript', 'lenient'); } if (technologies.includes('jest')) { - config.extends.push(deps.d.depend('@code-style/eslint-config-jest', { v })); - if (lenient) - config.extends.push( - `${deps.d.depend('@code-style/eslint-config-jest', { v })}/lenient`, - ); + add('@code-style/eslint-config-jest', 'jest'); + if (lenient) add('@code-style/eslint-config-jest', 'jest', 'lenient'); } if (technologies.includes('esm')) - config.extends.push( - deps.d.depend('@code-style/eslint-config-esmodule', { v }), - ); + add('@code-style/eslint-config-esmodule', 'esmodule'); - return { - content: [ - `# In order to update the config, update:`, - _generate_dependency_list(config) - .map((p) => `# ${p}`) - .join('\n'), - stringify(config), - ].join('\n'), - dependencies: deps, - }; + // the config packages only peer-depend on eslint + deps.d.depend('eslint'); + + const source_packages = [...new Set(entries.map((entry) => entry.pkg))]; + + const content = [ + `// In order to update the config, update:`, + source_packages.map((pkg) => `// ${pkg}`).join('\n'), + legacy.ignores.length > 0 + ? `import { defineConfig, globalIgnores } from 'eslint/config';` + : `import { defineConfig } from 'eslint/config';`, + '', + entries + .map( + (entry) => + `import { config as ${entry.alias} } from '${entry.pkg}${ + entry.subpath == null ? '' : `/${entry.subpath}` + }';`, + ) + .join('\n'), + '', + `export default defineConfig(${[ + ...(legacy.ignores.length > 0 + ? [`globalIgnores(${JSON.stringify(legacy.ignores)})`] + : []), + ...entries.map((entry) => entry.alias), + ...legacy.configs.map((config) => JSON.stringify(config)), + ].join(', ')});`, + ].join('\n'); + + return { content, dependencies: deps }; +} + +/** Top-level eslintrc keys whose values the generated config replaces. */ +const replaced_eslintrc_keys = new Set(['root', 'extends', 'parserOptions']); + +/** Converts an eslintrc `files` pattern (matched against basenames when it has no `/`). */ +function convert_eslintrc_glob(pattern: string): string { + return pattern.includes('/') + ? pattern.replace(/^\.?\//u, '') + : `**/${pattern}`; +} + +/** + * Converts the rules & ignores a project added to its eslintrc config into + * flat config, so they survive replacing it. + * @private + */ +export function _convert_legacy_eslint_config( + eslintrc: Linter.LegacyConfig, + eslintignore = '', +): LegacyConfig & { unmigrated: string[] } { + const unmigrated = Object.keys(eslintrc).filter( + (key) => + !replaced_eslintrc_keys.has(key) && + !['rules', 'ignorePatterns', 'overrides'].includes(key), + ); + + const ignores = [ + ...[eslintrc.ignorePatterns ?? []].flat(), + ...eslintignore + .split('\n') + .map((line) => line.trim()) + .filter((line) => line !== '' && !line.startsWith('#')), + ].map((pattern) => convertIgnorePatternToMinimatch(pattern)); + + const configs: Linter.Config[] = []; + if (eslintrc.rules != null && Object.keys(eslintrc.rules).length > 0) { + configs.push({ rules: eslintrc.rules }); + } + for (const override of eslintrc.overrides ?? []) { + const { files, excludedFiles, rules, ...rest } = override; + unmigrated.push(...Object.keys(rest).map((key) => `overrides[].${key}`)); + if (rules == null) continue; + configs.push({ + files: [files].flat().map(convert_eslintrc_glob), + ...(excludedFiles != null + ? { ignores: [excludedFiles].flat().map(convert_eslintrc_glob) } + : {}), + rules, + }); + } + + return { ignores, configs, unmigrated }; +} + +async function read_legacy_eslint_config(): Promise { + const eslintrc = await Promise.any( + ['.eslintrc', '.eslintrc.yaml', '.eslintrc.yml', '.eslintrc.json'].map( + async (path) => + parse(await readFile(path, 'utf-8')) as Linter.LegacyConfig, + ), + ).catch(() => ({})); + const eslintignore = await readFile('.eslintignore', 'utf-8').catch(() => ''); + + const { unmigrated, ...legacy } = _convert_legacy_eslint_config( + eslintrc, + eslintignore, + ); + if (unmigrated.length > 0) { + console.warn( + chalk.yellow( + `Couldn't migrate these eslintrc settings, so add them to eslint.config.mjs by hand: ${unmigrated.join(', ')}`, + ), + ); + } + return legacy; } export async function create_eslint_config({ @@ -155,24 +218,31 @@ export async function create_eslint_config({ languages, technologies, lenient, - overwrite = true, + overwrite, }: Pick< SetupOptions, 'project_type' | 'languages' | 'technologies' | 'lenient' | 'overwrite' >): Promise { - const preferred = '.eslintrc.yaml'; + const preferred = 'eslint.config.mjs'; + // read before the old config gets removed + const legacy = await read_legacy_eslint_config(); if ( await verify_missing({ - path: [preferred, /^\.?eslint(rc|\.config)\.([mc]?js|ya?ml|json)$/u], + path: [ + preferred, + // legacy eslintrc files (unsupported by ESLint 10) and `.eslintignore` + /^\.eslintrc(\.([cm]?js|ya?ml|json))?$/u, + '.eslintignore', + // other flat config filenames + /^eslint\.config\.([cm]?[jt]s)$/u, + ], remove: overwrite, }) ) { - const config = _generate_eslint_config({ - project_type, - languages, - technologies, - lenient, - }); + const config = _generate_eslint_config( + { project_type, languages, technologies, lenient }, + legacy, + ); await create_file(preferred, await prettify(preferred, config.content)); @@ -205,7 +275,7 @@ export function _generate_stylelint_config(languages: Language[]): ConfigFile { export async function create_stylelint_config({ languages, lenient, - overwrite = true, + overwrite, }: Pick): Promise< ConfigFile['dependencies'] | undefined > { diff --git a/packages/create-configs/src/steps/scripts.spec.ts b/packages/create-configs/src/steps/scripts.spec.ts index c0acbb7f..7e498527 100644 --- a/packages/create-configs/src/steps/scripts.spec.ts +++ b/packages/create-configs/src/steps/scripts.spec.ts @@ -12,16 +12,11 @@ describe('scripts', () => { const output = _generate_lint_script({ builder: 'esbuild', languages: ['ts'], - technologies: ['react'], }); it(`should create lint scripts`, () => { expect(output.scripts.lint).toMatch(/concurrently.+'npm:lint:\*'/u); - expect(output.scripts['lint:js']).toMatch(/^eslint /u); - expect(output.scripts['lint:js']).toMatch(/ --ext /u); - expect( - output.scripts['lint:js']?.match(/--ext (\S+)\b/u)?.[1]?.split(','), - ).toEqual(['ts', 'tsx', 'json']); + expect(output.scripts['lint:js']).toEqual('eslint . --cache'); }); test_no_shell_globs(Object.values(output.scripts)); @@ -32,16 +27,11 @@ describe('scripts', () => { const output = _generate_lint_script({ builder: 'esbuild', languages: ['ts', 'js'], - technologies: [], }); it(`should create lint scripts`, () => { expect(output.scripts.lint).toMatch(/concurrently.+'npm:lint:\*'/u); - expect(output.scripts['lint:js']).toMatch(/^eslint /u); - expect(output.scripts['lint:js']).toMatch(/ --ext /u); - expect( - output.scripts['lint:js']?.match(/--ext (\S+)\b/u)?.[1]?.split(','), - ).toEqual(['js', 'ts', 'json']); + expect(output.scripts['lint:js']).toEqual('eslint . --cache'); }); test_no_shell_globs(Object.values(output.scripts)); @@ -52,7 +42,6 @@ describe('scripts', () => { const output = _generate_lint_script({ builder: 'esbuild', languages: ['css'], - technologies: [], }); it(`should create lint scripts`, () => { @@ -69,7 +58,6 @@ describe('scripts', () => { const output = _generate_lint_script({ builder: 'esbuild', languages: ['css', 'scss'], - technologies: [], }); it(`should create lint scripts`, () => { diff --git a/packages/create-configs/src/steps/scripts.ts b/packages/create-configs/src/steps/scripts.ts index c8b8a407..b2e0d4f4 100644 --- a/packages/create-configs/src/steps/scripts.ts +++ b/packages/create-configs/src/steps/scripts.ts @@ -155,7 +155,7 @@ export function _generate_build_script({ break; default: console.warn( - chalk.yellow`Build scripts using "${builder}" are not at this time`, + chalk.yellow(`Build scripts using "${builder}" are not at this time`), ); } } @@ -173,9 +173,8 @@ type LintScripts = { /** @private */ export function _generate_lint_script({ languages, - technologies, builder, -}: Pick): { +}: Pick): { scripts: LintScripts; dependencies: Dependencies; } { @@ -193,17 +192,7 @@ export function _generate_lint_script({ case 'eslint': return { ...scripts, - 'lint:js': `${deps.d.depend('@code-style/eslint-config', { cmd: 'eslint', v })} . --ext ${languages - .filter((l) => ['js', 'ts'].includes(l)) - .reduce( - (extensions, ext) => [ - ext, - ...(technologies.includes('react') ? [`${ext}x`] : []), - ...extensions, - ], - ['json'], - ) - .join(',')} --cache`, + 'lint:js': `${deps.d.depend('eslint')} . --cache`, }; case 'stylelint': return { diff --git a/packages/create-configs/src/utils.spec.ts b/packages/create-configs/src/utils.spec.ts index 040f122e..f3e36aaf 100644 --- a/packages/create-configs/src/utils.spec.ts +++ b/packages/create-configs/src/utils.spec.ts @@ -1,6 +1,15 @@ -import { describe, it, expect } from '@jest/globals'; +import { mkdtemp, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { describe, it, expect, beforeEach, afterEach } from '@jest/globals'; import '@code-style/utils/testing/assert/matchers'; -import { Dependencies, DependencySet, is_dependencies_array } from './utils.js'; +import { + Dependencies, + DependencySet, + file_exists, + is_dependencies_array, + verify_missing, +} from './utils.js'; describe('utils', () => { describe('DependencySet', () => { @@ -84,4 +93,54 @@ describe('utils', () => { expect(is_dependencies_array([new Dependencies()])).toBe(true); }); }); + + describe('verify_missing', () => { + const prettier_paths = [ + '.prettierrc.mjs', + /^\.?prettier(rc|\.config)?(\.(json[5c]?|ya?ml|toml|[mc]?js))?$/u, + ]; + const original_cwd = process.cwd(); + let dir: string; + + beforeEach(async () => { + dir = await mkdtemp(join(tmpdir(), 'verify-missing-')); + process.chdir(dir); + }); + afterEach(async () => { + process.chdir(original_cwd); + await rm(dir, { recursive: true, force: true }); + }); + + it('should be true when no file matches', async () => { + await expect(verify_missing({ path: prettier_paths })).resolves.toBe( + true, + ); + }); + + it('should be false when a file matches and remove is off', async () => { + await writeFile('.prettierrc.json', '{}'); + await expect(verify_missing({ path: prettier_paths })).resolves.toBe( + false, + ); + await expect(file_exists('.prettierrc.json')).resolves.toEqual([ + '.prettierrc.json', + ]); + }); + + it('should throw when a file matches and reject is on', async () => { + await writeFile('.prettierrc.json', '{}'); + await expect( + verify_missing({ path: prettier_paths, reject: true }), + ).rejects.toThrow('.prettierrc.json'); + }); + + it('should remove a file matched by several patterns', async () => { + // both patterns match, which used to race to delete the file twice + await writeFile('.prettierrc.mjs', 'export default {};'); + await expect( + verify_missing({ path: prettier_paths, remove: true }), + ).resolves.toBe(true); + await expect(file_exists('.prettierrc.mjs')).resolves.toBe(false); + }); + }); }); diff --git a/packages/create-configs/src/utils.ts b/packages/create-configs/src/utils.ts index 9903b93e..df9f2cda 100644 --- a/packages/create-configs/src/utils.ts +++ b/packages/create-configs/src/utils.ts @@ -10,6 +10,7 @@ import { writeFile, } from 'node:fs/promises'; import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; import assert from 'node:assert'; import { cwd } from 'node:process'; import { format, Options } from 'prettier'; @@ -79,31 +80,25 @@ export async function verify_missing({ reject = false, }: VerifyMissingOptions): Promise { const paths = Array.isArray(path) ? path : [path]; - return Promise.all( - paths.map(async (path) => { - const existing_files = await file_exists(path); - if (existing_files !== false) { - if (remove) { - await Promise.all( - existing_files.map((existing_file) => rm(existing_file)), - ); - return true; - } else { - const message = `File "${path}" already exists.`; - if (reject) { - throw new Error(message); - } else { - console.info(message); - return false; - } - } - } else { - return true; - } - }), - ) - .then(() => true) - .catch(() => false); + // patterns can match the same file, so collect every match before deleting + const existing_files = [ + ...new Set( + (await Promise.all(paths.map((path) => file_exists(path)))).flatMap( + (files) => (files === false ? [] : files), + ), + ), + ]; + + if (existing_files.length === 0) return true; + if (remove) { + await Promise.all(existing_files.map((existing_file) => rm(existing_file))); + return true; + } + + const message = `File "${existing_files.join('", "')}" already exists.`; + if (reject) throw new Error(message); + console.info(message); + return false; } export type VerifyMissingScriptOptions = Omit< @@ -123,7 +118,7 @@ export type VerifyMissingScriptOptions = Omit< export async function verify_missing_script({ path, json_paths: _json_paths, - overwrite = false, + overwrite, reject = false, }: VerifyMissingScriptOptions): Promise { const json_paths = Array.isArray(_json_paths) ? _json_paths : [_json_paths]; @@ -189,7 +184,7 @@ export class DependencySet extends Set { { cmd: command = dependency, v: version }: DependOptions = {}, ): string { assert( - dependency.match(/^(?:[a-z0-9-_.]+|@[a-z0-9-_.]+\/[a-z0-9-_.]+)$/u) != + /^(?:[a-z0-9-_.]+|@[a-z0-9-_.]+\/[a-z0-9-_.]+)$/u.exec(dependency) != null, `Must be a valid package name.`, ); @@ -267,7 +262,7 @@ export async function find_nearest_package( } export const version: string = await readFile( - await find_nearest_package(import.meta.dirname), + await find_nearest_package(dirname(fileURLToPath(import.meta.url))), 'utf-8', ) .then((str) => JSON.parse(str) as unknown) diff --git a/packages/eslint-config-browser/README.md b/packages/eslint-config-browser/README.md index c514babf..4a87422a 100644 --- a/packages/eslint-config-browser/README.md +++ b/packages/eslint-config-browser/README.md @@ -15,9 +15,11 @@ My browser eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-browser' + import { config as base } from '@code-style/eslint-config'; + +import { config as browser } from '@code-style/eslint-config-browser'; + + -export default defineConfig(base); + +export default defineConfig(base, browser); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-browser/base.yaml b/packages/eslint-config-browser/base.yaml deleted file mode 100644 index 5c9fc4c2..00000000 --- a/packages/eslint-config-browser/base.yaml +++ /dev/null @@ -1,2 +0,0 @@ -env: - browser: true diff --git a/packages/eslint-config-browser/examples/.eslintrc.yaml b/packages/eslint-config-browser/examples/.eslintrc.yaml deleted file mode 100644 index 557076fe..00000000 --- a/packages/eslint-config-browser/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/browser' diff --git a/packages/eslint-config-browser/examples/eslint.config.mjs b/packages/eslint-config-browser/examples/eslint.config.mjs new file mode 100644 index 00000000..554897f4 --- /dev/null +++ b/packages/eslint-config-browser/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as browser } from '@code-style/eslint-config-browser'; + +export default defineConfig(base, browser); diff --git a/packages/eslint-config-browser/package.json b/packages/eslint-config-browser/package.json index f437dace..35468d3f 100644 --- a/packages/eslint-config-browser/package.json +++ b/packages/eslint-config-browser/package.json @@ -16,27 +16,35 @@ }, "license": "MIT", "author": "Louis Orleans ", + "type": "module", "exports": { - ".": "./base.yaml", - "./base": "./base.yaml", - "./*.yaml": "./*.yaml" + ".": "./dist/base.js", + "./*": "./dist/*.js" }, - "main": "base.yaml", + "main": "dist/base.js", "files": [ - "./base.yaml" + "./dist/" ], "scripts": { + "build": "concurrently --raw --group 'npm:build:*'", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*') --outdir=dist --sourcemap=inline --platform=node --target=node20 --format=esm", + "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", + "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, + "dependencies": { + "globals": "^16.0.0" + }, "devDependencies": { + "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-browser/src/base.ts b/packages/eslint-config-browser/src/base.ts new file mode 100644 index 00000000..8002e02a --- /dev/null +++ b/packages/eslint-config-browser/src/base.ts @@ -0,0 +1,11 @@ +import type { Linter } from 'eslint'; +import globals from 'globals'; + +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-browser/base', + languageOptions: { + globals: globals.browser, + }, + }, +]; diff --git a/packages/eslint-config-browser/test/index.ts b/packages/eslint-config-browser/test/index.ts index 446f76f3..289a2101 100644 --- a/packages/eslint-config-browser/test/index.ts +++ b/packages/eslint-config-browser/test/index.ts @@ -2,10 +2,10 @@ import { describe, it } from 'node:test'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testRuleFail } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as browser } from '@code-style/eslint-config-browser'; -const linter = initESLint({ - extends: ['@code-style', '@code-style/browser'], -}); +const linter = initESLint([...base, ...browser]); void describe('eslint-config-browser', () => { defaultTestSet(linter); diff --git a/packages/eslint-config-browser/tsconfig.build.json b/packages/eslint-config-browser/tsconfig.build.json new file mode 100644 index 00000000..6b51a225 --- /dev/null +++ b/packages/eslint-config-browser/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "baseUrl": "./" + }, + "include": ["src/"], + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/eslint-config-browser/tsconfig.json b/packages/eslint-config-browser/tsconfig.json new file mode 100644 index 00000000..f938419c --- /dev/null +++ b/packages/eslint-config-browser/tsconfig.json @@ -0,0 +1,14 @@ +// In order to update the config, update @code-style/typescript-configs +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/library" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["./"], + "exclude": ["dist/"] +} diff --git a/packages/eslint-config-cli/README.md b/packages/eslint-config-cli/README.md index b0f8e72a..8b2be911 100644 --- a/packages/eslint-config-cli/README.md +++ b/packages/eslint-config-cli/README.md @@ -15,9 +15,11 @@ My CLI project eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-cli' + import { config as base } from '@code-style/eslint-config'; + +import { config as cli } from '@code-style/eslint-config-cli'; + + -export default defineConfig(base); + +export default defineConfig(base, cli); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-cli/base.yaml b/packages/eslint-config-cli/base.yaml deleted file mode 100644 index 0ffb8408..00000000 --- a/packages/eslint-config-cli/base.yaml +++ /dev/null @@ -1,7 +0,0 @@ -rules: - # Allow scripts to log with `console`. - # Since we're creating a CLI app, we're probably just trying to show output to the user. - no-console: 'off' - - # Allow scripts to exit. - n/no-process-exit: 'off' diff --git a/packages/eslint-config-cli/examples/.eslintrc.yaml b/packages/eslint-config-cli/examples/.eslintrc.yaml deleted file mode 100644 index a8cff2f3..00000000 --- a/packages/eslint-config-cli/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/cli' diff --git a/packages/eslint-config-cli/examples/eslint.config.mjs b/packages/eslint-config-cli/examples/eslint.config.mjs new file mode 100644 index 00000000..1df3d59e --- /dev/null +++ b/packages/eslint-config-cli/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as cli } from '@code-style/eslint-config-cli'; + +export default defineConfig(base, cli); diff --git a/packages/eslint-config-cli/package.json b/packages/eslint-config-cli/package.json index 7ed5cdd4..8fb7b87b 100644 --- a/packages/eslint-config-cli/package.json +++ b/packages/eslint-config-cli/package.json @@ -16,29 +16,32 @@ }, "license": "MIT", "author": "Louis Orleans ", + "type": "module", "exports": { - ".": "./base.yaml", - "./base": "./base.yaml", - "./*.yaml": "./*.yaml" + ".": "./dist/base.js", + "./*": "./dist/*.js" }, - "main": "base.yaml", + "main": "dist/base.js", "files": [ - "./base.yaml" + "./dist/" ], "scripts": { + "build": "concurrently --raw --group 'npm:build:*'", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*') --outdir=dist --sourcemap=inline --platform=node --target=node20 --format=esm", + "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", + "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-cli/src/base.ts b/packages/eslint-config-cli/src/base.ts new file mode 100644 index 00000000..75feb42f --- /dev/null +++ b/packages/eslint-config-cli/src/base.ts @@ -0,0 +1,17 @@ +import type { Linter } from 'eslint'; + +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-cli/base', + rules: { + /** + * Allow scripts to log with `console`. + * Since we're creating a CLI app, we're probably just trying to show output to the user. + */ + 'no-console': 'off', + + // Allow scripts to exit. + 'n/no-process-exit': 'off', + }, + }, +]; diff --git a/packages/eslint-config-cli/test/index.ts b/packages/eslint-config-cli/test/index.ts index 8a1b4e63..580c113a 100644 --- a/packages/eslint-config-cli/test/index.ts +++ b/packages/eslint-config-cli/test/index.ts @@ -2,14 +2,11 @@ import { describe, it } from 'node:test'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testNoFail } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as cli } from '@code-style/eslint-config-cli'; -const linter = initESLint({ - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-node', - '@code-style/eslint-config-cli', - ], -}); +const linter = initESLint([...base, ...node, ...cli]); void describe('eslint-config-cli base', () => { defaultTestSet(linter); diff --git a/packages/eslint-config-cli/tsconfig.build.json b/packages/eslint-config-cli/tsconfig.build.json new file mode 100644 index 00000000..6b51a225 --- /dev/null +++ b/packages/eslint-config-cli/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "baseUrl": "./" + }, + "include": ["src/"], + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/eslint-config-cli/tsconfig.json b/packages/eslint-config-cli/tsconfig.json new file mode 100644 index 00000000..f938419c --- /dev/null +++ b/packages/eslint-config-cli/tsconfig.json @@ -0,0 +1,14 @@ +// In order to update the config, update @code-style/typescript-configs +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/library" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["./"], + "exclude": ["dist/"] +} diff --git a/packages/eslint-config-esmodule/README.md b/packages/eslint-config-esmodule/README.md index 05c7e07e..fe5f2c39 100644 --- a/packages/eslint-config-esmodule/README.md +++ b/packages/eslint-config-esmodule/README.md @@ -15,9 +15,11 @@ My ES Module eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-esmodule' + import { config as base } from '@code-style/eslint-config'; + +import { config as esmodule } from '@code-style/eslint-config-esmodule'; + + -export default defineConfig(base); + +export default defineConfig(base, esmodule); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-esmodule/examples/.eslintrc.yaml b/packages/eslint-config-esmodule/examples/.eslintrc.yaml deleted file mode 100644 index abe7040e..00000000 --- a/packages/eslint-config-esmodule/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-esmodule' diff --git a/packages/eslint-config-esmodule/examples/eslint.config.mjs b/packages/eslint-config-esmodule/examples/eslint.config.mjs new file mode 100644 index 00000000..fca24eee --- /dev/null +++ b/packages/eslint-config-esmodule/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; + +export default defineConfig(base, esmodule); diff --git a/packages/eslint-config-esmodule/package.json b/packages/eslint-config-esmodule/package.json index ce87b6ef..676f1724 100644 --- a/packages/eslint-config-esmodule/package.json +++ b/packages/eslint-config-esmodule/package.json @@ -17,7 +17,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./*": "./dist/*.js" @@ -28,26 +28,21 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, - "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-import": "^2.28.1" - }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-esmodule/src/base.ts b/packages/eslint-config-esmodule/src/base.ts index 088b35af..3d8dd5b4 100644 --- a/packages/eslint-config-esmodule/src/base.ts +++ b/packages/eslint-config-esmodule/src/base.ts @@ -1,21 +1,18 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - plugins: ['eslint-plugin-import'], +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-esmodule/base', + languageOptions: { + sourceType: 'module', + }, + rules: { + /** Disallow commonjs modules. */ + 'import/no-commonjs': 'error', - parserOptions: { - sourceType: 'module', + // TODO: this could turn off other `no-restricted-syntax` rules unintentionally + /** Turn off the `import` ban from `@code-style/eslint-config/rule-sets/imports`. */ + 'no-restricted-syntax': 'off', + }, }, - - rules: { - /** Disallow commonjs modules. */ - 'import/no-commonjs': 'error', - - // TODO: this could turn off other `no-restricted-syntax1 rules unintentionally - /** Turn off the `import` ban from `@code-style/eslint-config/rule-sets/imports.yaml` */ - 'no-restricted-syntax': 'off', - }, -}; - -export = config; +]; diff --git a/packages/eslint-config-esmodule/test/index.ts b/packages/eslint-config-esmodule/test/index.ts index ec7723e5..6f9b0019 100644 --- a/packages/eslint-config-esmodule/test/index.ts +++ b/packages/eslint-config-esmodule/test/index.ts @@ -6,10 +6,10 @@ import { testRuleFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; -const linter = initESLint({ - extends: ['@code-style', '@code-style/esmodule'], -}); +const linter = initESLint([...base, ...esmodule]); void describe('eslint-config-esmodule base', () => { defaultTestSet(linter); diff --git a/packages/eslint-config-jest/README.md b/packages/eslint-config-jest/README.md index 34372f7b..466f06ec 100644 --- a/packages/eslint-config-jest/README.md +++ b/packages/eslint-config-jest/README.md @@ -15,9 +15,11 @@ My Jest eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-jest' + import { config as base } from '@code-style/eslint-config'; + +import { config as jest } from '@code-style/eslint-config-jest'; + + -export default defineConfig(base); + +export default defineConfig(base, jest); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-jest/examples/.eslintrc.yaml b/packages/eslint-config-jest/examples/.eslintrc.yaml deleted file mode 100644 index da22b74d..00000000 --- a/packages/eslint-config-jest/examples/.eslintrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/node' - - '@code-style/jest' diff --git a/packages/eslint-config-jest/examples/eslint.config.mjs b/packages/eslint-config-jest/examples/eslint.config.mjs new file mode 100644 index 00000000..f2e07a6d --- /dev/null +++ b/packages/eslint-config-jest/examples/eslint.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as jest } from '@code-style/eslint-config-jest'; + +export default defineConfig(base, node, jest); diff --git a/packages/eslint-config-jest/package.json b/packages/eslint-config-jest/package.json index 184331ad..aa47a899 100644 --- a/packages/eslint-config-jest/package.json +++ b/packages/eslint-config-jest/package.json @@ -17,7 +17,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./base": "./dist/base.js", @@ -29,25 +29,24 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-jest": "^27.4.0" + "eslint-plugin-jest": "^29.16.0" }, "devDependencies": { "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "jest": "*" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-jest/src/base.ts b/packages/eslint-config-jest/src/base.ts index 756e6441..8209ac61 100644 --- a/packages/eslint-config-jest/src/base.ts +++ b/packages/eslint-config-jest/src/base.ts @@ -1,42 +1,47 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; -import { test_file_patterns } from './utils'; +import type { Linter } from 'eslint'; +import jestPlugin from 'eslint-plugin-jest'; -const config: ESLint.ConfigData = { - overrides: [ - { - files: test_file_patterns, - extends: ['plugin:eslint-plugin-jest/recommended'], - settings: { - jest: { - version: 'detect', - }, +import { test_file_patterns } from './utils.js'; + +/** The files this config applies to. Scope your own `jest/*` rule changes to these. */ +export const files = test_file_patterns; + +export const config: Linter.Config[] = [ + { + ...jestPlugin.configs['flat/recommended'], + name: '@code-style/eslint-config-jest/recommended', + files: test_file_patterns, + }, + { + name: '@code-style/eslint-config-jest/base', + files: test_file_patterns, + settings: { + jest: { + version: 'detect', }, - rules: { - /** Disallow `return` statements in tests. */ - 'jest/no-test-return-statement': 'error', + }, + rules: { + /** Disallow `return` statements in tests. */ + 'jest/no-test-return-statement': 'error', - /** - * Prefer Jest comparators instead of boolean comparisons. - * This leads to better test failure messages. - */ - 'jest/prefer-comparison-matcher': 'error', - 'jest/prefer-equality-matcher': 'error', + /** + * Prefer Jest comparators instead of boolean comparisons. + * This leads to better test failure messages. + */ + 'jest/prefer-comparison-matcher': 'error', + 'jest/prefer-equality-matcher': 'error', - /** - * Prefer Jest's `expect(foo()).resolve` instead of `expect(await foo())`. - * This leads to better test failure messages. - */ - 'jest/prefer-expect-resolves': 'error', + /** + * Prefer Jest's `expect(foo()).resolve` instead of `expect(await foo())`. + * This leads to better test failure messages. + */ + 'jest/prefer-expect-resolves': 'error', - /** Require Jest hooks to be inside a `describe`. */ - 'jest/require-top-level-describe': 'error', + /** Require Jest hooks to be inside a `describe`. */ + 'jest/require-top-level-describe': 'error', - /** Require blocks to have valid titles. */ - 'jest/valid-title': ['error', { ignoreTypeOfDescribeName: true }], - }, + /** Require blocks to have valid titles. */ + 'jest/valid-title': ['error', { ignoreTypeOfDescribeName: true }], }, - ], -}; - -export = config; + }, +]; diff --git a/packages/eslint-config-jest/src/lenient.ts b/packages/eslint-config-jest/src/lenient.ts index cbc16ace..c04c857c 100644 --- a/packages/eslint-config-jest/src/lenient.ts +++ b/packages/eslint-config-jest/src/lenient.ts @@ -1,20 +1,18 @@ -import type { ESLint } from 'eslint'; -import { test_file_patterns } from './utils'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - overrides: [ - { - files: test_file_patterns, - rules: { - /** Allow boolean comparisons instead of the equivalent Jest method. */ - 'jest/prefer-comparison-matcher': 'off', - 'jest/prefer-equality-matcher': 'off', +import { test_file_patterns } from './utils.js'; - /** Allow `expect(await foo())`. */ - 'jest/prefer-expect-resolves': 'off', - }, - }, - ], -}; +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-jest/lenient', + files: test_file_patterns, + rules: { + /** Allow boolean comparisons instead of the equivalent Jest method. */ + 'jest/prefer-comparison-matcher': 'off', + 'jest/prefer-equality-matcher': 'off', -export = config; + /** Allow `expect(await foo())`. */ + 'jest/prefer-expect-resolves': 'off', + }, + }, +]; diff --git a/packages/eslint-config-jest/src/utils.ts b/packages/eslint-config-jest/src/utils.ts index 17660bec..3473221c 100644 --- a/packages/eslint-config-jest/src/utils.ts +++ b/packages/eslint-config-jest/src/utils.ts @@ -1,8 +1,8 @@ export const test_file_patterns = [ '**/test/**', '**/__test__/**', - '*.test.*', - '*.spec.*', - '*.unit.*', - '*.e2e.*', + '**/*.test.*', + '**/*.spec.*', + '**/*.unit.*', + '**/*.e2e.*', ]; diff --git a/packages/eslint-config-jest/test/index.ts b/packages/eslint-config-jest/test/index.ts index 9bde6664..3f6c9dd8 100644 --- a/packages/eslint-config-jest/test/index.ts +++ b/packages/eslint-config-jest/test/index.ts @@ -1,18 +1,33 @@ import { describe, it } from 'node:test'; +import { strictEqual } from 'node:assert'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testRuleFail, testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as jest, files } from '@code-style/eslint-config-jest'; -const linter = initESLint({ - extends: ['@code-style', '@code-style/jest'], -}); +const linter = initESLint([...base, ...jest]); void describe('eslint-config-jest', () => { defaultTestSet(linter); + void it(`should apply rule changes scoped to its files`, async () => { + const overlaid = initESLint([ + ...base, + ...jest, + { files, rules: { 'jest/no-disabled-tests': 'error' } }, + ]); + const { rules } = (await overlaid.calculateConfigForFile( + 'src/index.test.js', + )) as { rules?: Record }; + strictEqual(rules?.['jest/no-disabled-tests']?.[0], 2); + // and doesn't break linting other files + await overlaid.calculateConfigForFile('src/index.js'); + }); + void describe('passes', () => { void it(`should have jest globals in test file`, () => testNoFail({ diff --git a/packages/eslint-config-nest/README.md b/packages/eslint-config-nest/README.md index a0961a04..e0cb4630 100644 --- a/packages/eslint-config-nest/README.md +++ b/packages/eslint-config-nest/README.md @@ -15,9 +15,11 @@ My NestJS eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-nest' + import { config as base } from '@code-style/eslint-config'; + +import { config as nest } from '@code-style/eslint-config-nest'; + + -export default defineConfig(base); + +export default defineConfig(base, nest); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-nest/base.yaml b/packages/eslint-config-nest/base.yaml deleted file mode 100644 index e553f39a..00000000 --- a/packages/eslint-config-nest/base.yaml +++ /dev/null @@ -1,9 +0,0 @@ -extends: - - 'plugin:@code-style/eslint-plugin-nest/recommended' - -rules: - # Disallow importing files from `@nestjs/terminus` since it includes a bunch of incorrect types. - no-restricted-imports: - - 'error' - - patterns: - - '@nestjs/terminus/dist/*' diff --git a/packages/eslint-config-nest/examples/.eslintrc.yaml b/packages/eslint-config-nest/examples/.eslintrc.yaml deleted file mode 100644 index f3e87715..00000000 --- a/packages/eslint-config-nest/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/nest' diff --git a/packages/eslint-config-nest/examples/eslint.config.mjs b/packages/eslint-config-nest/examples/eslint.config.mjs new file mode 100644 index 00000000..4da37598 --- /dev/null +++ b/packages/eslint-config-nest/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as nest } from '@code-style/eslint-config-nest'; + +export default defineConfig(base, nest); diff --git a/packages/eslint-config-nest/package.json b/packages/eslint-config-nest/package.json index b540b635..dd4c7a18 100644 --- a/packages/eslint-config-nest/package.json +++ b/packages/eslint-config-nest/package.json @@ -16,32 +16,35 @@ }, "license": "MIT", "author": "Louis Orleans ", + "type": "module", "exports": { - ".": "./base.yaml", - "./base": "./base.yaml", - "./*.yaml": "./*.yaml" + ".": "./dist/base.js", + "./*": "./dist/*.js" }, - "main": "base.yaml", + "main": "dist/base.js", "files": [ - "./base.yaml" + "./dist/" ], "scripts": { + "build": "concurrently --raw --group 'npm:build:*'", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*') --outdir=dist --sourcemap=inline --platform=node --target=node20 --format=esm", + "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", + "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@code-style/eslint-plugin-nest": "2.0.0-32" + "@code-style/eslint-plugin-nest": "^2.0.0-35" }, "devDependencies": { - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-nest/src/base.ts b/packages/eslint-config-nest/src/base.ts new file mode 100644 index 00000000..84d94f58 --- /dev/null +++ b/packages/eslint-config-nest/src/base.ts @@ -0,0 +1,19 @@ +import type { Linter } from 'eslint'; +import nestPlugin from '@code-style/eslint-plugin-nest'; + +export const config: Linter.Config[] = [ + nestPlugin.configs.recommended, + + { + name: '@code-style/eslint-config-nest/base', + rules: { + // Disallow importing files from `@nestjs/terminus` since it includes a bunch of incorrect types. + 'no-restricted-imports': [ + 'error', + { + patterns: ['@nestjs/terminus/dist/*'], + }, + ], + }, + }, +]; diff --git a/packages/eslint-config-nest/test/index.ts b/packages/eslint-config-nest/test/index.ts index 0515b740..fc97dfbf 100644 --- a/packages/eslint-config-nest/test/index.ts +++ b/packages/eslint-config-nest/test/index.ts @@ -1,23 +1,21 @@ import { describe, it } from 'node:test'; -import { join } from 'node:path'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testRuleFail, testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as nest } from '@code-style/eslint-config-nest'; const linter = initESLint( - { - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-esmodule', - '@code-style/eslint-config-node', - '@code-style/eslint-config-typescript', - '@code-style/eslint-config-nest', - ], - }, - { cwd: join(__dirname, 'fixture') }, + [...base, ...esmodule, ...node, ...typescript, ...nest], + { cwd: join(dirname(fileURLToPath(import.meta.url)), 'fixture') }, ); void describe('eslint-config-nest strict', () => { diff --git a/packages/eslint-config-nest/tsconfig.build.json b/packages/eslint-config-nest/tsconfig.build.json new file mode 100644 index 00000000..6b51a225 --- /dev/null +++ b/packages/eslint-config-nest/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": ["./tsconfig.json"], + "compilerOptions": { + "baseUrl": "./" + }, + "include": ["src/"], + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/eslint-config-nest/tsconfig.json b/packages/eslint-config-nest/tsconfig.json new file mode 100644 index 00000000..f938419c --- /dev/null +++ b/packages/eslint-config-nest/tsconfig.json @@ -0,0 +1,14 @@ +// In order to update the config, update @code-style/typescript-configs +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/library" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["./"], + "exclude": ["dist/"] +} diff --git a/packages/eslint-config-nextjs/README.md b/packages/eslint-config-nextjs/README.md index a23c6674..8dcbb366 100644 --- a/packages/eslint-config-nextjs/README.md +++ b/packages/eslint-config-nextjs/README.md @@ -15,9 +15,11 @@ My Next.JS eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-nextjs' + import { config as base } from '@code-style/eslint-config'; + +import { config as nextjs } from '@code-style/eslint-config-nextjs'; + + -export default defineConfig(base); + +export default defineConfig(base, nextjs); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-nextjs/examples/.eslintrc.yaml b/packages/eslint-config-nextjs/examples/.eslintrc.yaml deleted file mode 100644 index 66f55208..00000000 --- a/packages/eslint-config-nextjs/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-nextjs' diff --git a/packages/eslint-config-nextjs/examples/eslint.config.mjs b/packages/eslint-config-nextjs/examples/eslint.config.mjs new file mode 100644 index 00000000..b3bb9e1d --- /dev/null +++ b/packages/eslint-config-nextjs/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as nextjs } from '@code-style/eslint-config-nextjs'; + +export default defineConfig(base, nextjs); diff --git a/packages/eslint-config-nextjs/package.json b/packages/eslint-config-nextjs/package.json index 21e3e242..56092746 100644 --- a/packages/eslint-config-nextjs/package.json +++ b/packages/eslint-config-nextjs/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./*": "./dist/*.js" @@ -27,27 +27,26 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*' --ignore '**/*.d.ts') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@next/eslint-plugin-next": "^14.1.1", - "@rushstack/eslint-patch": "^1.10.2" + "@next/eslint-plugin-next": "^16.3.0" }, "devDependencies": { - "@types/react": "^18.2.23", - "react": "^18.2.0", + "@types/react": "^19.0.0", + "react": "^19.0.0", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "next": "*" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-nextjs/src/base.ts b/packages/eslint-config-nextjs/src/base.ts index 96c530b4..c25484a9 100644 --- a/packages/eslint-config-nextjs/src/base.ts +++ b/packages/eslint-config-nextjs/src/base.ts @@ -1,12 +1,15 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; +import nextPlugin from '@next/eslint-plugin-next'; -const config: ESLint.ConfigData = { - extends: ['plugin:@next/eslint-plugin-next/recommended'], - rules: { - /** NextJS requires page components to be default exports. */ - 'import/no-default-export': 'off', - }, -}; +export const config: Linter.Config[] = [ + // eslint-disable-next-line import/no-named-as-default-member -- CJS, so `configs` has no ESM named export + nextPlugin.configs.recommended, -export = config; + { + name: '@code-style/eslint-config-nextjs/base', + rules: { + /** NextJS requires page components to be default exports. */ + 'import/no-default-export': 'off', + }, + }, +]; diff --git a/packages/eslint-config-nextjs/src/types.d.ts b/packages/eslint-config-nextjs/src/types.d.ts new file mode 100644 index 00000000..f07b8ad1 --- /dev/null +++ b/packages/eslint-config-nextjs/src/types.d.ts @@ -0,0 +1,14 @@ +/** + * Ambient type stubs for plugins that don't ship their own type + * declarations. + */ + +declare module '@next/eslint-plugin-next' { + import type { ESLint, Linter } from 'eslint'; + + const plugin: ESLint.Plugin & { + configs: { recommended: Linter.Config }; + }; + // eslint-disable-next-line import/no-default-export + export default plugin; +} diff --git a/packages/eslint-config-nextjs/test/index.ts b/packages/eslint-config-nextjs/test/index.ts index 4de6a62b..9188d887 100644 --- a/packages/eslint-config-nextjs/test/index.ts +++ b/packages/eslint-config-nextjs/test/index.ts @@ -5,16 +5,19 @@ import { testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as browser } from '@code-style/eslint-config-browser'; +import { config as react } from '@code-style/eslint-config-react'; +import { config as nextjs } from '@code-style/eslint-config-nextjs'; -const linter = initESLint({ - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-esmodule', - '@code-style/eslint-config-browser', - '@code-style/eslint-config-react', - '@code-style/eslint-config-nextjs', - ], -}); +const linter = initESLint([ + ...base, + ...esmodule, + ...browser, + ...react, + ...nextjs, +]); void describe('eslint-config-nextjs', () => { defaultTestSet(linter); diff --git a/packages/eslint-config-node/README.md b/packages/eslint-config-node/README.md index c86bf37b..04fd47c9 100644 --- a/packages/eslint-config-node/README.md +++ b/packages/eslint-config-node/README.md @@ -15,9 +15,11 @@ My node eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-node' + import { config as base } from '@code-style/eslint-config'; + +import { config as node } from '@code-style/eslint-config-node'; + + -export default defineConfig(base); + +export default defineConfig(base, node); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-node/examples/.eslintrc.yaml b/packages/eslint-config-node/examples/.eslintrc.yaml deleted file mode 100644 index 84cdd506..00000000 --- a/packages/eslint-config-node/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/node' diff --git a/packages/eslint-config-node/examples/eslint.config.mjs b/packages/eslint-config-node/examples/eslint.config.mjs new file mode 100644 index 00000000..f0135330 --- /dev/null +++ b/packages/eslint-config-node/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; + +export default defineConfig(base, node); diff --git a/packages/eslint-config-node/package.json b/packages/eslint-config-node/package.json index 68ea12fe..519b09c6 100644 --- a/packages/eslint-config-node/package.json +++ b/packages/eslint-config-node/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./*": "./dist/*.js" @@ -27,26 +27,25 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-n": "^17.4.0" + "eslint-plugin-n": "^18.3.0", + "globals": "^16.0.0" }, "devDependencies": { - "@types/eslint": "^8.56.10", "@types/node": "^20.6.3", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-node/src/base.ts b/packages/eslint-config-node/src/base.ts index 701efe9e..ee2ec340 100644 --- a/packages/eslint-config-node/src/base.ts +++ b/packages/eslint-config-node/src/base.ts @@ -1,130 +1,150 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; - -const config: ESLint.ConfigData = { - extends: ['plugin:eslint-plugin-n/recommended-module'], - - parserOptions: { - ecmaVersion: 2022, // Version is inline with Node 16 - // TODO(0): should this maybe be 'script' until the upgrade to eslint 9 - sourceType: 'commonjs' as unknown as undefined, +import type { Linter } from 'eslint'; +import nPlugin from 'eslint-plugin-n'; +import globals from 'globals'; + +export const config: Linter.Config[] = [ + nPlugin.configs['flat/recommended-module'], + + { + name: '@code-style/eslint-config-node/base', + languageOptions: { + ecmaVersion: 2022, // Version is inline with Node 16 + sourceType: 'commonjs', + globals: { + ...globals.node, + // `flat/recommended-module` disables some globals we still want + // TODO(1): detect if project is type: module or not and remove the globals if so + __dirname: 'readonly', + __filename: 'readonly', + require: 'readonly', + module: 'writable', + }, + }, + rules: { + // Allow unspecified radix in `parseInt` since Node has a consistent radix. + radix: 'off', + + /** + * Disallow using `process.env`. + * Any environment config reading should be in a specific config module. + * This simplifies understanding of the affects of config variables, as well + * as helping to ease error handling. + */ + 'n/no-process-env': 'error', + + /** + * Require `return` upon callback. + * Not returning immediately makes it easy to continue executing code after + * what would usually be considered the end of method. + */ + 'n/callback-return': ['error', ['callback', 'cb', 'next']], + + /** + * Disallow `require()` outside of the top-level module scope to encourage a + * consistent style. + */ + 'n/global-require': 'error', + + // Require error handling in callbacks. + 'n/handle-callback-err': ['error', '^.*[eE]rr(or)?$'], + + /** + * Disallow mixing regular variable and `require` declarations to encourage a + * consistent style. + */ + 'n/no-mixed-requires': 'error', + + /** + * Disallow use of new operator with the `require` function to encourage a + * consistent style. + */ + 'n/no-new-require': 'error', + + // Disallow string concatenation with `__dirname` and `__filename`. + // Not all environments use the same path seperator (looking at you, Windows). + 'n/no-path-concat': 'error', + + // Allow usage of all node modules. + 'n/no-restricted-import': 'off', + 'n/no-restricted-require': 'off', + + /** + * Disallow use of synchronous methods that have an async alternative. + * Using synchronous methods ties up the thread, preventing other requests + * from being handled while waiting on I/O. + */ + 'n/no-sync': 'error', + + // Defer to import/no-extraneous-dependencies. + 'n/no-extraneous-import': 'off', + 'n/no-extraneous-require': 'off', + + // Require `module.exports` for commonjs to encourage a consistent style. + 'n/exports-style': ['error', 'module.exports'], + + // Require imports instead of globals. + 'n/prefer-global/buffer': ['error', 'never'], + 'n/prefer-global/text-decoder': ['error', 'never'], + 'n/prefer-global/text-encoder': ['error', 'never'], + 'n/prefer-global/url-search-params': ['error', 'never'], + 'n/prefer-global/url': ['error', 'never'], + + // Require promise APIs when available to encourage a consistent style. + 'n/prefer-promises/dns': 'error', + 'n/prefer-promises/fs': 'error', + + // Require callbacks to be error first callbacks. + 'n/no-callback-literal': 'error', + + // Check that all imports are part of our package in production. + 'n/no-unpublished-import': ['error', { ignoreTypeImport: true }], + + 'n/no-unsupported-features/node-builtins': [ + 'error', + { ignores: ['test', 'test.describe', 'test.it'] }, + ], + }, }, - env: { node: true }, - - // `plugin:n/recommended-module` disables some globals we still want - globals: { - // TODO(1): detect if project is type: module or not and remove the globals if so - __dirname: 'readonly', - __filename: 'readonly', - require: 'readonly', - module: 'writable', + { + // `.mjs` files are always ES modules (eg: `eslint.config.mjs`) + name: '@code-style/eslint-config-node/mjs-files', + files: ['**/*.mjs'], + languageOptions: { sourceType: 'module' }, }, - rules: { - // Allow unspecified radix in `parseInt` since Node has a consistent radix. - radix: 'off', - - /** - * Disallow using `process.env`. - * Any environment config reading should be in a specific config module. - * This simplifies understanding of the affects of config variables, as well - * as helping to ease error handling. - */ - 'n/no-process-env': 'error', - - /** - * Require `return` upon callback. - * Not returning immediately makes it easy to continue executing code after - * what would usually be considered the end of method. - */ - 'n/callback-return': ['error', ['callback', 'cb', 'next']], - - /** - * Disallow `require()` outside of the top-level module scope to encourage a - * consistent style. - */ - 'n/global-require': 'error', - - // Require error handling in callbacks. - 'n/handle-callback-err': ['error', '^.*[eE]rr(or)?$'], - - /** - * Disallow mixing regular variable and `require` declarations to encourage a - * consistent style. - */ - 'n/no-mixed-requires': 'error', - - /** - * Disallow use of new operator with the `require` function to encourage a - * consistent style. - */ - 'n/no-new-require': 'error', - - // Disallow string concatenation with `__dirname` and `__filename`. - // Not all environments use the same path seperator (looking at you, Windows). - 'n/no-path-concat': 'error', - - // Allow usage of all node modules. - 'n/no-restricted-import': 'off', - 'n/no-restricted-require': 'off', - - /** - * Disallow use of synchronous methods that have an async alternative. - * Using synchronous methods ties up the thread, preventing other requests - * from being handled while waiting on I/O. - */ - 'n/no-sync': 'error', - - // Defer to import/no-extraneous-dependencies. - 'n/no-extraneous-import': 'off', - 'n/no-extraneous-require': 'off', - - // Require `module.exports` for commonjs to encourage a consistent style. - 'n/exports-style': ['error', 'module.exports'], - - // Require imports instead of globals. - 'n/prefer-global/buffer': ['error', 'never'], - 'n/prefer-global/text-decoder': ['error', 'never'], - 'n/prefer-global/text-encoder': ['error', 'never'], - 'n/prefer-global/url-search-params': ['error', 'never'], - 'n/prefer-global/url': ['error', 'never'], - - // Require promise APIs when available to encourage a consistent style. - 'n/prefer-promises/dns': 'error', - 'n/prefer-promises/fs': 'error', - - // Require callbacks to be error first callbacks. - 'n/no-callback-literal': 'error', - - // Check that all imports are part of our package in production. - 'n/no-unpublished-import': ['error', { ignoreTypeImport: true }], - - 'n/no-unsupported-features/node-builtins': [ - 'error', - { ignores: ['test', 'test.describe', 'test.it'] }, + { + name: '@code-style/eslint-config-node/test-and-config-files', + files: [ + // test files + '**/test/**', + '**/__test__/**', + '**/*.test.*', + '**/*.spec.*', + '**/*.unit.*', + '**/*.e2e.*', + // config files + '**/*.config.*', + '**/*.configuration.*', + '**/config.*', + '**/configuration.*', ], + rules: { 'n/no-process-env': 'off' }, }, - overrides: [ - { - files: [ - // test files - '**/test/**', - '**/__test__/**', - '*.test.*', - '*.spec.*', - '*.unit.*', - '*.e2e.*', - // config files - '*.config.*', - '*.configuration.*', - 'config.*', - 'configuration.*', - ], - rules: { 'n/no-process-env': 'off' }, + { + name: '@code-style/eslint-config-node/test-files', + files: [ + '**/test/**', + '**/__test__/**', + '**/*.test.*', + '**/*.spec.*', + '**/*.unit.*', + '**/*.e2e.*', + ], + rules: { + // Allow test to import unpublished files. + 'n/no-unpublished-import': 'off', }, - ], -}; - -export = config; + }, +]; diff --git a/packages/eslint-config-node/src/lenient.ts b/packages/eslint-config-node/src/lenient.ts index 1d605f6a..9fddbcc0 100644 --- a/packages/eslint-config-node/src/lenient.ts +++ b/packages/eslint-config-node/src/lenient.ts @@ -1,17 +1,28 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // enforces error handling in callbacks - 'n/handle-callback-err': 'off', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-node/lenient', + rules: { + // enforces error handling in callbacks + 'n/handle-callback-err': 'off', - // disallow use of synchronous methods - 'n/no-sync': 'off', + // disallow use of synchronous methods + 'n/no-sync': 'off', - // use promise APIs - 'n/prefer-promises/dns': 'off', - 'n/prefer-promises/fs': 'off', - }, -}; + // use promise APIs + 'n/prefer-promises/dns': 'off', + 'n/prefer-promises/fs': 'off', + + // allow using globals instead of imports + 'n/prefer-global/buffer': 'off', + 'n/prefer-global/text-decoder': 'off', + 'n/prefer-global/text-encoder': 'off', + 'n/prefer-global/url-search-params': 'off', + 'n/prefer-global/url': 'off', -export = config; + // allow using `process.env` anywhere + 'n/no-process-env': 'off', + }, + }, +]; diff --git a/packages/eslint-config-node/test/lenient.ts b/packages/eslint-config-node/test/lenient.ts index 753b9786..8297c19e 100644 --- a/packages/eslint-config-node/test/lenient.ts +++ b/packages/eslint-config-node/test/lenient.ts @@ -5,14 +5,11 @@ import { testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as node_lenient } from '@code-style/eslint-config-node/lenient'; -const linter = initESLint({ - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-node', - '@code-style/eslint-config-node/lenient', - ], -}); +const linter = initESLint([...base, ...node, ...node_lenient]); void describe('eslint-config-node lenient', () => { defaultTestSet(linter); @@ -23,6 +20,9 @@ void describe('eslint-config-node lenient', () => { linter, files: [{ code: `const { readFileSync } = require('fs');` }], })); + + void it(`should pass n/no-process-env`, () => + testNoFail({ linter, files: [{ code: `process.env.FOO;\n` }] })); }); void describe('fails', () => { diff --git a/packages/eslint-config-node/test/strict.ts b/packages/eslint-config-node/test/strict.ts index d7f18998..ec9f2aea 100644 --- a/packages/eslint-config-node/test/strict.ts +++ b/packages/eslint-config-node/test/strict.ts @@ -5,10 +5,10 @@ import { testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; -const linter = initESLint({ - extends: ['@code-style/eslint-config', '@code-style/eslint-config-node'], -}); +const linter = initESLint([...base, ...node]); void describe('eslint-config-node strict', () => { defaultTestSet(linter); @@ -16,6 +16,17 @@ void describe('eslint-config-node strict', () => { void describe('passes', () => { void it(`should pass radix`, () => testNoFail({ linter, files: [{ code: `parseInt('10');\n` }] })); + + void it(`should parse .mjs files as esm`, () => + testNoFail({ + linter, + files: [ + { + path: 'eslint.config.mjs', + code: `import { join } from 'node:path';\n\nexport default join;\n`, + }, + ], + })); }); void describe('fails', () => { diff --git a/packages/eslint-config-react/README.md b/packages/eslint-config-react/README.md index 9ddd662e..6b037aad 100644 --- a/packages/eslint-config-react/README.md +++ b/packages/eslint-config-react/README.md @@ -15,9 +15,11 @@ My React eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-react' + import { config as base } from '@code-style/eslint-config'; + +import { config as react } from '@code-style/eslint-config-react'; + + -export default defineConfig(base); + +export default defineConfig(base, react); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-react/examples/.eslintrc.yaml b/packages/eslint-config-react/examples/.eslintrc.yaml deleted file mode 100644 index 3cbfcb61..00000000 --- a/packages/eslint-config-react/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/react' diff --git a/packages/eslint-config-react/examples/eslint.config.mjs b/packages/eslint-config-react/examples/eslint.config.mjs new file mode 100644 index 00000000..9b117ecf --- /dev/null +++ b/packages/eslint-config-react/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as react } from '@code-style/eslint-config-react'; + +export default defineConfig(base, react); diff --git a/packages/eslint-config-react/package.json b/packages/eslint-config-react/package.json index 318a2322..f00936f0 100644 --- a/packages/eslint-config-react/package.json +++ b/packages/eslint-config-react/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./*": "./dist/*.js" @@ -27,30 +27,30 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*' --ignore '**/*.d.ts') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0" + "@eslint/compat": "^2.1.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1" }, "devDependencies": { - "@types/react": "^18.2.23", - "react": "^18.2.0", + "@types/react": "^19.0.0", + "react": "^19.0.0", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "react": ">=16.8", "react-dom": ">=16.8" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-react/src/base.ts b/packages/eslint-config-react/src/base.ts index 24aea1cc..29d004c8 100644 --- a/packages/eslint-config-react/src/base.ts +++ b/packages/eslint-config-react/src/base.ts @@ -1,35 +1,48 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import { fixupPluginRules } from '@eslint/compat'; +import type { ESLint, Linter } from 'eslint'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; -const config: ESLint.ConfigData = { - extends: [ - 'plugin:eslint-plugin-react/recommended', - 'plugin:eslint-plugin-react-hooks/recommended', - 'plugin:eslint-plugin-jsx-a11y/recommended', - ], - settings: { - react: { - version: 'detect', - }, +export const config: Linter.Config[] = [ + // eslint-plugin-react & eslint-plugin-jsx-a11y still call rule-context methods ESLint 10 removed + { + ...reactPlugin.configs.flat.recommended, + plugins: { react: fixupPluginRules(reactPlugin) }, + }, + { + ...jsxA11y.flatConfigs.recommended, + plugins: { 'jsx-a11y': fixupPluginRules(jsxA11y) }, }, - rules: { - /** - * Limit max element nesting to reduce component complexity. - * This simplifies components & enables better testing. - */ - 'react/jsx-max-depth': ['error', { max: 5 }], + { + name: '@code-style/eslint-config-react/base', + // pinned to the rules the eslintrc `recommended` config enabled; v6+'s adds the React Compiler rules + plugins: { 'react-hooks': reactHooks as ESLint.Plugin }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', - /** Require class components to use ES6 classes rather than ES5 classes. */ - 'react/prefer-es6-class': 'error', + /** + * Limit max element nesting to reduce component complexity. + * This simplifies components & enables better testing. + */ + 'react/jsx-max-depth': ['error', { max: 5 }], - /** Require stateless components to be functional components. */ - 'react/prefer-stateless-function': 'error', + /** Require class components to use ES6 classes rather than ES5 classes. */ + 'react/prefer-es6-class': 'error', - 'react/no-children-prop': 'off', + /** Require stateless components to be functional components. */ + 'react/prefer-stateless-function': 'error', - /** Require iterated elements to have a `key`. */ - 'react/jsx-key': 'error', - }, -}; + 'react/no-children-prop': 'off', -export = config; + /** Require iterated elements to have a `key`. */ + 'react/jsx-key': 'error', + }, + }, +]; diff --git a/packages/eslint-config-react/src/types.d.ts b/packages/eslint-config-react/src/types.d.ts new file mode 100644 index 00000000..54d6b6de --- /dev/null +++ b/packages/eslint-config-react/src/types.d.ts @@ -0,0 +1,14 @@ +/** + * Ambient type stubs for plugins that don't ship their own type + * declarations. + */ + +declare module 'eslint-plugin-jsx-a11y' { + import type { ESLint, Linter } from 'eslint'; + + const plugin: ESLint.Plugin & { + flatConfigs: { recommended: Linter.Config }; + }; + // eslint-disable-next-line import/no-default-export + export default plugin; +} diff --git a/packages/eslint-config-react/test/index.ts b/packages/eslint-config-react/test/index.ts index 9ece7917..70a10be5 100644 --- a/packages/eslint-config-react/test/index.ts +++ b/packages/eslint-config-react/test/index.ts @@ -5,15 +5,12 @@ import { testNoFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as browser } from '@code-style/eslint-config-browser'; +import { config as react } from '@code-style/eslint-config-react'; -const linter = initESLint({ - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-esmodule', - '@code-style/eslint-config-browser', - '@code-style/eslint-config-react', - ], -}); +const linter = initESLint([...base, ...esmodule, ...browser, ...react]); void describe('eslint-config-react', () => { defaultTestSet(linter); diff --git a/packages/eslint-config-typescript/.eslintrc.yaml b/packages/eslint-config-typescript/.eslintrc.yaml deleted file mode 100644 index 508e930c..00000000 --- a/packages/eslint-config-typescript/.eslintrc.yaml +++ /dev/null @@ -1,6 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-esmodule' - - '@code-style/eslint-config-typescript' diff --git a/packages/eslint-config-typescript/README.md b/packages/eslint-config-typescript/README.md index 5a6f9999..8c8ab654 100644 --- a/packages/eslint-config-typescript/README.md +++ b/packages/eslint-config-typescript/README.md @@ -15,9 +15,11 @@ My Typescript eslint config 1. Add the plugin to your ESLint config. ```diff - extends: - - '@code-style/eslint-config' - + - '@code-style/eslint-config-typescript' + import { config as base } from '@code-style/eslint-config'; + +import { config as typescript } from '@code-style/eslint-config-typescript'; + + -export default defineConfig(base); + +export default defineConfig(base, typescript); ``` You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-typescript/eslint.config.mjs b/packages/eslint-config-typescript/eslint.config.mjs new file mode 100644 index 00000000..4da0dd88 --- /dev/null +++ b/packages/eslint-config-typescript/eslint.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as typescript } from '@code-style/eslint-config-typescript'; + +export default defineConfig(base, node, esmodule, typescript); diff --git a/packages/eslint-config-typescript/examples/.eslintrc.yaml b/packages/eslint-config-typescript/examples/.eslintrc.yaml deleted file mode 100644 index 1f142b8b..00000000 --- a/packages/eslint-config-typescript/examples/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/typescript' diff --git a/packages/eslint-config-typescript/examples/eslint.config.mjs b/packages/eslint-config-typescript/examples/eslint.config.mjs new file mode 100644 index 00000000..f05b701b --- /dev/null +++ b/packages/eslint-config-typescript/examples/eslint.config.mjs @@ -0,0 +1,6 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as typescript } from '@code-style/eslint-config-typescript'; + +export default defineConfig(base, typescript); diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json index 6ed42b12..aed11162 100644 --- a/packages/eslint-config-typescript/package.json +++ b/packages/eslint-config-typescript/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./*": "./dist/*.js" @@ -27,34 +27,32 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.spec.*') --outdir=dist/ --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "lint": "concurrently --raw --group \"npm:lint:*\"", - "lint:js": "eslint . --ext ts,mts,cts,js,json", + "lint:js": "eslint .", "lint:types": "tsc --noEmit --pretty", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' --ignore '**/fixture?(s)/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@rushstack/eslint-patch": "^1.10.2", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "eslint-plugin-import": "^2.29.1" + "eslint-import-resolver-typescript": "^4.4.5", + "eslint-plugin-import-x": "^4.17.0", + "typescript-eslint": "^8.67.0" }, "devDependencies": { "@types/common-tags": "^1.8.4", - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", "common-tags": "^1.8.2", "tsx": "^4.9.4" }, "peerDependencies": { - "eslint": "^8.49.0", + "eslint": "^10.0.0", "typescript": ">=5.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config-typescript/src/base.ts b/packages/eslint-config-typescript/src/base.ts index 52846111..7747724e 100644 --- a/packages/eslint-config-typescript/src/base.ts +++ b/packages/eslint-config-typescript/src/base.ts @@ -1,120 +1,183 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; - -const config: ESLint.ConfigData = { - overrides: [ - { - files: ['*.?(m|c)@(t|j)s?(x)'], - excludedFiles: '*.json', - - extends: [ - 'plugin:@typescript-eslint/eslint-plugin/strict-type-checked', - 'plugin:@typescript-eslint/eslint-plugin/stylistic-type-checked', - 'plugin:eslint-plugin-import/typescript', - ], - +import type { Linter } from 'eslint'; +import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript'; +import { flatConfigs as import_x_configs } from 'eslint-plugin-import-x'; +import { configs as tseslint_configs } from 'typescript-eslint'; + +/** The files this config applies to. Scope your own `@typescript-eslint/*` rule changes to these. */ +export const files = ['**/*.?(m|c)@(t|j)s?(x)']; + +export const config: Linter.Config[] = [ + ...[ + ...tseslint_configs.strictTypeChecked, + ...tseslint_configs.stylisticTypeChecked, + ].map((c) => ({ + ...c, + // like its eslintrc predecessor, only disable core rules that TypeScript makes redundant in TS files + files: + c.name === 'typescript-eslint/eslint-recommended' + ? ['**/*.?(m|c)ts?(x)'] + : files, + })), + + { + name: '@code-style/eslint-config-typescript/base', + files, + + languageOptions: { parserOptions: { project: true, }, + }, - rules: { - /** Allow specifying a type that could otherwise be inferred. */ - '@typescript-eslint/no-inferrable-types': 'off', - - /** Disallow unused variables. */ - '@typescript-eslint/no-unused-vars': [ - 'warn', - { args: 'none', destructuredArrayIgnorePattern: '^_' }, - ], - - // TODO(0): throws on code that should probably be allowed - // ``` - // const foo: number | undefined = Math.random() === 0 ? 1 : undefined; - // if (foo?.toString().includes('a')) console.log('hi'); - // ``` - /** Require only boolean types to be used for conditions. */ - '@typescript-eslint/strict-boolean-expressions': [ - 'error', - { - allowAny: false, - allowString: false, - allowNullableString: false, - allowNumber: false, - allowNullableNumber: false, - allowNullableObject: true, - allowNullableBoolean: true, - }, - ], - - /** Require switches on union types to handle all cases. */ - '@typescript-eslint/switch-exhaustiveness-check': 'error', - - /** Disallow empty classes, unless they're decorated. */ - '@typescript-eslint/no-extraneous-class': [ - 'error', - { allowWithDecorator: true }, - ], - - // TODO: do we want this? - /** - * Require `enum` values to be initialized in order to prevent value shifting. - * If an `enum`'s value isn't defined, Typescript will automatically pick a - * numeric value for it based on its position in the enum list. If that - * value is then used to save state into a store, and then the `enum`'s - * list of values is updated, the value in the store may not correspond with - * the intended enum value anymore. - */ - '@typescript-eslint/prefer-enum-initializers': 'error', - - /** Allow use of both `type` and `interface`. */ - '@typescript-eslint/consistent-type-definitions': 'off', - - /** Require `private` members to be marked `readonly` when possible. */ - '@typescript-eslint/prefer-readonly': 'error', - - /** Allow returning the correct type, even if it might be slightly confusing. */ - '@typescript-eslint/no-confusing-void-expression': 'off', - - /** Allow empty functions */ - '@typescript-eslint/no-empty-function': 'off', - - /** Disable this rule since it doesn't work reliably. */ - '@typescript-eslint/consistent-generic-constructors': 'off', - - /** - * Disable this rule until this issue is fixed. - * https://github.com/typescript-eslint/typescript-eslint/issues/7502 - */ - '@typescript-eslint/no-base-to-string': 'off', - - /** Allow comparing `enum`s to appropriate primitive values. */ - '@typescript-eslint/no-unsafe-enum-comparison': 'off', - - /** Disable this rule since Typescript checks imports for us. */ - 'import/no-unresolved': 'off', - 'n/no-missing-import': 'off', - - /** Disable these rules since Typescript handles these rules for us. */ - 'consistent-return': 'off', - 'no-invalid-this': 'off', - 'promise/valid-params': 'off', - - /** Allow any value in template literal expression. */ - '@typescript-eslint/restrict-template-expressions': 'off', - - /** Require unbound methods to be called with their expected scope. */ - '@typescript-eslint/unbound-method': ['error', { ignoreStatic: true }], - - /** Allow function overload signatures. */ - '@typescript-eslint/unified-signatures': 'off', - - /** Allow const requires */ - '@typescript-eslint/no-var-requires': 'off', - - // TODO(2): create a linter rule to handle correlation between class-validator types, swagger types, and typescript types - }, + settings: { + ...import_x_configs.typescript.settings, + // replaces the legacy `import-x/resolver` setting + 'import-x/resolver': undefined, + 'import-x/resolver-next': [createTypeScriptImportResolver()], }, - ], -}; -export = config; + rules: { + /** Allow specifying a type that could otherwise be inferred. */ + '@typescript-eslint/no-inferrable-types': 'off', + + /** Disallow unused variables. */ + '@typescript-eslint/no-unused-vars': [ + 'warn', + { args: 'none', destructuredArrayIgnorePattern: '^_' }, + ], + + // TODO(0): throws on code that should probably be allowed + // ``` + // const foo: number | undefined = Math.random() === 0 ? 1 : undefined; + // if (foo?.toString().includes('a')) console.log('hi'); + // ``` + /** Require only boolean types to be used for conditions. */ + '@typescript-eslint/strict-boolean-expressions': [ + 'error', + { + allowAny: false, + allowString: false, + allowNullableString: false, + allowNumber: false, + allowNullableNumber: false, + allowNullableObject: true, + allowNullableBoolean: true, + }, + ], + + /** Require switches on union types to handle all cases, or have a `default` case. */ + '@typescript-eslint/switch-exhaustiveness-check': [ + 'error', + { considerDefaultExhaustiveForUnions: true }, + ], + + /** Disallow empty classes, unless they're decorated. */ + '@typescript-eslint/no-extraneous-class': [ + 'error', + { allowWithDecorator: true }, + ], + + // TODO: do we want this? + /** + * Require `enum` values to be initialized in order to prevent value shifting. + * If an `enum`'s value isn't defined, Typescript will automatically pick a + * numeric value for it based on its position in the enum list. If that + * value is then used to save state into a store, and then the `enum`'s + * list of values is updated, the value in the store may not correspond with + * the intended enum value anymore. + */ + '@typescript-eslint/prefer-enum-initializers': 'error', + + /** Allow use of both `type` and `interface`. */ + '@typescript-eslint/consistent-type-definitions': 'off', + + /** Require `private` members to be marked `readonly` when possible. */ + '@typescript-eslint/prefer-readonly': 'error', + + /** Allow returning the correct type, even if it might be slightly confusing. */ + '@typescript-eslint/no-confusing-void-expression': 'off', + + /** Allow empty functions */ + '@typescript-eslint/no-empty-function': 'off', + + /** Disable this rule since it doesn't work reliably. */ + '@typescript-eslint/consistent-generic-constructors': 'off', + + /** + * Disable this rule until this issue is fixed. + * https://github.com/typescript-eslint/typescript-eslint/issues/7502 + */ + '@typescript-eslint/no-base-to-string': 'off', + + /** Allow comparing `enum`s to appropriate primitive values. */ + '@typescript-eslint/no-unsafe-enum-comparison': 'off', + + /** Disable this rule since Typescript checks imports for us. */ + 'import/named': 'off', + 'import/no-unresolved': 'off', + 'n/no-missing-import': 'off', + + /** Disable these rules since Typescript handles these rules for us. */ + 'consistent-return': 'off', + 'no-invalid-this': 'off', + 'promise/valid-params': 'off', + + /** Allow any value in template literal expression. */ + '@typescript-eslint/restrict-template-expressions': 'off', + + /** Require unbound methods to be called with their expected scope. */ + '@typescript-eslint/unbound-method': ['error', { ignoreStatic: true }], + + /** Allow function overload signatures. */ + '@typescript-eslint/unified-signatures': 'off', + + /** Allow const requires */ + '@typescript-eslint/no-require-imports': 'off', + + // TODO(2): create a linter rule to handle correlation between class-validator types, swagger types, and typescript types + }, + }, + + { + // config files usually aren't in the project's tsconfig, so type-aware linting can't parse them + ...tseslint_configs.disableTypeChecked, + name: '@code-style/eslint-config-typescript/config-files', + files: ['**/eslint.config.*'], + }, + + { + name: '@code-style/eslint-config-typescript/test-files', + files: [ + '**/test/**', + '**/__test__/**', + '**/*.test.*', + '**/*.spec.*', + '**/*.unit.*', + '**/*.e2e.*', + ], + rules: { + /** + * Don't require dot notation in tests. + * This can be useful for accessing Typescript `private` properties & methods. + */ + '@typescript-eslint/dot-notation': 'off', + + // Allow `any` in tests. + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + + // Allow non-null assertions in tests. + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', + + // Simplify testing methods. + '@typescript-eslint/unbound-method': 'off', + + // Allow tests to throw literals. + '@typescript-eslint/only-throw-error': 'off', + }, + }, +]; diff --git a/packages/eslint-config-typescript/src/lenient.ts b/packages/eslint-config-typescript/src/lenient.ts index 6c6ede93..00212145 100644 --- a/packages/eslint-config-typescript/src/lenient.ts +++ b/packages/eslint-config-typescript/src/lenient.ts @@ -1,51 +1,52 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; - -const config: ESLint.ConfigData = { - overrides: [ - { - files: ['*.?(m|c)@(t|j)s?(x)'], - excludedFiles: '*.json', - rules: { - /** Allow some non-boolean type conditionals. */ - '@typescript-eslint/strict-boolean-expressions': [ - 'error', - { - allowAny: true, - allowString: false, - allowNullableString: false, - allowNumber: false, - allowNullableNumber: false, - allowNullableObject: true, - allowNullableBoolean: true, - }, - ], - - /** Don't ensure switches on union types handle all cases. */ - '@typescript-eslint/switch-exhaustiveness-check': 'off', - - /** Allow unused vars. */ - '@typescript-eslint/no-unused-vars': 'off', - - /** Allow `any`. */ - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - - /** Allow non-null assertions. */ - '@typescript-eslint/no-non-null-assertion': 'off', - - /** Allow for loops. */ - '@typescript-eslint/prefer-for-of': 'off', - - /** Allow floating promises. */ - '@typescript-eslint/no-floating-promises': 'off', - }, +import type { Linter } from 'eslint'; + +import { files } from './base.js'; + +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config-typescript/lenient', + files, + rules: { + /** Allow some non-boolean type conditionals. */ + '@typescript-eslint/strict-boolean-expressions': [ + 'error', + { + allowAny: true, + allowString: false, + allowNullableString: false, + allowNumber: false, + allowNullableNumber: false, + allowNullableObject: true, + allowNullableBoolean: true, + }, + ], + + /** Don't ensure switches on union types handle all cases. */ + '@typescript-eslint/switch-exhaustiveness-check': 'off', + + /** Allow unused vars. */ + '@typescript-eslint/no-unused-vars': 'off', + + /** Allow `any`. */ + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + + /** Allow non-null assertions. */ + '@typescript-eslint/no-non-null-assertion': 'off', + + /** Allow for loops. */ + '@typescript-eslint/prefer-for-of': 'off', + + /** Allow floating promises. */ + '@typescript-eslint/no-floating-promises': 'off', + + /** Mirror `@code-style/eslint-config/lenient`'s `dot-notation` & `no-throw-literal`. */ + '@typescript-eslint/dot-notation': 'off', + '@typescript-eslint/only-throw-error': 'off', }, - ], -}; - -export = config; + }, +]; diff --git a/packages/eslint-config-typescript/test/lenient.ts b/packages/eslint-config-typescript/test/lenient.ts index f153d271..1c7fe718 100644 --- a/packages/eslint-config-typescript/test/lenient.ts +++ b/packages/eslint-config-typescript/test/lenient.ts @@ -1,5 +1,6 @@ import { describe, it } from 'node:test'; -import { join } from 'node:path'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testNoFail, @@ -7,21 +8,15 @@ import { } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; import { codeBlock } from 'common-tags'; +import { config as base } from '@code-style/eslint-config'; +import { config as base_lenient } from '@code-style/eslint-config/lenient'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as typescript_lenient } from '@code-style/eslint-config-typescript/lenient'; const linter = initESLint( - { - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config/lenient', - '@code-style/eslint-config-esmodule', - '@code-style/eslint-config-typescript', - '@code-style/eslint-config-typescript/lenient', - ], - parserOptions: { - ecmaVersion: 2022, - }, - }, - { cwd: join(__dirname, 'fixture') }, + [...base, ...base_lenient, ...esmodule, ...typescript, ...typescript_lenient], + { cwd: join(dirname(fileURLToPath(import.meta.url)), 'fixture') }, ); void describe('eslint-config-typescript lenient', () => { @@ -45,8 +40,8 @@ void describe('eslint-config-typescript lenient', () => { files: [ { code: codeBlock` - Number(a); - const a = 10; + foo(); + function foo(): void {} `, ts: true, }, @@ -117,7 +112,7 @@ void describe('eslint-config-typescript lenient', () => { { code: codeBlock` let foo = 'foo'; - foo = 'bar'; + if (foo === 'foo') foo = 'bar'; if (foo) Number(); `, ts: true, diff --git a/packages/eslint-config-typescript/test/strict.ts b/packages/eslint-config-typescript/test/strict.ts index 11750691..e081d955 100644 --- a/packages/eslint-config-typescript/test/strict.ts +++ b/packages/eslint-config-typescript/test/strict.ts @@ -1,53 +1,67 @@ import { describe, it } from 'node:test'; -import { deepStrictEqual } from 'node:assert'; -import { join } from 'node:path'; +import { strictEqual } from 'node:assert'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { codeBlock } from 'common-tags'; -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; import { initESLint } from '@code-style/utils/testing/eslint'; import { testNoFail, testRuleFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { + config as typescript, + files, +} from '@code-style/eslint-config-typescript'; -const linter = initESLint( - { - extends: [ - '@code-style/eslint-config', - '@code-style/eslint-config-esmodule', - '@code-style/eslint-config-typescript', - ], - }, - { cwd: join(__dirname, 'fixture') }, -); +const linter = initESLint([...base, ...esmodule, ...typescript], { + cwd: join(dirname(fileURLToPath(import.meta.url)), 'fixture'), +}); void describe('lint rules strict', async () => { + // flat config normalizes rule severities to numbers const calculated = (await linter.calculateConfigForFile( 'src/index.ts', - )) as Pick< - ESLint.ConfigData, - | 'env' - | 'globals' - | 'ignorePatterns' - | 'noInlineConfig' - | 'parser' - | 'parserOptions' - | 'plugins' - | 'reportUnusedDisableDirectives' - | 'rules' - | 'settings' - >; + )) as Pick & { + rules?: Record; + }; void it(`should have rules from eslint-config-typescript`, () => { - deepStrictEqual(calculated.rules?.['@typescript-eslint/no-namespace'], [ - 'error', - ]); + strictEqual(calculated.rules?.['@typescript-eslint/no-namespace']?.[0], 2); }); void it(`should have rules from eslint-config-esmodule`, () => { - deepStrictEqual(calculated.rules?.['import/no-commonjs'], ['error']); + strictEqual(calculated.rules?.['import/no-commonjs']?.[0], 2); }); void it(`should have rules from eslint-config`, () => { - deepStrictEqual(calculated.rules?.['no-constructor-return'], ['error']); + strictEqual(calculated.rules?.['no-constructor-return']?.[0], 2); + }); + + void it(`should apply rule changes scoped to its files`, async () => { + const overlaid = initESLint( + [ + ...base, + ...esmodule, + ...typescript, + { files, rules: { '@typescript-eslint/no-explicit-any': 'warn' } }, + ], + { cwd: join(dirname(fileURLToPath(import.meta.url)), 'fixture') }, + ); + const { rules } = (await overlaid.calculateConfigForFile( + 'src/index.ts', + )) as { rules?: Record }; + strictEqual(rules?.['@typescript-eslint/no-explicit-any']?.[0], 1); + // and doesn't break linting files the typescript config doesn't cover + await overlaid.calculateConfigForFile('package.json'); + }); + + void it(`should relax rules in test files`, async () => { + const { rules } = (await linter.calculateConfigForFile( + 'src/index.test.ts', + )) as { rules?: Record }; + strictEqual(rules?.['@typescript-eslint/no-non-null-assertion']?.[0], 0); }); }); @@ -72,8 +86,8 @@ void describe('eslint-config-typescript strict', () => { files: [ { code: codeBlock` - Number(a); - const a = 10; + foo(); + function foo(): void {} `, ts: true, }, @@ -130,7 +144,7 @@ void describe('eslint-config-typescript strict', () => { { code: codeBlock` let foo = 'foo'; - foo = 'bar'; + if (foo === 'foo') foo = 'bar'; if (foo) Number(); `, ts: true, @@ -146,7 +160,7 @@ void describe('eslint-config-typescript strict', () => { { code: codeBlock` let foo: unknown = 'foo'; - foo = 'bar'; + if (foo === 'foo') foo = 'bar'; if (foo) Number(); `, ts: true, diff --git a/packages/eslint-config-typescript/tsconfig.build.json b/packages/eslint-config-typescript/tsconfig.build.json index 6b51a225..7b11e52f 100644 --- a/packages/eslint-config-typescript/tsconfig.build.json +++ b/packages/eslint-config-typescript/tsconfig.build.json @@ -1,6 +1,7 @@ { "extends": ["./tsconfig.json"], "compilerOptions": { + "rootDir": "src/", "baseUrl": "./" }, "include": ["src/"], diff --git a/packages/eslint-config-typescript/tsconfig.json b/packages/eslint-config-typescript/tsconfig.json index aca2915d..5ea1f06b 100644 --- a/packages/eslint-config-typescript/tsconfig.json +++ b/packages/eslint-config-typescript/tsconfig.json @@ -6,8 +6,11 @@ "@code-style/typescript-configs/layers/library" ], "compilerOptions": { + "rootDir": "./", "baseUrl": "src/", - "outDir": "dist/" + "outDir": "dist/", + // eslint-plugin-import-x's bundled types reference packages it doesn't declare + "skipLibCheck": true }, "include": ["./"], "exclude": ["dist/", "coverage/"] diff --git a/packages/eslint-config/.eslintrc.yaml b/packages/eslint-config/.eslintrc.yaml deleted file mode 100644 index 840e3dc0..00000000 --- a/packages/eslint-config/.eslintrc.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# In order to update the config, update: -# @code-style/eslint-config -# @code-style/eslint-config-node -# @code-style/eslint-config-cli -# @code-style/eslint-config-typescript -# @code-style/eslint-config-esmodule -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-cli' - - '@code-style/eslint-config-typescript' - - '@code-style/eslint-config-esmodule' -parserOptions: - ecmaVersion: 2022 diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md index faaa8e62..4286df16 100644 --- a/packages/eslint-config/README.md +++ b/packages/eslint-config/README.md @@ -4,6 +4,8 @@ A set of ESLint rules customized for code corectness. **The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** +To add your own rules on top, see [Customizing the ESLint configs](https://github.com/dudeofawesome/code-style/blob/main/docs/customizing-eslint.md). + You're probably looking to use this with one of our other configs: - [`@code-style/node`](../eslint-config-node/README.md) diff --git a/packages/eslint-config/eslint.config.mjs b/packages/eslint-config/eslint.config.mjs new file mode 100644 index 00000000..f7c5d6d6 --- /dev/null +++ b/packages/eslint-config/eslint.config.mjs @@ -0,0 +1,15 @@ +// In order to update the config, update: +// @code-style/eslint-config +// @code-style/eslint-config-node +// @code-style/eslint-config-cli +// @code-style/eslint-config-typescript +// @code-style/eslint-config-esmodule +import { defineConfig } from 'eslint/config'; + +import { config as node } from '@code-style/eslint-config-node'; +import { config as cli } from '@code-style/eslint-config-cli'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as base } from '@code-style/eslint-config'; + +export default defineConfig(base, node, cli, typescript, esmodule); diff --git a/packages/eslint-config/examples/.eslintrc.yaml b/packages/eslint-config/examples/.eslintrc.yaml deleted file mode 100644 index 0e78773c..00000000 --- a/packages/eslint-config/examples/.eslintrc.yaml +++ /dev/null @@ -1,3 +0,0 @@ -root: true -extends: - - '@code-style' diff --git a/packages/eslint-config/examples/eslint.config.mjs b/packages/eslint-config/examples/eslint.config.mjs new file mode 100644 index 00000000..1550a693 --- /dev/null +++ b/packages/eslint-config/examples/eslint.config.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; + +export default defineConfig(base); diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index f41d54c1..ba9e8926 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -16,7 +16,7 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "exports": { ".": "./dist/base.js", "./base": "./dist/base.js", @@ -30,25 +30,26 @@ ], "scripts": { "build": "concurrently --raw --group 'npm:build:*'", - "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*') --outdir=dist --sourcemap=inline --platform=node --target=node18 --format=cjs", + "build:js": "esbuild --tsconfig=tsconfig.build.json $(glob 'src/**/*.?(c|m)[jt]s' --ignore '**/*.@(spec|test).*' --ignore '**/*.d.ts') --outdir=dist --sourcemap=inline --platform=node --target=node20 --format=esm", "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly", "check": "concurrently --raw --group 'npm:test' 'npm:lint'", "lint": "concurrently --raw --group 'npm:lint:*'", - "lint:js": "eslint . --ext ts,json --cache", + "lint:js": "eslint . --cache", "lint:types": "tsc --noEmit --pretty", "prepublishOnly": "npm run build", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", - "@rushstack/eslint-patch": "^1.10.2", - "eslint": "^8.49.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-json-files": "^4.1.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1" + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.0", + "@eslint/compat": "^2.1.1", + "@eslint/js": "^10.0.0", + "eslint-config-prettier": "^10.1.0", + "eslint-plugin-import-x": "^4.17.0", + "eslint-plugin-json-files": "^5.1.0", + "eslint-plugin-prettier": "^5.5.0", + "eslint-plugin-promise": "^7.3.0", + "globals": "^16.0.0" }, "devDependencies": { "@code-style/code-style": "^2.0.0-35", @@ -58,7 +59,6 @@ "@code-style/eslint-config-node": "^2.0.0-35", "@code-style/eslint-config-typescript": "^2.0.0-35", "@code-style/typescript-configs": "^2.0.0-35", - "@types/eslint": "^8.44.2", "@types/node": "^20.12.11", "concurrently": "^8.2.2", "esbuild": "^0.21.1", @@ -67,10 +67,11 @@ "typescript": "^5.4.5" }, "peerDependencies": { + "eslint": "^10.0.0", "prettier": "^3.1.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-config/src/base.ts b/packages/eslint-config/src/base.ts index ce9dc991..4d48be05 100644 --- a/packages/eslint-config/src/base.ts +++ b/packages/eslint-config/src/base.ts @@ -1,33 +1,74 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; +import { recommended as eslint_comments_recommended } from '@eslint-community/eslint-plugin-eslint-comments/configs'; +import js from '@eslint/js'; +import { + flatConfigs as import_x_configs, + importX, +} from 'eslint-plugin-import-x'; +import prettierRecommended from 'eslint-plugin-prettier/recommended'; +import promisePlugin from 'eslint-plugin-promise'; +import globals from 'globals'; -const config: ESLint.ConfigData = { - extends: [ - 'eslint:recommended', - 'plugin:prettier/recommended', - 'plugin:eslint-plugin-promise/recommended', - 'plugin:eslint-plugin-import/recommended', - 'plugin:@eslint-community/eslint-plugin-eslint-comments/recommended', +import { config as bugs } from './rule-sets/bugs.js'; +import { config as deprecated } from './rule-sets/deprecated.js'; +import { config as footguns } from './rule-sets/footguns.js'; +import { config as imports } from './rule-sets/imports.js'; +import { config as miscellaneous } from './rule-sets/miscellaneous.js'; +import { config as modern_code } from './rule-sets/modern-code.js'; +import { config as promises } from './rule-sets/promises.js'; +import { config as readability } from './rule-sets/readability.js'; +import { config as security } from './rule-sets/security.js'; +import { config as overrides } from './overrides/index.js'; - './rule-sets/bugs.js', - './rule-sets/deprecated.js', - './rule-sets/footguns.js', - './rule-sets/imports.js', - './rule-sets/miscellaneous.js', - './rule-sets/modern-code.js', - './rule-sets/promises.js', - './rule-sets/readability.js', - './rule-sets/security.js', +/** + * eslint-plugin-import-x is registered under the `import` namespace to keep + * the `import/*` rule IDs, so its recommended rules need renaming to match. + */ +const import_recommended_rules: Linter.RulesRecord = Object.fromEntries( + Object.entries(import_x_configs.recommended.rules ?? {}).map( + ([rule, severity]) => [rule.replace(/^import-x\//u, 'import/'), severity], + ), +); - './overrides/index.js', - ], - parserOptions: { - ecmaVersion: 2022, +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/ignores', + ignores: ['**/dist/', '**/out/', '**/coverage/'], }, - env: { - commonjs: true, + { + // flat config only lints `*.{js,mjs,cjs}` unless a config matches other extensions + name: '@code-style/eslint-config/files', + files: ['**/*.?(m|c)@(t|j)s?(x)'], }, - ignorePatterns: ['**/dist/**', '**/out/**', '**/coverage/**', '!.*'], -}; + js.configs.recommended, + prettierRecommended, + promisePlugin.configs['flat/recommended'], + { + name: '@code-style/eslint-config/import', + plugins: { import: importX }, + rules: import_recommended_rules, + }, + eslint_comments_recommended, + + ...bugs, + ...deprecated, + ...footguns, + ...imports, + ...miscellaneous, + ...modern_code, + ...promises, + ...readability, + ...security, -export = config; + ...overrides, + + { + name: '@code-style/eslint-config/language-options', + languageOptions: { + ecmaVersion: 2022, + // matches the eslintrc config, which parsed as `module` via `plugin:import/recommended` + sourceType: 'module', + globals: globals.commonjs, + }, + }, +]; diff --git a/packages/eslint-config/src/lenient.ts b/packages/eslint-config/src/lenient.ts index 6f32c7f0..723ad9e8 100644 --- a/packages/eslint-config/src/lenient.ts +++ b/packages/eslint-config/src/lenient.ts @@ -1,27 +1,22 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - 'symbol-description': 'off', - 'prefer-template': 'off', - 'prefer-spread': 'off', - 'no-await-in-loop': 'off', - 'promise/catch-or-return': 'off', - 'dot-notation': 'off', - 'max-lines': 'off', - 'no-param-reassign': 'off', - 'import/order': 'off', - 'import/newline-after-import': 'off', - 'n/prefer-global/buffer': 'off', - 'n/prefer-global/text-decoder': 'off', - 'n/prefer-global/text-encoder': 'off', - 'n/prefer-global/url-search-params': 'off', - 'n/prefer-global/url': 'off', - 'n/no-process-env': 'off', - 'promise/always-return': 'off', - 'no-throw-literal': 'off', - 'no-unused-vars': 'off', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/lenient', + rules: { + 'symbol-description': 'off', + 'prefer-template': 'off', + 'prefer-spread': 'off', + 'no-await-in-loop': 'off', + 'promise/catch-or-return': 'off', + 'dot-notation': 'off', + 'max-lines': 'off', + 'no-param-reassign': 'off', + 'import/order': 'off', + 'import/newline-after-import': 'off', + 'promise/always-return': 'off', + 'no-throw-literal': 'off', + 'no-unused-vars': 'off', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/overrides/index.ts b/packages/eslint-config/src/overrides/index.ts index 92f91b0f..48e17cd3 100644 --- a/packages/eslint-config/src/overrides/index.ts +++ b/packages/eslint-config/src/overrides/index.ts @@ -1,23 +1,19 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - overrides: [ - { - files: ['*.json'], - extends: './json.js', - }, - { - files: [ - '**/test/**', - '**/__test__/**', - '*.test.*', - '*.spec.*', - '*.unit.*', - '*.e2e.*', - ], - extends: './testing.js', - }, - ], -}; +import { config as json } from './json.js'; +import { config as testing } from './testing.js'; -export = config; +export const config: Linter.Config[] = [ + ...json.map((c) => ({ ...c, files: ['**/*.json'] })), + ...testing.map((c) => ({ + ...c, + files: [ + '**/test/**', + '**/__test__/**', + '**/*.test.*', + '**/*.spec.*', + '**/*.unit.*', + '**/*.e2e.*', + ], + })), +]; diff --git a/packages/eslint-config/src/overrides/json.ts b/packages/eslint-config/src/overrides/json.ts index 774e1a71..a7a73ed9 100644 --- a/packages/eslint-config/src/overrides/json.ts +++ b/packages/eslint-config/src/overrides/json.ts @@ -1,10 +1,17 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; +import jsonFiles from 'eslint-plugin-json-files'; -const config: ESLint.ConfigData = { - rules: { - // eslint-plugin-prettier breaks JSON linting (https://github.com/prettier/eslint-plugin-prettier/issues/570) - 'prettier/prettier': 'off', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/overrides/json', + // ESLint 10's `--cache` requires processors to have a `meta` object + processor: { + meta: { name: 'json-files/.json' }, + ...jsonFiles.processors['.json'], + }, + rules: { + // eslint-plugin-prettier breaks JSON linting (https://github.com/prettier/eslint-plugin-prettier/issues/570) + 'prettier/prettier': 'off', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/overrides/testing.ts b/packages/eslint-config/src/overrides/testing.ts index 01825d9a..a8b8345f 100644 --- a/packages/eslint-config/src/overrides/testing.ts +++ b/packages/eslint-config/src/overrides/testing.ts @@ -1,40 +1,20 @@ -import type { ESLint } from 'eslint'; - -const config: ESLint.ConfigData = { - rules: { - // Allow console logging in tests - 'no-console': 'off', - - // Allow test to import unpublished files. - 'n/no-unpublished-import': 'off', - - // Allow test files to be any length. - 'max-lines': 'off', - - /** - * Don't require dot notation in tests. - * This can be useful for accessing Typescript `private` properties & methods. - */ - 'dot-notation': 'off', - '@typescript-eslint/dot-notation': 'off', - - // Allow `any` in tests. - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - - // Allow non-null assertions in tests. - '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', - - // Simplify testing methods. - '@typescript-eslint/unbound-method': 'off', - - // Allow tests to throw literals. - '@typescript-eslint/no-throw-literal': 'off', +import type { Linter } from 'eslint'; + +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/overrides/testing', + rules: { + // Allow console logging in tests + 'no-console': 'off', + + // Allow test files to be any length. + 'max-lines': 'off', + + /** + * Don't require dot notation in tests. + * This can be useful for accessing Typescript `private` properties & methods. + */ + 'dot-notation': 'off', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/bugs.ts b/packages/eslint-config/src/rule-sets/bugs.ts index cd7bcf12..7bbc9caf 100644 --- a/packages/eslint-config/src/rule-sets/bugs.ts +++ b/packages/eslint-config/src/rule-sets/bugs.ts @@ -1,32 +1,33 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // Disallows meaningless comparisons to self. - 'no-self-compare': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/bugs', + rules: { + // Disallows meaningless comparisons to self. + 'no-self-compare': 'error', - // Disallows using `this` when `this` is undefined. - 'no-invalid-this': 'error', + // Disallows using `this` when `this` is undefined. + 'no-invalid-this': 'error', - // Catches some race conditions, but can lead to false-positives. - 'require-atomic-updates': ['warn', { allowProperties: true }], + // Catches some race conditions, but can lead to false-positives. + 'require-atomic-updates': ['warn', { allowProperties: true }], - // Disallows usage of `new` for certain globals functions. - 'no-new-native-nonconstructor': 'error', + // Disallows usage of `new` for certain globals functions. + 'no-new-native-nonconstructor': 'error', - /** - * Disallows throwing literal values, preferring objects extending `Error` instead. - * Throwing `Errors` improves the traceability of exceptions. - */ - 'no-throw-literal': 'error', + /** + * Disallows throwing literal values, preferring objects extending `Error` instead. + * Throwing `Errors` improves the traceability of exceptions. + */ + 'no-throw-literal': 'error', - /** - * Ensures that binary comparisons can possibly change value. - * If a binary expression comparison can't change value, then you're likely doing something you didn't intend. - * https://eslint.org/blog/2022/07/interesting-bugs-caught-by-no-constant-binary-expression/ - */ - 'no-constant-binary-expression': 'error', + /** + * Ensures that binary comparisons can possibly change value. + * If a binary expression comparison can't change value, then you're likely doing something you didn't intend. + * https://eslint.org/blog/2022/07/interesting-bugs-caught-by-no-constant-binary-expression/ + */ + 'no-constant-binary-expression': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/deprecated.ts b/packages/eslint-config/src/rule-sets/deprecated.ts index d5dbccc7..98dc26ba 100644 --- a/packages/eslint-config/src/rule-sets/deprecated.ts +++ b/packages/eslint-config/src/rule-sets/deprecated.ts @@ -1,16 +1,17 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // `__iterator__` is deprecated. - 'no-iterator': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/deprecated', + rules: { + // `__iterator__` is deprecated. + 'no-iterator': 'error', - // `__proto__` is deprecated. - 'no-proto': 'error', + // `__proto__` is deprecated. + 'no-proto': 'error', - // Disallows allow `var`, preferring `let` or `const` instead. - 'no-var': 'error', + // Disallows allow `var`, preferring `let` or `const` instead. + 'no-var': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/footguns.ts b/packages/eslint-config/src/rule-sets/footguns.ts index 7d460550..6ba1ded9 100644 --- a/packages/eslint-config/src/rule-sets/footguns.ts +++ b/packages/eslint-config/src/rule-sets/footguns.ts @@ -1,77 +1,79 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import { fixupPluginRules } from '@eslint/compat'; +import type { Linter } from 'eslint'; +import jsonFiles from 'eslint-plugin-json-files'; -const config: ESLint.ConfigData = { - rules: { - // TODO(0): look into where parseInt isn't base 10 - // Require `parseInt` to have a radix specified since some browsers don't default to base 10. - radix: 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/footguns', + rules: { + // TODO(0): look into where parseInt isn't base 10 + // Require `parseInt` to have a radix specified since some browsers don't default to base 10. + radix: 'error', - // Require the use of `===` since `==` has some weird behavior. - eqeqeq: ['error', 'smart'], + // Require the use of `===` since `==` has some weird behavior. + eqeqeq: ['error', 'smart'], - // Prefer binary, octal, and hexadecimal literals instead of `parseInt('F', 16)`. - 'prefer-numeric-literals': 'error', + // Prefer binary, octal, and hexadecimal literals instead of `parseInt('F', 16)`. + 'prefer-numeric-literals': 'error', - // Ensure that functional array methods are chainable. - 'array-callback-return': 'error', + // Ensure that functional array methods are chainable. + 'array-callback-return': 'error', - // Disallow returning in a constructor. - 'no-constructor-return': 'error', + // Disallow returning in a constructor. + 'no-constructor-return': 'error', - // Disallow array constructors with multiple params. - 'no-array-constructor': 'error', + // Disallow array constructors with multiple params. + 'no-array-constructor': 'error', - // Disallow `arguments.caller`. - 'no-caller': 'error', + // Disallow `arguments.caller`. + 'no-caller': 'error', - // Disallow monkeypatching. - 'no-extend-native': 'error', + // Disallow monkeypatching. + 'no-extend-native': 'error', - // TODO(2): are we sure we really want this? it's not _really_ necessary - // Disallow sequences. - 'no-sequences': ['error', { allowInParentheses: false }], + // TODO(2): are we sure we really want this? it's not _really_ necessary + // Disallow sequences. + 'no-sequences': ['error', { allowInParentheses: false }], - // Disallow the `void` keyword. - 'no-void': ['error', { allowAsStatement: true }], + // Disallow the `void` keyword. + 'no-void': ['error', { allowAsStatement: true }], - // Disallow bitwise operators, which are usually typos for boolean operators - 'no-bitwise': 'error', + // Disallow bitwise operators, which are usually typos for boolean operators + 'no-bitwise': 'error', - // Ensure regexp uses certain flags. - 'require-unicode-regexp': 'error', + // Ensure regexp uses certain flags. + 'require-unicode-regexp': 'error', - // Prevent unintentional numeric literal values (eg: `071 === 51`). - 'no-octal': 'error', + // Prevent unintentional numeric literal values (eg: `071 === 51`). + 'no-octal': 'error', - // Prevent labels from sharing their name with variable. - 'no-label-var': 'error', + // Prevent labels from sharing their name with variable. + 'no-label-var': 'error', - // Disallow allow empty blocks. - 'no-empty': ['error', { allowEmptyCatch: true }], + // Disallow allow empty blocks. + 'no-empty': ['error', { allowEmptyCatch: true }], + }, }, - overrides: [ - { - files: '*.json', - plugins: ['eslint-plugin-json-files'], - rules: { - // Prevent having the same package in dependencies and devDependencies. - 'json-files/require-unique-dependency-names': 'error', - - // Require that specific ranges are specified in `package.json` `dependencies`. - 'json-files/restrict-ranges': [ - 'error', - { - versionHint: 'caret', - dependencyTypes: ['dependencies', 'devDependencies'], - }, - ], - - // Require that `engines` are specified in `package.json`. - 'json-files/require-engines': 'error', - }, + { + name: '@code-style/eslint-config/rule-sets/footguns/json', + files: ['**/*.json'], + // eslint-plugin-json-files still calls rule-context methods ESLint 10 removed + plugins: { 'json-files': fixupPluginRules(jsonFiles) }, + rules: { + // Prevent having the same package in dependencies and devDependencies. + 'json-files/require-unique-dependency-names': 'error', + + // Require that specific ranges are specified in `package.json` `dependencies`. + 'json-files/restrict-ranges': [ + 'error', + { + versionHint: 'caret', + dependencyTypes: ['dependencies', 'devDependencies'], + }, + ], + + // Require that `engines` are specified in `package.json`. + 'json-files/require-engines': 'error', }, - ], -}; - -export = config; + }, +]; diff --git a/packages/eslint-config/src/rule-sets/imports.ts b/packages/eslint-config/src/rule-sets/imports.ts index 8b46c919..4ef3b8d5 100644 --- a/packages/eslint-config/src/rule-sets/imports.ts +++ b/packages/eslint-config/src/rule-sets/imports.ts @@ -1,86 +1,95 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // Warn about deprecated imports. - 'import/no-deprecated': 'warn', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/imports', + rules: { + // Warn about deprecated imports. + 'import/no-deprecated': 'warn', - // Disallow exporting mutable vars. - 'import/no-mutable-exports': 'error', + // Disallow exporting mutable vars. + 'import/no-mutable-exports': 'error', - // Disallow AMD modules. - 'import/no-amd': 'error', + // Disallow AMD modules. + 'import/no-amd': 'error', - // Disallow mixing ESM with commonjs exports. - 'import/no-import-module-exports': 'error', + // Disallow mixing ESM with commonjs exports. + 'import/no-import-module-exports': 'error', - // Disallow importing yourself. - 'import/no-self-import': 'error', + // Disallow importing yourself. + 'import/no-self-import': 'error', - // Disallow webpack imports. - 'import/no-webpack-loader-syntax': 'error', + // Disallow webpack imports. + 'import/no-webpack-loader-syntax': 'error', - // Ensure imports come first in file. - 'import/first': 'error', + // Ensure imports come first in file. + 'import/first': 'error', - // Ensure imports are seperated from the rest of the file. - 'import/newline-after-import': 'error', + // Ensure imports are seperated from the rest of the file. + 'import/newline-after-import': 'error', - // Disallow default exports. - 'import/no-default-export': 'error', + // Disallow default exports. + 'import/no-default-export': 'error', - // Ensure consistent ordering of imports. - 'import/order': [ - 'warn', - { - groups: ['builtin', 'external', 'internal'], - 'newlines-between': 'ignore', - }, - ], + // Ensure consistent ordering of imports. + 'import/order': [ + 'warn', + { + groups: ['builtin', 'external', 'internal'], + 'newlines-between': 'ignore', + }, + ], - // Use `import/order` instead. - 'sort-imports': 'off', + // Use `import/order` instead. + 'sort-imports': 'off', - // Disable ES Module import/export. - 'no-restricted-syntax': [ - 'error', - { - selector: 'ImportDeclaration', - message: 'ES Module import not allowed', - }, - { - selector: 'ExportNamedDeclaration', - message: 'ES Module export not allowed', - }, - { - selector: 'ExportDefaultDeclaration', - message: 'ES Module export not allowed', - }, - { - selector: 'ExportAllDeclaration', - message: 'ES Module export not allowed', - }, - { - selector: 'TSExportAssignment', - message: 'ES Module export not allowed', - }, - ], + // Disable ES Module import/export. + 'no-restricted-syntax': [ + 'error', + { + selector: 'ImportDeclaration', + message: 'ES Module import not allowed', + }, + { + selector: 'ExportNamedDeclaration', + message: 'ES Module export not allowed', + }, + { + selector: 'ExportDefaultDeclaration', + message: 'ES Module export not allowed', + }, + { + selector: 'ExportAllDeclaration', + message: 'ES Module export not allowed', + }, + { + selector: 'TSExportAssignment', + message: 'ES Module export not allowed', + }, + ], + }, }, - - overrides: [ - { - files: ['jest.config.*js'], - rules: { - 'import/no-default-export': 'off', - }, + { + // these tools require their config files to default export + name: '@code-style/eslint-config/rule-sets/imports/default-export-config-files', + files: ['**/jest.config.*js', '**/eslint.config.*'], + rules: { + 'import/no-default-export': 'off', }, - { - files: ['./*.config.js'], - rules: { - 'import/no-commonjs': 'off', - }, + }, + { + // `.mjs` files are always ES modules (eg: `eslint.config.mjs`) + name: '@code-style/eslint-config/rule-sets/imports/mjs-files', + files: ['**/*.mjs'], + rules: { + 'no-restricted-syntax': 'off', }, - ], -}; - -export = config; + }, + { + name: '@code-style/eslint-config/rule-sets/imports/config-files', + files: ['*.config.js'], + rules: { + 'import/no-commonjs': 'off', + }, + }, +]; diff --git a/packages/eslint-config/src/rule-sets/miscellaneous.ts b/packages/eslint-config/src/rule-sets/miscellaneous.ts index be52185d..ac1fd87d 100644 --- a/packages/eslint-config/src/rule-sets/miscellaneous.ts +++ b/packages/eslint-config/src/rule-sets/miscellaneous.ts @@ -1,26 +1,27 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - /** - * Disallow `console` and `alert` calls. - * Neither of these methods should be used in production. - */ - 'no-console': 'error', - 'no-alert': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/miscellaneous', + rules: { + /** + * Disallow `console` and `alert` calls. + * Neither of these methods should be used in production. + */ + 'no-console': 'error', + 'no-alert': 'error', - // Warn about prettier style issues. - 'prettier/prettier': 'warn', + // Warn about prettier style issues. + 'prettier/prettier': 'warn', - // Disallow renaming `import`, `export`, and destructured assignments to the same name. - 'no-useless-rename': 'error', + // Disallow renaming `import`, `export`, and destructured assignments to the same name. + 'no-useless-rename': 'error', - // Require `symbol`s to have a description. - 'symbol-description': 'error', + // Require `symbol`s to have a description. + 'symbol-description': 'error', - // Require `switch`'s `default` case to be last. - 'default-case-last': 'error', + // Require `switch`'s `default` case to be last. + 'default-case-last': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/modern-code.ts b/packages/eslint-config/src/rule-sets/modern-code.ts index 4756280e..84cb1bc4 100644 --- a/packages/eslint-config/src/rule-sets/modern-code.ts +++ b/packages/eslint-config/src/rule-sets/modern-code.ts @@ -1,22 +1,23 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // Prefer template literals instead of string concatenation. - 'prefer-template': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/modern-code', + rules: { + // Prefer template literals instead of string concatenation. + 'prefer-template': 'error', - // Disallow using `.apply()`. - 'prefer-spread': 'error', + // Disallow using `.apply()`. + 'prefer-spread': 'error', - // Prefer a rest parameter instead of `arguments`. - 'prefer-rest-params': 'error', + // Prefer a rest parameter instead of `arguments`. + 'prefer-rest-params': 'error', - // Prefer using arrow functions as callbacks. - 'prefer-arrow-callback': ['error', { allowNamedFunctions: true }], + // Prefer using arrow functions as callbacks. + 'prefer-arrow-callback': ['error', { allowNamedFunctions: true }], - // Prefer `const` for vars that are never modified. - 'prefer-const': 'error', + // Prefer `const` for vars that are never modified. + 'prefer-const': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/promises.ts b/packages/eslint-config/src/rule-sets/promises.ts index bcba4313..0b3a7698 100644 --- a/packages/eslint-config/src/rule-sets/promises.ts +++ b/packages/eslint-config/src/rule-sets/promises.ts @@ -1,28 +1,29 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // Require errors from promises are caught. - 'promise/catch-or-return': ['error', { allowThen: true }], +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/promises', + rules: { + // Require errors from promises are caught. + 'promise/catch-or-return': ['error', { allowThen: true }], - // Disallow calling resolve multiple times. - 'promise/no-multiple-resolved': 'error', + // Disallow calling resolve multiple times. + 'promise/no-multiple-resolved': 'error', - // Allow nesting promises. - 'promise/no-nesting': 'off', + // Allow nesting promises. + 'promise/no-nesting': 'off', - // Allow using promises inside of callbacks. - 'promise/no-promise-in-callback': 'off', + // Allow using promises inside of callbacks. + 'promise/no-promise-in-callback': 'off', - // Ensure the proper number of arguments are passed to `Promise` functions. - 'promise/valid-params': 'error', + // Ensure the proper number of arguments are passed to `Promise` functions. + 'promise/valid-params': 'error', - // Require `async` functions to contain an `await`. - 'require-await': 'error', + // Require `async` functions to contain an `await`. + 'require-await': 'error', - // Prefer using `Promise.all` instead of synchronous loops. - 'no-await-in-loop': 'error', + // Prefer using `Promise.all` instead of synchronous loops. + 'no-await-in-loop': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/rule-sets/readability.ts b/packages/eslint-config/src/rule-sets/readability.ts index 0152cce3..4275a90e 100644 --- a/packages/eslint-config/src/rule-sets/readability.ts +++ b/packages/eslint-config/src/rule-sets/readability.ts @@ -1,49 +1,51 @@ -import '@rushstack/eslint-patch/modern-module-resolution'; -import type { ESLint } from 'eslint'; +import { fixupPluginRules } from '@eslint/compat'; +import type { Linter } from 'eslint'; +import jsonFiles from 'eslint-plugin-json-files'; -const config: ESLint.ConfigData = { - rules: { - // Prefer `else if` instead of a lonely `if` inside of an `else`. - 'no-lonely-if': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/readability', + rules: { + // Prefer `else if` instead of a lonely `if` inside of an `else`. + 'no-lonely-if': 'error', - // Require dot notation when possible. - 'dot-notation': 'error', + // Require dot notation when possible. + 'dot-notation': 'error', - // TODO: what should our max be? should we even have one? - // Disallow excessively large files which would be better to be broken up. - 'max-lines': [ - 'error', - { - max: 2000, - skipBlankLines: true, - skipComments: true, - }, - ], + // TODO: what should our max be? should we even have one? + // Disallow excessively large files which would be better to be broken up. + 'max-lines': [ + 'error', + { + max: 2000, + skipBlankLines: true, + skipComments: true, + }, + ], - // Disallow reassigning method params, treating them as `const`. - 'no-param-reassign': 'warn', + // Disallow reassigning method params, treating them as `const`. + 'no-param-reassign': 'warn', - 'no-unused-vars': [ - 'warn', - { - args: 'none', - destructuredArrayIgnorePattern: '^_', - }, - ], + 'no-unused-vars': [ + 'warn', + { + args: 'none', + destructuredArrayIgnorePattern: '^_', + }, + ], + }, }, - overrides: [ - { - files: '*.json', - plugins: ['eslint-plugin-json-files'], - rules: { - /** - * Require keys in package.json to be sorted, improving readability & - * consistency across projects. - */ - 'json-files/sort-package-json': 'warn', - }, + { + name: '@code-style/eslint-config/rule-sets/readability/json', + files: ['**/*.json'], + // eslint-plugin-json-files still calls rule-context methods ESLint 10 removed + plugins: { 'json-files': fixupPluginRules(jsonFiles) }, + rules: { + /** + * Require keys in package.json to be sorted, improving readability & + * consistency across projects. + */ + 'json-files/sort-package-json': 'warn', }, - ], -}; - -export = config; + }, +]; diff --git a/packages/eslint-config/src/rule-sets/security.ts b/packages/eslint-config/src/rule-sets/security.ts index 099e4709..ae2ffecc 100644 --- a/packages/eslint-config/src/rule-sets/security.ts +++ b/packages/eslint-config/src/rule-sets/security.ts @@ -1,11 +1,12 @@ -import type { ESLint } from 'eslint'; +import type { Linter } from 'eslint'; -const config: ESLint.ConfigData = { - rules: { - // Disallow `eval`. - 'no-eval': 'error', - 'no-implied-eval': 'error', +export const config: Linter.Config[] = [ + { + name: '@code-style/eslint-config/rule-sets/security', + rules: { + // Disallow `eval`. + 'no-eval': 'error', + 'no-implied-eval': 'error', + }, }, -}; - -export = config; +]; diff --git a/packages/eslint-config/src/types.d.ts b/packages/eslint-config/src/types.d.ts new file mode 100644 index 00000000..993911ff --- /dev/null +++ b/packages/eslint-config/src/types.d.ts @@ -0,0 +1,30 @@ +/** + * Ambient type stubs for plugins that don't ship their own type + * declarations. + */ + +declare module 'eslint-plugin-promise' { + import type { ESLint, Linter } from 'eslint'; + + const plugin: ESLint.Plugin & { + configs: { 'flat/recommended': Linter.Config }; + }; + // eslint-disable-next-line import/no-default-export + export default plugin; +} + +declare module '@eslint-community/eslint-plugin-eslint-comments/configs' { + import type { Linter } from 'eslint'; + + export const recommended: Linter.Config; +} + +declare module 'eslint-plugin-json-files' { + import type { ESLint, Linter } from 'eslint'; + + const plugin: ESLint.Plugin & { + processors: Record<'.json', Linter.Processor>; + }; + // eslint-disable-next-line import/no-default-export + export default plugin; +} diff --git a/packages/eslint-config/test/strict.ts b/packages/eslint-config/test/strict.ts index dfd2c009..9cb0a9b9 100644 --- a/packages/eslint-config/test/strict.ts +++ b/packages/eslint-config/test/strict.ts @@ -6,8 +6,9 @@ import { testRuleFail, } from '@code-style/utils/testing/eslint/tests'; import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; +import { config as base } from '@code-style/eslint-config'; -const linter = initESLint({ extends: ['@code-style/eslint-config'] }); +const linter = initESLint(base); void describe('eslint-config strict', () => { defaultTestSet(linter); @@ -72,8 +73,11 @@ void describe('eslint-config strict', () => { void it(`should fail no-console`, async () => { const res = await linter.lintText(`console.log('foo');\n`); - // this gets 2 errors due to `console` not being defined - strictEqual(res[0]?.messages[0]?.ruleId, 'no-console'); + // this also gets a `no-undef` error due to `console` not being defined + strictEqual( + res[0]?.messages.some((m) => m.ruleId === 'no-console'), + true, + ); }); void it(`should fail es module import`, () => diff --git a/packages/eslint-config/tsconfig.build.json b/packages/eslint-config/tsconfig.build.json index ddcd47a6..5f038d3a 100644 --- a/packages/eslint-config/tsconfig.build.json +++ b/packages/eslint-config/tsconfig.build.json @@ -1,6 +1,7 @@ { "extends": ["./tsconfig.json"], "compilerOptions": { + "rootDir": "src/", "baseUrl": "./" }, "include": ["src/"], diff --git a/packages/eslint-config/tsconfig.json b/packages/eslint-config/tsconfig.json index aca2915d..5ea1f06b 100644 --- a/packages/eslint-config/tsconfig.json +++ b/packages/eslint-config/tsconfig.json @@ -6,8 +6,11 @@ "@code-style/typescript-configs/layers/library" ], "compilerOptions": { + "rootDir": "./", "baseUrl": "src/", - "outDir": "dist/" + "outDir": "dist/", + // eslint-plugin-import-x's bundled types reference packages it doesn't declare + "skipLibCheck": true }, "include": ["./"], "exclude": ["dist/", "coverage/"] diff --git a/packages/eslint-plugin-nest/.eslintrc.yaml b/packages/eslint-plugin-nest/.eslintrc.yaml deleted file mode 100644 index 6900000f..00000000 --- a/packages/eslint-plugin-nest/.eslintrc.yaml +++ /dev/null @@ -1,9 +0,0 @@ -root: true -extends: - - '@code-style' - - '@code-style/esmodule' - - '@code-style/node' - - '@code-style/jest' - - '@code-style/typescript' -ignorePatterns: - - '/jest.config.mjs' diff --git a/packages/eslint-plugin-nest/eslint.config.mjs b/packages/eslint-plugin-nest/eslint.config.mjs new file mode 100644 index 00000000..ddac82e3 --- /dev/null +++ b/packages/eslint-plugin-nest/eslint.config.mjs @@ -0,0 +1,16 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as jest } from '@code-style/eslint-config-jest'; +import { config as typescript } from '@code-style/eslint-config-typescript'; + +export default defineConfig( + globalIgnores(['jest.config.mjs']), + base, + esmodule, + node, + jest, + typescript, +); diff --git a/packages/eslint-plugin-nest/package.json b/packages/eslint-plugin-nest/package.json index c3abf938..982420d5 100644 --- a/packages/eslint-plugin-nest/package.json +++ b/packages/eslint-plugin-nest/package.json @@ -16,20 +16,19 @@ }, "license": "MIT", "author": "Louis Orleans ", - "type": "commonjs", + "type": "module", "main": "dist/index.js", "files": [ "./dist/" ], "scripts": { "build": "tsc --project tsconfig.build.json", - "lint": "eslint . --ext ts,js,json", + "lint": "eslint .", "prepublishOnly": "npm run build", "test": "NODE_OPTIONS=--experimental-vm-modules npx jest" }, "dependencies": { - "@typescript-eslint/typescript-estree": "^7.0.0", - "@typescript-eslint/utils": "^7.0.0" + "@typescript-eslint/utils": "^8.67.0" }, "devDependencies": { "@code-style/eslint-config": "^2.0.0-35", @@ -37,9 +36,8 @@ "@code-style/eslint-config-typescript": "^2.0.0-32", "@code-style/jest-configs": "^2.0.0-35", "@code-style/typescript-configs": "^2.0.0-32", - "@types/eslint": "^8.44.2", "@types/node": "^20.6.3", - "@typescript-eslint/rule-tester": "^7.0.0", + "@typescript-eslint/rule-tester": "^8.67.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "tsx": "^4.9.4", @@ -47,10 +45,10 @@ }, "peerDependencies": { "@nestjs/core": "*", - "eslint": "^8.49.0" + "eslint": "^10.0.0" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "publishConfig": { "access": "public", diff --git a/packages/eslint-plugin-nest/src/configs/index.ts b/packages/eslint-plugin-nest/src/configs/index.ts deleted file mode 100644 index cb6afcf0..00000000 --- a/packages/eslint-plugin-nest/src/configs/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { recommended } from './recommended.js'; -import { recommended_flat } from './recommended-flat.js'; - -export const configs = { - recommended, - recommended_flat, -}; diff --git a/packages/eslint-plugin-nest/src/configs/recommended-flat.ts b/packages/eslint-plugin-nest/src/configs/recommended-flat.ts deleted file mode 100644 index fc7dd0dc..00000000 --- a/packages/eslint-plugin-nest/src/configs/recommended-flat.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Linter } from 'eslint'; -import plugin from '../index.js'; -import { recommended } from './recommended.js'; - -export const recommended_flat: Linter.FlatConfig = { - plugins: { '@code-style/nest': plugin }, - rules: recommended.rules, -}; diff --git a/packages/eslint-plugin-nest/src/configs/recommended.ts b/packages/eslint-plugin-nest/src/configs/recommended.ts deleted file mode 100644 index a8b958c3..00000000 --- a/packages/eslint-plugin-nest/src/configs/recommended.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ESLint } from 'eslint'; - -export const recommended: ESLint.ConfigData = { - plugins: ['@code-style/eslint-plugin-nest'], - rules: { - /** - * Disallow barrel files since they can lead to a number of hard to debug - * issues - */ - '@code-style/nest/no-barreling': 'error', - }, -}; diff --git a/packages/eslint-plugin-nest/src/index.ts b/packages/eslint-plugin-nest/src/index.ts index bf5605ac..c3b50fde 100644 --- a/packages/eslint-plugin-nest/src/index.ts +++ b/packages/eslint-plugin-nest/src/index.ts @@ -1,11 +1,29 @@ -import { ESLint } from 'eslint'; +import { createRequire } from 'node:module'; +import type { ESLint, Linter } from 'eslint'; import { rules } from './rules/index.js'; -import { configs } from './configs/index.js'; -const plugin: ESLint.Plugin = { +const { name, version } = createRequire(import.meta.url)('../package.json') as { + name: string; + version: string; +}; + +const plugin = { + meta: { name, version }, rules, - configs, + configs: {} as { recommended: Linter.Config }, +} satisfies ESLint.Plugin; + +plugin.configs.recommended = { + plugins: { '@code-style/nest': plugin }, + rules: { + /** + * Disallow barrel files since they can lead to a number of hard to debug + * issues + */ + '@code-style/nest/no-barreling': 'error', + }, }; -export = plugin; +// eslint-disable-next-line import/no-default-export +export default plugin; diff --git a/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts b/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts index b5731ceb..210042c2 100644 --- a/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts +++ b/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts @@ -1,7 +1,7 @@ import { RuleTester } from '@typescript-eslint/rule-tester'; import { no_barreling } from './no-barreling.js'; -const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser' }); +const ruleTester = new RuleTester(); ruleTester.run('my-rule', no_barreling, { valid: [ @@ -13,17 +13,54 @@ ruleTester.run('my-rule', no_barreling, { invalid: [ { code: `export * from './test'`, - errors: [{ messageId: 'not_allowed' }], + errors: [ + { + messageId: 'not_allowed', + suggestions: [{ messageId: 'delete_export', output: `` }], + }, + ], }, { code: `export * from './test' const foo = 'foo'`, - errors: [{ messageId: 'not_allowed' }], + errors: [ + { + messageId: 'not_allowed', + suggestions: [ + { + messageId: 'delete_export', + output: ` +const foo = 'foo'`, + }, + ], + }, + ], }, { code: `export * from './test' export type * from './test'`, - errors: [{ messageId: 'not_allowed' }], + errors: [ + { + messageId: 'not_allowed', + suggestions: [ + { + messageId: 'delete_export', + output: ` +export type * from './test'`, + }, + ], + }, + ], + }, + { + code: `export * from './a' +export * from './b'`, + errors: [ + { + messageId: 'not_allowed', + suggestions: [{ messageId: 'delete_export', output: `\n` }], + }, + ], }, ], }); diff --git a/packages/eslint-plugin-nest/src/rules/no-barreling.ts b/packages/eslint-plugin-nest/src/rules/no-barreling.ts index 648e5e34..669156e4 100644 --- a/packages/eslint-plugin-nest/src/rules/no-barreling.ts +++ b/packages/eslint-plugin-nest/src/rules/no-barreling.ts @@ -7,7 +7,6 @@ const createRule = ESLintUtils.RuleCreator( export const no_barreling = createRule({ name: 'no-barreling', - defaultOptions: [], meta: { type: 'problem', hasSuggestions: true, @@ -16,29 +15,27 @@ export const no_barreling = createRule({ }, messages: { not_allowed: 'Barrel files are not allowed', - delete_export: 'Delete this export declaration', + delete_export: 'Delete the `export *` declarations', }, schema: [], + defaultOptions: [], }, create(context) { return { - Program: (node) => { - if ( - node.body.find( - (node) => - node.type === 'ExportAllDeclaration' && - node.exportKind !== 'type', - ) != null - ) { + Program: (program) => { + const barrel_exports = program.body.filter( + (node) => + node.type === 'ExportAllDeclaration' && node.exportKind !== 'type', + ); + if (barrel_exports[0] != null) { context.report({ - node, + node: barrel_exports[0], messageId: 'not_allowed', suggest: [ { messageId: 'delete_export', - fix(fixer) { - return fixer.remove(node); - }, + fix: (fixer) => + barrel_exports.map((node) => fixer.remove(node)), }, ], }); diff --git a/packages/jest-configs/.eslintrc.yaml b/packages/jest-configs/.eslintrc.yaml deleted file mode 100644 index 0a122df2..00000000 --- a/packages/jest-configs/.eslintrc.yaml +++ /dev/null @@ -1,6 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-typescript' - - '@code-style/eslint-config-esmodule' diff --git a/packages/jest-configs/eslint.config.mjs b/packages/jest-configs/eslint.config.mjs new file mode 100644 index 00000000..7100e100 --- /dev/null +++ b/packages/jest-configs/eslint.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as typescript } from '@code-style/eslint-config-typescript'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; + +export default defineConfig(base, node, typescript, esmodule); diff --git a/packages/jest-configs/package.json b/packages/jest-configs/package.json index 779abc8d..8e887dbc 100644 --- a/packages/jest-configs/package.json +++ b/packages/jest-configs/package.json @@ -35,7 +35,7 @@ ], "scripts": { "build": "tsc", - "lint": "eslint . --ext ts,js,json", + "lint": "eslint .", "prepublishOnly": "npm run build" }, "dependencies": { diff --git a/scripts/build.sh b/scripts/build.sh index 8f6e0597..bde8a246 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -2,8 +2,9 @@ set -e npm run build --workspace packages/code-style +npm run build --workspace packages/eslint-plugin-nest scripts/concurrently-ws.ts build \ --skip \ - packages/code-style + packages/code-style,packages/eslint-plugin-nest echo 'All builds succeeded.' diff --git a/utils/.eslintrc.yaml b/utils/.eslintrc.yaml deleted file mode 100644 index 09e9a06f..00000000 --- a/utils/.eslintrc.yaml +++ /dev/null @@ -1,17 +0,0 @@ -root: true -extends: - - '@code-style/eslint-config' - - '@code-style/eslint-config-node' - - '@code-style/eslint-config-esmodule' - - '@code-style/eslint-config-typescript' - -overrides: - - files: - - '**/test/**' - - '**/testing/**' - - '**/__test__/**' - - '*.test.*' - - '*.spec.*' - - '*.unit.*' - - '*.e2e.*' - extends: '@code-style/eslint-config/overrides/testing' diff --git a/utils/eslint.config.mjs b/utils/eslint.config.mjs new file mode 100644 index 00000000..4da0dd88 --- /dev/null +++ b/utils/eslint.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'eslint/config'; + +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; +import { config as esmodule } from '@code-style/eslint-config-esmodule'; +import { config as typescript } from '@code-style/eslint-config-typescript'; + +export default defineConfig(base, node, esmodule, typescript); diff --git a/utils/package.json b/utils/package.json index dc99a8f4..a1b532a2 100644 --- a/utils/package.json +++ b/utils/package.json @@ -2,15 +2,24 @@ "name": "@code-style/utils", "version": "2.0.0-35", "private": true, + "type": "module", + "exports": { + "./path": "./path.ts", + "./testing/eslint": "./testing/eslint/index.ts", + "./testing/eslint/*": "./testing/eslint/*.ts", + "./testing/stylelint": "./testing/stylelint/index.ts", + "./testing/stylelint/*": "./testing/stylelint/*.ts", + "./testing/assert/*": "./testing/assert/*.ts" + }, "scripts": { "lint": "concurrently --raw --group \"npm:lint:*\"", - "lint:js": "eslint . --ext ts,mts,cts,js,json", + "lint:js": "eslint .", "lint:types": "tsc --noEmit --pretty", "test": "node $NODE_OPTS --import=tsx --test $(glob --ignore '**/node_modules/**' --ignore '**/dist/**' '**/*[.-_]test.?(c|m)[jt]s' '**/test?(-*).?(c|m)[jt]s' '**/test/**/*.?(c|m)[jt]s')", "test:debug": "NODE_OPTS='--inspect-brk' npm run test" }, "dependencies": { - "eslint": "^8.56.0", + "eslint": "^10.0.0", "stylelint": "^16.3.1" }, "devDependencies": { @@ -18,6 +27,6 @@ "common-tags": "^1.8.2" }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" } } diff --git a/utils/path.test.ts b/utils/path.test.ts index a87c3898..2d4b4354 100644 --- a/utils/path.test.ts +++ b/utils/path.test.ts @@ -2,7 +2,7 @@ import { describe, it } from 'node:test'; import { doesNotReject, match, equal } from 'node:assert'; import { cwd } from 'node:process'; import { join } from 'node:path'; -import { find_node_modules_path, path_exists } from './path'; +import { find_node_modules_path, path_exists } from './path.js'; void describe('path', () => { void describe('find_node_modules_path', () => { diff --git a/utils/testing/assert/matchers.ts b/utils/testing/assert/matchers.ts index 8b3208ad..130dfb58 100644 --- a/utils/testing/assert/matchers.ts +++ b/utils/testing/assert/matchers.ts @@ -1,5 +1,5 @@ import { expect } from '@jest/globals'; -import { areSetsEqual } from './set-matcher'; +import { areSetsEqual } from './set-matcher.js'; expect.addEqualityTesters([areSetsEqual]); diff --git a/utils/testing/assert/set-matcher.test.ts b/utils/testing/assert/set-matcher.test.ts index 9649d991..0f328e11 100644 --- a/utils/testing/assert/set-matcher.test.ts +++ b/utils/testing/assert/set-matcher.test.ts @@ -1,7 +1,7 @@ import { describe, it } from 'node:test'; import { strictEqual } from 'node:assert'; -import { areSetsEqual } from './set-matcher'; +import { areSetsEqual } from './set-matcher.js'; void describe('set-matcher', () => { void describe(areSetsEqual.name, () => { diff --git a/utils/testing/eslint/default-test-sets.ts b/utils/testing/eslint/default-test-sets.ts index aeeffa27..e2303549 100644 --- a/utils/testing/eslint/default-test-sets.ts +++ b/utils/testing/eslint/default-test-sets.ts @@ -1,6 +1,6 @@ import { describe, it } from 'node:test'; import { ESLint } from 'eslint'; -import { testNoFail, testRuleFail } from './tests'; +import { testNoFail, testRuleFail } from './tests.js'; export function defaultTestSet(linter: ESLint) { void describe('[standard tests] passes', () => { diff --git a/utils/testing/eslint/index.ts b/utils/testing/eslint/index.ts index f5615ae6..016e8b74 100644 --- a/utils/testing/eslint/index.ts +++ b/utils/testing/eslint/index.ts @@ -1,15 +1,45 @@ import { access } from 'node:fs/promises'; import { ESLint, Linter } from 'eslint'; +const init_registry = new WeakMap< + ESLint, + { config: Linter.Config[]; options: ESLint.Options } +>(); + export function initESLint( - config: Linter.Config, + config: Linter.Config[], options: ESLint.Options = {}, ): ESLint { - return new ESLint({ - useEslintrc: false, - overrideConfig: { root: true, ...config }, + const linter = new ESLint({ + // `true` = don't look for an eslint.config.* file; use `overrideConfig` alone + overrideConfigFile: true, + overrideConfig: [ + ...config, + /** + * typescript-eslint switches to "single run" mode when `CI=true`, which + * builds its programs from files on disk; tests lint in-memory code. + */ + { + languageOptions: { + parserOptions: { disallowAutomaticSingleRunInference: true }, + }, + }, + ], ...options, }); + init_registry.set(linter, { config, options }); + return linter; +} + +/** + * Flat-config ESLint refuses to lint files outside its base path (the cwd), + * so tests that write fixtures to a temp dir need a linter re-created with + * that dir as its cwd. + */ +export function recreateWithCwd(linter: ESLint, cwd: string): ESLint { + const init = init_registry.get(linter); + if (init == null) return linter; + return initESLint(init.config, { ...init.options, cwd }); } export type FilePathResult = string; diff --git a/utils/testing/eslint/tests.test.ts b/utils/testing/eslint/tests.test.ts index 92a17110..68cacdec 100644 --- a/utils/testing/eslint/tests.test.ts +++ b/utils/testing/eslint/tests.test.ts @@ -1,13 +1,13 @@ import { describe, it } from 'node:test'; import { rejects } from 'node:assert'; import { codeBlock } from 'common-tags'; +import { config as base } from '@code-style/eslint-config'; +import { config as node } from '@code-style/eslint-config-node'; import { initESLint } from '@code-style/utils/testing/eslint'; -import { testRuleFail } from './tests'; +import { testRuleFail } from './tests.js'; -const linter = initESLint({ - extends: ['@code-style/eslint-config', '@code-style/eslint-config-node'], -}); +const linter = initESLint([...base, ...node]); void describe('tests', () => { void describe('testRuleFail', () => { diff --git a/utils/testing/eslint/tests.ts b/utils/testing/eslint/tests.ts index 862ba380..1f4074d2 100644 --- a/utils/testing/eslint/tests.ts +++ b/utils/testing/eslint/tests.ts @@ -5,8 +5,13 @@ import { tmpdir } from 'node:os'; import { randomUUID } from 'node:crypto'; import { ESLint } from 'eslint'; -import { FilePathResult, FilePathOpts, filePath } from '.'; -import { find_node_modules_path } from '../../path'; +import { + FilePathResult, + FilePathOpts, + filePath, + recreateWithCwd, +} from './index.js'; +import { find_node_modules_path } from '../../path.js'; export function noLintMessage(lint_results: ESLint.LintResult[]) { strictEqual( @@ -82,10 +87,11 @@ export async function testRuleFail({ specificLintMessage(res, ruleId); } else { const { tmp_dir, cleanup } = await setup_tmp_dir(_files); + const scoped_linter = recreateWithCwd(linter, tmp_dir); try { specificLintMessage( - await linter.lintFiles( + await scoped_linter.lintFiles( _files.filter((f) => f.lint).map((f) => join(tmp_dir, f.path)), ), ruleId, @@ -117,10 +123,11 @@ export async function testNoFail({ noLintMessage(res); } else { const { tmp_dir, cleanup } = await setup_tmp_dir(_files); + const scoped_linter = recreateWithCwd(linter, tmp_dir); try { noLintMessage( - await linter.lintFiles( + await scoped_linter.lintFiles( _files.filter((f) => f.lint).map((f) => join(tmp_dir, f.path)), ), ); diff --git a/utils/testing/stylelint/default-test-sets.ts b/utils/testing/stylelint/default-test-sets.ts index b065dc0a..9c9430bd 100644 --- a/utils/testing/stylelint/default-test-sets.ts +++ b/utils/testing/stylelint/default-test-sets.ts @@ -1,6 +1,6 @@ import { describe, it } from 'node:test'; import { Config } from 'stylelint'; -import { testNoFail, testRuleFail } from '.'; +import { testNoFail, testRuleFail } from './index.js'; export function defaultTestSet(config: Config): void { void describe('[standard tests] passes', () => { diff --git a/utils/tsconfig.json b/utils/tsconfig.json index 9a74d83d..1b3e982d 100644 --- a/utils/tsconfig.json +++ b/utils/tsconfig.json @@ -1,5 +1,6 @@ { "extends": ["../tsconfig.json"], + "compilerOptions": { "rootDir": "./" }, "include": ["./"], "exclude": ["coverage/"] }