1
1
// @ts -check
2
2
3
- import eslint from '@eslint/js'
4
3
import globals from 'globals'
4
+ import eslintJs from '@eslint/js'
5
+ import eslintTs from 'typescript-eslint'
5
6
import stylistic from '@stylistic/eslint-plugin'
6
- import typescript from 'typescript-eslint'
7
7
import react from 'eslint-plugin-react'
8
+ import { fixupPluginRules } from '@eslint/compat'
9
+ import { FlatCompat } from '@eslint/eslintrc'
8
10
9
- export default typescript . config (
10
- eslint . configs . recommended ,
11
- ...typescript . configs . strictTypeChecked ,
12
- ...typescript . configs . stylisticTypeChecked ,
11
+ const compat = new FlatCompat ( {
12
+ baseDirectory : import . meta. dirname ,
13
+ recommendedConfig : eslintJs . configs . recommended
14
+ } )
15
+
16
+ const legacyPlugin = ( name , alias = name ) =>
17
+ fixupPluginRules ( compat . plugins ( name ) [ 0 ] ?. plugins ?. [ alias ] )
18
+
19
+ export default eslintTs . config (
20
+ eslintJs . configs . recommended ,
21
+ ...eslintTs . configs . strictTypeChecked ,
22
+ ...eslintTs . configs . stylisticTypeChecked ,
23
+ ...compat . extends ( 'plugin:import/typescript' ) ,
24
+ ...compat . extends ( 'plugin:react-hooks/recommended' ) ,
13
25
react . configs . flat . recommended ,
14
26
{
15
27
ignores : [ 'bundle/*' , 'src/dist/*' , 'src/vendor/*' , 'svn/*' , 'eslint.config.mjs' ]
16
28
} ,
17
29
{
18
- plugins : {
19
- '@stylistic' : stylistic ,
20
- 'react' : react
21
- } ,
22
30
languageOptions : {
23
31
ecmaVersion : 2018 ,
24
32
globals : { ...globals . browser } ,
@@ -29,8 +37,21 @@ export default typescript.config(
29
37
projectService : { allowDefaultProject : [ 'eslint.config.mjs' ] }
30
38
}
31
39
} ,
40
+ plugins : {
41
+ '@stylistic' : stylistic ,
42
+ 'react' : react ,
43
+ 'import' : legacyPlugin ( 'eslint-plugin-import' , 'import' )
44
+ } ,
32
45
settings : {
33
- react : { version : 'detect' }
46
+ 'react' : {
47
+ version : 'detect'
48
+ } ,
49
+ 'import/resolver' : {
50
+ typescript : {
51
+ alwaysTryTypes : true ,
52
+ project : './tsconfig.json' ,
53
+ }
54
+ }
34
55
} ,
35
56
rules : {
36
57
'@stylistic/array-bracket-newline' : [ 'error' , 'consistent' ] ,
@@ -82,6 +103,17 @@ export default typescript.config(
82
103
'dot-notation' : 'error' ,
83
104
'eqeqeq' : [ 'error' , 'always' ] ,
84
105
'func-style' : [ 'error' , 'expression' ] ,
106
+ 'import/export' : 'error' ,
107
+ 'import/named' : 'error' ,
108
+ 'import/no-duplicates' : 'warn' ,
109
+ 'import/no-namespace' : 'error' ,
110
+ 'import/no-unresolved' : 'error' ,
111
+ 'import/no-useless-path-segments' : 'warn' ,
112
+ 'import/order' : [ 'error' , {
113
+ 'groups' : [ 'builtin' , 'external' , 'internal' , 'parent' , 'sibling' , 'index' , 'object' , 'type' ] ,
114
+ 'newlines-between' : 'never' ,
115
+ 'alphabetize' : { orderImportKind : 'asc' }
116
+ } ] ,
85
117
'max-lines-per-function' : [ 'warn' , { skipBlankLines : true , skipComments : true } ] ,
86
118
'no-invalid-this' : 'error' ,
87
119
'no-magic-numbers' : [ 'error' , { ignore : [ - 1 , 0 , 1 ] } ] ,
@@ -90,6 +122,7 @@ export default typescript.config(
90
122
'one-var' : [ 'error' , 'never' ] ,
91
123
'prefer-named-capture-group' : 'error' ,
92
124
'prefer-template' : 'error' ,
125
+ 'sort-imports' : [ 'error' , { ignoreDeclarationSort : true } ] ,
93
126
'yoda' : [ 'error' , 'always' ]
94
127
}
95
128
} ,
0 commit comments