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