@tb-dev/eslint-config 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs DELETED
@@ -1,947 +0,0 @@
1
- import eslintConfigPrettier from 'eslint-config-prettier';
2
- import globals from 'globals';
3
- import process from 'node:process';
4
-
5
- var Glob;
6
- (function (Glob) {
7
- Glob["ALL"] = "**/*.?([cm])[jt]s?(x)";
8
- Glob["JAVASCRIPT"] = "**/*.?([cm])js?(x)";
9
- Glob["TYPESCRIPT"] = "**/*.?([cm])ts?(x)";
10
- Glob["VITEST"] = "**/*.{test,spec}.[jt]s";
11
- Glob["VUE"] = "**/*.vue";
12
- })(Glob || (Glob = {}));
13
- var GlobIgnore;
14
- (function (GlobIgnore) {
15
- GlobIgnore["CACHE"] = "**/cache";
16
- GlobIgnore["DIST"] = "**/dist";
17
- GlobIgnore["LOG"] = "**/log?(s)";
18
- GlobIgnore["NODE_MODULES"] = "**/node_modules";
19
- GlobIgnore["OUT"] = "**/out";
20
- GlobIgnore["TARGET"] = "**/target";
21
- GlobIgnore["TEMP"] = "**/?(.)temp";
22
- })(GlobIgnore || (GlobIgnore = {}));
23
-
24
- /* eslint-disable @typescript-eslint/no-unsafe-return */
25
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
26
- /* eslint-disable @typescript-eslint/no-explicit-any */
27
- async function interopDefault(promise) {
28
- const result = await promise;
29
- return result.default ?? result;
30
- }
31
- function getIgnores() {
32
- return Object.values(GlobIgnore);
33
- }
34
-
35
- /**
36
- * @see https://eslint.org/docs/latest/rules/
37
- */
38
- function javascript(options) {
39
- const { overrides } = options;
40
- const files = [Glob.ALL];
41
- if (options.vue)
42
- files.push(Glob.VUE);
43
- return {
44
- files,
45
- languageOptions: {
46
- ecmaVersion: 'latest',
47
- sourceType: 'module',
48
- globals: {
49
- ...globals.browser,
50
- ...globals.es2021,
51
- ...globals.node,
52
- document: 'readonly',
53
- window: 'readonly'
54
- }
55
- },
56
- rules: {
57
- 'accessor-pairs': ['error', { enforceForClassMembers: true, setWithoutGet: true }],
58
- 'array-callback-return': [
59
- 'error',
60
- {
61
- checkForEach: true,
62
- allowVoid: true
63
- }
64
- ],
65
- 'block-scoped-var': 'error',
66
- 'consistent-this': ['error', 'self'],
67
- 'default-case-last': 'error',
68
- eqeqeq: ['error', 'always'],
69
- 'for-direction': 'error',
70
- 'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
71
- 'grouped-accessor-pairs': ['error', 'getBeforeSet'],
72
- 'guard-for-in': 'error',
73
- 'init-declarations': 'off',
74
- 'logical-assignment-operators': ['error', 'always', { enforceForIfStatements: true }],
75
- 'max-params': 'off',
76
- 'new-cap': ['error', { newIsCap: true, capIsNew: false, properties: true }],
77
- 'no-alert': 'error',
78
- 'no-async-promise-executor': 'error',
79
- 'no-caller': 'error',
80
- 'no-case-declarations': 'error',
81
- 'no-class-assign': 'error',
82
- 'no-compare-neg-zero': 'error',
83
- 'no-cond-assign': ['error', 'always'],
84
- 'no-constant-binary-expression': 'error',
85
- 'no-constant-condition': 'error',
86
- 'no-constructor-return': 'error',
87
- 'no-control-regex': 'error',
88
- 'no-debugger': 'error',
89
- 'no-delete-var': 'error',
90
- 'no-dupe-else-if': 'error',
91
- 'no-duplicate-case': 'error',
92
- 'no-duplicate-imports': ['error', { includeExports: false }],
93
- 'no-else-return': 'error',
94
- 'no-empty': ['error', { allowEmptyCatch: true }],
95
- 'no-empty-character-class': 'error',
96
- 'no-empty-pattern': 'error',
97
- 'no-empty-static-block': 'error',
98
- 'no-eval': 'error',
99
- 'no-ex-assign': 'error',
100
- 'no-extend-native': 'error',
101
- 'no-extra-bind': 'error',
102
- 'no-extra-boolean-cast': 'error',
103
- 'no-fallthrough': ['error', { allowEmptyCase: true }],
104
- 'no-global-assign': 'error',
105
- 'no-implicit-coercion': ['error', { disallowTemplateShorthand: true }],
106
- 'no-import-assign': 'error',
107
- 'no-inner-declarations': ['error', 'both'],
108
- 'no-invalid-regexp': 'error',
109
- 'no-irregular-whitespace': 'error',
110
- 'no-iterator': 'error',
111
- 'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
112
- 'no-lone-blocks': 'error',
113
- 'no-lonely-if': 'error',
114
- 'no-misleading-character-class': 'error',
115
- 'no-multi-assign': 'error',
116
- 'no-multi-str': 'error',
117
- 'no-new': 'error',
118
- 'no-new-func': 'error',
119
- 'no-new-native-nonconstructor': 'error',
120
- 'no-new-wrappers': 'error',
121
- 'no-nonoctal-decimal-escape': 'error',
122
- 'no-object-constructor': 'error',
123
- 'no-octal': 'error',
124
- 'no-octal-escape': 'error',
125
- 'no-promise-executor-return': ['error', { allowVoid: true }],
126
- 'no-proto': 'error',
127
- 'no-prototype-builtins': 'error',
128
- 'no-regex-spaces': 'error',
129
- 'no-script-url': 'error',
130
- 'no-self-assign': 'error',
131
- 'no-self-compare': 'error',
132
- 'no-sequences': 'error',
133
- 'no-shadow-restricted-names': 'error',
134
- 'no-sparse-arrays': 'error',
135
- 'no-template-curly-in-string': 'error',
136
- 'no-undef-init': 'error',
137
- 'no-undefined': 'error',
138
- 'no-unexpected-multiline': 'error',
139
- 'no-unmodified-loop-condition': 'error',
140
- 'no-unneeded-ternary': ['error', { defaultAssignment: false }],
141
- 'no-unreachable-loop': 'error',
142
- 'no-unsafe-finally': 'error',
143
- 'no-unsafe-optional-chaining': ['error', { disallowArithmeticOperators: true }],
144
- 'no-unused-vars': 'off',
145
- 'no-useless-backreference': 'error',
146
- 'no-useless-call': 'error',
147
- 'no-useless-catch': 'error',
148
- 'no-useless-computed-key': 'error',
149
- 'no-useless-concat': 'error',
150
- 'no-useless-rename': 'error',
151
- 'no-useless-return': 'error',
152
- 'no-var': 'error',
153
- 'no-with': 'error',
154
- 'object-shorthand': ['error', 'always'],
155
- 'operator-assignment': ['error', 'always'],
156
- 'prefer-arrow-callback': 'error',
157
- 'prefer-const': [
158
- 'error',
159
- {
160
- destructuring: 'all',
161
- ignoreReadBeforeAssign: true
162
- }
163
- ],
164
- 'prefer-destructuring': 'off',
165
- 'prefer-exponentiation-operator': 'error',
166
- 'prefer-object-has-own': 'error',
167
- 'prefer-object-spread': 'error',
168
- 'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }],
169
- 'prefer-rest-params': 'error',
170
- 'prefer-spread': 'error',
171
- 'prefer-template': 'error',
172
- 'require-atomic-updates': 'error',
173
- 'sort-imports': [
174
- 'error',
175
- {
176
- allowSeparatedGroups: false,
177
- ignoreCase: false,
178
- ignoreDeclarationSort: true,
179
- ignoreMemberSort: false,
180
- memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single']
181
- }
182
- ],
183
- 'symbol-description': 'error',
184
- 'use-isnan': 'error',
185
- 'valid-typeof': 'error',
186
- yoda: ['error', 'never'],
187
- ...overrides?.javascript
188
- }
189
- };
190
- }
191
-
192
- /**
193
- * @see https://eslint-plugin-perfectionist.azat.io/rules/
194
- */
195
- async function perfectionist(options) {
196
- const { overrides, perfectionist: enabled = true } = options;
197
- if (!enabled)
198
- return {};
199
- const plugin = await interopDefault(import('eslint-plugin-perfectionist'));
200
- return {
201
- plugins: {
202
- perfectionist: plugin
203
- },
204
- rules: {
205
- 'perfectionist/sort-classes': [
206
- 'error',
207
- {
208
- type: 'natural',
209
- order: 'asc',
210
- groups: [
211
- 'index-signature',
212
- 'property',
213
- 'private-property',
214
- 'constructor',
215
- 'method',
216
- 'private-method',
217
- ['get-method', 'set-method'],
218
- 'static-property',
219
- 'static-method',
220
- 'static-private-method',
221
- 'unknown'
222
- ]
223
- }
224
- ],
225
- 'perfectionist/sort-enums': [
226
- 'error',
227
- {
228
- type: 'natural',
229
- order: 'asc'
230
- }
231
- ],
232
- 'perfectionist/sort-exports': [
233
- 'error',
234
- {
235
- type: 'line-length',
236
- order: 'asc'
237
- }
238
- ],
239
- 'perfectionist/sort-imports': [
240
- 'error',
241
- {
242
- type: 'line-length',
243
- order: 'asc',
244
- 'newlines-between': 'never',
245
- groups: [
246
- ['style', 'side-effect'],
247
- ['builtin', 'builtin-type'],
248
- ['external', 'external-type'],
249
- ['internal', 'internal-type'],
250
- 'unknown'
251
- ]
252
- }
253
- ],
254
- 'perfectionist/sort-interfaces': [
255
- 'error',
256
- {
257
- type: 'natural',
258
- order: 'asc',
259
- 'partition-by-new-line': true
260
- }
261
- ],
262
- 'perfectionist/sort-maps': [
263
- 'error',
264
- {
265
- type: 'natural',
266
- order: 'asc'
267
- }
268
- ],
269
- 'perfectionist/sort-named-exports': [
270
- 'error',
271
- {
272
- type: 'natural',
273
- order: 'asc'
274
- }
275
- ],
276
- 'sort-imports': 'off',
277
- 'perfectionist/sort-named-imports': [
278
- 'error',
279
- {
280
- type: 'natural',
281
- order: 'asc'
282
- }
283
- ],
284
- '@typescript-eslint/adjacent-overload-signatures': 'off',
285
- 'perfectionist/sort-object-types': [
286
- 'error',
287
- {
288
- type: 'natural',
289
- order: 'asc',
290
- 'partition-by-new-line': true
291
- }
292
- ],
293
- ...overrides?.perfectionist
294
- }
295
- };
296
- }
297
-
298
- /**
299
- * @see https://typescript-eslint.io/rules/
300
- */
301
- async function typescript(options) {
302
- const { project, overrides } = options;
303
- const [tsParser, tsPlugin] = await Promise.all([
304
- await interopDefault(import('@typescript-eslint/parser')),
305
- await interopDefault(import('@typescript-eslint/eslint-plugin'))
306
- ]);
307
- const files = [Glob.TYPESCRIPT];
308
- if (options.vue)
309
- files.push(Glob.VUE);
310
- const rules = {
311
- '@typescript-eslint/adjacent-overload-signatures': 'error',
312
- 'no-array-constructor': 'off',
313
- '@typescript-eslint/no-array-constructor': 'error',
314
- '@typescript-eslint/array-type': ['error', { default: 'array' }],
315
- '@typescript-eslint/ban-ts-comment': [
316
- 'error',
317
- {
318
- 'ts-expect-error': 'allow-with-description',
319
- 'ts-ignore': true,
320
- 'ts-nocheck': true,
321
- 'ts-check': false,
322
- minimumDescriptionLength: 3
323
- }
324
- ],
325
- '@typescript-eslint/class-literal-property-style': ['error', 'fields'],
326
- 'class-methods-use-this': 'off',
327
- '@typescript-eslint/class-methods-use-this': [
328
- 'error',
329
- {
330
- ignoreOverrideMethods: true,
331
- ignoreClassesThatImplementAnInterface: 'public-fields'
332
- }
333
- ],
334
- '@typescript-eslint/consistent-generic-constructors': ['error', 'constructor'],
335
- '@typescript-eslint/consistent-indexed-object-style': ['error', 'record'],
336
- '@typescript-eslint/consistent-type-assertions': [
337
- 'error',
338
- { assertionStyle: 'as', objectLiteralTypeAssertions: 'allow-as-parameter' }
339
- ],
340
- '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
341
- 'dot-notation': 'off',
342
- '@typescript-eslint/dot-notation': ['error', { allowKeywords: true }],
343
- '@typescript-eslint/explicit-function-return-type': 'off',
344
- '@typescript-eslint/explicit-member-accessibility': [
345
- 'error',
346
- {
347
- accessibility: 'explicit',
348
- overrides: {
349
- accessors: 'no-public',
350
- constructors: 'no-public',
351
- methods: 'explicit',
352
- properties: 'explicit',
353
- parameterProperties: 'explicit'
354
- }
355
- }
356
- ],
357
- '@typescript-eslint/explicit-module-boundary-types': 'off',
358
- '@typescript-eslint/method-signature-style': ['error', 'property'],
359
- '@typescript-eslint/no-array-delete': 'error',
360
- '@typescript-eslint/no-base-to-string': 'error',
361
- '@typescript-eslint/no-confusing-non-null-assertion': 'error',
362
- '@typescript-eslint/no-confusing-void-expression': [
363
- 'error',
364
- {
365
- ignoreArrowShorthand: true,
366
- ignoreVoidOperator: true
367
- }
368
- ],
369
- '@typescript-eslint/no-duplicate-enum-values': 'error',
370
- '@typescript-eslint/no-duplicate-type-constituents': 'error',
371
- '@typescript-eslint/no-dynamic-delete': 'error',
372
- 'no-empty-function': 'off',
373
- '@typescript-eslint/no-empty-function': 'error',
374
- '@typescript-eslint/no-empty-interface': 'error',
375
- '@typescript-eslint/no-explicit-any': ['error', { fixToUnknown: true }],
376
- '@typescript-eslint/no-extra-non-null-assertion': 'error',
377
- '@typescript-eslint/no-extraneous-class': 'error',
378
- '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }],
379
- '@typescript-eslint/no-for-in-array': 'error',
380
- 'no-implied-eval': 'off',
381
- '@typescript-eslint/no-implied-eval': 'error',
382
- '@typescript-eslint/no-import-type-side-effects': 'error',
383
- '@typescript-eslint/no-inferrable-types': 'error',
384
- '@typescript-eslint/no-invalid-void-type': [
385
- 'error',
386
- {
387
- allowInGenericTypeArguments: true,
388
- allowAsThisParameter: true
389
- }
390
- ],
391
- 'no-loop-func': 'off',
392
- '@typescript-eslint/no-loop-func': 'error',
393
- 'no-loss-of-precision': 'off',
394
- '@typescript-eslint/no-loss-of-precision': 'error',
395
- '@typescript-eslint/no-meaningless-void-operator': 'error',
396
- '@typescript-eslint/no-misused-new': 'error',
397
- '@typescript-eslint/no-misused-promises': [
398
- 'error',
399
- {
400
- checksConditionals: true,
401
- checksSpreads: true,
402
- checksVoidReturn: {
403
- arguments: true,
404
- attributes: true,
405
- properties: true,
406
- returns: true,
407
- variables: true
408
- }
409
- }
410
- ],
411
- '@typescript-eslint/no-mixed-enums': 'error',
412
- '@typescript-eslint/no-namespace': 'error',
413
- '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',
414
- '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
415
- '@typescript-eslint/no-non-null-assertion': 'error',
416
- '@typescript-eslint/no-redundant-type-constituents': 'off',
417
- '@typescript-eslint/no-require-imports': 'error',
418
- 'no-shadow': 'off',
419
- '@typescript-eslint/no-shadow': 'error',
420
- '@typescript-eslint/no-this-alias': 'error',
421
- 'no-throw-literal': 'off',
422
- '@typescript-eslint/no-throw-literal': 'error',
423
- '@typescript-eslint/no-unnecessary-boolean-literal-compare': [
424
- 'error',
425
- {
426
- allowComparingNullableBooleansToTrue: false,
427
- allowComparingNullableBooleansToFalse: true
428
- }
429
- ],
430
- '@typescript-eslint/no-unnecessary-condition': 'error',
431
- '@typescript-eslint/no-unnecessary-qualifier': 'error',
432
- '@typescript-eslint/no-unnecessary-type-arguments': 'error',
433
- '@typescript-eslint/no-unnecessary-type-assertion': 'error',
434
- '@typescript-eslint/no-unnecessary-type-constraint': 'error',
435
- '@typescript-eslint/no-unsafe-argument': 'off',
436
- '@typescript-eslint/no-unsafe-assignment': 'off',
437
- '@typescript-eslint/no-unsafe-call': 'error',
438
- '@typescript-eslint/no-unsafe-declaration-merging': 'error',
439
- '@typescript-eslint/no-unsafe-enum-comparison': 'off',
440
- '@typescript-eslint/no-unsafe-member-access': 'error',
441
- '@typescript-eslint/no-unsafe-return': 'off',
442
- '@typescript-eslint/no-unsafe-unary-minus': 'error',
443
- 'no-unused-expressions': 'off',
444
- '@typescript-eslint/no-unused-expressions': [
445
- 'error',
446
- {
447
- allowTaggedTemplates: true
448
- }
449
- ],
450
- 'no-use-before-define': 'off',
451
- '@typescript-eslint/no-use-before-define': [
452
- 'error',
453
- {
454
- functions: false,
455
- enums: true,
456
- typedefs: false
457
- }
458
- ],
459
- 'no-useless-constructor': 'off',
460
- '@typescript-eslint/no-useless-constructor': 'error',
461
- '@typescript-eslint/no-useless-empty-export': 'error',
462
- '@typescript-eslint/no-useless-template-literals': 'error',
463
- '@typescript-eslint/non-nullable-type-assertion-style': 'error',
464
- '@typescript-eslint/prefer-as-const': 'error',
465
- '@typescript-eslint/prefer-enum-initializers': 'error',
466
- '@typescript-eslint/prefer-for-of': 'error',
467
- '@typescript-eslint/prefer-function-type': 'error',
468
- '@typescript-eslint/prefer-includes': 'error',
469
- '@typescript-eslint/prefer-literal-enum-member': 'error',
470
- '@typescript-eslint/prefer-nullish-coalescing': [
471
- 'error',
472
- {
473
- ignoreTernaryTests: false,
474
- ignoreConditionalTests: false,
475
- ignoreMixedLogicalExpressions: false,
476
- ignorePrimitives: {
477
- bigint: false,
478
- boolean: false,
479
- number: false,
480
- string: false
481
- }
482
- }
483
- ],
484
- '@typescript-eslint/prefer-optional-chain': 'error',
485
- 'prefer-promise-reject-errors': 'off',
486
- '@typescript-eslint/prefer-promise-reject-errors': 'error',
487
- '@typescript-eslint/prefer-readonly': 'error',
488
- '@typescript-eslint/prefer-readonly-parameter-types': 'off',
489
- '@typescript-eslint/prefer-reduce-type-parameter': 'error',
490
- '@typescript-eslint/prefer-regexp-exec': 'error',
491
- '@typescript-eslint/prefer-return-this-type': 'error',
492
- '@typescript-eslint/prefer-string-starts-ends-with': 'error',
493
- '@typescript-eslint/prefer-ts-expect-error': 'error',
494
- '@typescript-eslint/promise-function-async': 'off',
495
- '@typescript-eslint/require-array-sort-compare': 'error',
496
- 'require-await': 'off',
497
- '@typescript-eslint/require-await': 'error',
498
- '@typescript-eslint/restrict-plus-operands': 'error',
499
- '@typescript-eslint/restrict-template-expressions': 'error',
500
- '@typescript-eslint/strict-boolean-expressions': 'off',
501
- '@typescript-eslint/switch-exhaustiveness-check': [
502
- 'error',
503
- {
504
- requireDefaultForNonUnion: true
505
- }
506
- ],
507
- '@typescript-eslint/unbound-method': 'error',
508
- '@typescript-eslint/unified-signatures': [
509
- 'error',
510
- {
511
- ignoreDifferentlyNamedParameters: true
512
- }
513
- ],
514
- ...overrides?.typescript
515
- };
516
- return {
517
- files,
518
- languageOptions: {
519
- ecmaVersion: 'latest',
520
- sourceType: 'module',
521
- parser: tsParser,
522
- parserOptions: {
523
- project,
524
- tsconfigRootDir: process.cwd(),
525
- extraFileExtensions: options.vue ? ['.vue'] : []
526
- }
527
- },
528
- plugins: {
529
- '@typescript-eslint': tsPlugin
530
- },
531
- rules
532
- };
533
- }
534
-
535
- /**
536
- * @see https://github.com/sindresorhus/eslint-plugin-unicorn#rules
537
- */
538
- async function unicorn(options) {
539
- const { overrides, unicorn: enabled = true } = options;
540
- if (!enabled)
541
- return {};
542
- const plugin = await interopDefault(import('eslint-plugin-unicorn'));
543
- return {
544
- plugins: {
545
- unicorn: plugin
546
- },
547
- rules: {
548
- 'unicorn/catch-error-name': [
549
- 'error',
550
- {
551
- name: 'err'
552
- }
553
- ],
554
- 'unicorn/consistent-function-scoping': [
555
- 'error',
556
- {
557
- checkArrowFunctions: true
558
- }
559
- ],
560
- 'unicorn/custom-error-definition': 'error',
561
- 'unicorn/error-message': 'error',
562
- 'unicorn/no-array-for-each': 'error',
563
- 'unicorn/no-array-method-this-argument': 'error',
564
- 'unicorn/no-array-push-push': 'error',
565
- 'unicorn/no-await-expression-member': 'error',
566
- 'unicorn/no-invalid-remove-event-listener': 'error',
567
- 'unicorn/no-thenable': 'error',
568
- 'unicorn/no-typeof-undefined': 'off',
569
- 'unicorn/no-useless-fallback-in-spread': 'error',
570
- 'unicorn/no-useless-length-check': 'error',
571
- 'unicorn/no-useless-promise-resolve-reject': 'error',
572
- 'unicorn/prefer-at': 'error',
573
- 'unicorn/prefer-date-now': 'error',
574
- 'unicorn/prefer-dom-node-append': 'error',
575
- 'unicorn/prefer-dom-node-dataset': 'error',
576
- 'unicorn/prefer-dom-node-remove': 'error',
577
- 'unicorn/prefer-dom-node-text-content': 'error',
578
- 'unicorn/prefer-modern-dom-apis': 'error',
579
- 'unicorn/prefer-node-protocol': 'error',
580
- 'unicorn/prefer-number-properties': 'error',
581
- 'unicorn/prefer-object-from-entries': 'error',
582
- 'unicorn/prefer-prototype-methods': 'error',
583
- 'unicorn/prefer-query-selector': 'error',
584
- 'unicorn/prefer-reflect-apply': 'error',
585
- 'unicorn/prefer-regexp-test': 'error',
586
- 'unicorn/prefer-string-slice': 'error',
587
- 'unicorn/prefer-type-error': 'error',
588
- 'unicorn/relative-url-style': ['error', 'never'],
589
- ...overrides?.unicorn
590
- }
591
- };
592
- }
593
-
594
- async function vitest(options) {
595
- const { overrides, vitest: enabled } = options;
596
- if (!enabled)
597
- return {};
598
- const plugin = await interopDefault(import('eslint-plugin-vitest'));
599
- return {
600
- plugins: {
601
- vitest: plugin
602
- },
603
- files: [Glob.VITEST],
604
- rules: {
605
- 'vitest/consistent-test-it': ['error', { fn: 'it', withinDescribe: 'it' }],
606
- 'vitest/expect-expect': [
607
- 'error',
608
- {
609
- assertFunctionNames: ['expect']
610
- }
611
- ],
612
- 'vitest/max-expects': ['error', { max: 5 }],
613
- 'vitest/max-nested-describe': ['error', { max: 1 }],
614
- 'vitest/no-alias-methods': 'error',
615
- 'vitest/no-commented-out-tests': 'error',
616
- 'vitest/no-conditional-expect': 'error',
617
- 'vitest/no-conditional-in-test': 'error',
618
- 'vitest/no-conditional-tests': 'error',
619
- 'vitest/no-done-callback': 'error',
620
- 'vitest/no-duplicate-hooks': 'error',
621
- 'vitest/no-identical-title': 'error',
622
- 'vitest/no-import-node-test': 'error',
623
- 'vitest/no-standalone-expect': 'error',
624
- 'vitest/no-test-return-statement': 'error',
625
- 'vitest/prefer-comparison-matcher': 'error',
626
- 'vitest/prefer-each': 'error',
627
- 'vitest/prefer-equality-matcher': 'error',
628
- 'vitest/prefer-expect-resolves': 'error',
629
- 'vitest/prefer-hooks-in-order': 'error',
630
- 'vitest/prefer-hooks-on-top': 'error',
631
- 'vitest/prefer-lowercase-title': 'error',
632
- 'vitest/prefer-mock-promise-shorthand': 'error',
633
- 'vitest/prefer-spy-on': 'error',
634
- 'vitest/prefer-to-be-object': 'error',
635
- 'vitest/prefer-to-contain': 'error',
636
- 'vitest/prefer-to-have-length': 'error',
637
- 'vitest/prefer-todo': 'error',
638
- 'vitest/require-top-level-describe': [
639
- 'error',
640
- {
641
- maxNumberOfTopLevelDescribes: 10
642
- }
643
- ],
644
- 'vitest/valid-describe-callback': 'error',
645
- 'vitest/valid-expect': 'error',
646
- ...overrides?.vitest
647
- }
648
- };
649
- }
650
-
651
- /* eslint-disable @typescript-eslint/no-explicit-any */
652
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
653
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
654
- /**
655
- * @see https://eslint.vuejs.org/rules/
656
- */
657
- async function vue(options) {
658
- const { overrides, vue: enabled } = options;
659
- if (!enabled)
660
- return [];
661
- const [vuePlugin, vueParser, tsParser] = await Promise.all([
662
- // @ts-expect-error no types
663
- await interopDefault(import('eslint-plugin-vue')),
664
- await interopDefault(import('vue-eslint-parser')),
665
- await interopDefault(import('@typescript-eslint/parser'))
666
- ]);
667
- const rules = {
668
- ...vuePlugin.configs.base.rules,
669
- 'vue/attribute-hyphenation': ['error', 'always'],
670
- 'vue/attributes-order': 'error',
671
- 'vue/block-lang': [
672
- 'error',
673
- {
674
- script: {
675
- lang: 'ts'
676
- },
677
- style: {
678
- lang: 'scss',
679
- allowNoLang: true
680
- }
681
- }
682
- ],
683
- 'vue/block-order': [
684
- 'error',
685
- {
686
- order: [['script', 'template'], 'style:not([scoped])', 'style[scoped]']
687
- }
688
- ],
689
- 'vue/block-tag-newline': [
690
- 'error',
691
- {
692
- singleline: 'always',
693
- multiline: 'always',
694
- maxEmptyLines: 0
695
- }
696
- ],
697
- 'vue/component-api-style': ['error', ['script-setup']],
698
- 'vue/component-definition-name-casing': ['error', 'PascalCase'],
699
- 'vue/component-name-in-template-casing': ['error', 'PascalCase'],
700
- 'vue/custom-event-name-casing': ['error', 'camelCase'],
701
- 'vue/define-emits-declaration': ['error', 'type-based'],
702
- 'vue/define-macros-order': [
703
- 'error',
704
- {
705
- order: ['defineProps', 'defineEmits']
706
- }
707
- ],
708
- 'vue/define-props-declaration': ['error', 'type-based'],
709
- 'vue/first-attribute-linebreak': 'off',
710
- 'vue/html-button-has-type': [
711
- 'error',
712
- {
713
- button: true,
714
- submit: true,
715
- reset: true
716
- }
717
- ],
718
- 'vue/html-closing-bracket-newline': [
719
- 'error',
720
- {
721
- singleline: 'never',
722
- multiline: 'always'
723
- }
724
- ],
725
- 'vue/html-closing-bracket-spacing': [
726
- 'error',
727
- {
728
- startTag: 'never',
729
- endTag: 'never',
730
- selfClosingTag: 'always'
731
- }
732
- ],
733
- 'vue/html-self-closing': [
734
- 'error',
735
- {
736
- html: {
737
- void: 'never',
738
- normal: 'always',
739
- component: 'always'
740
- },
741
- svg: 'always',
742
- math: 'always'
743
- }
744
- ],
745
- 'vue/match-component-file-name': [
746
- 'off',
747
- {
748
- extensions: ['tsx', 'vue'],
749
- shouldMatchCase: false
750
- }
751
- ],
752
- 'vue/match-component-import-name': 'error',
753
- 'vue/multi-word-component-names': 'off',
754
- 'vue/mustache-interpolation-spacing': ['error', 'always'],
755
- 'vue/no-arrow-functions-in-watch': 'off',
756
- 'vue/no-async-in-computed-properties': 'error',
757
- 'vue/no-boolean-default': ['error', 'no-default'],
758
- 'vue/no-computed-properties-in-data': 'error',
759
- 'vue/no-dupe-keys': 'error',
760
- 'vue/no-dupe-v-else-if': 'error',
761
- 'vue/no-duplicate-attributes': [
762
- 'error',
763
- {
764
- allowCoexistClass: true,
765
- allowCoexistStyle: true
766
- }
767
- ],
768
- 'vue/no-export-in-script-setup': 'error',
769
- 'vue/no-expose-after-await': 'error',
770
- 'vue/no-lifecycle-after-await': 'error',
771
- 'vue/no-lone-template': 'error',
772
- 'vue/no-multi-spaces': 'error',
773
- 'vue/no-multiple-objects-in-class': 'error',
774
- 'vue/no-mutating-props': 'error',
775
- 'vue/no-parsing-error': 'error',
776
- 'vue/no-ref-as-operand': 'error',
777
- 'vue/no-ref-object-reactivity-loss': 'error',
778
- 'vue/no-reserved-component-names': 'error',
779
- 'vue/no-reserved-keys': 'error',
780
- 'vue/no-reserved-props': 'error',
781
- 'vue/no-required-prop-with-default': [
782
- 'error',
783
- {
784
- autofix: true
785
- }
786
- ],
787
- 'vue/no-root-v-if': 'error',
788
- 'vue/no-setup-props-reactivity-loss': 'error',
789
- 'vue/no-shared-component-data': 'error',
790
- 'vue/no-side-effects-in-computed-properties': 'error',
791
- 'vue/no-spaces-around-equal-signs-in-attribute': 'error',
792
- 'vue/no-static-inline-styles': [
793
- 'error',
794
- {
795
- allowBinding: false
796
- }
797
- ],
798
- 'vue/no-template-key': 'error',
799
- 'vue/no-template-shadow': 'error',
800
- 'vue/no-template-target-blank': 'error',
801
- 'vue/no-textarea-mustache': 'error',
802
- 'vue/no-unused-components': 'error',
803
- 'vue/no-unused-emit-declarations': 'error',
804
- 'vue/no-unused-properties': 'error',
805
- 'vue/no-unused-refs': 'error',
806
- 'vue/no-unused-vars': [
807
- 'error',
808
- {
809
- ignorePattern: '^_'
810
- }
811
- ],
812
- 'vue/no-use-computed-property-like-method': 'error',
813
- 'vue/no-use-v-else-with-v-for': 'error',
814
- 'vue/no-use-v-if-with-v-for': 'error',
815
- 'vue/no-useless-mustaches': [
816
- 'error',
817
- {
818
- ignoreIncludesComment: false,
819
- ignoreStringEscape: false
820
- }
821
- ],
822
- 'vue/no-useless-template-attributes': 'error',
823
- 'vue/no-useless-v-bind': 'error',
824
- 'vue/no-v-for-template-key-on-child': 'error',
825
- 'vue/no-v-text-v-html-on-component': 'error',
826
- 'vue/no-v-html': 'off',
827
- 'vue/no-watch-after-await': 'error',
828
- 'vue/order-in-components': 'error',
829
- 'vue/padding-line-between-blocks': ['error', 'always'],
830
- 'vue/prefer-define-options': 'error',
831
- 'vue/prefer-import-from-vue': 'error',
832
- 'vue/prefer-separate-static-class': 'error',
833
- 'vue/prefer-true-attribute-shorthand': 'error',
834
- 'vue/prop-name-casing': ['error', 'camelCase'],
835
- 'vue/require-component-is': 'error',
836
- 'vue/require-default-prop': 'off',
837
- 'vue/require-explicit-emits': [
838
- 'error',
839
- {
840
- allowProps: false
841
- }
842
- ],
843
- 'vue/require-macro-variable-name': [
844
- 'error',
845
- {
846
- defineProps: 'props',
847
- defineEmits: 'emit',
848
- defineSlots: 'slots',
849
- useSlots: 'slots',
850
- useAttrs: 'attrs'
851
- }
852
- ],
853
- 'vue/require-prop-types': 'error',
854
- 'vue/require-render-return': 'error',
855
- 'vue/require-slots-as-functions': 'error',
856
- 'vue/require-toggle-inside-transition': 'error',
857
- 'vue/require-typed-ref': 'error',
858
- 'vue/require-v-for-key': 'error',
859
- 'vue/require-valid-default-prop': 'error',
860
- 'vue/return-in-computed-property': 'error',
861
- 'vue/return-in-emits-validator': 'error',
862
- 'vue/this-in-template': ['error', 'never'],
863
- 'vue/use-v-on-exact': 'error',
864
- 'vue/v-bind-style': ['error', 'shorthand'],
865
- 'vue/v-for-delimiter-style': ['error', 'of'],
866
- 'vue/v-on-handler-style': 'off',
867
- 'vue/v-on-style': ['error', 'shorthand'],
868
- 'vue/v-slot-style': [
869
- 'error',
870
- {
871
- atComponent: 'shorthand',
872
- default: 'shorthand',
873
- named: 'shorthand'
874
- }
875
- ],
876
- 'vue/v-on-event-hyphenation': ['error', 'always'],
877
- 'vue/valid-attribute-name': 'error',
878
- 'vue/valid-define-emits': 'error',
879
- 'vue/valid-define-options': 'error',
880
- 'vue/valid-define-props': 'error',
881
- 'vue/valid-next-tick': 'error',
882
- 'vue/valid-template-root': 'error',
883
- 'vue/valid-v-bind': 'error',
884
- 'vue/valid-v-cloak': 'error',
885
- 'vue/valid-v-else-if': 'error',
886
- 'vue/valid-v-else': 'error',
887
- 'vue/valid-v-for': 'error',
888
- 'vue/valid-v-html': 'error',
889
- 'vue/valid-v-if': 'error',
890
- 'vue/valid-v-memo': 'error',
891
- 'vue/valid-v-model': 'error',
892
- 'vue/valid-v-on': 'error',
893
- 'vue/valid-v-once': 'error',
894
- 'vue/valid-v-pre': 'error',
895
- 'vue/valid-v-show': 'error',
896
- 'vue/valid-v-slot': 'error',
897
- 'vue/valid-v-text': 'error',
898
- ...overrides?.vue
899
- };
900
- return [
901
- {
902
- plugins: {
903
- vue: vuePlugin
904
- }
905
- },
906
- {
907
- files: [Glob.VUE],
908
- languageOptions: {
909
- parser: vueParser,
910
- parserOptions: {
911
- parser: tsParser,
912
- project: options.project,
913
- tsconfigRootDir: process.cwd(),
914
- extraFileExtensions: ['.vue'],
915
- sourceType: 'module',
916
- ecmaVersion: 'latest'
917
- }
918
- }
919
- },
920
- {
921
- // @ts-expect-error no types
922
- processor: vuePlugin.processors['.vue'],
923
- rules
924
- }
925
- ];
926
- }
927
-
928
- /* eslint-disable @typescript-eslint/no-explicit-any */
929
- /* eslint-disable @typescript-eslint/no-unsafe-return */
930
- async function config(options) {
931
- const { prettier = true } = options;
932
- const objs = await Promise.all([
933
- javascript(options),
934
- typescript(options),
935
- ...(await vue(options)),
936
- perfectionist(options),
937
- unicorn(options),
938
- vitest(options),
939
- prettier ? eslintConfigPrettier : {},
940
- {
941
- ignores: [...getIgnores(), ...(options.ignores ?? [])]
942
- }
943
- ]);
944
- return objs;
945
- }
946
-
947
- export { config as default };