1+ import tseslint from 'typescript-eslint' ;
2+ import simpleImportSort from 'eslint-plugin-simple-import-sort' ;
3+ import stylistic from '@stylistic/eslint-plugin' ;
4+ import stylisticEslintPluginTs from '@stylistic/eslint-plugin-ts' ;
5+ import eslint from '@eslint/js' ;
6+ import tsParser from '@typescript-eslint/parser' ;
7+ import typescriptEslint from '@typescript-eslint/eslint-plugin' ;
8+
9+ const namingConventions = [
10+ {
11+ selector : 'default' ,
12+ format : [ 'camelCase' ] ,
13+ } , {
14+ selector : 'variable' ,
15+ format : [ 'camelCase' , 'UPPER_CASE' ] ,
16+ leadingUnderscore : 'allow' ,
17+ } , {
18+ selector : 'function' ,
19+ format : [ 'camelCase' ] ,
20+ leadingUnderscore : 'allow' ,
21+ } , {
22+ selector : 'typeLike' ,
23+ format : [ 'PascalCase' ] ,
24+ } , {
25+ selector : 'enumMember' ,
26+ format : [ 'UPPER_CASE' ] ,
27+ } , {
28+ selector : 'typeProperty' ,
29+ format : [ 'camelCase' , 'PascalCase' ] ,
30+ } , {
31+ selector : 'import' ,
32+ format : [ 'camelCase' , 'PascalCase' , 'UPPER_CASE' ] ,
33+ }
34+ ]
35+
36+ export function extendNamingConventions ( ...list ) {
37+ const selectors = list . map ( convention => convention . selector )
38+
39+ return [
40+ ...namingConventions . filter ( convention => ! selectors . includes ( convention . selector ) ) ,
41+ ...list
42+ ]
43+ }
44+
45+ export default tseslint . config (
46+ eslint . configs . recommended ,
47+ ...tseslint . configs . strictTypeChecked ,
48+ ...tseslint . configs . stylisticTypeChecked ,
49+ stylistic . configs [ 'all-flat' ] ,
50+ {
51+ languageOptions : {
52+ parser : tsParser ,
53+ parserOptions : {
54+ projectService : true
55+ } ,
56+ } ,
57+ } ,
58+ {
59+ files : [ 'src/**/*.{ts,tsx}' , 'test/**/*.{ts,tsx}' ] ,
60+ plugins : {
61+ '@typescript-eslint' : typescriptEslint ,
62+ 'simple-import-sort' : simpleImportSort ,
63+ '@stylistic' : stylistic ,
64+ '@stylistic/ts' : stylisticEslintPluginTs ,
65+ } ,
66+ rules : {
67+ '@typescript-eslint/consistent-type-definitions' : 'off' ,
68+ 'no-cond-assign' : 'error' ,
69+ 'no-console' : 'error' ,
70+ 'no-constant-condition' : 'error' ,
71+ 'no-duplicate-imports' : 'warn' ,
72+ 'no-control-regex' : 'warn' ,
73+ 'no-dupe-args' : 'error' ,
74+ 'no-dupe-keys' : 'error' ,
75+ 'no-duplicate-case' : 'error' ,
76+ 'no-empty-character-class' : 'error' ,
77+ 'no-empty' : 'warn' ,
78+ 'no-extra-boolean-cast' : 'error' ,
79+ 'no-extra-semi' : 'error' ,
80+ 'no-func-assign' : 'error' ,
81+ 'no-inner-declarations' : 'error' ,
82+ 'no-unsafe-negation' : 'error' ,
83+ 'no-sparse-arrays' : 'error' ,
84+ 'no-unreachable' : 'error' ,
85+ 'default-case' : 'warn' ,
86+ eqeqeq : 'warn' ,
87+ 'no-caller' : 'error' ,
88+ 'no-else-return' : 'error' ,
89+ 'no-eq-null' : 'error' ,
90+ 'no-eval' : 'error' ,
91+ 'no-fallthrough' : 'error' ,
92+ 'no-implied-eval' : 'error' ,
93+ 'no-labels' : 'error' ,
94+ 'no-loop-func' : 'error' ,
95+ 'no-multi-spaces' : 'error' ,
96+ 'no-new' : 'error' ,
97+ 'no-proto' : 'error' ,
98+ 'no-redeclare' : 'off' ,
99+ '@typescript-eslint/no-redeclare' : 'error' ,
100+ 'no-self-compare' : 'error' ,
101+ 'init-declarations' : [ 'error' , 'always' ] ,
102+ 'no-undefined' : 'error' ,
103+ 'comma-dangle' : [ 'error' , 'never' ] ,
104+ semi : 'off' ,
105+ 'no-shadow' : 'off' ,
106+ '@typescript-eslint/no-shadow' : 'error' ,
107+ 'no-unused-vars' : 'off' ,
108+
109+ '@typescript-eslint/no-unused-vars' : [ 'error' , {
110+ argsIgnorePattern : '^_' ,
111+ varsIgnorePattern : '^_' ,
112+ caughtErrorsIgnorePattern : '^_' ,
113+ } ] ,
114+
115+ 'object-curly-spacing' : [ 'error' , 'always' ] ,
116+
117+ camelcase : [ 'error' , {
118+ properties : 'always' ,
119+ } ] ,
120+
121+ 'comma-spacing' : [ 'warn' , {
122+ before : false ,
123+ after : true ,
124+ } ] ,
125+
126+ '@stylistic/indent' : [ 'error' , 2 ] ,
127+ 'newline-after-var' : [ 'error' , 'always' ] ,
128+ 'no-mixed-spaces-and-tabs' : 'error' ,
129+
130+ 'no-multiple-empty-lines' : [ 'warn' , {
131+ max : 1 ,
132+ } ] ,
133+
134+ 'space-before-blocks' : [ 'error' , 'always' ] ,
135+ 'space-in-parens' : [ 'error' , 'never' ] ,
136+
137+ // 'space-before-function-paren': ['error', {
138+ // anonymous: 'always',
139+ // named: 'never',
140+ // }],
141+
142+ 'keyword-spacing' : 'error' ,
143+ 'max-depth' : [ 'warn' , 4 ] ,
144+
145+ 'max-len' : [ 'warn' , 120 , 4 , {
146+ ignoreComments : true ,
147+ } ] ,
148+
149+ 'max-params' : [ 'warn' , 7 ] ,
150+ 'max-statements' : [ 'warn' , 12 ] ,
151+ 'simple-import-sort/imports' : 'warn' ,
152+ 'simple-import-sort/exports' : 'warn' ,
153+ complexity : [ 'error' , 10 ] ,
154+ 'no-trailing-spaces' : 'error' ,
155+ 'eol-last' : [ 'error' , 'always' ] ,
156+
157+ '@typescript-eslint/naming-convention' : [ 'error' , ...namingConventions ] ,
158+ 'padded-blocks' : [ 'error' , 'never' ] ,
159+ 'spaced-comment' : [ 'error' , 'always' ] ,
160+ '@typescript-eslint/no-unsafe-return' : 'warn' ,
161+ '@typescript-eslint/no-unsafe-argument' : 'warn' ,
162+ '@typescript-eslint/no-unsafe-assignment' : 'warn' ,
163+ '@typescript-eslint/no-unsafe-member-access' : 'warn' ,
164+ '@typescript-eslint/no-unsafe-call' : 'warn' ,
165+ '@typescript-eslint/no-unnecessary-type-parameters' : 'warn' ,
166+ '@typescript-eslint/no-unnecessary-condition' : 'warn' ,
167+ '@typescript-eslint/no-confusing-void-expression' : 'warn' ,
168+ '@typescript-eslint/no-non-null-assertion' : 'warn' ,
169+ '@typescript-eslint/no-dynamic-delete' : 'warn' ,
170+ '@typescript-eslint/no-explicit-any' : 'warn' ,
171+
172+ '@stylistic/semi' : [ 'error' , 'never' ] ,
173+ '@stylistic/padded-blocks' : [ 'error' , 'never' ] ,
174+ '@stylistic/object-curly-spacing' : [ 'error' , 'always' ] ,
175+ '@stylistic/quotes' : [ 'error' , 'single' , {
176+ avoidEscape : true ,
177+ allowTemplateLiterals : true ,
178+ } ] ,
179+ '@stylistic/function-call-argument-newline' : [ 'error' , 'consistent' ] ,
180+ '@stylistic/space-before-function-paren' : [ 'error' , {
181+ anonymous : 'always' ,
182+ named : 'never' ,
183+ } ] ,
184+ '@stylistic/quote-props' : [ 'error' , 'as-needed' ] ,
185+ '@stylistic/object-property-newline' : [ 'error' , { 'allowAllPropertiesOnSameLine' : true } ] ,
186+ '@stylistic/member-delimiter-style' : [ 'error' , {
187+ "multiline" : {
188+ "delimiter" : "none" ,
189+ "requireLast" : true
190+ } ,
191+ "singleline" : {
192+ "delimiter" : "comma" ,
193+ "requireLast" : false
194+ } ,
195+ "multilineDetection" : "brackets"
196+ } ] ,
197+ '@stylistic/no-extra-parens' : [ 'error' , 'all' , { 'ignoreJSX' : 'multi-line' } ] ,
198+ '@stylistic/arrow-parens' : [ 'error' , 'as-needed' ] ,
199+ '@stylistic/no-confusing-arrow' : "off" ,
200+ '@stylistic/array-element-newline' : 'off' ,
201+ '@typescript-eslint/restrict-template-expressions' : [ 'error' , { 'allowNumber' : true } ] ,
202+ '@stylistic/lines-around-comment' : [ 'error' , { 'beforeBlockComment' : false , 'beforeLineComment' : false } ] ,
203+ '@stylistic/lines-between-class-members' : 'off' ,
204+ '@stylistic/array-bracket-newline' : [ 'error' , 'consistent' ] ,
205+ '@stylistic/dot-location' : [ 'error' , 'property' ] ,
206+ '@typescript-eslint/prefer-nullish-coalescing' : 'warn' ,
207+ '@stylistic/operator-linebreak' : [ 'error' , 'before' ] ,
208+ }
209+ } ,
210+ {
211+ files : [ 'test/**/*.ts' ] ,
212+ rules : {
213+ 'no-magic-numbers' : 'off' ,
214+ '@typescript-eslint/no-confusing-void-expression' : 'off' ,
215+ }
216+ }
217+ )
0 commit comments