@tb-dev/eslint-config 3.5.0 → 3.5.2

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