@mikey-pro/eslint-config 9.0.8 → 10.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/overrides.js CHANGED
@@ -1,22 +1,20 @@
1
1
  // Modern overrides for different file types and frameworks
2
- import path from 'node:path';
3
-
4
2
  import html from '@html-eslint/eslint-plugin';
5
3
  import htmlParser from '@html-eslint/parser';
6
4
  import tsPlugin from '@typescript-eslint/eslint-plugin';
7
5
  import tsParser from '@typescript-eslint/parser';
6
+ import markdown from '@eslint/markdown';
8
7
  import cypress from 'eslint-plugin-cypress';
9
- import importPlugin from 'eslint-plugin-import';
8
+ import importX from 'eslint-plugin-import-x';
10
9
  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';
10
+ import jestDom from 'eslint-plugin-jest-dom';
11
+ import jsoncPlugin from 'eslint-plugin-jsonc';
12
+ import testingLibrary from 'eslint-plugin-testing-library';
13
+ import tomlPlugin from 'eslint-plugin-toml';
14
14
  import jsoncParser from 'jsonc-eslint-parser';
15
15
  import tomlParser from 'toml-eslint-parser';
16
16
  import yamlParser from 'yaml-eslint-parser';
17
17
 
18
- const currentDirectory = import.meta.dirname;
19
-
20
18
  // TypeScript configuration
