diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2a42d3dc83..94cd1db7a27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,6 +134,25 @@ 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/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/2-Babel-Error.shot index 05e3f2fa460..d261e20d3f4 100644 --- a/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/2-Babel-Error.shot +++ b/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/2-Babel-Error.shot @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`AST Fixtures declaration VariableDeclaration _error_ missing-value-in-using Babel - Error 1`] = `"NO ERROR"`; +exports[`AST Fixtures declaration VariableDeclaration _error_ missing-value-in-using Babel - Error 1`] = `[SyntaxError: Missing initializer in using declaration. (1:7)]`; diff --git a/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/3-Alignment-Error.shot index 71344766bf9..62b811d2845 100644 --- a/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/3-Alignment-Error.shot +++ b/packages/ast-spec/src/declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/snapshots/3-Alignment-Error.shot @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`AST Fixtures declaration VariableDeclaration _error_ missing-value-in-using Error Alignment 1`] = `"TSESTree errored but Babel didn't"`; +exports[`AST Fixtures declaration VariableDeclaration _error_ missing-value-in-using Error Alignment 1`] = `"Both errored"`; diff --git a/packages/ast-spec/tests/fixtures-with-differences-errors.shot b/packages/ast-spec/tests/fixtures-with-differences-errors.shot index 0fa210c0721..3baa5a85efc 100644 --- a/packages/ast-spec/tests/fixtures-with-differences-errors.shot +++ b/packages/ast-spec/tests/fixtures-with-differences-errors.shot @@ -49,7 +49,6 @@ exports[`AST Fixtures List fixtures with Error differences 1`] = ` "TSESTree errored but Babel didn't": [ "declaration/ExportAllDeclaration/fixtures/_error_/named-non-identifier/fixture.ts", "declaration/ExportNamedDeclaration/fixtures/_error_/aliased-literal/fixture.ts", - "declaration/VariableDeclaration/fixtures/_error_/missing-value-in-using/fixture.ts", "element/AccessorProperty/fixtures/_error_/modifier-abstract-accessor-with-value/fixture.ts", "legacy-fixtures/basics/fixtures/_error_/abstract-class-with-abstract-constructor/fixture.ts", "legacy-fixtures/expressions/fixtures/_error_/instantiation-expression/fixture.ts", diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 839899a4548..a4400adc707 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -103,7 +103,7 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.57.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { diff --git a/packages/eslint-plugin/tests/docs.test.ts b/packages/eslint-plugin/tests/docs.test.ts index 4e44a8fca7b..e71524a0bea 100644 --- a/packages/eslint-plugin/tests/docs.test.ts +++ b/packages/eslint-plugin/tests/docs.test.ts @@ -100,7 +100,7 @@ function renderLintResults(code: string, errors: Linter.LintMessage[]): string { return output.join('\n').trim() + '\n'; } -const linter = new Linter(); +const linter = new Linter({ configType: 'eslintrc' }); linter.defineParser('@typescript-eslint/parser', tseslintParser); const eslintOutputSnapshotFolder = path.resolve( diff --git a/packages/eslint-plugin/tests/rules/array-type.test.ts b/packages/eslint-plugin/tests/rules/array-type.test.ts index 44be83ff63d..09b5e39d2d5 100644 --- a/packages/eslint-plugin/tests/rules/array-type.test.ts +++ b/packages/eslint-plugin/tests/rules/array-type.test.ts @@ -1924,7 +1924,7 @@ interface FooInterface { // -- eslint rule tester is not working with multi-pass // https://github.com/eslint/eslint/issues/11187 describe('array-type (nested)', () => { - const linter = new TSESLint.Linter(); + const linter = new TSESLint.Linter({ configType: 'eslintrc' }); linter.defineRule('array-type', rule); linter.defineParser('@typescript-eslint/parser', parser); diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts index 195014149b1..af8c42b6340 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts @@ -16,17 +16,25 @@ const ruleTester = new RuleTester({ }, }); -ruleTester.defineRule('use-every-a', context => { - /** - * Mark a variable as used - */ - function useA(node: TSESTree.Node): void { - context.sourceCode.markVariableAsUsed('a', node); - } - return { - VariableDeclaration: useA, - ReturnStatement: useA, - }; +ruleTester.defineRule('use-every-a', { + create: context => { + /** + * Mark a variable as used + */ + function useA(node: TSESTree.Node): void { + context.sourceCode.markVariableAsUsed('a', node); + } + return { + VariableDeclaration: useA, + ReturnStatement: useA, + }; + }, + defaultOptions: [], + meta: { + messages: {}, + type: 'problem', + schema: [], + }, }); /** diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts index c810f351c0a..f7442e38166 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts @@ -20,9 +20,17 @@ const withMetaParserOptions = { }; // this is used to ensure that the caching the utility does does not impact the results done by no-unused-vars -ruleTester.defineRule('collect-unused-vars', context => { - collectUnusedVariables(context); - return {}; +ruleTester.defineRule('collect-unused-vars', { + create(context) { + collectUnusedVariables(context); + return {}; + }, + defaultOptions: [], + meta: { + messages: {}, + type: 'problem', + schema: [], + }, }); ruleTester.run('no-unused-vars', rule, { diff --git a/packages/parser/package.json b/packages/parser/package.json index 3a684ba7ceb..ad1b4d677c3 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -49,7 +49,7 @@ "typecheck": "tsc -p tsconfig.json --noEmit" }, "peerDependencies": { - "eslint": "^8.57.0" + "eslint": "^8.57.0 || ^9.0.0" }, "dependencies": { "@typescript-eslint/scope-manager": "7.8.0", diff --git a/packages/rule-tester/package.json b/packages/rule-tester/package.json index 917bc931bb0..4fec34e5c95 100644 --- a/packages/rule-tester/package.json +++ b/packages/rule-tester/package.json @@ -56,7 +56,7 @@ }, "peerDependencies": { "@eslint/eslintrc": ">=2", - "eslint": "^8.57.0" + "eslint": "^8.57.0 || ^9.0.0" }, "devDependencies": { "@types/lodash.merge": "4.6.9", diff --git a/packages/rule-tester/src/RuleTester.ts b/packages/rule-tester/src/RuleTester.ts index 1cafa9f65bf..3deea7fd224 100644 --- a/packages/rule-tester/src/RuleTester.ts +++ b/packages/rule-tester/src/RuleTester.ts @@ -76,7 +76,7 @@ let defaultConfig = deepMerge( export class RuleTester extends TestFramework { readonly #testerConfig: TesterConfigWithDefaults; readonly #rules: Record = {}; - readonly #linter: Linter = new Linter(); + readonly #linter: Linter = new Linter({ configType: 'eslintrc' }); /** * Creates a new instance of RuleTester. diff --git a/packages/type-utils/package.json b/packages/type-utils/package.json index 4862a678eab..33975676a1e 100644 --- a/packages/type-utils/package.json +++ b/packages/type-utils/package.json @@ -60,9 +60,6 @@ "rimraf": "*", "typescript": "*" }, - "peerDependencies": { - "eslint": "^8.57.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true diff --git a/packages/typescript-eslint/package.json b/packages/typescript-eslint/package.json index 20af32a5d8d..4c466fe66f0 100644 --- a/packages/typescript-eslint/package.json +++ b/packages/typescript-eslint/package.json @@ -51,9 +51,6 @@ "test": "jest --coverage --passWithNoTests", "typecheck": "tsc -p tsconfig.json --noEmit" }, - "peerDependencies": { - "eslint": "^8.57.0" - }, "dependencies": { "@typescript-eslint/eslint-plugin": "7.8.0", "@typescript-eslint/parser": "7.8.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 343a6b1734d..98521466325 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -76,7 +76,7 @@ "semver": "^7.6.0" }, "peerDependencies": { - "eslint": "^8.57.0" + "eslint": "^8.57.0 || ^9.0.0" }, "devDependencies": { "@typescript-eslint/parser": "7.8.0", diff --git a/packages/utils/src/ts-eslint/Linter.ts b/packages/utils/src/ts-eslint/Linter.ts index bad397d8cfb..4e0f5ead0bd 100644 --- a/packages/utils/src/ts-eslint/Linter.ts +++ b/packages/utils/src/ts-eslint/Linter.ts @@ -276,7 +276,7 @@ namespace Linter { parserOptions?: ParserOptions; } - // TODO - RuleCreateFunction is no longer supported in ESLint v9 + // TODO - remove RuleCreateFunction once we no longer support ESLint 8 export type LegacyPluginRules = Record< string, AnyRuleCreateFunction | AnyRuleModule diff --git a/packages/utils/src/ts-eslint/Rule.ts b/packages/utils/src/ts-eslint/Rule.ts index 2ef5a17ad2f..ae1258181b9 100644 --- a/packages/utils/src/ts-eslint/Rule.ts +++ b/packages/utils/src/ts-eslint/Rule.ts @@ -676,7 +676,7 @@ export type AnyRuleModuleWithMetaDocs = RuleModuleWithMetaDocs< * @see {@link LooseParserModule}, {@link LooseProcessorModule} */ export type LooseRuleDefinition = - // TODO - ESLint v9 will remove support for RuleCreateFunction + // TODO - remove RuleCreateFunction once we no longer support ESLint 8 | LooseRuleCreateFunction | { meta?: object | undefined; diff --git a/packages/website-eslint/src/index.js b/packages/website-eslint/src/index.js index 1c16db4da84..9121a97c7d5 100644 --- a/packages/website-eslint/src/index.js +++ b/packages/website-eslint/src/index.js @@ -24,7 +24,7 @@ exports.astConverter = astConverter; exports.esquery = esquery; exports.createLinter = function () { - const linter = new Linter(); + const linter = new Linter({ configType: 'eslintrc' }); for (const name in plugin.rules) { linter.defineRule(`@typescript-eslint/${name}`, plugin.rules[name]); } diff --git a/packages/website-eslint/types/eslint.d.ts b/packages/website-eslint/types/eslint.d.ts index 82c78be17ef..cda0b0da579 100644 --- a/packages/website-eslint/types/eslint.d.ts +++ b/packages/website-eslint/types/eslint.d.ts @@ -9,7 +9,11 @@ it just uses `any` for the import - marking it as an untyped export. So adding t cannot use VSCode's cache ever - stubbing it out permanently. */ declare module 'eslint' { + export interface LinterOptions { + configType?: 'eslintrc'; + } export class Linter { + constructor(options: LinterOptions); defineRule(name: string, rule: unknown): void; } } diff --git a/yarn.lock b/yarn.lock index ea0a3e7559c..7941e2bec62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -266,30 +266,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:*, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.3": - version: 7.24.3 - resolution: "@babel/core@npm:7.24.3" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.24.2 - "@babel/generator": ^7.24.1 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.24.1 - "@babel/parser": ^7.24.1 - "@babel/template": ^7.24.0 - "@babel/traverse": ^7.24.1 - "@babel/types": ^7.24.0 - convert-source-map: ^2.0.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.3 - semver: ^6.3.1 - checksum: 1a33460794f4122cf255b656f4d6586913f41078a1afdf1bcf0365ddbd99c1ddb68f904062f9079445ab26b507c36bc297055192bc26e5c8e6e3def42195f9ab - languageName: node - linkType: hard - -"@babel/core@npm:^7.24.4": +"@babel/core@npm:*, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.19.6, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.3, @babel/core@npm:^7.24.4": version: 7.24.4 resolution: "@babel/core@npm:7.24.4" dependencies: @@ -326,19 +303,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2": - version: 7.24.1 - resolution: "@babel/generator@npm:7.24.1" - dependencies: - "@babel/types": ^7.24.0 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 - jsesc: ^2.5.1 - checksum: 98c6ce5ec7a1cba2bdf35cdf607273b90cf7cf82bbe75cd0227363fb84d7e1bd8efa74f40247d5900c8c009123f10132ad209a05283757698de918278c3c6700 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.24.4": +"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.24.4, @babel/generator@npm:^7.7.2": version: 7.24.4 resolution: "@babel/generator@npm:7.24.4" dependencies: @@ -588,17 +553,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/helpers@npm:7.24.1" - dependencies: - "@babel/template": ^7.24.0 - "@babel/traverse": ^7.24.1 - "@babel/types": ^7.24.0 - checksum: 0643b8ccf3358682303aea65f0798e482b2c3642040d32ffe130a245f4a46d0d23fe575a5e06e3cda4e8ec4af89d52b94ff1c444a74465d47ccc27da6ddbbb9f - languageName: node - linkType: hard - "@babel/helpers@npm:^7.24.4": version: 7.24.4 resolution: "@babel/helpers@npm:7.24.4" @@ -622,16 +576,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:*, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": - version: 7.24.1 - resolution: "@babel/parser@npm:7.24.1" - bin: - parser: ./bin/babel-parser.js - checksum: a1068941dddf82ffdf572565b8b7b2cddb963ff9ddf97e6e28f50e843d820b4285e6def8f59170104a94e2a91ae2e3b326489886d77a57ea29d468f6a5e79bf9 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.24.4": +"@babel/parser@npm:*, @babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1, @babel/parser@npm:^7.24.4": version: 7.24.4 resolution: "@babel/parser@npm:7.24.4" bin: @@ -1764,16 +1709,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4": - version: 7.24.1 - resolution: "@babel/runtime@npm:7.24.1" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 5c8f3b912ba949865f03b3cf8395c60e1f4ebd1033fbd835bdfe81b6cac8a87d85bc3c7aded5fcdf07be044c9ab8c818f467abe0deca50020c72496782639572 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.24.4": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4": version: 7.24.4 resolution: "@babel/runtime@npm:7.24.4" dependencies: @@ -5591,7 +5527,7 @@ __metadata: unist-util-visit: ^5.0.0 peerDependencies: "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true @@ -5626,7 +5562,7 @@ __metadata: rimraf: "*" typescript: "*" peerDependencies: - eslint: ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 peerDependenciesMeta: typescript: optional: true @@ -5677,7 +5613,7 @@ __metadata: typescript: "*" peerDependencies: "@eslint/eslintrc": ">=2" - eslint: ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 languageName: unknown linkType: soft @@ -5732,8 +5668,6 @@ __metadata: rimraf: "*" ts-api-utils: ^1.3.0 typescript: "*" - peerDependencies: - eslint: ^8.57.0 peerDependenciesMeta: typescript: optional: true @@ -5923,7 +5857,7 @@ __metadata: semver: ^7.6.0 typescript: "*" peerDependencies: - eslint: ^8.57.0 + eslint: ^8.57.0 || ^9.0.0 languageName: unknown linkType: soft @@ -16368,7 +16302,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.16": +"postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": version: 6.0.16 resolution: "postcss-selector-parser@npm:6.0.16" dependencies: @@ -16378,16 +16312,6 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.9": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" - dependencies: - cssesc: ^3.0.0 - util-deprecate: ^1.0.2 - checksum: f89163338a1ce3b8ece8e9055cd5a3165e79a15e1c408e18de5ad8f87796b61ec2d48a2902d179ae0c4b5de10fccd3a325a4e660596549b040bc5ad1b465f096 - languageName: node - linkType: hard - "postcss-sort-media-queries@npm:^4.4.1": version: 4.4.1 resolution: "postcss-sort-media-queries@npm:4.4.1" @@ -16447,18 +16371,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.26, postcss@npm:^8.4.32, postcss@npm:^8.4.33": - version: 8.4.35 - resolution: "postcss@npm:8.4.35" - dependencies: - nanoid: ^3.3.7 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da - languageName: node - linkType: hard - -"postcss@npm:^8.4.38": +"postcss@npm:^8.4.17, postcss@npm:^8.4.21, postcss@npm:^8.4.26, postcss@npm:^8.4.32, postcss@npm:^8.4.33, postcss@npm:^8.4.38": version: 8.4.38 resolution: "postcss@npm:8.4.38" dependencies: @@ -18131,14 +18044,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.0": +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": version: 1.2.0 resolution: "source-map-js@npm:1.2.0" checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 @@ -19284,8 +19190,6 @@ __metadata: prettier: ^3.2.5 rimraf: "*" typescript: "*" - peerDependencies: - eslint: ^8.57.0 peerDependenciesMeta: typescript: optional: true