From d0d5d902f1f12ccb3e1c00eb8ca55292fefc08fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Mon, 30 Aug 2021 03:06:15 +0200 Subject: [PATCH] [New] support eslint 8.x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michaƫl De Boey Co-authored-by: Jordan Harband --- .github/workflows/node-4+.yml | 23 +++++++++++++++++++++ package.json | 4 ++-- tests/helpers/getESLintCoreRule.js | 11 ++++++++++ tests/helpers/parsers.js | 11 ++++++++-- tests/lib/rules/destructuring-assignment.js | 1 - tests/lib/rules/jsx-no-undef.js | 4 ++-- tests/lib/rules/jsx-no-useless-fragment.js | 4 +--- tests/lib/rules/jsx-uses-react.js | 4 ++-- tests/lib/rules/jsx-uses-vars.js | 6 +++--- tests/lib/rules/no-unused-prop-types.js | 6 ------ 10 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 tests/helpers/getESLintCoreRule.js diff --git a/.github/workflows/node-4+.yml b/.github/workflows/node-4+.yml index 7b4ea899dd..f9c0731ba9 100644 --- a/.github/workflows/node-4+.yml +++ b/.github/workflows/node-4+.yml @@ -26,6 +26,7 @@ jobs: matrix: node-version: ${{ fromJson(needs.matrix.outputs.latest) }} eslint: + - 8 - 7 - 6 - 5 @@ -45,24 +46,46 @@ jobs: babel-eslint: 10 - node-version: 4 babel-eslint: 9 + - node-version: 15 + eslint: 8 + - node-version: 13 + eslint: 8 + - node-version: 11 + eslint: 8 + - node-version: 11 + eslint: 7 + - node-version: 10 + eslint: 8 + - node-version: 9 + eslint: 8 - node-version: 9 eslint: 7 + - node-version: 8 + eslint: 8 - node-version: 8 eslint: 7 + - node-version: 7 + eslint: 8 - node-version: 7 eslint: 7 - node-version: 7 eslint: 6 + - node-version: 6 + eslint: 8 - node-version: 6 eslint: 7 - node-version: 6 eslint: 6 + - node-version: 5 + eslint: 8 - node-version: 5 eslint: 7 - node-version: 5 eslint: 6 - node-version: 5 eslint: 5 + - node-version: 4 + eslint: 8 - node-version: 4 eslint: 7 - node-version: 4 diff --git a/package.json b/package.json index 296e418072..e620f5488a 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@typescript-eslint/parser": "^2.34.0 || ^3.10.1 || ^4.0.0 || ^5.0.0", "aud": "^1.1.5", "babel-eslint": "^8 || ^9 || ^10.1.0", - "eslint": "^3 || ^4 || ^5 || ^6 || ^7", + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint-config-airbnb-base": "^14.2.1", "eslint-plugin-eslint-plugin": "^2.3.0 || ^3.5.3 || ^4.0.1", "eslint-plugin-import": "^2.25.2", @@ -72,7 +72,7 @@ "typescript-eslint-parser": "^20.1.1" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" }, "engines": { "node": ">=4" diff --git a/tests/helpers/getESLintCoreRule.js b/tests/helpers/getESLintCoreRule.js new file mode 100644 index 0000000000..bbed38bccb --- /dev/null +++ b/tests/helpers/getESLintCoreRule.js @@ -0,0 +1,11 @@ +'use strict'; + +const version = require('eslint/package.json').version; +const semver = require('semver'); + +const isESLintV8 = semver.major(version) >= 8; + +// eslint-disable-next-line global-require, import/no-dynamic-require, import/no-unresolved +const getESLintCoreRule = (ruleId) => (isESLintV8 ? require('eslint/use-at-your-own-risk').builtinRules.get(ruleId) : require(`eslint/lib/rules/${ruleId}`)); + +module.exports = getESLintCoreRule; diff --git a/tests/helpers/parsers.js b/tests/helpers/parsers.js index 1a935f60d7..929d67d300 100644 --- a/tests/helpers/parsers.js +++ b/tests/helpers/parsers.js @@ -56,7 +56,7 @@ const parsers = { const es = test.parserOptions && test.parserOptions.ecmaVersion; function addComment(testObject, parser) { - const extraComment = `\n// features: [${Array.from(features).join(',')}], parser: ${parser}, parserOptions: ${testObject.parserOptions}`; + const extraComment = `\n// features: [${Array.from(features).join(',')}], parser: ${parser}, parserOptions: ${JSON.stringify(testObject.parserOptions)}`; return Object.assign( {}, testObject, @@ -94,7 +94,14 @@ const parsers = { const tsNew = !skipTS && !features.has('no-ts-new'); return [].concat( - skipBase ? [] : addComment(test, 'default'), + skipBase ? [] : addComment( + Object.assign({}, test, features.has('class fields') && { + parserOptions: Object.assign({}, test.parserOptions, { + ecmaVersion: Math.max((test.parserOptions && test.parserOptions.ecmaVersion) || 0, 2022), + }), + }), + 'default' + ), skipOldBabel ? [] : addComment(Object.assign({}, test, { parser: parsers.BABEL_ESLINT }), 'babel-eslint'), skipNewBabel ? [] : addComment(Object.assign({}, test, { parser: parsers['@BABEL_ESLINT'], diff --git a/tests/lib/rules/destructuring-assignment.js b/tests/lib/rules/destructuring-assignment.js index 6efae95582..197a977830 100644 --- a/tests/lib/rules/destructuring-assignment.js +++ b/tests/lib/rules/destructuring-assignment.js @@ -596,7 +596,6 @@ ruleTester.run('destructuring-assignment', rule, { ); }; `, - parser: parsers.BABEL_ESLINT, errors: [ { messageId: 'useDestructAssignment', diff --git a/tests/lib/rules/jsx-no-undef.js b/tests/lib/rules/jsx-no-undef.js index 7387b79c8f..665f0da454 100644 --- a/tests/lib/rules/jsx-no-undef.js +++ b/tests/lib/rules/jsx-no-undef.js @@ -29,8 +29,8 @@ const parserOptions = { // ----------------------------------------------------------------------------- const ruleTester = new RuleTester({ parserOptions }); -const linter = ruleTester.linter || eslint.linter; -linter.defineRule('no-undef', require('eslint/lib/rules/no-undef')); +const linter = ruleTester.linter || eslint.linter || eslint.Linter; +linter.defineRule('no-undef', require('../../helpers/getESLintCoreRule')('no-undef')); ruleTester.run('jsx-no-undef', rule, { valid: parsers.all([ diff --git a/tests/lib/rules/jsx-no-useless-fragment.js b/tests/lib/rules/jsx-no-useless-fragment.js index 6b104dd976..d9a5e15c31 100644 --- a/tests/lib/rules/jsx-no-useless-fragment.js +++ b/tests/lib/rules/jsx-no-useless-fragment.js @@ -8,12 +8,10 @@ // Requirements // ----------------------------------------------------------------------------- -const eslint = require('eslint'); +const RuleTester = require('eslint').RuleTester; const rule = require('../../../lib/rules/jsx-no-useless-fragment'); const parsers = require('../../helpers/parsers'); -const RuleTester = eslint.RuleTester; - const parserOptions = { ecmaVersion: 2018, ecmaFeatures: { diff --git a/tests/lib/rules/jsx-uses-react.js b/tests/lib/rules/jsx-uses-react.js index 3fcc973654..0110be18bb 100644 --- a/tests/lib/rules/jsx-uses-react.js +++ b/tests/lib/rules/jsx-uses-react.js @@ -10,7 +10,7 @@ // ----------------------------------------------------------------------------- const eslint = require('eslint'); -const rule = require('eslint/lib/rules/no-unused-vars'); +const rule = require('../../helpers/getESLintCoreRule')('no-unused-vars'); const RuleTester = eslint.RuleTester; @@ -35,7 +35,7 @@ const settings = { // ----------------------------------------------------------------------------- const ruleTester = new RuleTester({ parserOptions }); -const linter = ruleTester.linter || eslint.linter; +const linter = ruleTester.linter || eslint.linter || eslint.Linter; linter.defineRule('jsx-uses-react', require('../../../lib/rules/jsx-uses-react')); ruleTester.run('no-unused-vars', rule, { diff --git a/tests/lib/rules/jsx-uses-vars.js b/tests/lib/rules/jsx-uses-vars.js index f689faa9dd..3dc9ccdaad 100644 --- a/tests/lib/rules/jsx-uses-vars.js +++ b/tests/lib/rules/jsx-uses-vars.js @@ -10,8 +10,8 @@ // ----------------------------------------------------------------------------- const eslint = require('eslint'); -const ruleNoUnusedVars = require('eslint/lib/rules/no-unused-vars'); -const rulePreferConst = require('eslint/lib/rules/prefer-const'); +const ruleNoUnusedVars = require('../../helpers/getESLintCoreRule')('no-unused-vars'); +const rulePreferConst = require('../../helpers/getESLintCoreRule')('prefer-const'); const RuleTester = eslint.RuleTester; @@ -30,7 +30,7 @@ const parserOptions = { // ----------------------------------------------------------------------------- const ruleTester = new RuleTester({ parserOptions }); -const linter = ruleTester.linter || eslint.linter; +const linter = ruleTester.linter || eslint.linter || eslint.Linter; linter.defineRule('jsx-uses-vars', require('../../../lib/rules/jsx-uses-vars')); ruleTester.run('no-unused-vars', ruleNoUnusedVars, { diff --git a/tests/lib/rules/no-unused-prop-types.js b/tests/lib/rules/no-unused-prop-types.js index f552b5dd04..99c5956989 100644 --- a/tests/lib/rules/no-unused-prop-types.js +++ b/tests/lib/rules/no-unused-prop-types.js @@ -234,9 +234,6 @@ ruleTester.run('no-unused-prop-types', rule, { } `, features: ['class fields', 'optional chaining'], - parserOptions: { - ecmaVersion: 2020, - }, }, { code: ` @@ -775,9 +772,6 @@ ruleTester.run('no-unused-prop-types', rule, { } `, features: ['class fields', 'optional chaining'], - parserOptions: { - ecmaVersion: 2020, - }, }, { code: `