11module . exports = {
22 extends : [
33 'airbnb-base' ,
4- 'prettier' , // eslint-config-prettier 处理冲突
54 'plugin:react/recommended' ,
6- 'plugin:import/typescript' ,
75 'plugin:@typescript-eslint/recommended' ,
6+ 'plugin:prettier/recommended' ,
87 ] ,
98 parser : '@typescript-eslint/parser' ,
10- plugins : [ '@typescript-eslint' , 'react-hooks' ] ,
9+ plugins : [ '@typescript-eslint' , 'react-hooks' , 'simple-import-sort' , 'prettier' ] ,
1110 env : {
1211 browser : true ,
1312 node : true ,
@@ -27,32 +26,17 @@ module.exports = {
2726 } ,
2827 } ,
2928 rules : {
29+ 'no-console' : [
30+ 'warn' ,
31+ {
32+ allow : [ 'info' , 'warn' , 'error' ] ,
33+ } ,
34+ ] ,
35+
36+ // code style config
37+ 'no-param-reassign' : 'off' ,
38+ 'guard-for-in' : 'off' ,
3039 'no-use-before-define' : 'off' ,
31- '@typescript-eslint/explicit-module-boundary-types' : 'off' ,
32- '@typescript-eslint/ban-types' : 'off' ,
33- '@typescript-eslint/explicit-function-return-type' : 'off' ,
34- '@typescript-eslint/indent' : [ 'off' , 2 ] ,
35- '@typescript-eslint/ban-ts-comment' : 'off' ,
36- '@typescript-eslint/camelcase' : 'off' ,
37- '@typescript-eslint/no-empty-interface' : 'error' , // codecc
38- '@typescript-eslint/no-explicit-any' : 'off' ,
39- '@typescript-eslint/no-use-before-define' : [ 'error' , { functions : false } ] ,
40- '@typescript-eslint/no-var-requires' : 'off' ,
41- '@typescript-eslint/no-unused-vars' : 'error' , // codecc
42- 'import/order' : 'error' ,
43- 'import/extensions' : 'off' ,
44- 'import/no-named-as-default' : 'off' ,
45- 'import/prefer-default-export' : 'off' ,
46- 'import/no-extraneous-dependencies' : 'off' ,
47- 'import/no-cycle' : 'off' , // TODO: turn on this rule later
48- 'import/no-unresolved' : 'off' , // TODO: turn on this rule later
49- 'react/display-name' : 'off' ,
50- 'react-hooks/exhaustive-deps' : 'warn' ,
51- 'react-hooks/rules-of-hooks' : 'error' ,
52- 'react/prop-types' : 'off' ,
53- 'max-len' : 'off' ,
54- 'no-shadow' : 'off' ,
55- 'no-console' : [ 'warn' , { allow : [ 'warn' , 'error' ] } ] ,
5640 'no-throw-literal' : 'off' ,
5741 'no-unused-expressions' : 'off' ,
5842 'no-bitwise' : 'off' ,
@@ -68,7 +52,7 @@ module.exports = {
6852 'no-restricted-syntax' : 'off' ,
6953 'no-restricted-globals' : 'off' ,
7054 'no-unneeded-ternary' : 'off' ,
71- 'eol-last' : 'error' , // codecc
55+ 'eol-last' : 'error' ,
7256 'func-names' : 'off' ,
7357 'consistent-return' : 'off' ,
7458 'default-case' : 'off' ,
@@ -83,6 +67,86 @@ module.exports = {
8367 ] ,
8468 } ,
8569 ] ,
70+ 'max-len' : 'off' ,
71+ 'no-shadow' : 'off' ,
72+ 'prettier/prettier' : [
73+ 'error' ,
74+ {
75+ printWidth : 120 ,
76+ tabWidth : 2 ,
77+ useTabs : false ,
78+ semi : true ,
79+ singleQuote : true ,
80+ quoteProps : 'as-needed' ,
81+ jsxSingleQuote : false ,
82+ trailingComma : 'all' ,
83+ bracketSpacing : true ,
84+ jsxBracketSameLine : false ,
85+ arrowParens : 'always' ,
86+ proseWrap : 'preserve' ,
87+ htmlWhitespaceSensitivity : 'css' ,
88+ endOfLine : 'lf' ,
89+ } ,
90+ ] ,
91+ // import config
92+ 'import/order' : 'off' ,
93+ 'import/extensions' : 'off' ,
94+ 'import/no-named-as-default' : 'off' ,
95+ 'import/prefer-default-export' : 'off' ,
96+ 'import/no-extraneous-dependencies' : 'off' ,
97+ 'import/no-cycle' : 'off' ,
98+ 'import/no-unresolved' : 'off' ,
99+ 'import/no-relative-packages' : 'off' ,
100+ 'simple-import-sort/imports' : [
101+ 'error' ,
102+ {
103+ groups : [
104+ // NodeJS 内置模块
105+ [
106+ '^(assert|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|https|module|net|os|path|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|tty|url|util|vm|zlib)(/.*|$)' ,
107+ ] ,
108+ // 副作用导入(例如 "dotenv/config"
109+ [ '^\\u0000' ] ,
110+ // 第三方包
111+ [ '^react' , '^\\w' , '^@\\w' ] ,
112+ // 内部路径别名
113+ [ '^@/' ] ,
114+ // 相对路径
115+ [ '^\\.' ] ,
116+ // 类型
117+ [ '^react\\u0000$' , '^@?\\w.*\\u0000$' , '^@/.*\\u0000$' , '^\\..*\\u0000$' ] ,
118+ // css
119+ [ '\\.css$' , '\\.less$' ] ,
120+ ] ,
121+ } ,
122+ ] ,
123+ 'simple-import-sort/exports' : 'error' ,
124+ // typescript config
125+ '@typescript-eslint/explicit-module-boundary-types' : 'off' ,
126+ '@typescript-eslint/ban-types' : 'off' ,
127+ '@typescript-eslint/explicit-function-return-type' : 'off' ,
128+ '@typescript-eslint/indent' : [ 'off' , 2 ] ,
129+ '@typescript-eslint/ban-ts-comment' : 'off' ,
130+ '@typescript-eslint/camelcase' : 'off' ,
131+ '@typescript-eslint/no-empty-interface' : 'error' ,
132+ '@typescript-eslint/no-explicit-any' : 'off' ,
133+ '@typescript-eslint/no-use-before-define' : [ 'error' , { functions : false } ] ,
134+ '@typescript-eslint/no-var-requires' : 'off' ,
135+ '@typescript-eslint/no-unused-vars' : 'error' ,
136+ 'import/consistent-type-specifier-style' : [ 'error' , 'prefer-top-level' ] ,
137+ '@typescript-eslint/consistent-type-imports' : [
138+ 'error' ,
139+ {
140+ prefer : 'type-imports' ,
141+ fixStyle : 'separate-type-imports' ,
142+ disallowTypeAnnotations : false ,
143+ } ,
144+ ] ,
145+ // react config
146+ 'react/display-name' : 'off' ,
147+ 'react-hooks/exhaustive-deps' : 'warn' ,
148+ 'react-hooks/rules-of-hooks' : 'error' ,
149+ 'react/prop-types' : 'off' ,
86150 } ,
87151 overrides : [
88152 {
0 commit comments