@tb-dev/eslint-config 9.0.2 → 9.0.3

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