Skip to content

Commit beb3d69

Browse files
authored
Test eslint plugin against eslint 9 (#16663)
* test eslint-* against eslint 9 * test: provide eslintConfigCompat for older eslint version tests * update NodeGte12NoESM test * Merge two tests The ESLint tests will be run against Node >= 12 only, so nodeGte12NoESM implies itNoESM, which can be merged with itESM into it. * updat babel e2e patches * use eslint.config.mjs for eslint-plugin-import integration test * update duplicated-babel-parser test to ESLint 9 * yarn dedupe * bump eslint to 9.7.0
1 parent 5ddaac4 commit beb3d69

File tree

37 files changed

+406
-296
lines changed

37 files changed

+406
-296
lines changed

eslint/babel-eslint-parser/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"@types/estree": "^1.0.5",
4343
"@typescript-eslint/scope-manager": "^6.19.0",
4444
"dedent": "^1.5.3",
45-
"eslint": "^9.0.0"
45+
"eslint": "^9.7.0"
4646
},
4747
"conditions": {
4848
"BABEL_8_BREAKING": [

eslint/babel-eslint-plugin-development-internal/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"eslint": ">=7.5.0"
2121
},
2222
"devDependencies": {
23-
"eslint": "^8.22.0"
23+
"eslint": "^9.7.0"
2424
},
2525
"type": "module"
2626
}