21
19
  export const ts = {
22
20
  files: ['**/*.ts', '**/*.tsx'],
@@ -26,20 +24,16 @@ export const ts = {
26
24
  parserOptions: {
27
25
  ecmaFeatures: { jsx: true },
28
26
  extraFileExtensions: ['.vue', '.svelte'],
29
- project: path.join(currentDirectory, '../../tsconfig.json'),
30
- tsconfigRootDir: path.join(currentDirectory, '../..'),
27
+ project: true,
28
+ tsconfigRootDir: process.cwd(),
31
29
  },
32
30
  sourceType: 'module',
33
31
  },
34
- plugins: {
35
- '@typescript-eslint': tsPlugin,
36
- import: importPlugin,
37
- },
38
32
  rules: {
39
33
  // TypeScript-specific rules
40
34
  ...tsPlugin.configs.all.rules,
41
35
  ...tsPlugin.configs['recommended-requiring-type-checking'].rules,
42
- ...importPlugin.configs.typescript.rules,
36
+ ...importX.flatConfigs.typescript.rules,
43
37
 
44
38
  // Override some rules for better developer experience
45
39
  '@typescript-eslint/class-methods-use-this': 'off',
@@ -208,10 +202,10 @@ export const ts = {
208
202
  '@typescript-eslint/use-unknown-in-catch-callback-variable': 'off',
209
203
  },
210
204
  settings: {
211
- 'import/parsers': {
205
+ 'import-x/parsers': {
212
206
  '@typescript-eslint/parser': ['.ts', '.tsx', '.d.ts'],
213
207
  },
214
- 'import/resolver': {
208
+ 'import-x/resolver': {
215
209
  typescript: { alwaysTryTypes: true },
216
210
  },
217
211
  },
@@ -247,11 +241,25 @@ export const yaml = {
247
241
  languageOptions: {
248
242
  parser: yamlParser,
249
243
  },
250
- plugins: {
251
- yml: yml,
252
- },
253
244
  rules: {
245
+ 'yml/block-mapping': 'error',
246
+ 'yml/block-mapping-question-indicator-newline': 'error',
247
+ 'yml/block-sequence': 'error',
248
+ 'yml/block-sequence-hyphen-indicator-newline': 'error',
249
+ 'yml/flow-mapping-curly-newline': 'error',
250
+ 'yml/flow-mapping-curly-spacing': 'error',
251
+ 'yml/flow-sequence-bracket-newline': 'error',
252
+ 'yml/flow-sequence-bracket-spacing': 'error',
253
+ 'yml/indent': ['error', 2],
254
+ 'yml/key-spacing': 'error',
255
+ 'yml/no-empty-document': 'error',
256
+ 'yml/no-empty-key': 'error',
257
+ 'yml/no-empty-mapping-value': 'error',
258
+ 'yml/no-empty-sequence-entry': 'error',
259
+ 'yml/no-irregular-whitespace': 'error',
260
+ 'yml/no-tab-indent': 'error',
254
261
  'yml/quotes': ['warn', { avoidEscape: true, prefer: 'double' }],
262
+ 'yml/require-string-key': 'error',
255
263
  },
256
264
  };
257
265
 
@@ -262,20 +270,40 @@ export const toml = {
262
270
  parser: tomlParser,
263
271
  },
264
272
  rules: {
273
+ ...tomlPlugin.configs['flat/recommended'].reduce(
274
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
275
+ {},
276
+ ),
265
277
  'prettier/prettier': 'off',
266
278
  },
267
279
  };
268
280
 
269
- // Markdown files - currently disabled due to processor configuration issues
281
+ // Markdown files uses @eslint/markdown language plugin
270
282
  export const md = {
271
283
  files: ['**/*.md'],
272
- // TODO: Implement proper markdown linting with @eslint/markdown
284
+ language: 'markdown/commonmark',
285
+ rules: {
286
+ 'markdown/fenced-code-language': 'error',
287
+ 'markdown/heading-increment': 'error',
288
+ 'markdown/no-duplicate-headings': 'error',
289
+ 'markdown/no-empty-links': 'error',
290
+ 'markdown/no-html': 'off',
291
+ 'markdown/no-invalid-label-refs': 'error',
292
+ 'markdown/no-missing-label-refs': 'error',
293
+ },
273
294
  };
274
295
 
275
296
  // Package.json files
276
297
  export const packageJson = {
277
298
  files: ['**/package.json'],
299
+ languageOptions: {
300
+ parser: jsoncParser,
301
+ },
278
302
  rules: {
303
+ ...jsoncPlugin.configs['flat/recommended-with-json'].reduce(
304
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
305
+ {},
306
+ ),
279
307
  'prettier/prettier': ['warn', { parser: 'json' }],
280
308
  },
281
309
  settings: {
@@ -316,11 +344,8 @@ export const htmlConfig = {
316
344
  languageOptions: {
317
345
  parser: htmlParser,
318
346
  },
319
- plugins: {
320
- '@html-eslint': html,
321
- },
322
347
  rules: {
323
- ...html.configs.recommended.rules,
348
+ ...html.configs['flat/recommended'].rules,
324
349
  '@html-eslint/element-newline': 'off',
325
350
  '@html-eslint/indent': 'off',
326
351
  '@html-eslint/no-extra-spacing-attrs': 'off',
@@ -333,11 +358,21 @@ export const htmlConfig = {
333
358
 
334
359
  // JSONC files
335
360
  export const jsonc = {
336
- files: ['**/*.jsonc', '**/*rc'],
361
+ files: [
362
+ '**/*.jsonc',
363
+ '**/.babelrc',
364
+ '**/.eslintrc',
365
+ '**/.prettierrc',
366
+ '**/.stylelintrc',
367
+ ],
337
368
  languageOptions: {
338
369
  parser: jsoncParser,
339
370
  },
340
371
  rules: {
372
+ ...jsoncPlugin.configs['flat/recommended-with-jsonc'].reduce(
373
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
374
+ {},
375
+ ),
341
376
  'prettier/prettier': ['warn', { parser: 'json' }],
342
377
  },
343
378
  };
@@ -349,6 +384,10 @@ export const json5 = {
349
384
  parser: jsoncParser,
350
385
  },
351
386
  rules: {
387
+ ...jsoncPlugin.configs['flat/recommended-with-json5'].reduce(
388
+ (accumulator, config) => ({ ...accumulator, ...config.rules }),
389
+ {},
390
+ ),
352
391
  'prettier/prettier': ['warn', { parser: 'json5' }],
353
392
  },
354
393
  };
@@ -359,14 +398,42 @@ export const jestJs = {
359
398
  languageOptions: {
360
399
  globals: { jest: true },
361
400
  },
362
- plugins: {
363
- jest,
364
- },
365
401
  rules: {
366
- ...jest.configs.all.rules,
402
+ ...jest.configs['flat/all'].rules,
403
+ // Jest DOM rules for testing-library assertions
404
+ 'jest-dom/prefer-checked': 'error',
405
+ 'jest-dom/prefer-enabled-disabled': 'error',
406
+ 'jest-dom/prefer-focus': 'error',
407
+ 'jest-dom/prefer-in-document': 'error',
408
+ 'jest-dom/prefer-required': 'error',
409
+ 'jest-dom/prefer-to-have-attribute': 'error',
410
+ 'jest-dom/prefer-to-have-class': 'error',
411
+ 'jest-dom/prefer-to-have-style': 'error',
412
+ 'jest-dom/prefer-to-have-text-content': 'error',
413
+ 'jest-dom/prefer-to-have-value': 'error',
414
+ // Testing Library rules
415
+ 'testing-library/await-async-queries': 'error',
416
+ 'testing-library/await-async-utils': 'error',
417
+ 'testing-library/no-await-sync-queries': 'error',
418
+ 'testing-library/no-debugging-utils': 'warn',
419
+ 'testing-library/no-dom-import': 'error',
420
+ 'testing-library/no-manual-cleanup': 'error',
421
+ 'testing-library/no-render-in-lifecycle': 'error',
422
+ 'testing-library/no-unnecessary-act': 'error',
423
+ 'testing-library/no-wait-for-multiple-assertions': 'error',
424
+ 'testing-library/prefer-explicit-assert': 'warn',
425
+ 'testing-library/prefer-find-by': 'error',
426
+ 'testing-library/prefer-presence-queries': 'error',
427
+ 'testing-library/prefer-query-by-disappearance': 'error',
428
+ 'testing-library/prefer-screen-queries': 'error',
429
+ 'testing-library/render-result-naming-convention': 'error',
430
+ // Disable rules requiring TypeScript type checking (not available in JS files)
431
+ 'jest/no-error-equal': 'off',
432
+ 'jest/no-unnecessary-assertion': 'off',
433
+ 'jest/unbound-method': 'off',
434
+ 'jest/valid-expect-with-promise': 'off',
367
435
  'jest/prefer-spy-on': 'warn',
368
436
  'jest/require-top-level-describe': 'error',
369
- 'jest/unbound-method': 'off',
370
437
  'unicorn/no-array-callback-reference': 'off',
371
438
  'unicorn/prevent-abbreviations': ['warn', { ignore: [/e2e/] }],
372
439
  },
@@ -379,12 +446,35 @@ export const jestTs = {
379
446
  globals: { jest: true },
380
447
  parser: tsParser,
381
448
  },
382
- plugins: {
383
- '@typescript-eslint': tsPlugin,
384
- jest,
385
- },
386
449
  rules: {
387
- ...jest.configs.all.rules,
450
+ ...jest.configs['flat/all'].rules,
451
+ // Jest DOM rules for testing-library assertions
452
+ 'jest-dom/prefer-checked': 'error',
453
+ 'jest-dom/prefer-enabled-disabled': 'error',
454
+ 'jest-dom/prefer-focus': 'error',
455
+ 'jest-dom/prefer-in-document': 'error',
456
+ 'jest-dom/prefer-required': 'error',
457
+ 'jest-dom/prefer-to-have-attribute': 'error',
458
+ 'jest-dom/prefer-to-have-class': 'error',
459
+ 'jest-dom/prefer-to-have-style': 'error',
460
+ 'jest-dom/prefer-to-have-text-content': 'error',
461
+ 'jest-dom/prefer-to-have-value': 'error',
462
+ // Testing Library rules
463
+ 'testing-library/await-async-queries': 'error',
464
+ 'testing-library/await-async-utils': 'error',
465
+ 'testing-library/no-await-sync-queries': 'error',
466
+ 'testing-library/no-debugging-utils': 'warn',
467
+ 'testing-library/no-dom-import': 'error',
468
+ 'testing-library/no-manual-cleanup': 'error',
469
+ 'testing-library/no-render-in-lifecycle': 'error',
470
+ 'testing-library/no-unnecessary-act': 'error',
471
+ 'testing-library/no-wait-for-multiple-assertions': 'error',
472
+ 'testing-library/prefer-explicit-assert': 'warn',
473
+ 'testing-library/prefer-find-by': 'error',
474
+ 'testing-library/prefer-presence-queries': 'error',
475
+ 'testing-library/prefer-query-by-disappearance': 'error',
476
+ 'testing-library/prefer-screen-queries': 'error',
477
+ 'testing-library/render-result-naming-convention': 'error',
388
478
  'jest/prefer-spy-on': 'warn',
389
479
  'jest/require-top-level-describe': 'error',
390
480
  'jest/unbound-method': 'off',
@@ -396,47 +486,11 @@ export const jestTs = {
396
486
  // Cypress files
397
487
  export const cypressConfig = {
398
488
  files: ['**/*.cy.*'],
399
- plugins: {
400
- cypress,
401
- },
402
489
  rules: {
403
490
  ...cypress.configs.recommended.rules,
404
491
  },
405
492
  };
406
493
 
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
494
  // Export all overrides
441
495
  export const baseOverrides = [
442
496
  ts,
@@ -453,6 +507,4 @@ export const baseOverrides = [
453
507
  jestJs,
454
508
  jestTs,
455
509
  cypressConfig,
456
- shellConfig,
457
- envFilesConfig,
458
510
  ];
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.1",
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",
@@ -113,12 +93,12 @@
113
93
  ],
114
94
  "type": "module",
115
95
  "engines": {
116
- "node": ">=20.0.0",
96
+ "node": ">=20.19.0",
117
97
  "npm": ">=9.0.0",
118
98
  "pnpm": ">=8.0.0",
119
99
  "yarn": ">=4.0.0"
120
100
  },
121
- "_comment": "Priority: Latest Node (25+) for latest features. Minimum: Node 20. Older versions tested but may break.",
101
+ "_comment": "Priority: Latest Node (25+) for latest features. Minimum: Node 20.19.0. Older versions tested but may break.",
122
102
  "exports": {
123
103
  ".": {
124
104
  "import": "./index.js",
@@ -128,17 +108,25 @@
128
108
  "import": "./flat.js",
129
109
  "require": "./flat.js"
130
110
  },
131
- "./rules": {
132
- "import": "./rules.js",
133
- "require": "./rules.js"
111
+ "./flat.js": {
112
+ "import": "./flat.js",
113
+ "require": "./flat.js"
134
114
  },
135
115
  "./overrides": {
136
116
  "import": "./overrides.js",
137
117
  "require": "./overrides.js"
138
118
  },
119
+ "./overrides.js": {
120
+ "import": "./overrides.js",
121
+ "require": "./overrides.js"
122
+ },
139
123
  "./base-config": {
140
124
  "import": "./base-config.js",
141
125
  "require": "./base-config.js"
126
+ },
127
+ "./base-config.js": {
128
+ "import": "./base-config.js",
129
+ "require": "./base-config.js"
142
130
  }
143
131
  }
144
132
  }