Skip to content

Commit a32c0ad

Browse files
committed
[Tests] test plugin in flat configs
1 parent 4be7f0e commit a32c0ad

17 files changed

+251
-1
lines changed

.eslintrc

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"ignorePatterns": [
1717
"coverage/",
1818
".nyc_output/",
19+
"tests/fixtures/flat-config/"
1920
],
2021
"rules": {
2122
"comma-dangle": [2, "always-multiline"],

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"test": "npm run unit-test",
1616
"posttest": "aud --production",
1717
"type-check": "tsc",
18-
"unit-test": "istanbul cover node_modules/mocha/bin/_mocha tests/lib/**/*.js tests/util/**/*.js tests/index.js",
18+
"unit-test": "istanbul cover node_modules/mocha/bin/_mocha tests/lib/**/*.js tests/util/**/*.js tests/index.js tests/flat-config.js",
1919
"update:eslint-docs": "eslint-doc-generator"
2020
},
2121
"repository": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use strict';
2+
3+
const reactAll = require('../../../../configs/all');
4+
5+
module.exports = [{
6+
files: ['**/*.jsx'],
7+
...reactAll,
8+
languageOptions: {
9+
...reactAll.languageOptions
10+
}
11+
}];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict';
2+
3+
const reactPlugin = require('../../../..');
4+
5+
module.exports = [{
6+
files: ['**/*.jsx'],
7+
...reactPlugin.configs['flat/all']
8+
}];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div foo="hello">
2+
test
3+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
const reactRecommended = require('../../../../configs/recommended');
4+
const reactJSXRuntime = require('../../../../configs/jsx-runtime');
5+
6+
module.exports = [
7+
{
8+
files: ['**/*.jsx'],
9+
...reactRecommended,
10+
languageOptions: {
11+
...reactRecommended.languageOptions
12+
}
13+
},
14+
reactJSXRuntime
15+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use strict';
2+
3+
const reactPlugin = require('../../../..');
4+
5+
module.exports = [
6+
{
7+
files: ['**/*.jsx'],
8+
...reactPlugin.configs['flat/recommended']
9+
},
10+
reactPlugin.configs['flat/jsx-runtime']
11+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div foo="hello">
2+
test
3+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use strict';
2+
3+
const reactRecommended = require('../../../../configs/recommended');
4+
5+
module.exports = [{
6+
files: ['**/*.jsx'],
7+
...reactRecommended,
8+
languageOptions: {
9+
...reactRecommended.languageOptions
10+
}
11+
}];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict';
2+
3+
const reactPlugin = require('../../../..');
4+
5+
module.exports = [{
6+
files: ['**/*.jsx'],
7+
...reactPlugin.configs['flat/recommended']
8+
}];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div foo="hello">
2+
test
3+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict';
2+
3+
const react = require('../../../..');
4+
const reactRecommended = require('../../../../configs/recommended');
5+
6+
module.exports = [
7+
{
8+
files: ['**/*.jsx'],
9+
plugins: { react }
10+
},
11+
{
12+
files: ['**/*.jsx'],
13+
...reactRecommended,
14+
languageOptions: {
15+
...reactRecommended.languageOptions
16+
}
17+
}
18+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
3+
const react = require('../../../..');
4+
const reactRecommended = require('../../../../configs/recommended');
5+
6+
module.exports = [
7+
{
8+
files: ['**/*.jsx'],
9+
plugins: { react }
10+
},
11+
{
12+
files: ['**/*.jsx'],
13+
...react.configs['flat/recommended']
14+
}
15+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div foo="hello">
2+
test
3+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
const react = require('../../../..');
4+
5+
module.exports = [{
6+
files: ['**/*.jsx'],
7+
languageOptions: {
8+
parserOptions: {
9+
ecmaFeatures: {
10+
jsx: true,
11+
},
12+
},
13+
},
14+
plugins: {
15+
react,
16+
},
17+
rules: {
18+
'react/jsx-no-literals': 1,
19+
},
20+
}];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div foo="hello">
2+
test
3+
</div>

tests/flat-config.js

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/* eslint-env mocha */
2+
3+
'use strict';
4+
5+
const semver = require('semver');
6+
const eslintPkg = require('eslint/package.json');
7+
8+
if (!semver.satisfies(eslintPkg.version, '>= 8.57.0')) {
9+
return;
10+
}
11+
12+
const ESLint = semver.major(eslintPkg.version) < 9
13+
? require('eslint/use-at-your-own-risk').FlatESLint // eslint-disable-line import/no-unresolved -- false positive
14+
: require('eslint').ESLint;
15+
16+
const path = require('path');
17+
const assert = require('assert');
18+
19+
describe('eslint-plugin-react in flat config', () => {
20+
const fixturesdDir = path.resolve(__dirname, 'fixtures', 'flat-config');
21+
22+
it('should work when the plugin is used directly', () => {
23+
const eslint = new ESLint({
24+
cwd: path.resolve(fixturesdDir, 'plugin'),
25+
});
26+
27+
return eslint.lintFiles(['test.jsx']).then((results) => {
28+
const result = results[0];
29+
30+
assert.strictEqual(result.messages.length, 1);
31+
assert.strictEqual(result.messages[0].severity, 1);
32+
assert.strictEqual(result.messages[0].ruleId, 'react/jsx-no-literals');
33+
assert.strictEqual(result.messages[0].messageId, 'literalNotInJSXExpression');
34+
});
35+
});
36+
37+
['root', 'deep'].forEach((configAccess) => {
38+
const overrideConfigFile = `eslint.config-${configAccess}.js`;
39+
40+
it(`should work when the plugin is used with "all" config (${configAccess})`, () => {
41+
const eslint = new ESLint({
42+
cwd: path.resolve(fixturesdDir, 'config-all'),
43+
overrideConfigFile,
44+
});
45+
46+
return eslint.lintFiles(['test.jsx']).then((results) => {
47+
const result = results[0];
48+
49+
assert.strictEqual(result.messages.length, 3);
50+
assert.strictEqual(result.messages[0].severity, 2);
51+
assert.strictEqual(result.messages[0].ruleId, 'react/react-in-jsx-scope');
52+
assert.strictEqual(result.messages[0].messageId, 'notInScope');
53+
assert.strictEqual(result.messages[1].severity, 2);
54+
assert.strictEqual(result.messages[1].ruleId, 'react/no-unknown-property');
55+
assert.strictEqual(result.messages[1].messageId, 'unknownProp');
56+
assert.strictEqual(result.messages[2].severity, 2);
57+
assert.strictEqual(result.messages[2].ruleId, 'react/jsx-no-literals');
58+
assert.strictEqual(result.messages[2].messageId, 'literalNotInJSXExpression');
59+
});
60+
});
61+
62+
it(`should work when the plugin is used with "recommended" config (${configAccess})`, () => {
63+
const eslint = new ESLint({
64+
cwd: path.resolve(fixturesdDir, 'config-recommended'),
65+
overrideConfigFile,
66+
});
67+
68+
return eslint.lintFiles(['test.jsx']).then((results) => {
69+
const result = results[0];
70+
71+
assert.strictEqual(result.messages.length, 2);
72+
assert.strictEqual(result.messages[0].severity, 2);
73+
assert.strictEqual(result.messages[0].ruleId, 'react/react-in-jsx-scope');
74+
assert.strictEqual(result.messages[0].messageId, 'notInScope');
75+
assert.strictEqual(result.messages[1].severity, 2);
76+
assert.strictEqual(result.messages[1].ruleId, 'react/no-unknown-property');
77+
assert.strictEqual(result.messages[1].messageId, 'unknownProp');
78+
});
79+
});
80+
81+
it(`should work when the plugin is used with "recommended" and "jsx-runtime" configs (${configAccess})`, () => {
82+
const eslint = new ESLint({
83+
cwd: path.resolve(fixturesdDir, 'config-jsx-runtime'),
84+
overrideConfigFile,
85+
});
86+
87+
return eslint.lintFiles(['test.jsx']).then((results) => {
88+
const result = results[0];
89+
90+
assert.strictEqual(result.messages.length, 1);
91+
assert.strictEqual(result.messages[0].severity, 2);
92+
assert.strictEqual(result.messages[0].ruleId, 'react/no-unknown-property');
93+
assert.strictEqual(result.messages[0].messageId, 'unknownProp');
94+
});
95+
});
96+
97+
// https://github.com/jsx-eslint/eslint-plugin-react/issues/3693
98+
it(`should work when the plugin is used directly and with "recommended" config (${configAccess})`, () => {
99+
const eslint = new ESLint({
100+
cwd: path.resolve(fixturesdDir, 'plugin-and-config'),
101+
overrideConfigFile,
102+
});
103+
104+
return eslint.lintFiles(['test.jsx']).then((results) => {
105+
const result = results[0];
106+
107+
assert.strictEqual(result.messages.length, 2);
108+
assert.strictEqual(result.messages[0].severity, 2);
109+
assert.strictEqual(result.messages[0].ruleId, 'react/react-in-jsx-scope');
110+
assert.strictEqual(result.messages[0].messageId, 'notInScope');
111+
assert.strictEqual(result.messages[1].severity, 2);
112+
assert.strictEqual(result.messages[1].ruleId, 'react/no-unknown-property');
113+
assert.strictEqual(result.messages[1].messageId, 'unknownProp');
114+
});
115+
});
116+
});
117+
});

0 commit comments

Comments
 (0)