eslint/babel-eslint-plugin-development/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
},
3232
"homepage": "https://babel.dev/",
3333
"devDependencies": {
34-
"eslint": "^8.22.0"
34+
"eslint": "^9.7.0"
3535
},
3636
"conditions": {
3737
"BABEL_8_BREAKING": [

eslint/babel-eslint-plugin-development/test/rules/no-deprecated-clone.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ const cloneError = "t.clone() is deprecated. Use t.cloneNode() instead.";
55
const cloneDeepError =
66
"t.cloneDeep() is deprecated. Use t.cloneNode() instead.";
77

8-
const ruleTester = new RuleTester({
9-
parserOptions: { sourceType: "module" },
10-
});
8+
const ruleTester = new RuleTester();
119

1210
ruleTester.run("no-deprecated-clone", rule, {
1311
valid: [

eslint/babel-eslint-plugin-development/test/rules/no-undefined-identifier.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import RuleTester from "../../../babel-eslint-shared-fixtures/utils/RuleTester.j
44
const error =
55
"Use path.scope.buildUndefinedNode() to create an undefined identifier directly.";
66

7-
const ruleTester = new RuleTester({
8-
parserOptions: { sourceType: "module" },
9-
});
7+
const ruleTester = new RuleTester();
108

119
ruleTester.run("no-undefined-identifier", rule, {
1210
valid: [

eslint/babel-eslint-plugin/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
},
4242
"devDependencies": {
4343
"clone-deep": "^4.0.1",
44-
"eslint": "^9.0.0"
44+
"eslint": "^9.7.0"
4545
},
4646
"conditions": {
4747
"BABEL_8_BREAKING": [

eslint/babel-eslint-plugin/test/rules/no-invalid-this.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import cloneDeep from "clone-deep";
22
import rule from "../../lib/rules/no-invalid-this.cjs";
33
import RuleTester from "../../../babel-eslint-shared-fixtures/utils/RuleTester.js";
4+
import { ESLint } from "eslint";
45

56
/**
67
* A constant value for non strict mode environment.
@@ -164,8 +165,12 @@ const patterns = [
164165
},
165166
];
166167

167-
const ruleTester = new RuleTester();
168-
ruleTester.run("@babel/no-invalid-this", rule, {
169-
valid: extractPatterns(patterns, "valid"),
170-
invalid: extractPatterns(patterns, "invalid"),
171-
});
168+
if (parseInt(ESLint.version, 10) < 9) {
169+
const ruleTester = new RuleTester();
170+
ruleTester.run("@babel/no-invalid-this", rule, {
171+
valid: extractPatterns(patterns, "valid"),
172+
invalid: extractPatterns(patterns, "invalid"),
173+
});
174+
} else {
175+
test("@babel/no-invalid-this fallbacks to noop for ESLint 9", () => {});
176+
}

eslint/babel-eslint-shared-fixtures/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"@babel/preset-env": "workspace:^",
1717
"@babel/preset-flow": "workspace:^",
1818
"@babel/preset-react": "workspace:^",
19-
"eslint": "^8.22.0"
19+
"eslint": "^9.7.0"
2020
},
2121
"type": "commonjs"
2222
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
const { RuleTester } = require("eslint");
2+
const {
3+
eslintConfigCompat,
4+
} = require("../../babel-eslint-tests/test/helpers/eslintConfigCompat.cjs");
25

3-
RuleTester.setDefaultConfig({
4-
parser: require.resolve("@babel/eslint-parser"),
5-
parserOptions: {
6-
sourceType: "module",
7-
ecmaVersion: "latest",
8-
babelOptions: {
9-
configFile: require.resolve("../config/babel.config.js"),
6+
const defaultConfig = {
7+
languageOptions: {
8+
parser: require("@babel/eslint-parser"),
9+
parserOptions: {
10+
sourceType: "module",
11+
ecmaVersion: "latest",
12+
babelOptions: {
13+
configFile: require.resolve("../config/babel.config.js"),
14+
},
1015
},
1116
},
12-
});
17+
};
18+
19+
RuleTester.setDefaultConfig(eslintConfigCompat(defaultConfig));
1320

1421
module.exports = RuleTester;

eslint/babel-eslint-tests/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
"@babel/core": "workspace:^",
88
"@babel/eslint-parser": "workspace:^",
99
"@babel/preset-react": "workspace:^",
10+
"@eslint/compat": "^1.1.1",
1011
"dedent": "^1.5.3",
11-
"eslint": "^8.22.0",
12+
"eslint": "^9.7.0",
1213
"eslint-plugin-import": "^2.25.4",
14+
"globals": "^15.6.0",
1315
"npm-babel-parser": "npm:@babel/parser@^7.14.0"
1416
},
1517
"type": "module"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { func1 } from "./index.js";
2+
3+
export function five() {
4+
return { five: `number(${5})` };
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module.exports = {
2+
plugins: [
3+
() => ({
4+
parserOverride: require("npm-babel-parser").parse,
5+
}),
6+
],
7+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const babelParser = require("@babel/eslint-parser");
2+
3+
module.exports = [
4+
{
5+
languageOptions: {
6+
parser: babelParser,
7+
parserOptions: {
8+
babelOptions: {
9+
configFile: __dirname + "/babel.config.js",
10+
sourceType: "module",
11+
},
12+
},
13+
},
14+
15+
rules: {
16+
"template-curly-spacing": "error",
17+
},
18+
},
19+
];

eslint/babel-eslint-tests/test/fixtures/eslint-plugin-import/.eslintrc.yml renamed to eslint/babel-eslint-tests/test/fixtures/eslint-plugin-import-eslint-8/.eslintrc.yml

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
root: true
22
parser: "@babel/eslint-parser"
3+
parserOptions:
4+
requireConfigFile: false
5+
babelOptions:
6+
configFile: false
7+
presets:
8+
- "@babel/preset-flow"
39
plugins:
410
- import
511
rules:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default function foo() { }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import foo from './a.js';
2+
3+
console.log(foo);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @flow
2+
type Foo = {};
3+
4+
const FlowTypeButton = ({ }: Foo) => { };
5+
6+
console.log(FlowTypeButton);
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
import foo from './a.js';
2+
3+
console.log(foo);

eslint/babel-eslint-tests/test/fixtures/eslint-plugin-import/c.js

+2
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
type Foo = {};
33

44
const FlowTypeButton = ({ }: Foo) => { };
5+
6+
console.log(FlowTypeButton);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import _import from "eslint-plugin-import";
2+
import { fixupPluginRules } from "@eslint/compat";
3+
import babelParser from "@babel/eslint-parser";
4+
5+
export default [
6+
{
7+
plugins: {
8+
import: fixupPluginRules(_import),
9+
},
10+
11+
languageOptions: {
12+
parser: babelParser,
13+
parserOptions: {
14+
requireConfigFile: false,
15+
babelOptions: {
16+
configFile: false,
17+
presets: ["@babel/preset-flow"],
18+
},
19+
},
20+
},
21+
22+
rules: {
23+
"import/no-named-as-default": "error",
24+
"no-unused-vars": "error",
25+
},
26+
},
27+
];

eslint/babel-eslint-tests/test/fixtures/mjs-config-file/.eslintrc.js

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module.exports = {
2+
languageOptions: {
3+
parser: require("@babel/eslint-parser/experimental-worker"),
4+
parserOptions: {
5+
babelOptions: {
6+
configFile: __dirname + "/babel.config.mjs",
7+
sourceType: "module",
8+
},
9+
},
10+
},
11+
rules: {
12+
"template-curly-spacing": "error",
13+
},
14+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const eslint = require("eslint");
2+
const babelESLintParserPath = require.resolve("../../../babel-eslint-parser");
3+
/**
4+
* Convert ESLint 9 config to ESLint 7/8 config
5+
* @param {eslint.Linter.FlatConfig} ESLint 9 config
6+
*/
7+
function eslintConfigCompatTo8(config) {
8+
const newConfig = { ...config };
9+
const { languageOptions } = config;
10+
if (languageOptions) {
11+
const { parser, parserOptions, globals: globalsOption } = languageOptions;
12+
if (parser) {
13+
newConfig.parser = babelESLintParserPath;
14+
}
15+
if (parserOptions) {
16+
newConfig.parserOptions = languageOptions.parserOptions;
17+
}
18+
if (globalsOption) {
19+
const env = {};
20+
if (globalsOption.__dirname === false) {
21+
env.node = true;
22+
}
23+
if (globalsOption.Promise === false) {
24+
env.es2015 = true;
25+
}
26+
newConfig.env = env;
27+
}
28+
delete newConfig.languageOptions;
29+
}
30+
return newConfig;
31+
}
32+
33+
function eslintConfigCompat(config) {
34+
if (parseInt(eslint.ESLint.version, 10) <= 8) {
35+
return eslintConfigCompatTo8(config);
36+
}
37+
return config;
38+
}
39+
40+
module.exports.babelESLintParserPath = babelESLintParserPath;
41+
42+
module.exports.eslintConfigCompat = eslintConfigCompat;

eslint/babel-eslint-tests/test/helpers/verifyAndAssertMessages.js

+25-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
import eslint from "eslint";
1+
import { Linter, ESLint } from "eslint";
22
import unpad from "dedent";
33
import path from "path";
44
import { fileURLToPath } from "url";
5+
import {
6+
eslintConfigCompat,
7+
babelESLintParserPath,
8+
} from "./eslintConfigCompat.cjs";
59
import * as parser from "../../../babel-eslint-parser/lib/index.cjs";
10+
import babelEslintParser from "@babel/eslint-parser";
11+
import globals from "globals";
612

713
export default function verifyAndAssertMessages(
814
code,
@@ -11,17 +17,17 @@ export default function verifyAndAssertMessages(
1117
sourceType,
1218
overrideConfig,
1319
) {
14-
const linter = new eslint.Linter();
15-
linter.defineParser("@babel/eslint-parser", parser);
20+
const linter = new Linter();
21+
if (parseInt(ESLint.version, 10) < 9) {
22+
linter.defineParser(babelESLintParserPath, parser);
23+
}
1624

17-
const messages = linter.verify(unpad(`${code}`), {
18-
parser: "@babel/eslint-parser",
19-
rules,
20-
env: {
21-
node: true,
22-
es6: true,
25+
const languageOptions = {
26+
globals: (overrideConfig && overrideConfig.globals) ?? {
27+
...globals.node,
28+
...globals.es2024,
2329
},
24-
...overrideConfig,
30+
parser: babelEslintParser.default || babelEslintParser,
2531
parserOptions: {
2632
sourceType,
2733
requireConfigFile: false,
@@ -36,7 +42,15 @@ export default function verifyAndAssertMessages(
3642
overrideConfig.parserOptions.babelOptions),
3743
},
3844
},
39-
});
45+
};
46+
47+
const messages = linter.verify(
48+
unpad(`${code}`),
49+
eslintConfigCompat({
50+
languageOptions,
51+
rules,
52+
}),
53+
);
4054

4155
if (messages.length !== expectedMessages.length) {
4256
throw new Error(

0 commit comments

Comments
 (0)