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