diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d09db3f80db..730ffc5af693 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,25 +134,6 @@ jobs: run: yarn stylelint working-directory: packages/website - eslint_v9_tests: - name: Run tests on ESLint v9 - needs: [build] - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install - uses: ./.github/actions/prepare-install - with: - node-version: ${{ env.PRIMARY_NODE_VERSION }} - - name: Build - uses: ./.github/actions/prepare-build - - run: yarn add eslint@9 - - name: Run tests - run: yarn test - env: - CI: true - integration_tests: name: Run integration tests on primary Node.js version needs: [build] diff --git a/eslint.config.mjs b/eslint.config.mjs index aa0565d5e459..d171204d9d93 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -2,6 +2,7 @@ import url from 'node:url'; +import { fixupConfigRules, fixupPluginRules } from '@eslint/compat'; import { FlatCompat } from '@eslint/eslintrc'; import eslint from '@eslint/js'; import tseslintInternalPlugin from '@typescript-eslint/eslint-plugin-internal'; @@ -29,15 +30,20 @@ export default tseslint.config( plugins: { ['@typescript-eslint']: tseslint.plugin, ['@typescript-eslint/internal']: tseslintInternalPlugin, - ['deprecation']: deprecationPlugin, + // https://github.com/gund/eslint-plugin-deprecation/issues/78 + // https://github.com/typescript-eslint/typescript-eslint/issues/8988 + ['deprecation']: fixupPluginRules(deprecationPlugin), ['eslint-comments']: eslintCommentsPlugin, ['eslint-plugin']: eslintPluginPlugin, - ['import']: importPlugin, + // https://github.com/import-js/eslint-plugin-import/issues/2948 + ['import']: fixupPluginRules(importPlugin), ['jest']: jestPlugin, ['jsdoc']: jsdocPlugin, ['jsx-a11y']: jsxA11yPlugin, - ['react-hooks']: reactHooksPlugin, - ['react']: reactPlugin, + // https://github.com/facebook/react/issues/28313 + ['react-hooks']: fixupPluginRules(reactHooksPlugin), + // https://github.com/jsx-eslint/eslint-plugin-react/issues/3699 + ['react']: fixupPluginRules(reactPlugin), ['simple-import-sort']: simpleImportSortPlugin, ['unicorn']: unicornPlugin, }, @@ -512,8 +518,8 @@ export default tseslint.config( files: ['packages/website/**/*.{ts,tsx,mts,cts,js,jsx}'], extends: [ ...compat.config(jsxA11yPlugin.configs.recommended), - ...compat.config(reactPlugin.configs.recommended), - ...compat.config(reactHooksPlugin.configs.recommended), + ...fixupConfigRules(compat.config(reactPlugin.configs.recommended)), + ...fixupConfigRules(compat.config(reactHooksPlugin.configs.recommended)), ], rules: { '@typescript-eslint/internal/prefer-ast-types-enum': 'off', diff --git a/package.json b/package.json index 64ba4daf8a4d..d3e2c8ec2925 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@babel/eslint-parser": "^7.24.1", "@babel/parser": "^7.24.4", "@babel/types": "^7.24.0", + "@eslint/compat": "^1.0.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "^8.57.0", "@jest/types": "29.6.3", @@ -85,7 +86,7 @@ "cross-fetch": "^4.0.0", "cspell": "^8.6.1", "downlevel-dts": ">=0.11.0", - "eslint": "8.57.0", + "eslint": "^9.3.0", "eslint-plugin-deprecation": "^2.0.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-eslint-plugin": "^5.5.0", @@ -129,7 +130,7 @@ "@types/estree": "link:./tools/dummypkg", "@types/node": "^20.0.0", "@types/react": "^18.2.14", - "eslint": "8.57.0", + "eslint": "^9", "eslint-visitor-keys": "^3.4.1", "jest-config": "^29", "jest-resolve": "^29", diff --git a/packages/eslint-plugin/rules.d.ts b/packages/eslint-plugin/rules.d.ts index 84b09acb7193..d6625d09950e 100644 --- a/packages/eslint-plugin/rules.d.ts +++ b/packages/eslint-plugin/rules.d.ts @@ -74,5 +74,4 @@ export type TypeScriptESLintRules = Record< >; declare const rules: TypeScriptESLintRules; -// eslint-disable-next-line import/no-default-export export default rules; diff --git a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts index 5e8e1774eda4..b19e0305c7bb 100644 --- a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts +++ b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/prefer-literal-enum-member */ import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import * as tsutils from 'ts-api-utils'; diff --git a/packages/eslint-plugin/tests/rules/prefer-optional-chain/base-cases.ts b/packages/eslint-plugin/tests/rules/prefer-optional-chain/base-cases.ts index 28b75a91697d..4ea5f6cc087b 100644 --- a/packages/eslint-plugin/tests/rules/prefer-optional-chain/base-cases.ts +++ b/packages/eslint-plugin/tests/rules/prefer-optional-chain/base-cases.ts @@ -229,10 +229,6 @@ const RawBaseCases = (operator: '&&' | '||') => ] as const; export const identity: MutateFn = c => c; -/* -eslint-disable-next-line eslint-plugin/prefer-message-ids, eslint-plugin/prefer-object-rule, eslint-plugin/require-meta-type, eslint-plugin/require-meta-schema -- -TODO - bug in hte rules - https://github.com/eslint-community/eslint-plugin-eslint-plugin/issues/455 -*/ export const BaseCases: BaseCaseCreator = ({ operator, mutateCode = identity, diff --git a/packages/eslint-plugin/tests/schema-snapshots/no-restricted-imports.shot b/packages/eslint-plugin/tests/schema-snapshots/no-restricted-imports.shot index 1fbe61748f34..55bec533996f 100644 --- a/packages/eslint-plugin/tests/schema-snapshots/no-restricted-imports.shot +++ b/packages/eslint-plugin/tests/schema-snapshots/no-restricted-imports.shot @@ -15,6 +15,12 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos { "additionalProperties": false, "properties": { + "allowImportNames": { + "items": { + "type": "string" + }, + "type": "array" + }, "allowTypeImports": { "description": "Disallow value imports, but allow type-only imports.", "type": "boolean" @@ -56,6 +62,12 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos { "additionalProperties": false, "properties": { + "allowImportNames": { + "items": { + "type": "string" + }, + "type": "array" + }, "allowTypeImports": { "description": "Disallow value imports, but allow type-only imports.", "type": "boolean" @@ -95,6 +107,17 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos "items": { "additionalProperties": false, "properties": { + "allowImportNamePattern": { + "type": "string" + }, + "allowImportNames": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, "allowTypeImports": { "description": "Disallow value imports, but allow type-only imports.", "type": "boolean" @@ -149,6 +172,7 @@ exports[`Rule schemas should be convertible to TS types for documentation purpos type Options = | ( | { + allowImportNames?: string[]; /** Disallow value imports, but allow type-only imports. */ allowTypeImports?: boolean; importNames?: string[]; @@ -162,6 +186,7 @@ type Options = { paths?: ( | { + allowImportNames?: string[]; /** Disallow value imports, but allow type-only imports. */ allowTypeImports?: boolean; importNames?: string[]; @@ -172,6 +197,8 @@ type Options = )[]; patterns?: | { + allowImportNamePattern?: string; + allowImportNames?: [string, ...string[]]; /** Disallow value imports, but allow type-only imports. */ allowTypeImports?: boolean; caseSensitive?: boolean; diff --git a/packages/integration-tests/fixtures/markdown/.eslintrc.js b/packages/integration-tests/fixtures/markdown/.eslintrc.js deleted file mode 100644 index 9dd8a5505b98..000000000000 --- a/packages/integration-tests/fixtures/markdown/.eslintrc.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - env: { - es6: true, - node: true, - }, - parserOptions: { - sourceType: 'module', - extraFileExtensions: ['.vue'], - ecmaFeatures: { - jsx: true, - }, - }, - plugins: ['markdown', '@typescript-eslint'], - overrides: [ - { - // this will also ensure that eslint will force lint the markdown files - files: ['**/*.md'], - processor: 'markdown/markdown', - }, - { - files: ['**/*.md/*.{js,ts,jsx,tsx,javascript,node}'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', - 'no-console': 'error', - }, - }, - ], -}; diff --git a/packages/integration-tests/fixtures/markdown/eslint.config.js b/packages/integration-tests/fixtures/markdown/eslint.config.js new file mode 100644 index 000000000000..813da175da2f --- /dev/null +++ b/packages/integration-tests/fixtures/markdown/eslint.config.js @@ -0,0 +1,15 @@ +import markdown from 'eslint-plugin-markdown'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + tseslint.configs.base, + // this will also ensure that eslint will force lint the markdown files + { plugins: { markdown }, files: ['**/*.md'], processor: 'markdown/markdown' }, + { + files: ['**/*.md/*.{js,ts,jsx,tsx,javascript,node}'], + rules: { + '@typescript-eslint/no-explicit-any': 'error', + 'no-console': 'error', + }, + }, +); diff --git a/packages/integration-tests/fixtures/markdown/package.json b/packages/integration-tests/fixtures/markdown/package.json index a0cb6620d6cb..b109350f6a63 100644 --- a/packages/integration-tests/fixtures/markdown/package.json +++ b/packages/integration-tests/fixtures/markdown/package.json @@ -1,4 +1,5 @@ { + "type": "module", "devDependencies": { "eslint-plugin-markdown": "latest" } diff --git a/packages/integration-tests/fixtures/recommended-does-not-require-program/.eslintrc.js b/packages/integration-tests/fixtures/recommended-does-not-require-program/eslint.config.js similarity index 50% rename from packages/integration-tests/fixtures/recommended-does-not-require-program/.eslintrc.js rename to packages/integration-tests/fixtures/recommended-does-not-require-program/eslint.config.js index 0f28905d8de8..52b114c8ac7a 100644 --- a/packages/integration-tests/fixtures/recommended-does-not-require-program/.eslintrc.js +++ b/packages/integration-tests/fixtures/recommended-does-not-require-program/eslint.config.js @@ -1,14 +1,11 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + // This integration test exists to make sure that the recommended config does // not require a program to be specified to ensure a fast and simple initial // setup. Users can add on one of our other configs if they want to opt in to // more expensive checks. -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - ], - plugins: ['@typescript-eslint'], -}; +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommended, +); diff --git a/packages/integration-tests/fixtures/recommended-does-not-require-program/package.json b/packages/integration-tests/fixtures/recommended-does-not-require-program/package.json index 6ae64c0520b4..48b88be7f264 100644 --- a/packages/integration-tests/fixtures/recommended-does-not-require-program/package.json +++ b/packages/integration-tests/fixtures/recommended-does-not-require-program/package.json @@ -1,3 +1,4 @@ { + "type": "module", "devDependencies": {} } diff --git a/packages/integration-tests/fixtures/vue-jsx/.eslintrc.js b/packages/integration-tests/fixtures/vue-jsx/.eslintrc.js deleted file mode 100644 index 750fe39d0bdc..000000000000 --- a/packages/integration-tests/fixtures/vue-jsx/.eslintrc.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - root: true, - parser: 'vue-eslint-parser', - env: { - es6: true, - node: true, - }, - extends: ['plugin:vue/essential'], - parserOptions: { - parser: '@typescript-eslint/parser', - sourceType: 'module', - extraFileExtensions: ['.vue'], - ecmaFeatures: { - jsx: true, - }, - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', - }, -}; diff --git a/packages/integration-tests/fixtures/vue-jsx/eslint.config.js b/packages/integration-tests/fixtures/vue-jsx/eslint.config.js new file mode 100644 index 000000000000..e363e288fd1e --- /dev/null +++ b/packages/integration-tests/fixtures/vue-jsx/eslint.config.js @@ -0,0 +1,13 @@ +import tseslint from 'typescript-eslint'; +import pluginVue from 'eslint-plugin-vue'; + +export default tseslint.config( + tseslint.configs.base, + ...pluginVue.configs['flat/essential'], + { + languageOptions: { + parserOptions: { ecmaFeatures: { jsx: true }, parser: tseslint.parser }, + }, + rules: { '@typescript-eslint/no-explicit-any': 'error' }, + }, +); diff --git a/packages/integration-tests/fixtures/vue-jsx/package.json b/packages/integration-tests/fixtures/vue-jsx/package.json index bef3a8935336..dd7e0cf5056c 100644 --- a/packages/integration-tests/fixtures/vue-jsx/package.json +++ b/packages/integration-tests/fixtures/vue-jsx/package.json @@ -1,4 +1,5 @@ { + "type": "module", "devDependencies": { "vue-eslint-parser": "latest", "eslint-plugin-vue": "latest", diff --git a/packages/integration-tests/fixtures/vue-sfc/.eslintrc.js b/packages/integration-tests/fixtures/vue-sfc/.eslintrc.js deleted file mode 100644 index 3306fe237555..000000000000 --- a/packages/integration-tests/fixtures/vue-sfc/.eslintrc.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - root: true, - parser: 'vue-eslint-parser', - env: { - es6: true, - node: true, - }, - extends: ['plugin:vue/essential'], - parserOptions: { - parser: '@typescript-eslint/parser', - project: '/usr/linked/tsconfig.json', - sourceType: 'module', - extraFileExtensions: ['.vue'], - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/no-unnecessary-type-assertion': 'error', - 'semi-spacing': 'error', - }, -}; diff --git a/packages/integration-tests/fixtures/vue-sfc/eslint.config.js b/packages/integration-tests/fixtures/vue-sfc/eslint.config.js new file mode 100644 index 000000000000..37a9d7db399a --- /dev/null +++ b/packages/integration-tests/fixtures/vue-sfc/eslint.config.js @@ -0,0 +1,20 @@ +import pluginVue from 'eslint-plugin-vue'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + tseslint.configs.base, + ...pluginVue.configs['flat/essential'], + { + languageOptions: { + parserOptions: { + parser: tseslint.parser, + project: '/usr/linked/tsconfig.json', + }, + }, + rules: { + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + 'semi-spacing': 'error', + }, + }, +); diff --git a/packages/integration-tests/fixtures/vue-sfc/package.json b/packages/integration-tests/fixtures/vue-sfc/package.json index bef3a8935336..dd7e0cf5056c 100644 --- a/packages/integration-tests/fixtures/vue-sfc/package.json +++ b/packages/integration-tests/fixtures/vue-sfc/package.json @@ -1,4 +1,5 @@ { + "type": "module", "devDependencies": { "vue-eslint-parser": "latest", "eslint-plugin-vue": "latest", diff --git a/packages/integration-tests/tests/__snapshots__/recommended-does-not-require-program.test.ts.snap b/packages/integration-tests/tests/__snapshots__/recommended-does-not-require-program.test.ts.snap index ae2bd5a863e8..059dfb803b0e 100644 --- a/packages/integration-tests/tests/__snapshots__/recommended-does-not-require-program.test.ts.snap +++ b/packages/integration-tests/tests/__snapshots__/recommended-does-not-require-program.test.ts.snap @@ -24,16 +24,7 @@ exports[`recommended-does-not-require-program eslint should work successfully 1` "output": "const foo: unknown = true; ", "suppressedMessages": [], - "usedDeprecatedRules": [ - { - "replacedBy": [], - "ruleId": "no-extra-semi", - }, - { - "replacedBy": [], - "ruleId": "no-mixed-spaces-and-tabs", - }, - ], + "usedDeprecatedRules": [], "warningCount": 0, }, ] diff --git a/packages/integration-tests/tests/flat-config-types.test.ts b/packages/integration-tests/tests/flat-config-types.test.ts index a8483fba3fc3..15c8481b5433 100644 --- a/packages/integration-tests/tests/flat-config-types.test.ts +++ b/packages/integration-tests/tests/flat-config-types.test.ts @@ -25,4 +25,4 @@ for (const additionalFlags of [ }, ); } -eslintIntegrationTest(__filename, 'eslint.config.js', true); +eslintIntegrationTest(__filename, 'eslint.config.js'); diff --git a/packages/integration-tests/tools/integration-test-base.ts b/packages/integration-tests/tools/integration-test-base.ts index 548df55030e3..e9dbe74dcd37 100644 --- a/packages/integration-tests/tools/integration-test-base.ts +++ b/packages/integration-tests/tools/integration-test-base.ts @@ -128,7 +128,6 @@ function integrationTest( export function eslintIntegrationTest( testFilename: string, filesGlob: string, - flatConfig = false, ): void { integrationTest('eslint', testFilename, async testFolder => { // lint, outputting to a JSON file @@ -143,8 +142,6 @@ export function eslintIntegrationTest( 'json', '--output-file', outFile, - '--config', - flatConfig ? './eslint.config.js' : './.eslintrc.js', '--fix-dry-run', filesGlob, ], diff --git a/packages/website-eslint/build.ts b/packages/website-eslint/build.ts index b119efbf430f..a786940cbcbe 100644 --- a/packages/website-eslint/build.ts +++ b/packages/website-eslint/build.ts @@ -75,16 +75,21 @@ async function buildPackage(name: string, file: string): Promise { 'define.amd': 'false', global: 'window', }, - alias: { - util: requireResolved('./src/mock/util.js'), - assert: requireResolved('./src/mock/assert.js'), - path: requireResolved('./src/mock/path.js'), - typescript: requireResolved('./src/mock/typescript.js'), - 'typescript/lib/tsserverlibrary': requireResolved( - './src/mock/typescript.js', - ), - 'lru-cache': requireResolved('./src/mock/lru-cache.js'), - }, + alias: Object.fromEntries( + [ + // built-in Node packages — alias each twice — both with and without the `node:` prefix + ...['util', 'assert', 'path'].flatMap(from => [from, `node:${from}`]), + // other NPM packages + 'typescript', + 'typescript/lib/tsserverlibrary', + 'lru-cache', + ].map(from => [ + from, + requireResolved( + `./src/mock/${from.split('/')[0].split(':').at(-1)}.js`, + ), + ]), + ), plugins: [ { name: 'replace-plugin', diff --git a/packages/website/src/hooks/useClipboard.ts b/packages/website/src/hooks/useClipboard.ts index 0a98af33b91b..0c07beacf445 100644 --- a/packages/website/src/hooks/useClipboard.ts +++ b/packages/website/src/hooks/useClipboard.ts @@ -7,12 +7,13 @@ export type useClipboardResult = [copied: boolean, copy: () => void]; export function useClipboard(code: () => string): useClipboardResult { const [copied, setCopied] = useDebouncedToggle(false); - const copy = useCallback(() => { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - void navigator.clipboard.writeText(code()).then(() => { - setCopied(true); - }); - }, [setCopied, code]); + const copy = useCallback( + () => + void navigator.clipboard.writeText(code()).then(() => { + setCopied(true); + }), + [setCopied, code], + ); return [copied, copy]; } diff --git a/packages/website/src/theme/MDXComponents/RuleAttributes.tsx b/packages/website/src/theme/MDXComponents/RuleAttributes.tsx index d3ccab92c538..338945fd2e6d 100644 --- a/packages/website/src/theme/MDXComponents/RuleAttributes.tsx +++ b/packages/website/src/theme/MDXComponents/RuleAttributes.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import Link from '@docusaurus/Link'; import { useRulesMeta } from '@site/src/hooks/useRulesMeta'; import type { ESLintPluginDocs } from '@typescript-eslint/eslint-plugin/use-at-your-own-risk/rules'; diff --git a/typings/eslint-plugin-deprecation.d.ts b/typings/eslint-plugin-deprecation.d.ts new file mode 100644 index 000000000000..007bdbf2c75b --- /dev/null +++ b/typings/eslint-plugin-deprecation.d.ts @@ -0,0 +1,12 @@ +declare module 'eslint-plugin-deprecation' { + import type { + ClassicConfig, + Linter, + } from '@typescript-eslint/utils/ts-eslint'; + + declare const exprt: { + configs: { recommended: ClassicConfig.Config }; + rules: NonNullable; + }; + export = exprt; +} diff --git a/typings/eslint__compat.d.ts b/typings/eslint__compat.d.ts new file mode 100644 index 000000000000..a097ec396d32 --- /dev/null +++ b/typings/eslint__compat.d.ts @@ -0,0 +1,12 @@ +declare module '@eslint/compat' { + import type { FlatConfig, Linter } from '@typescript-eslint/utils/ts-eslint'; + + declare const exprt: { + fixupConfigRules: ( + config: FlatConfig.ConfigArray, + ) => FlatConfig.ConfigArray; + fixupPluginRules: (plugin: Linter.Plugin) => Linter.Plugin; + }; + + export = exprt; +} diff --git a/yarn.lock b/yarn.lock index f14f64386719..ed95fc12e72c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3347,6 +3347,13 @@ __metadata: languageName: node linkType: hard +"@eslint/compat@npm:^1.0.1": + version: 1.0.1 + resolution: "@eslint/compat@npm:1.0.1" + checksum: 98d31eae0ab2a1c781790b184f2be7dd92565ac9bf3c08fe788b3a79b9ff36e196f76e80fdfde57c4d96cab8ed98cf468ca9175d60e40b9aea423d15b8b00692 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -3364,13 +3371,37 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:*, @eslint/js@npm:8.57.0, @eslint/js@npm:^8.57.0": +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.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 + checksum: b0a9bbd98c8b9e0f4d975b042ff9b874dde722b20834ea2ff46551c3de740d4f10f56c449b790ef34d7f82147cbddfc22b004a43cc885dbc2664bb134766b5e4 + languageName: node + linkType: hard + +"@eslint/js@npm:*, @eslint/js@npm:^8.57.0": version: 8.57.0 resolution: "@eslint/js@npm:8.57.0" checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb languageName: node linkType: hard +"@eslint/js@npm:9.3.0": + version: 9.3.0 + resolution: "@eslint/js@npm:9.3.0" + checksum: 5af317c8bcfef660efc17624b825c71bac16770f8866bfdc2922e1fcc2010af96e4f896e91724b81550e5dba6db6983c221b5be9a1294c9e727dee9ada15c9f8 + languageName: node + linkType: hard + "@fastify/busboy@npm:^2.0.0": version: 2.0.0 resolution: "@fastify/busboy@npm:2.0.0" @@ -3394,14 +3425,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": ^2.0.2 + "@humanwhocodes/object-schema": ^2.0.3 debug: ^4.3.1 minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 + checksum: eae69ff9134025dd2924f0b430eb324981494be26f0fddd267a33c28711c4db643242cf9fddf7dadb9d16c96b54b2d2c073e60a56477df86e0173149313bd5d6 languageName: node linkType: hard @@ -3412,10 +3443,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee +"@humanwhocodes/object-schema@npm:^2.0.3": + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.0 + resolution: "@humanwhocodes/retry@npm:0.3.0" + checksum: 4349cb8b60466a000e945fde8f8551cefb01ebba22ead4a92ac7b145f67f5da6b52e5a1e0c53185d732d0a49958ac29327934a4a5ac1d0bc20efb4429a4f7bf7 languageName: node linkType: hard @@ -5876,6 +5914,7 @@ __metadata: "@babel/eslint-parser": ^7.24.1 "@babel/parser": ^7.24.4 "@babel/types": ^7.24.0 + "@eslint/compat": ^1.0.1 "@eslint/eslintrc": ^2.1.4 "@eslint/js": ^8.57.0 "@jest/types": 29.6.3 @@ -5901,7 +5940,7 @@ __metadata: cross-fetch: ^4.0.0 cspell: ^8.6.1 downlevel-dts: ">=0.11.0" - eslint: 8.57.0 + eslint: ^9.3.0 eslint-plugin-deprecation: ^2.0.0 eslint-plugin-eslint-comments: ^3.2.0 eslint-plugin-eslint-plugin: ^5.5.0 @@ -6119,7 +6158,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 @@ -9159,15 +9198,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -10098,13 +10128,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.0.1": + version: 8.0.1 + resolution: "eslint-scope@npm:8.0.1" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + checksum: 67a5a39312dadb8c9a677df0f2e8add8daf15280b08bfe07f898d5347ee2d7cd2a1f5c2760f34e46e8f5f13f7192f47c2c10abe676bfa4173ae5539365551940 languageName: node linkType: hard @@ -10126,40 +10156,36 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.57.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint@npm:^9": + version: 9.3.0 + resolution: "eslint@npm:9.3.0" 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 + "@eslint/eslintrc": ^3.1.0 + "@eslint/js": 9.3.0 + "@humanwhocodes/config-array": ^0.13.0 "@humanwhocodes/module-importer": ^1.0.1 + "@humanwhocodes/retry": ^0.3.0 "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 - doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 + eslint-scope: ^8.0.1 + eslint-visitor-keys: ^4.0.0 + espree: ^10.0.1 esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 + file-entry-cache: ^8.0.0 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 ignore: ^5.2.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 lodash.merge: ^4.6.2 @@ -10170,7 +10196,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + checksum: c6d1eb8b4b064470a99f0d927b0d2b88f1947d7e871761b43b84e6c9b6464db4f6ebbb868f7196a45d2589978b09919a8807d200e3b1640d0a9cd245c9504707 languageName: node linkType: hard @@ -10185,7 +10211,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": +"espree@npm:^9.6.0": version: 9.6.1 resolution: "espree@npm:9.6.1" dependencies: @@ -10632,15 +10658,6 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - "file-entry-cache@npm:^8.0.0": version: 8.0.0 resolution: "file-entry-cache@npm:8.0.0" @@ -10774,17 +10791,6 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a - languageName: node - linkType: hard - "flat-cache@npm:^4.0.0": version: 4.0.1 resolution: "flat-cache@npm:4.0.1" @@ -11323,6 +11329,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 534b8216736a5425737f59f6e6a5c7f386254560c9f41d24a9227d60ee3ad4a9e82c5b85def0e212e9d92162f83a92544be4c7fd4c902cb913736c10e08237ac + languageName: node + linkType: hard + "globals@npm:^15.0.0": version: 15.6.0 resolution: "globals@npm:15.6.0"