@aarongoldenthal/eslint-config-standard 42.0.1 → 43.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aarongoldenthal/eslint-config-standard",
3
- "version": "42.0.1",
3
+ "version": "43.0.0",
4
4
  "description": "Standard ESLint configuration settings",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -32,17 +32,20 @@
32
32
  "./eslint-comments-config": "./eslint-comments-config.js",
33
33
  "./esm-config": "./esm-config.js",
34
34
  "./jest-config": "./jest-config.js",
35
- "./jsdoc-config": "./jsdoc-config.js",
35
+ "./jsdoc-configs": "./jsdoc-configs.js",
36
36
  "./node-config": "./node-config.js",
37
37
  "./playwright-config": "./playwright-config.js",
38
38
  "./promise-config": "./promise-config.js",
39
39
  "./recommended": "./recommended.js",
40
40
  "./recommended-esm": "./recommended-esm.js",
41
+ "./recommended-ts": "./recommended-ts.js",
42
+ "./typescript-eslint-configs": "./typescript-eslint-configs.js",
41
43
  "./unicorn-configs": "./unicorn-configs.js",
42
44
  "./vitest-config": "./vitest-config.js"
43
45
  },
44
46
  "files": [
45
47
  "*-config*.js",
48
+ "settings.js",
46
49
  "recommended*.js"
47
50
  ],
48
51
  "bugs": {
@@ -51,26 +54,34 @@
51
54
  "homepage": "https://gitlab.com/gitlab-ci-utils/eslint-config-standard",
52
55
  "dependencies": {
53
56
  "@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
54
- "@vitest/eslint-plugin": "1.5.2",
57
+ "@vitest/eslint-plugin": "1.6.4",
55
58
  "eslint-config-prettier": "10.1.8",
56
- "eslint-plugin-jest": "29.2.2",
59
+ "eslint-plugin-jest": "29.11.2",
57
60
  "eslint-plugin-jsdoc": "61.5.0",
58
61
  "eslint-plugin-n": "17.23.1",
59
62
  "eslint-plugin-playwright": "2.4.0",
60
63
  "eslint-plugin-promise": "7.2.1",
61
64
  "eslint-plugin-unicorn": "62.0.0",
62
- "globals": "16.5.0"
65
+ "globals": "16.5.0",
66
+ "typescript-eslint": "8.51.0"
63
67
  },
64
68
  "devDependencies": {
65
69
  "@eslint/config-inspector": "1.4.2",
66
- "@vitest/coverage-v8": "4.0.15",
70
+ "@vitest/coverage-v8": "4.0.16",
67
71
  "eslint": "9.39.2",
68
72
  "jest": "30.2.0",
69
73
  "markdownlint-cli2": "0.20.0",
70
74
  "prettier": "3.7.4",
71
- "vitest": "4.0.15"
75
+ "typescript": "5.9.3",
76
+ "vitest": "4.0.16"
72
77
  },
73
78
  "peerDependencies": {
74
- "eslint": "^9.22.0"
79
+ "eslint": "^9.22.0",
80
+ "typescript": "^5.8.0"
81
+ },
82
+ "peerDependenciesMeta": {
83
+ "typescript": {
84
+ "optional": true
85
+ }
75
86
  }
76
87
  }
@@ -1,11 +1,12 @@
1
1
  import { defineConfig } from 'eslint/config';
2
+ import { filePatterns } from './settings.js';
2
3
  import globals from 'globals';
3
4
  import playwrightPlugin from 'eslint-plugin-playwright';
4
5
 
5
6
  const maxExpects = 5;
6
7
 
