@mikey-pro/eslint-config 9.0.8 → 10.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/overrides.js CHANGED
@@ -5,12 +5,14 @@ import html from '@html-eslint/eslint-plugin';
5
5
  import htmlParser from '@html-eslint/parser';
6
6
  import tsPlugin from '@typescript-eslint/eslint-plugin';
7
7
  import tsParser from '@typescript-eslint/parser';
8
+ import markdown from '@eslint/markdown';
8
9
  import cypress from 'eslint-plugin-cypress';
9
- import importPlugin from 'eslint-plugin-import';
10
+ import importX from 'eslint-plugin-import-x';
10
11
  import jest from 'eslint-plugin-jest';
11
- import prettier from 'eslint-plugin-prettier';
12
- import shell, { parserPlain } from 'eslint-plugin-shell';
13
- import yml from 'eslint-plugin-yml';
12
+ import jestDom from 'eslint-plugin-jest-dom';
13
+ import jsoncPlugin from 'eslint-plugin-jsonc';
14
+ import testingLibrary from 'eslint-plugin-testing-library';
15
+ import tomlPlugin from 'eslint-plugin-toml';
14
16
  import jsoncParser from 'jsonc-eslint-parser';
15
17
  import tomlParser from 'toml-eslint-parser';
16
18
  import yamlParser from 'yaml-eslint-parser';
@@ -31,15 +33,11 @@ export const ts = {
31
33
  },
32
34
  sourceType: 'module',
33
35
  },
