Skip to content

Commit 31c4572

Browse files
authored
feat: introduce flat config (#361)
* feat: introduce flat config * fix files patterns * remove babel parser as default parser supports JSX
1 parent 3a7ef3a commit 31c4572

File tree

15 files changed

+370
-53
lines changed

15 files changed

+370
-53
lines changed

README.md

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ module.exports = {
5959
};
6060
```
6161

62+
**eslint.config.js**
63+
```js
64+
const algolia = require('eslint-config-algolia/flat/base');
65+
module.exports = [
66+
...algolia,
67+
];
68+
```
69+
6270
**package.json**
6371
```json
6472
{
@@ -86,6 +94,16 @@ module.exports = {
8694
};
8795
```
8896

97+
**eslint.config.js**
98+
```js
99+
const algolia = require('eslint-config-algolia/flat/base');
100+
const algoliaJest = require('eslint-config-algolia/flat/jest');
101+
module.exports = [
102+
...algolia,
103+
...algoliaJest,
104+
];
105+
```
106+
89107
**package.json**
90108
```json
91109
{
@@ -111,6 +129,16 @@ module.exports = {
111129
};
112130
```
113131

132+
**eslint.config.js**
133+
```js
134+
const algolia = require('eslint-config-algolia/flat/base');
135+
const algoliaReact = require('eslint-config-algolia/flat/react');
136+
module.exports = [
137+
...algolia,
138+
...algoliaReact,
139+
];
140+
```
141+
114142
**package.json**
115143
```json
116144
{
@@ -122,7 +150,7 @@ module.exports = {
122150
}
123151
```
124152

125-
### Flow
153+
### Flow (deprecated)
126154

127155
**terminal**
128156
```sh
@@ -136,7 +164,7 @@ module.exports = {
136164
};
137165
```
138166

139-
### Flow with React
167+
### Flow with React (deprecated)
140168

141169
**terminal**
142170
```sh
@@ -171,14 +199,31 @@ yarn add @typescript-eslint/parser @typescript-eslint/eslint-plugin typescript -
171199
**.eslintrc.js**
172200
```js
173201
module.exports = {
174-
extends: ['algolia', 'algolia/typescript']
202+
extends: ['algolia', 'algolia/typescript'],
175203

176204
parserOptions: {
177205
project: '<path-to-tsconfig.json>',
178206
},
179207
};
180208
```
181209

210+
**eslint.config.js**
211+
```js
212+
const algolia = require('eslint-config-algolia/flat/base');
213+
const algoliaTypescript = require('eslint-config-algolia/flat/typescript');
214+
module.exports = [
215+
...algolia,
216+
...algoliaTypescript,
217+
{
218+
languageOptions: {
219+
parserOptions: {
220+
project: '<path-to-tsconfig.json>',
221+
},
222+
},
223+
},
224+
];
225+
```
226+
182227
**package.json**
183228
```json
184229
{
@@ -207,6 +252,18 @@ module.exports = {
207252
```
208253
**Note**: Be sure to put the `algolia/typescript` configuration last so the parser is properly set for TypeScript files.
209254

255+
**eslint.config.js**
256+
```js
257+
const algolia = require('eslint-config-algolia/flat/base');
258+
const algoliaReact = require('eslint-config-algolia/flat/react');
259+
const algoliaTypescript = require('eslint-config-algolia/flat/typescript');
260+
module.exports = [
261+
...algolia,
262+
...algoliaReact,
263+
...algoliaTypescript,
264+
];
265+
```
266+
210267
**package.json**
211268
```json
212269
{
@@ -233,6 +290,16 @@ module.exports = {
233290
};
234291
```
235292

293+
**eslint.config.js**
294+
```js
295+
const algolia = require('eslint-config-algolia/flat/base');
296+
const algoliaVue = require('eslint-config-algolia/flat/vue');
297+
module.exports = [
298+
...algolia,
299+
...algoliaVue,
300+
];
301+
```
302+
236303
**package.json**
237304
```json
238305
{
@@ -275,10 +342,23 @@ module.exports = {
275342
extends: 'algolia',
276343
rules: {
277344
'import/no-commonjs': 'off'
278-
}
345+
},
279346
};
280347
```
281348

349+
**eslint.config.js**
350+
```js
351+
const algolia = require('eslint-config-algolia/flat/base');
352+
module.exports = [
353+
...algolia,
354+
{
355+
rules: {
356+
'import/no-commonjs': 'off'
357+
}
358+
},
359+
];
360+
```
361+
282362
## Existing codebase setup
283363

284364
If you have a lot of files already written and wants to now use

packages/eslint-config-algolia/.eslintrc.js

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/* eslint-disable import/no-commonjs */
2+
const base = require('./flat/base');
3+
4+
module.exports = [...base];
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* eslint-disable import/no-commonjs */
2+
const eslintJs = require('@eslint/js');
3+
const commentsPlugin = require('@eslint-community/eslint-plugin-eslint-comments');
4+
const stylisticPlugin = require('@stylistic/eslint-plugin');
5+
const importPlugin = require('eslint-plugin-import');
6+
const jsdocPlugin = require('eslint-plugin-jsdoc');
7+
const eslintPluginPrettierRecommended = require('eslint-plugin-prettier/recommended');
8+
const reactHooksPlugin = require('eslint-plugin-react-hooks');
9+
const globals = require('globals');
10+
11+
const rules = require('../rules/base');
12+
13+
// Remove legacy properties
14+
delete rules.overrides;
15+
16+
module.exports = [
17+
eslintJs.configs.recommended,
18+
rules,
19+
// prettier is set after to override our own rules
20+
eslintPluginPrettierRecommended,
21+
{
22+
plugins: {
23+
'@stylistic': stylisticPlugin,
24+
'@eslint-community/eslint-comments': commentsPlugin,
25+
import: importPlugin,
26+
jsdoc: jsdocPlugin,
27+
'react-hooks': reactHooksPlugin,
28+
},
29+
languageOptions: {
30+
globals: {
31+
...globals.browser,
32+
...globals.node,
33+
},
34+
ecmaVersion: 'latest',
35+
sourceType: 'module',
36+
parserOptions: {
37+
ecmaFeatures: {
38+
experimentalObjectRestSpread: true,
39+
impliedStrict: true,
40+
},
41+
},
42+
},
43+
settings: {
44+
'import/extensions': ['.js', '.jsx', '.ts', '.tsx'],
45+
46+
'import/resolver': {
47+
node: {
48+
extensions: ['.js', '.jsx', '.ts', '.tsx'],
49+
},
50+
},
51+
},
52+
},
53+
{
54+
// enable the rule specifically for TypeScript files
55+
files: ['**/*.ts', '**/*.tsx'],
56+
rules: {
57+
'jsdoc/no-types': ['error'],
58+
},
59+
},
60+
];
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/* eslint-disable import/no-commonjs */
2+
const jestPlugin = require('eslint-plugin-jest');
3+
const globals = require('globals');
4+
5+
const jestRules = require('../rules/jest');
6+
7+
module.exports = [
8+
jestRules,
9+
{
10+
...jestPlugin.configs['flat/recommended'],
11+
...jestPlugin.configs['flat/style'],
12+
languageOptions: {
13+
globals: {
14+
...globals.jest,
15+
},
16+
},
17+
},
18+
];
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* eslint-disable import/no-commonjs */
2+
const jsxA11yPlugin = require('eslint-plugin-jsx-a11y');
3+
const reactPlugin = require('eslint-plugin-react');
4+
const reactHooksPlugin = require('eslint-plugin-react-hooks');
5+
6+
const rules = require('../rules/react');
7+
8+
module.exports = [
9+
reactPlugin.configs.flat.recommended,
10+
rules,
11+
{
12+
files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],
13+
14+
plugins: {
15+
'react-hooks': reactHooksPlugin,
16+
'jsx-a11y': jsxA11yPlugin,
17+
},
18+
19+
languageOptions: {
20+
parserOptions: {
21+
ecmaFeatures: {
22+
jsx: true,
23+
},
24+
requireConfigFile: false,
25+
},
26+
},
27+
},
28+
];
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint-disable import/no-commonjs */
2+
const typescriptPlugin = require('@typescript-eslint/eslint-plugin');
3+
const parser = require('@typescript-eslint/parser');
4+
const importPlugin = require('eslint-plugin-import');
5+
6+
const rules = require('../rules/typescript');
7+
8+
// Remove legacy properties
9+
delete rules.plugins;
10+
delete rules.overrides;
11+
12+
module.exports = [
13+
rules,
14+
{
15+
plugins: {
16+
'@typescript-eslint': typescriptPlugin,
17+
import: importPlugin,
18+
},
19+
languageOptions: {
20+
parser,
21+
parserOptions: {
22+
ecmaFeatures: {
23+
impliedStrict: true,
24+
jsx: true,
25+
},
26+
ecmaVersion: 2018,
27+
sourceType: 'module',
28+
requireConfigFile: false,
29+
},
30+
},
31+
},
32+
{
33+
// enable the rule specifically for TypeScript files
34+
files: ['**/*.ts', '**/*.tsx'],
35+
rules: {
36+
'@typescript-eslint/explicit-function-return-type': [
37+
'error',
38+
{
39+
allowHigherOrderFunctions: true,
40+
allowTypedFunctionExpressions: true,
41+
// allowExpressions: true,
42+
},
43+
],
44+
'@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'no-public' }],
45+
},
46+
},
47+
];
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// We don't extends from the `base` preset because the Vue plugin needs
2+
// to use the parser under `parserOptions`. By doing this we broke the import
3+
// plugin in the `react` preset. For now we just recreate the same configuration
4+
// until all the plugins behave the same.
5+
6+
/* eslint-disable import/no-commonjs */
7+
const babelParser = require('@babel/eslint-parser');
8+
const importPlugin = require('eslint-plugin-import');
9+
const vuePlugin = require('eslint-plugin-vue');
10+
const globals = require('globals');
11+
12+
const rules = require('../rules/vue');
13+
14+
module.exports.flat = [
15+
...vuePlugin.configs['flat/recommended'],
16+
rules,
17+
{
18+
plugins: {
19+
import: importPlugin,
20+
},
21+
languageOptions: {
22+
globals: {
23+
...globals.browser,
24+
...globals.node,
25+
},
26+
ecmaVersion: 2018,
27+
sourceType: 'module',
28+
parser: babelParser, // allows both flowtype and static class properties
29+
parserOptions: {
30+
ecmaFeatures: {
31+
impliedStrict: true,
32+
jsx: true,
33+
},
34+
},
35+
},
36+
settings: {
37+
'import/extensions': ['.js'],
38+
},
39+
},
40+
];

packages/eslint-config-algolia/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@
2727
"@babel/core": "7.25.2",
2828
"@babel/eslint-parser": "7.25.1",
2929
"@eslint-community/eslint-plugin-eslint-comments": "4.4.0",
30+
"@eslint/js": "9.11.1",
3031
"@stylistic/eslint-plugin": "2.7.2",
3132
"eslint": "8.57.0",
3233
"eslint-config-prettier": "8.10.0",
33-
"eslint-plugin-import": "2.29.1",
34+
"eslint-plugin-import": "2.31.0",
3435
"eslint-plugin-jest": "28.8.2",
3536
"eslint-plugin-jsdoc": "50.2.2",
3637
"eslint-plugin-jsx-a11y": "6.9.0",
3738
"eslint-plugin-prettier": "5.2.1",
3839
"eslint-plugin-react": "7.35.0",
3940
"eslint-plugin-react-hooks": "4.6.2",
41+
"globals": "15.10.0",
4042
"prettier": "3.3.3"
4143
},
4244
"peerDependencies": {

0 commit comments

Comments
 (0)