7
8
  export default defineConfig({
8
- files: ['**/*.pwtest.{js,mjs,cjs}'],
9
+ files: [...filePatterns.playwrightJs, ...filePatterns.playwrightTs],
9
10
  languageOptions: {
10
11
  globals: {
11
12
  ...globals['shared-node-browser']
package/promise-config.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import { defineConfig } from 'eslint/config';
2
+ import { filePatterns } from './settings.js';
2
3
  import promisePlugin from 'eslint-plugin-promise';
3
4
 
4
5
  // Create local variable due to vitest v4 coverage changes
5
6
  const config = defineConfig({
6
- files: ['**/*.{js,mjs,cjs}'],
7
+ files: [...filePatterns.allJs, ...filePatterns.allTs],
7
8
  name: 'promise (all files)',
8
9
  plugins: { promise: promisePlugin },
9
10
  rules: {
@@ -0,0 +1,24 @@
1
+ import baseConfigs from './base-configs.js';
2
+ import eslintCommentsConfig from './eslint-comments-config.js';
3
+ import esmConfig from './esm-config.js';
4
+ import jsdocConfigs from './jsdoc-configs.js';
5
+ import nodeConfig from './node-config.js';
6
+ import playwrightConfig from './playwright-config.js';
7
+ import promiseConfig from './promise-config.js';
8
+ import unicornConfigs from './unicorn-configs.js';
9
+ import vitestConfig from './vitest-config.js';
10
+
11
+ // Create local variable due to vitest v4 coverage changes
12
+ const baseConfig = [
13
+ eslintCommentsConfig,
14
+ jsdocConfigs,
15
+ nodeConfig,
16
+ playwrightConfig,
17
+ promiseConfig,
18
+ unicornConfigs,
19
+ vitestConfig,
20
+ baseConfigs,
21
+ esmConfig
22
+ ];
23
+
24
+ export default baseConfig;
@@ -1,28 +1,11 @@
1
1
  import { defineConfig } from 'eslint/config';
2
-
3
- import baseConfigs from './base-configs.js';
4
- import eslintCommentsConfig from './eslint-comments-config.js';
5
- import esmConfig from './esm-config.js';
6
- import jsdocConfig from './jsdoc-config.js';
7
- import nodeConfig from './node-config.js';
8
- import playwrightConfig from './playwright-config.js';
2
+ import esmBaseConfig from './recommended-esm-base.js';
9
3
  import prettierConfig from 'eslint-config-prettier';
10
- import promiseConfig from './promise-config.js';
11
- import unicornConfigs from './unicorn-configs.js';
12
- import vitestConfig from './vitest-config.js';
13
4
 
14
5
  // Create local variable due to vitest v4 coverage changes
15
6
  const config = defineConfig([
16
- eslintCommentsConfig,
17
- jsdocConfig,
18
- nodeConfig,
19
- playwrightConfig,
20
- promiseConfig,
21
- unicornConfigs,
22
- vitestConfig,
23
- baseConfigs,
24
- esmConfig,
25
- prettierConfig
7
+ esmBaseConfig,
8
+ { name: 'prettier (all files)', ...prettierConfig }
26
9
  ]);
27
10
 
28
11
  export default config;
@@ -0,0 +1,13 @@
1
+ import { defineConfig } from 'eslint/config';
2
+ import esmBaseConfig from './recommended-esm-base.js';
3
+ import prettierConfig from 'eslint-config-prettier';
4
+ import typescriptEslintConfigs from './typescript-eslint-configs.js';
5
+
6
+ // Create local variable due to vitest v4 coverage changes
7
+ const config = defineConfig([
8
+ esmBaseConfig,
9
+ typescriptEslintConfigs,
10
+ { name: 'prettier (all files)', ...prettierConfig }
11
+ ]);
12
+
13
+ export default config;
package/recommended.js CHANGED
@@ -3,7 +3,7 @@ import { defineConfig } from 'eslint/config';
3
3
  import baseConfigs from './base-configs.js';
4
4
  import eslintCommentsConfig from './eslint-comments-config.js';
5
5
  import jestConfig from './jest-config.js';
6
- import jsdocConfig from './jsdoc-config.js';
6
+ import jsdocConfigs from './jsdoc-configs.js';
7
7
  import nodeConfig from './node-config.js';
8
8
  import playwrightConfig from './playwright-config.js';
9
9
  import prettierConfig from 'eslint-config-prettier';
@@ -14,7 +14,7 @@ import unicornConfigs from './unicorn-configs.js';
14
14
  const config = defineConfig([
15
15
  eslintCommentsConfig,
16
16
  jestConfig,
17
- jsdocConfig,
17
+ jsdocConfigs,
18
18
  nodeConfig,
19
19
  playwrightConfig,
20
20
  promiseConfig,
package/settings.js ADDED
@@ -0,0 +1,31 @@
1
+ const filePatterns = {
2
+ allJs: ['**/*.{js,mjs,cjs}'],
3
+ allTs: ['**/*.{ts,mts,cts}'],
4
+ baseJsTs: ['**/*.{js,ts}'],
5
+ commonJsTs: ['**/*.{cjs,cts}'],
6
+ esmJsTs: ['**/*.{mjs,mts}'],
7
+ playwrightJs: ['**/*.pwtest.{js,mjs,cjs}'],
8
+ playwrightTs: ['**/*.pwtest.{ts,mts,cts}'],
9
+ testAllJs: [
10
+ '**/__tests__/**/*.{js,mjs,cjs}',
11
+ '**/?(*.)+(spec|test).{js,mjs,cjs}'
12
+ ],
13
+ testAllTs: [
14
+ '**/__tests__/**/*.{ts,mts,cts}',
15
+ '**/?(*.)+(spec|test).{ts,mts,cts}'
16
+ ],
17
+ testEsmJs: ['**/__tests__/**/*.{js,mjs}', '**/?(*.)+(spec|test).{js,mjs}'],
18
+ testEsmTs: ['**/__tests__/**/*.{ts,mts}', '**/?(*.)+(spec|test).{ts,mts}']
19
+ };
20
+
21
+ const thresholds = {
22
+ complexityHigh: 15,
23
+ complexityLow: 5,
24
+ maxFunctionLines: 30,
25
+ maxLines: 300,
26
+ maxParameters: 4,
27
+ maxStatements: 50,
28
+ nested: 5
29
+ };
30
+
31
+ export { filePatterns, thresholds };
@@ -0,0 +1,258 @@
1
+ import { filePatterns, thresholds } from './settings.js';
2
+ import { defineConfig } from 'eslint/config';
3
+ import tseslint from 'typescript-eslint';
4
+
5
+ // Rules with unfixable errors on *.{js,mjs,cjs} files
6
+ const typescriptOnlyRules = {
7
+ '@typescript-eslint/explicit-function-return-type': 'error',
8
+ '@typescript-eslint/explicit-member-accessibility': 'error',
9
+ '@typescript-eslint/explicit-module-boundary-types': 'error'
10
+ };
11
+
12
+ const typescriptTypedRules = {
13
+ '@typescript-eslint/await-thenable': 'error',
14
+ '@typescript-eslint/consistent-type-exports': 'error',
15
+ '@typescript-eslint/consistent-type-imports': 'error',
16
+ '@typescript-eslint/no-array-delete': 'error',
17
+ '@typescript-eslint/no-base-to-string': 'error',
18
+ '@typescript-eslint/no-confusing-void-expression': 'error',
19
+ '@typescript-eslint/no-deprecated': 'error',
20
+ '@typescript-eslint/no-duplicate-type-constituents': 'error',
21
+ '@typescript-eslint/no-floating-promises': 'error',
22
+ '@typescript-eslint/no-for-in-array': 'error',
23
+ '@typescript-eslint/no-meaningless-void-operator': 'error',
24
+ '@typescript-eslint/no-misused-promises': 'error',
25
+ '@typescript-eslint/no-misused-spread': 'error',
26
+ '@typescript-eslint/no-mixed-enums': 'error',
27
+ '@typescript-eslint/no-redundant-type-constituents': 'error',
28
+ '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',
29
+ '@typescript-eslint/no-unnecessary-condition': 'error',
30
+ '@typescript-eslint/no-unnecessary-qualifier': 'error',
31
+ '@typescript-eslint/no-unnecessary-template-expression': 'error',
32
+ '@typescript-eslint/no-unnecessary-type-arguments': 'error',
33
+ '@typescript-eslint/no-unnecessary-type-assertion': 'error',
34
+ '@typescript-eslint/no-unnecessary-type-conversion': 'error',
35
+ '@typescript-eslint/no-unnecessary-type-parameters': 'error',
36
+ '@typescript-eslint/no-unsafe-argument': 'error',
37
+ '@typescript-eslint/no-unsafe-assignment': 'error',
38
+ '@typescript-eslint/no-unsafe-call': 'error',
39
+ '@typescript-eslint/no-unsafe-enum-comparison': 'error',
40
+ '@typescript-eslint/no-unsafe-member-access': 'error',
41
+ '@typescript-eslint/no-unsafe-return': 'error',
42
+ '@typescript-eslint/no-unsafe-type-assertion': 'error',
43
+ '@typescript-eslint/no-unsafe-unary-minus': 'error',
44
+ '@typescript-eslint/no-useless-default-assignment': 'error',
45
+ '@typescript-eslint/non-nullable-type-assertion-style': 'error',
46
+ '@typescript-eslint/prefer-find': 'error',
47
+ '@typescript-eslint/prefer-includes': 'error',
48
+ '@typescript-eslint/prefer-nullish-coalescing': 'error',
49
+ '@typescript-eslint/prefer-optional-chain': 'error',
50
+ '@typescript-eslint/prefer-readonly': 'error',
51
+ // Rule is very strict, lots of false positives
52
+ '@typescript-eslint/prefer-readonly-parameter-types': 'off',
53
+ '@typescript-eslint/prefer-reduce-type-parameter': 'error',
54
+ '@typescript-eslint/prefer-regexp-exec': 'error',
55
+ '@typescript-eslint/prefer-return-this-type': 'error',
56
+ '@typescript-eslint/prefer-string-starts-ends-with': 'error',
57
+ '@typescript-eslint/promise-function-async': 'error',
58
+ '@typescript-eslint/related-getter-setter-pairs': 'error',
59
+ '@typescript-eslint/require-array-sort-compare': 'error',
60
+ '@typescript-eslint/restrict-plus-operands': [
61
+ 'error',
62
+ {
63
+ allowAny: false,
64
+ allowBoolean: false,
65
+ allowNullish: false,
66
+ allowNumberAndString: false,
67
+ allowRegExp: false
68
+ }
69
+ ],
70
+ '@typescript-eslint/restrict-template-expressions': [
71
+ 'error',
72
+ {
73
+ allowAny: false,
74
+ allowBoolean: false,
75
+ allowNever: false,
76
+ allowNullish: false,
77
+ allowNumber: false,
78
+ allowRegExp: false
79
+ }
80
+ ],
81
+ '@typescript-eslint/return-await': [
82
+ 'error',
83
+ 'error-handling-correctness-only'
84
+ ],
85
+ '@typescript-eslint/strict-boolean-expressions': 'error',
86
+ '@typescript-eslint/switch-exhaustiveness-check': 'error',
87
+ '@typescript-eslint/unbound-method': 'error',
88
+ '@typescript-eslint/use-unknown-in-catch-callback-variable': 'error'
89
+ };
90
+
91
+ /* eslint-disable sort-keys -- keep rules in pairs*/
92
+ const typescriptRulesExtendBaseRules = {
93
+ 'class-methods-use-this': 'off',
94
+ '@typescript-eslint/class-methods-use-this': 'error',
95
+ // Disabled in favor of noImplicitReturns in tsconfig.json
96
+ 'consistent-return': 'off',
97
+ '@typescript-eslint/consistent-return': 'off', // Typed rule
98
+ 'default-param-last': 'off',
99
+ '@typescript-eslint/default-param-last': 'error',
100
+ 'dot-notation': 'off',
101
+ '@typescript-eslint/dot-notation': [
102
+ 'error',
103
+ { allowPattern: '^[a-z]+(_[a-z]+)+$' }
104
+ ], // Typed rule
105
+ 'max-params': 'off',
106
+ '@typescript-eslint/max-params': [
107
+ 'error',
108
+ { max: thresholds.maxParameters }
109
+ ],
110
+ camelcase: 'off',
111
+ '@typescript-eslint/naming-convention': [
112
+ 'error',
113
+ {
114
+ format: ['camelCase'],
115
+ leadingUnderscore: 'forbid',
116
+ selector: 'default',
117
+ trailingUnderscore: 'forbid'
118
+ },
119
+ {
120
+ format: ['camelCase', 'PascalCase'],
121
+ selector: 'import'
122
+ },
123
+ {
124
+ format: ['camelCase', 'UPPER_CASE'],
125
+ selector: 'variable'
126
+ },
127
+ {
128
+ format: ['PascalCase'],
129
+ selector: 'typeLike'
130
+ }
131
+ ], // Typed rule
132
+ 'no-array-constructor': 'off',
133
+ '@typescript-eslint/no-array-constructor': 'error',
134
+ 'no-dupe-class-members': 'off',
135
+ '@typescript-eslint/no-dupe-class-members': 'error',
136
+ 'no-empty-function': 'off',
137
+ '@typescript-eslint/no-empty-function': 'error',
138
+ 'no-implied-eval': 'off',
139
+ '@typescript-eslint/no-implied-eval': 'error', // Typed rule
140
+ 'no-loop-func': 'off',
141
+ '@typescript-eslint/no-loop-func': 'error',
142
+ 'no-magic-numbers': 'off',
143
+ '@typescript-eslint/no-magic-numbers': ['error', { ignore: [-1, 0, 1] }], // Typed rule
144
+ 'no-shadow': 'off',
145
+ '@typescript-eslint/no-shadow': 'error',
146
+ 'no-throw-literal': 'off',
147
+ '@typescript-eslint/only-throw-error': 'error', // Typed rule
148
+ 'no-unused-expressions': 'off',
149
+ '@typescript-eslint/no-unused-expressions': [
150
+ 'error',
151
+ { allowShortCircuit: true, allowTernary: true }
152
+ ],
153
+ 'no-unused-private-class-members': 'off',
154
+ '@typescript-eslint/no-unused-private-class-members': 'error',
155
+ 'no-unused-vars': 'off',
156
+ '@typescript-eslint/no-unused-vars': ['error', { args: 'all' }],
157
+ 'no-use-before-define': 'off',
158
+ '@typescript-eslint/no-use-before-define': ['error', { functions: false }],
159
+ 'no-useless-constructor': 'off',
160
+ '@typescript-eslint/no-useless-constructor': 'error',
161
+ 'prefer-destructuring': 'off',
162
+ '@typescript-eslint/prefer-destructuring': [
163
+ 'error',
164
+ { array: true, object: true }
165
+ ], // Typed rule
166
+ 'prefer-promise-reject-errors': 'off',
167
+ '@typescript-eslint/prefer-promise-reject-errors': 'error', // Typed rule
168
+ 'require-await': 'off',
169
+ '@typescript-eslint/require-await': 'error' // Typed rule
170
+ };
171
+ /* eslint-enable sort-keys -- keep rules in pairs*/
172
+
173
+ const typescriptUntypedRules = {
174
+ '@typescript-eslint/adjacent-overload-signatures': 'error',
175
+ '@typescript-eslint/array-type': ['error', { default: 'array-simple' }],
176
+ '@typescript-eslint/ban-ts-comment': 'error',
177
+ '@typescript-eslint/ban-tslint-comment': 'error',
178
+ '@typescript-eslint/class-literal-property-style': 'error',
179
+ '@typescript-eslint/consistent-generic-constructors': 'error',
180
+ '@typescript-eslint/consistent-indexed-object-style': ['error', 'record'],
181
+ '@typescript-eslint/consistent-type-assertions': 'error',
182
+ '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
183
+ '@typescript-eslint/init-declarations': 'off',
184
+ '@typescript-eslint/member-ordering': 'error',
185
+ '@typescript-eslint/method-signature-style': ['error', 'method'],
186
+ '@typescript-eslint/no-confusing-non-null-assertion': 'error',
187
+ '@typescript-eslint/no-duplicate-enum-values': 'error',
188
+ '@typescript-eslint/no-dynamic-delete': 'error',
189
+ '@typescript-eslint/no-empty-object-type': 'error',
190
+ '@typescript-eslint/no-explicit-any': 'error',
191
+ '@typescript-eslint/no-extra-non-null-assertion': 'error',
192
+ '@typescript-eslint/no-extraneous-class': 'error',
193
+ '@typescript-eslint/no-import-type-side-effects': 'error',
194
+ '@typescript-eslint/no-inferrable-types': 'off',
195
+ '@typescript-eslint/no-invalid-this': 'off',
196
+ '@typescript-eslint/no-invalid-void-type': 'error',
197
+ '@typescript-eslint/no-misused-new': 'error',
198
+ '@typescript-eslint/no-namespace': 'error',
199
+ '@typescript-eslint/no-non-null-asserted-nullish-coalescing': 'error',
200
+ '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
201
+ '@typescript-eslint/no-non-null-assertion': 'error',
202
+ '@typescript-eslint/no-redeclare': 'off',
203
+ '@typescript-eslint/no-require-imports': 'error', // ESM-only
204
+ '@typescript-eslint/no-restricted-imports': 'off',
205
+ '@typescript-eslint/no-restricted-types': 'off',
206
+ '@typescript-eslint/no-this-alias': 'error',
207
+ '@typescript-eslint/no-unnecessary-parameter-property-assignment': 'error',
208
+ '@typescript-eslint/no-unnecessary-type-constraint': 'error',
209
+ '@typescript-eslint/no-unsafe-declaration-merging': 'error',
210
+ '@typescript-eslint/no-unsafe-function-type': 'error',
211
+ '@typescript-eslint/no-useless-empty-export': 'error',
212
+ '@typescript-eslint/no-wrapper-object-types': 'error',
213
+ '@typescript-eslint/parameter-properties': 'error',
214
+ '@typescript-eslint/prefer-as-const': 'error',
215
+ '@typescript-eslint/prefer-enum-initializers': 'error',
216
+ '@typescript-eslint/prefer-for-of': 'error',
217
+ '@typescript-eslint/prefer-function-type': 'error',
218
+ '@typescript-eslint/prefer-literal-enum-member': 'error',
219
+ '@typescript-eslint/prefer-namespace-keyword': 'error',
220
+ '@typescript-eslint/triple-slash-reference': 'error',
221
+ '@typescript-eslint/unified-signatures': 'error'
222
+ };
223
+
224
+ export default defineConfig([
225
+ {
226
+ files: [...filePatterns.allTs],
227
+ languageOptions: {
228
+ parser: tseslint.parser,
229
+ parserOptions: {
230
+ projectService: true
231
+ }
232
+ },
233
+ name: 'typescript-eslint parser and TS-specific rules',
234
+ rules: {
235
+ ...typescriptOnlyRules,
236
+ ...typescriptTypedRules,
237
+ ...typescriptRulesExtendBaseRules
238
+ }
239
+ },
240
+ {
241
+ files: [...filePatterns.allJs, ...filePatterns.allTs],
242
+ name: 'typescript-eslint untyped rules (js/ts)',
243
+ // Set the plugin here so applicable to all TS and JS files.
244
+ plugins: {
245
+ '@typescript-eslint': tseslint.plugin
246
+ },
247
+ rules: {
248
+ ...typescriptUntypedRules
249
+ }
250
+ },
251
+ {
252
+ files: [...filePatterns.commonJsTs],
253
+ name: 'typescript-eslint untyped cjs rules (cjs/cts)',
254
+ rules: {
255
+ '@typescript-eslint/no-require-imports': 'off'
256
+ }
257
+ }
258
+ ]);
@@ -1,10 +1,11 @@
1
1
  import { defineConfig } from 'eslint/config';
2
+ import { filePatterns } from './settings.js';
2
3
  import unicornPlugin from 'eslint-plugin-unicorn';
3
4
 
4
5
  // Create local variable due to vitest v4 coverage changes
5
6
  const config = defineConfig([
6
7
  {
7
- files: ['**/*.{js,mjs,cjs}'],
8
+ files: [...filePatterns.allJs, ...filePatterns.allTs],
8
9
  name: 'unicorn (all files)',
9
10
  plugins: { unicorn: unicornPlugin },
10
11
  rules: {
@@ -164,10 +165,11 @@ const config = defineConfig([
164
165
  {
165
166
  files: [
166
167
  // Patterns for jest-config, vitest-config
167
- '**/__tests__/**/*.{js,mjs,cjs}',
168
- '**/?(*.)+(spec|test).{js,mjs,cjs}',
168
+ ...filePatterns.testAllJs,
169
+ ...filePatterns.testAllTs,
169
170
  // Pattern for playwright-config
170
- '**/*.pwtest.{js,mjs,cjs}'
171
+ ...filePatterns.playwrightJs,
172
+ ...filePatterns.playwrightTs
171
173
  ],
172
174
  name: 'unicorn (test files)',
173
175
  rules: {
@@ -177,8 +179,8 @@ const config = defineConfig([
177
179
  }
178
180
  },
179
181
  {
180
- files: ['**/*.mjs'],
181
- name: 'esm (mjs files)',
182
+ files: [...filePatterns.esmJsTs],
183
+ name: 'esm (mjs/mts files)',
182
184
  rules: {
183
185
  'unicorn/prefer-module': 'error',
184
186
  'unicorn/prefer-top-level-await': 'error'
package/vitest-config.js CHANGED
@@ -1,17 +1,27 @@
1
1
  import { defineConfig } from 'eslint/config';
2
+ import { filePatterns } from './settings.js';
2
3
  import vitestPlugin from '@vitest/eslint-plugin';
3
4
 
4
5
  // Create local variable due to vitest v4 coverage changes
5
6
  const config = defineConfig({
6
- files: ['**/__tests__/**/*.{js,mjs}', '**/?(*.)+(spec|test).{js,mjs}'],
7
+ files: [...filePatterns.testEsmJs, ...filePatterns.testEsmTs],
7
8
  name: 'vitest (test files)',
8
9
  plugins: { vitest: vitestPlugin },
9
10
  rules: {
11
+ 'vitest/consistent-each-for': [
12
+ 'error',
13
+ {
14
+ describe: 'each',
15
+ it: 'each',
16
+ suite: 'each',
17
+ test: 'each'
18
+ }
19
+ ],
10
20
  'vitest/consistent-test-filename': [
11
21
  'error',
12
22
  {
13
- allTestPattern: String.raw`.*\.test\.(js|mjs)$`,
14
- pattern: String.raw`.*\.test\.(js|mjs)$`
23
+ allTestPattern: String.raw`.*\.test\.(js|mjs|ts|mts)$`,
24
+ pattern: String.raw`.*\.test\.(js|mjs|ts|mts)$`
15
25
  }
16
26
  ],
17
27
  'vitest/consistent-test-it': [
@@ -65,6 +75,7 @@ const config = defineConfig({
65
75
  'vitest/prefer-importing-vitest-globals': 'error',
66
76
  'vitest/prefer-lowercase-title': 'error',
67
77
  'vitest/prefer-mock-promise-shorthand': 'error',
78
+ 'vitest/prefer-mock-return-shorthand': 'error',
68
79
  'vitest/prefer-snapshot-hint': 'error',
69
80
  'vitest/prefer-spy-on': 'error',
70
81
  'vitest/prefer-strict-equal': 'error',
@@ -73,6 +84,7 @@ const config = defineConfig({
73
84
  'vitest/prefer-to-be-object': 'error',
74
85
  'vitest/prefer-to-be-truthy': 'off',
75
86
  'vitest/prefer-to-contain': 'error',
87
+ 'vitest/prefer-to-have-been-called-times': 'error',
76
88
  'vitest/prefer-to-have-length': 'error',
77
89
  'vitest/prefer-todo': 'error',
78
90
  'vitest/prefer-vi-mocked': 'error',