Skip to content

Commit 20bfe75

Browse files
committed
[DRAFT] New flat config
This is in hiatus because the import module can't ahndle it import-js/eslint-plugin-import#2556 (comment)
1 parent b42d9ed commit 20bfe75

File tree

6 files changed

+248
-169
lines changed

6 files changed

+248
-169
lines changed

.eslintignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ dist/
55
.vscode/
66
node_modules/
77
coverage/
8-
!.eslintrc.js
9-
!.prettierrc.js
108
!*.js
119
!*.ts
1210
!.vscode/*.json

.eslintrc.js

Lines changed: 0 additions & 157 deletions
This file was deleted.

.vscode/settings.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@
55
],
66
"editor.formatOnSave": true,
77
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
8+
"editor.codeActionsOnSave": {
9+
"source.organizeImports": "never"
10+
},
811
"[javascript,typescript]": {
9-
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
12+
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
13+
"editor.codeActionsOnSave": {
14+
"source.organizeImports": "never"
15+
},
1016
},
17+
"eslint.experimental.useFlatConfig": true,
1118
"jest.jestCommandLine": "npm test -- ",
1219
"jest.runMode": {
1320
"type": "on-demand"

eslint.config.js

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
const stylistic = require('@stylistic/eslint-plugin');
2+
const js = require('@eslint/js');
3+
const tseslint = require('typescript-eslint');
4+
5+
const ts = require('@typescript-eslint/eslint-plugin');
6+
const tsParser = require('@typescript-eslint/parser');
7+
const imprt = require('eslint-plugin-import');
8+
const globals = require('globals');
9+
const jest = require('eslint-plugin-jest');
10+
const off = 'off';
11+
12+
const warn = 'warn';
13+
14+
const error = 'error';
15+
16+
const TEST_ONLY_IMPORTS = ['fast-check',
17+
'jest'];
18+
19+
/**
20+
* set of typescript-eslint any rules
21+
* @param {'error' | 'warn' | 'off'} level
22+
* @returns
23+
*/
24+
const any_rules = (level) => {
25+
return {
26+
'@typescript-eslint/no-unsafe-return': level,
27+
'@typescript-eslint/no-var-requires': level,
28+
'@typescript-eslint/no-unsafe-member-access': level,
29+
'@typescript-eslint/no-unsafe-assignment': level,
30+
'@typescript-eslint/no-unsafe-argument': level,
31+
'@typescript-eslint/no-unsafe-call': level,
32+
'@typescript-eslint/no-explicit-any': level,
33+
};
34+
};
35+
36+
module.exports
37+
= [
38+
js.configs.recommended,
39+
...tseslint.configs.recommended,
40+
{ languageOptions: {
41+
globals: globals.node,
42+
parser: tsParser,
43+
parserOptions: {
44+
ecmaVersion: 2022,
45+
sourceType: 'module',
46+
tsconfigRootDir: __dirname,
47+
project: [
48+
'./tsconfig.eslint.json',
49+
'./tsconfig.json',
50+
'/tsconfig.prod.json',
51+
],
52+
},
53+
},
54+
},
55+
stylistic.configs['recommended-flat'],
56+
stylistic.configs.customize({
57+
// the following options are the default values
58+
semi: true,
59+
}),
60+
{ languageOptions: { parser: tsParser },
61+
plugins: {
62+
'import': imprt,
63+
// '@typescript-eslint': ts,
64+
'@stylistic': stylistic,
65+
ts,
66+
} },
67+
{
68+
ignores: ['**/node_modules',
69+
'**/dist',
70+
'**/build',
71+
'**/__snapshots__',
72+
'**/mocks',
73+
'**/coverage',
74+
'**/report'],
75+
},
76+
{
77+
rules: {
78+
...ts.configs['eslint-recommended'].rules,
79+
...ts.configs['recommended'].rules,
80+
...ts.configs['recommended-requiring-type-checking'].rules,
81+
...imprt.configs['errors'].rules,
82+
...imprt.configs['warnings'].rules,
83+
...imprt.configs['typescript'].rules,
84+
'import/no-extraneous-dependencies': error,
85+
'no-console': error,
86+
'@typescript-eslint/return-await': ['error',
87+
'always'],
88+
'no-unused-vars': off,
89+
'@typescript-eslint/no-unused-vars': error,
90+
'eqeqeq': [error,
91+
'smart'],
92+
'no-else-return': [
93+
error,
94+
{
95+
allowElseIf: true,
96+
},
97+
],
98+
'@typescript-eslint/require-await': error,
99+
'@typescript-eslint/unbound-method': [
100+
error,
101+
{
102+
ignoreStatic: true,
103+
},
104+
],
105+
// See https://github.com/orgs/react-hook-form/discussions/8622#discussioncomment-4060570
106+
'@typescript-eslint/no-misused-promises': [
107+
error,
108+
{
109+
checksVoidReturn: {
110+
attributes: false,
111+
},
112+
},
113+
],
114+
'no-restricted-imports': [
115+
'error',
116+
{
117+
paths: TEST_ONLY_IMPORTS.map((name) => {
118+
return { name,
119+
message: `${name} is only available during testing` };
120+
}),
121+
patterns: TEST_ONLY_IMPORTS.map(dep => `${dep}/*`),
122+
},
123+
],
124+
'@typescript-eslint/explicit-member-accessibility': warn,
125+
'@typescript-eslint/no-explicit-any': warn,
126+
'@typescript-eslint/explicit-function-return-type': off,
127+
// '@typescript-eslint/no-var-requires': off,
128+
'@typescript-eslint/no-empty-function': off,
129+
'@typescript-eslint/no-floating-promises': error,
130+
},
131+
},
132+
{
133+
files: ['.*.js',
134+
'.*.cjs',
135+
'*.config.cjs',
136+
'*.config.js',
137+
'*.config.ts'],
138+
rules: {
139+
'no-restricted-imports': off,
140+
// Consider if this is too leanient for tests
141+
...any_rules('off'),
142+
},
143+
},
144+
{
145+
files: [
146+
'**/*.test.js',
147+
'**/*.spec.js',
148+
'**/*.test.ts',
149+
'**/*.spec.ts',
150+
'tests/**/*.js',
151+
'tests/**/*.ts',
152+
'__tests__/**/*.js',
153+
'__tests__/**/*.ts',
154+
'jest.*.js',
155+
'jest.*.ts',
156+
],
157+
// https://eslint.org/docs/user-guide/configuring#specifying-environments
158+
languageOptions: { globals: globals.jest },
159+
plugins: { jest },
160+
rules: {
161+
...jest.configs['recommended'].rules,
162+
'no-restricted-imports': off,
163+
'jest/expect-expect': [
164+
error,
165+
{
166+
assertFunctionNames: ['expect',
167+
'fc.assert'],
168+
},
169+
],
170+
...any_rules('off'),
171+
},
172+
},
173+
];

0 commit comments

Comments
 (0)