34
- plugins: {
35
- '@typescript-eslint': tsPlugin,
36
- import: importPlugin,
37
- },
38
36
  rules: {
39
37
  // TypeScript-specific rules
40
38
  ...tsPlugin.configs.all.rules,
41
39
  ...tsPlugin.configs['recommended-requiring-type-checking'].rules,
42
- ...importPlugin.configs.typescript.rules,
40
+ ...importX.flatConfigs.typescript.rules,
43
41
 
44
42
  // Override some rules for better developer experience
45
43
  '@typescript-eslint/class-methods-use-this': 'off',
@@ -208,10 +206,10 @@ export const ts = {
208
206
  '@typescript-eslint/use-unknown-in-catch-callback-variable': 'off',
209
207
  },
210
208
  settings: {
211
- 'import/parsers': {
209
+ 'import-x/parsers': {
212
210
  '@typescript-eslint/parser': ['.ts', '.tsx', '.d.ts'],
213
211
  },
214
- 'import/resolver': {
212
+ 'import-x/resolver': {
215
213
  typescript: { alwaysTryTypes: true },
216
214
  },
217
215
  },
@@ -247,11 +245,25 @@ export const yaml = {
247
245
  languageOptions: {
248
246
  parser: yamlParser,
249
247
  },
250
- plugins: {
251
- yml: yml,
252
- },
253
248
  rules: {
249
+ 'yml/block-mapping': 'error',
250
+ 'yml/block-mapping-question-indicator-newline': 'error',
251
+ 'yml/block-sequence': 'error',
252
+ 'yml/block-sequence-hyphen-indicator-newline': 'error',
253
+ 'yml/flow-mapping-curly-newline': 'error',
254
+ 'yml/flow-mapping-curly-spacing': 'error',
255
+ 'yml/flow-sequence-bracket-newline': 'error',
256
+ 'yml/flow-sequence-bracket-spacing': 'error',
257
+ 'yml/indent': ['error', 2],
258
+ 'yml/key-spacing': 'error',
259
+ 'yml/no-empty-document': 'error',
260
+ 'yml/no-empty-key': 'error',
261
+ 'yml/no-empty-mapping-value': 'error',
262
+ 'yml/no-empty-sequence-entry': 'error',
263
+ 'yml/no-irregular-whitespace': 'error',
264
+ 'yml/no-tab-indent': 'error',
254
265
  'yml/quotes': ['warn', { avoidEscape: true, prefer: 'double' }],
266
+ 'yml/require-string-key': 'error',
255
267
  },
256
268
  };
257
269
 
@@ -262,20 +274,40 @@ export const toml = {
262
274
  parser: tomlParser,
263
275
  },
264
276
  rules: {
277
+ ...tomlPlugin.configs['flat/recommended'].reduce(
278
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
279
+ {},
280
+ ),
265
281
  'prettier/prettier': 'off',
266
282
  },
267
283
  };
268
284
 
269
- // Markdown files - currently disabled due to processor configuration issues
285
+ // Markdown files uses @eslint/markdown language plugin
270
286
  export const md = {
271
287
  files: ['**/*.md'],
272
- // TODO: Implement proper markdown linting with @eslint/markdown
288
+ language: 'markdown/commonmark',
289
+ rules: {
290
+ 'markdown/fenced-code-language': 'error',
291
+ 'markdown/heading-increment': 'error',
292
+ 'markdown/no-duplicate-headings': 'error',
293
+ 'markdown/no-empty-links': 'error',
294
+ 'markdown/no-html': 'off',
295
+ 'markdown/no-invalid-label-refs': 'error',
296
+ 'markdown/no-missing-label-refs': 'error',
297
+ },
273
298
  };
274
299
 
275
300
  // Package.json files
276
301
  export const packageJson = {
277
302
  files: ['**/package.json'],
303
+ languageOptions: {
304
+ parser: jsoncParser,
305
+ },
278
306
  rules: {
307
+ ...jsoncPlugin.configs['flat/recommended-with-json'].reduce(
308
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
309
+ {},
310
+ ),
279
311
  'prettier/prettier': ['warn', { parser: 'json' }],
280
312
  },
281
313
  settings: {
@@ -316,11 +348,8 @@ export const htmlConfig = {
316
348
  languageOptions: {
317
349
  parser: htmlParser,
318
350
  },
319
- plugins: {
320
- '@html-eslint': html,
321
- },
322
351
  rules: {
323
- ...html.configs.recommended.rules,
352
+ ...html.configs['flat/recommended'].rules,
324
353
  '@html-eslint/element-newline': 'off',
325
354
  '@html-eslint/indent': 'off',
326
355
  '@html-eslint/no-extra-spacing-attrs': 'off',
@@ -333,11 +362,21 @@ export const htmlConfig = {
333
362
 
334
363
  // JSONC files
335
364
  export const jsonc = {
336
- files: ['**/*.jsonc', '**/*rc'],
365
+ files: [
366
+ '**/*.jsonc',
367
+ '**/.babelrc',
368
+ '**/.eslintrc',
369
+ '**/.prettierrc',
370
+ '**/.stylelintrc',
371
+ ],
337
372
  languageOptions: {
338
373
  parser: jsoncParser,
339
374
  },
340
375
  rules: {
376
+ ...jsoncPlugin.configs['flat/recommended-with-jsonc'].reduce(
377
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
378
+ {},
379
+ ),
341
380
  'prettier/prettier': ['warn', { parser: 'json' }],
342
381
  },
343
382
  };
@@ -349,6 +388,10 @@ export const json5 = {
349
388
  parser: jsoncParser,
350
389
  },
351
390
  rules: {
391
+ ...jsoncPlugin.configs['flat/recommended-with-json5'].reduce(
392
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
393
+ {},
394
+ ),
352
395
  'prettier/prettier': ['warn', { parser: 'json5' }],
353
396
  },
354
397
  };
@@ -359,14 +402,42 @@ export const jestJs = {
359
402
  languageOptions: {
360
403
  globals: { jest: true },
361
404
  },
362
- plugins: {
363
- jest,
364
- },
365
405
  rules: {
366
- ...jest.configs.all.rules,
406
+ ...jest.configs['flat/all'].rules,
407
+ // Jest DOM rules for testing-library assertions
408
+ 'jest-dom/prefer-checked': 'error',
409
+ 'jest-dom/prefer-enabled-disabled': 'error',
410
+ 'jest-dom/prefer-focus': 'error',
411
+ 'jest-dom/prefer-in-document': 'error',
412
+ 'jest-dom/prefer-required': 'error',
413
+ 'jest-dom/prefer-to-have-attribute': 'error',
414
+ 'jest-dom/prefer-to-have-class': 'error',
415
+ 'jest-dom/prefer-to-have-style': 'error',
416
+ 'jest-dom/prefer-to-have-text-content': 'error',
417
+ 'jest-dom/prefer-to-have-value': 'error',
418
+ // Testing Library rules
419
+ 'testing-library/await-async-queries': 'error',
420
+ 'testing-library/await-async-utils': 'error',
421
+ 'testing-library/no-await-sync-queries': 'error',
422
+ 'testing-library/no-debugging-utils': 'warn',
423
+ 'testing-library/no-dom-import': 'error',
424
+ 'testing-library/no-manual-cleanup': 'error',
425
+ 'testing-library/no-render-in-lifecycle': 'error',
426
+ 'testing-library/no-unnecessary-act': 'error',
427
+ 'testing-library/no-wait-for-multiple-assertions': 'error',
428
+ 'testing-library/prefer-explicit-assert': 'warn',
429
+ 'testing-library/prefer-find-by': 'error',
430
+ 'testing-library/prefer-presence-queries': 'error',
431
+ 'testing-library/prefer-query-by-disappearance': 'error',
432
+ 'testing-library/prefer-screen-queries': 'error',
433
+ 'testing-library/render-result-naming-convention': 'error',
434
+ // Disable rules requiring TypeScript type checking (not available in JS files)
435
+ 'jest/no-error-equal': 'off',
436
+ 'jest/no-unnecessary-assertion': 'off',
437
+ 'jest/unbound-method': 'off',
438
+ 'jest/valid-expect-with-promise': 'off',
367
439
  'jest/prefer-spy-on': 'warn',
368
440
  'jest/require-top-level-describe': 'error',
369
- 'jest/unbound-method': 'off',
370
441
  'unicorn/no-array-callback-reference': 'off',
371
442
  'unicorn/prevent-abbreviations': ['warn', { ignore: [/e2e/] }],
372
443
  },
@@ -379,12 +450,35 @@ export const jestTs = {
379
450
  globals: { jest: true },
380
451
  parser: tsParser,
381
452
  },
382
- plugins: {
383
- '@typescript-eslint': tsPlugin,
384
- jest,
385
- },
386
453
  rules: {
387
- ...jest.configs.all.rules,
454
+ ...jest.configs['flat/all'].rules,
455
+ // Jest DOM rules for testing-library assertions
456
+ 'jest-dom/prefer-checked': 'error',
457
+ 'jest-dom/prefer-enabled-disabled': 'error',
458
+ 'jest-dom/prefer-focus': 'error',
459
+ 'jest-dom/prefer-in-document': 'error',
460
+ 'jest-dom/prefer-required': 'error',
461
+ 'jest-dom/prefer-to-have-attribute': 'error',
462
+ 'jest-dom/prefer-to-have-class': 'error',
463
+ 'jest-dom/prefer-to-have-style': 'error',
464
+ 'jest-dom/prefer-to-have-text-content': 'error',
465
+ 'jest-dom/prefer-to-have-value': 'error',
466
+ // Testing Library rules
467
+ 'testing-library/await-async-queries': 'error',
468
+ 'testing-library/await-async-utils': 'error',
469
+ 'testing-library/no-await-sync-queries': 'error',
470
+ 'testing-library/no-debugging-utils': 'warn',
471
+ 'testing-library/no-dom-import': 'error',
472
+ 'testing-library/no-manual-cleanup': 'error',
473
+ 'testing-library/no-render-in-lifecycle': 'error',
474
+ 'testing-library/no-unnecessary-act': 'error',
475
+ 'testing-library/no-wait-for-multiple-assertions': 'error',
476
+ 'testing-library/prefer-explicit-assert': 'warn',
477
+ 'testing-library/prefer-find-by': 'error',
478
+ 'testing-library/prefer-presence-queries': 'error',
479
+ 'testing-library/prefer-query-by-disappearance': 'error',
480
+ 'testing-library/prefer-screen-queries': 'error',
481
+ 'testing-library/render-result-naming-convention': 'error',
388
482
  'jest/prefer-spy-on': 'warn',
389
483
  'jest/require-top-level-describe': 'error',
390
484
  'jest/unbound-method': 'off',
@@ -396,47 +490,11 @@ export const jestTs = {
396
490
  // Cypress files
397
491
  export const cypressConfig = {
398
492
  files: ['**/*.cy.*'],
399
- plugins: {
400
- cypress,
401
- },
402
493
  rules: {
403
494
  ...cypress.configs.recommended.rules,
404
495
  },
405
496
  };
406
497
 
407
- // Shell scripts (bash, sh, zsh)
408
- export const shellConfig = {
409
- files: ['**/*.sh', '**/*.bash', '**/*.zsh'],
410
- languageOptions: {
411
- parser: parserPlain,
412
- },
413
- plugins: {
414
- shell,
415
- },
416
- rules: {
417
- // Basic shell script linting rules
418
- // Note: Full shell script linting may require shellcheck (external tool)
419
- 'shell/shell': 'warn',
420
- },
421
- };
422
-
423
- // .env files
424
- export const envFilesConfig = {
425
- files: ['**/.env', '**/.env.*', '**/*.env'],
426
- languageOptions: {
427
- parser: parserPlain,
428
- },
429
- plugins: {
430
- shell,
431
- },
432
- rules: {
433
- // Relax JavaScript-specific variable rules for .env files
434
- // Note: .env formatting and validation should be handled by external tools
435
- 'no-undef': 'off',
436
- 'no-unused-vars': 'off',
437
- },
438
- };
439
-
440
498
  // Export all overrides
441
499
  export const baseOverrides = [
442
500
  ts,
@@ -453,6 +511,4 @@ export const baseOverrides = [
453
511
  jestJs,
454
512
  jestTs,
455
513
  cypressConfig,
456
- shellConfig,
457
- envFilesConfig,
458
514
  ];
package/package.json CHANGED
@@ -1,56 +1,43 @@
1
1
  {
2
2
  "name": "@mikey-pro/eslint-config",
3
- "version": "9.0.8",
3
+ "version": "10.0.0",
4
4
  "description": "Mikey Pro ESLint configuration - Ultimate coding style guide for excellence",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "sideEffects": false,
8
8
  "dependencies": {
9
- "@babel/core": "^7.28.4",
10
- "@babel/eslint-parser": "^7.28.4",
11
- "@babel/eslint-plugin": "^7.27.1",
12
- "@babel/preset-env": "^7.28.3",
13
- "@cypress/eslint-plugin-json": "^3.2.3",
14
- "@eslint/js": "^9.35.0",
9
+ "@eslint/js": "^10.0.0",
10
+ "@eslint/markdown": "^7.5.1",
15
11
  "@html-eslint/eslint-plugin": "^0.46.2",
16
12
  "@html-eslint/parser": "^0.46.2",
17
- "@stylistic/eslint-plugin": "^5.3.1",
18
- "@typescript-eslint/eslint-plugin": "^8.43.0",
19
- "@typescript-eslint/parser": "^8.43.0",
20
- "eslint": "^9.35.0",
21
- "eslint-config-prettier": "^10.1.8",
22
- "eslint-import-resolver-typescript": "^4.4.4",
23
- "eslint-plugin-boundaries": "^5.0.1",
24
- "eslint-plugin-compat": "^6.0.2",
25
- "eslint-plugin-css-modules": "^2.12.0",
26
- "eslint-plugin-cypress": "^5.1.1",
27
- "eslint-plugin-filenames": "^1.3.2",
28
- "@eslint/markdown": "^6.1.0",
13
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
14
+ "@typescript-eslint/parser": "^8.56.0",
15
+ "eslint": "^10.0.0",
16
+ "eslint-plugin-boundaries": "^5.4.0",
17
+ "eslint-plugin-compat": "^7.0.0",
18
+ "eslint-plugin-cypress": "^6.1.0",
19
+ "eslint-plugin-import-x": "^4.16.1",
20
+ "eslint-plugin-jest": "^29.12.1",
29
21
  "eslint-plugin-jest-dom": "^5.5.0",
30
22
  "eslint-plugin-jsonc": "^2.20.1",
31
- "eslint-plugin-markdownlint": "^0.9.0",
32
- "eslint-plugin-n": "^17.21.3",
23
+ "eslint-plugin-n": "^17.23.1",
33
24
  "eslint-plugin-no-only-tests": "^3.3.0",
34
- "eslint-plugin-no-secrets": "^2.2.1",
35
- "eslint-plugin-only-warn": "^1.1.0",
36
- "eslint-plugin-optimize-regex": "^1.2.1",
25
+ "eslint-plugin-no-secrets": "^2.3.3",
37
26
  "eslint-plugin-perfectionist": "^4.15.0",
38
- "eslint-plugin-prettier": "^5.5.4",
27
+ "eslint-plugin-prettier": "^5.5.5",
39
28
  "eslint-plugin-promise": "^7.2.1",
40
29
  "eslint-plugin-regexp": "^2.10.0",
41
- "eslint-plugin-security": "^3.0.1",
42
- "eslint-plugin-shell": "^0.0.1",
30
+ "eslint-plugin-security": "^4.0.0",
43
31
  "eslint-plugin-simple-import-sort": "^12.1.1",
44
32
  "eslint-plugin-sonarjs": "^3.0.5",
45
- "eslint-plugin-sort-destructure-keys": "^2.0.0",
33
+ "eslint-plugin-sort-destructure-keys": "^3.0.0",
46
34
  "eslint-plugin-testing-library": "^7.6.8",
47
35
  "eslint-plugin-toml": "^0.12.0",
48
- "eslint-plugin-unicorn": "^61.0.2",
49
- "eslint-plugin-write-good-comments": "^0.2.0",
36
+ "eslint-plugin-unicorn": "^62.0.0",
50
37
  "eslint-plugin-yml": "^1.18.0",
51
38
  "globals": "^16.4.0",
52
- "postcss": "^8.5.6",
53
- "postcss-scss": "^4.0.9",
39
+ "jsonc-eslint-parser": "^2.4.0",
40
+ "toml-eslint-parser": "^0.10.0",
54
41
  "yaml-eslint-parser": "^1.3.0"
55
42
  },
56
43
  "peerDependenciesMeta": {
@@ -59,19 +46,12 @@
59
46
  },
60
47
  "@typescript-eslint/parser": {
61
48
  "optional": true
62
- },
63
- "eslint-plugin-import": {
64
- "optional": false
65
- },
66
- "eslint-plugin-n": {
67
- "optional": false
68
49
  }
69
50
  },
70
51
  "files": [
71
52
  "index.js",
72
53
  "base-config.js",
73
54
  "flat.js",
74
- "rules.js",
75
55
  "overrides.js",
76
56
  "README.md",
77
57
  "LICENSE",
@@ -99,7 +79,7 @@
99
79
  "style-guide",
100
80
  "style",
101
81
  "guide",
102
- "eslint-9",
82
+ "eslint-10",
103
83
  "flat-config",
104
84
  "typescript",
105
85
  "react",
@@ -108,17 +88,15 @@
108
88
  "angular"
109
89
  ],
110
90
  "author": "Mikl Wolfe <wolfe@mikl.io> (https://mikl.io)",
111
- "browserslist": [
112
- "defaults"
113
- ],
91
+ "browserslist": ["defaults"],
114
92
  "type": "module",
115
93
  "engines": {
116
- "node": ">=20.0.0",
94
+ "node": ">=20.19.0",
117
95
  "npm": ">=9.0.0",
118
96
  "pnpm": ">=8.0.0",
119
97
  "yarn": ">=4.0.0"
120
98
  },
121
- "_comment": "Priority: Latest Node (25+) for latest features. Minimum: Node 20. Older versions tested but may break.",
99
+ "_comment": "Priority: Latest Node (25+) for latest features. Minimum: Node 20.19.0. Older versions tested but may break.",
122
100
  "exports": {
123
101
  ".": {
124
102
  "import": "./index.js",
@@ -128,10 +106,6 @@
128
106
  "import": "./flat.js",
129
107
  "require": "./flat.js"
130
108
  },
131
- "./rules": {
132
- "import": "./rules.js",
133
- "require": "./rules.js"
134
- },
135
109
  "./overrides": {
136
110
  "import": "./overrides.js",
137
111
  "require": "./overrides.js"