eslint-config-setup 0.4.0 → 0.5.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/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # ESLint Config Setup
2
2
 
3
+ [![Powered by Sebastian Software](https://img.shields.io/badge/Powered%20by-Sebastian%20Software-00718d?style=flat-square)](https://oss.sebastian-software.com)
3
4
  [![CI](https://github.com/sebastian-software/eslint-config-setup/actions/workflows/ci.yml/badge.svg)](https://github.com/sebastian-software/eslint-config-setup/actions/workflows/ci.yml)
4
5
  [![npm version](https://img.shields.io/npm/v/eslint-config-setup.svg)](https://www.npmjs.com/package/eslint-config-setup)
5
6
  [![npm downloads](https://img.shields.io/npm/dm/eslint-config-setup.svg)](https://www.npmjs.com/package/eslint-config-setup)
@@ -7,15 +8,15 @@
7
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
8
9
  [![Node.js](https://img.shields.io/node/v/eslint-config-setup.svg)](https://nodejs.org)
9
10
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org)
10
- [![ESLint](https://img.shields.io/badge/ESLint-9.22+-4B32C3.svg)](https://eslint.org)
11
+ [![ESLint](https://img.shields.io/badge/ESLint-10+-4B32C3.svg)](https://eslint.org)
11
12
 
12
13
  The ESLint config for teams that ship with AI and want to move fast.
13
14
 
14
15
  Most ESLint configs compose rules at runtime from dozens of plugins. That means version conflicts, plugin mismatches, and "works on my machine" differences. **ESLint Config Setup** resolves every rule at build time — you get a flat, pre-built config where every rule is already decided. No runtime composition, no surprises.
15
16
 
16
17
  - **AI guardrails** — a dedicated `ai` mode that enforces what code review can't: explicit types, strict naming, no magic values, complexity limits. Rules that humans find tedious are trivial for an AI to follow. The AI doesn't push back. It just fixes the code.
17
- - **OxLint-ready** — a single `oxlint` flag disables every ESLint rule that OxLint already covers, and `getOxlintConfig()` generates a matching OxLint config. No manual migration, no rule conflicts, no coverage gaps. Run both linters, get the full rule set at 100x the speed.
18
- - **27 plugins, one import** — TypeScript (`strictTypeChecked`), React 19, import cycles, security, browser compat, spell checking, and more. Every rule pre-resolved at build time. No plugin conflicts, no version mismatches.
18
+ - **OxLint-ready** — a single `oxlint` flag disables every ESLint rule that OxLint already covers, and `getOxlintConfig()` generates a matching OxLint config. No manual migration, no rule conflicts, no coverage gaps. Run both linters and keep the full rule surface.
19
+ - **30 lint integrations, one import** — TypeScript (`strictTypeChecked`), React 19, import cycles, security, browser compat, spell checking, formatter-conflict support, and more. Every rule pre-resolved at build time. No plugin conflicts, no version mismatches.
19
20
 
20
21
  ```typescript
21
22
  // eslint.config.ts
@@ -37,7 +38,7 @@ import { getEslintConfig } from "eslint-config-setup"
37
38
  export default await getEslintConfig({ react: true })
38
39
  ```
39
40
 
40
- Requires Node.js >= 22, ESLint >= 9.22, and TypeScript >= 5.0.
41
+ Requires Node.js >= 22, ESLint >= 10, and TypeScript >= 5.0.
41
42
 
42
43
  ## Configuration flags
43
44
 
@@ -69,7 +70,7 @@ export default config
69
70
  - [React Linting](https://sebastian-software.github.io/eslint-config-setup/guide/react) — React 19 rules, compat layer, and OxLint acceleration
70
71
  - [AI Mode](https://sebastian-software.github.io/eslint-config-setup/guide/ai-mode) — why AI-generated code needs different rules
71
72
  - [OxLint Integration](https://sebastian-software.github.io/eslint-config-setup/guide/oxlint) — run ESLint + OxLint without conflicts
72
- - [All 27 Plugins](https://sebastian-software.github.io/eslint-config-setup/guide/plugins) — what's included and why
73
+ - [Included Plugins](https://sebastian-software.github.io/eslint-config-setup/guide/plugins) — what's included and why
73
74
  - [Configuration](https://sebastian-software.github.io/eslint-config-setup/guide/configuration) — flags and usage examples
74
75
  - [Rule API](https://sebastian-software.github.io/eslint-config-setup/guide/rule-api) — rule manipulation and scoped overrides
75
76
  - [File Conventions](https://sebastian-software.github.io/eslint-config-setup/guide/file-conventions) — automatic test/config/story/script overrides
@@ -83,4 +84,19 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, architecture overv
83
84
 
84
85
  ## License
85
86
 
86
- [MIT](LICENSE) — Copyright (c) 2025 [Sebastian Software GmbH](https://sebastian-software.com)
87
+ [MIT](LICENSE)
88
+
89
+ ---
90
+
91
+ <!-- sebastian-software-branding:start -->
92
+ <p align="center">
93
+ <a href="https://oss.sebastian-software.com">
94
+ <img src="https://sebastian-brand.vercel.app/sebastian-software/logo-software.svg" alt="Sebastian Software" width="240" />
95
+ </a>
96
+ </p>
97
+
98
+ <p align="center">
99
+ <a href="https://oss.sebastian-software.com">Open Source at Sebastian Software</a><br />
100
+ Copyright &copy; 2026 Sebastian Software GmbH
101
+ </p>
102
+ <!-- sebastian-software-branding:end -->
@@ -126,10 +126,6 @@ export default [
126
126
  ]
127
127
  }
128
128
  ],
129
- "@typescript-eslint/method-signature-style": [
130
- "error",
131
- "property"
132
- ],
133
129
  "@typescript-eslint/naming-convention": [
134
130
  "error",
135
131
  {
@@ -370,7 +366,6 @@ export default [
370
366
  "getBeforeSet"
371
367
  ],
372
368
  "guard-for-in": "error",
373
- "import/newline-after-import": "error",
374
369
  "import/no-extraneous-dependencies": [
375
370
  "error",
376
371
  {
@@ -392,9 +387,7 @@ export default [
392
387
  "jsdoc/reject-function-type": "error",
393
388
  "jsdoc/require-next-type": "error",
394
389
  "jsdoc/require-returns-check": "error",
395
- "jsdoc/require-throws-type": "error",
396
390
  "jsdoc/require-yields-check": "error",
397
- "jsdoc/require-yields-type": "error",
398
391
  "jsdoc/ts-no-empty-object-type": "error",
399
392
  "jsdoc/valid-types": "error",
400
393
  "logical-assignment-operators": [
@@ -682,20 +675,14 @@ export default [
682
675
  "sonarjs/reduce-initial-value": "error",
683
676
  "symbol-description": "error",
684
677
  "unicorn/no-array-push-push": "error",
678
+ "unicorn/no-for-each": "error",
685
679
  "unicorn/no-for-loop": "error",
686
- "unicorn/prefer-export-from": [
687
- "error",
688
- {
689
- "ignoreUsedVariables": true
690
- }
691
- ],
692
680
  "unicorn/prefer-switch": [
693
681
  "error",
694
682
  {
695
683
  "minimumCases": 3
696
684
  }
697
685
  ],
698
- "unicorn/prevent-abbreviations": "error",
699
686
  "unused-imports/no-unused-imports": "error",
700
687
  "yoda": "error"
701
688
  },
@@ -711,7 +698,6 @@ export default [
711
698
  "@typescript-eslint/consistent-type-exports": "off",
712
699
  "@typescript-eslint/dot-notation": "off",
713
700
  "@typescript-eslint/member-ordering": "off",
714
- "@typescript-eslint/method-signature-style": "off",
715
701
  "@typescript-eslint/naming-convention": "off",
716
702
  "@typescript-eslint/no-array-delete": "off",
717
703
  "@typescript-eslint/no-base-to-string": "off",
@@ -770,7 +756,6 @@ export default [
770
756
  "@typescript-eslint/unbound-method": "off",
771
757
  "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
772
758
  "dot-notation": "off",
773
- "getter-return": "error",
774
759
  "no-array-constructor": "off",
775
760
  "no-dupe-args": "error",
776
761
  "no-empty-function": "off",
@@ -781,7 +766,6 @@ export default [
781
766
  "no-shadow": "off",
782
767
  "no-throw-literal": "off",
783
768
  "no-undef": "error",
784
- "no-unreachable": "error",
785
769
  "no-useless-constructor": "off",
786
770
  "prefer-const": [
787
771
  "error",
@@ -1031,7 +1015,6 @@ export default [
1031
1015
  "@typescript-eslint/consistent-type-exports": "off",
1032
1016
  "@typescript-eslint/dot-notation": "off",
1033
1017
  "@typescript-eslint/member-ordering": "off",
1034
- "@typescript-eslint/method-signature-style": "off",
1035
1018
  "@typescript-eslint/naming-convention": "off",
1036
1019
  "@typescript-eslint/no-array-delete": "off",
1037
1020
  "@typescript-eslint/no-base-to-string": "off",
@@ -1112,10 +1095,10 @@ export default [
1112
1095
  },
1113
1096
 
1114
1097
  // OxLint integration — disables rules already covered by OxLint
1115
- ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint", ...c })),
1116
- ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-typescript", ...c })),
1117
- ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-unicorn", ...c })),
1118
- ...[oxlintPlugin.configs["flat/import"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-import", ...c })),
1119
- ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsdoc", ...c })),
1098
+ ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint" + (array.length > 1 ? "-" + (index + 1) : "") })),
1099
+ ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-typescript" + (array.length > 1 ? "-" + (index + 1) : "") })),
1100
+ ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-unicorn" + (array.length > 1 ? "-" + (index + 1) : "") })),
1101
+ ...[oxlintPlugin.configs["flat/import"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-import" + (array.length > 1 ? "-" + (index + 1) : "") })),
1102
+ ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsdoc" + (array.length > 1 ? "-" + (index + 1) : "") })),
1120
1103
 
1121
1104
  ]
@@ -67,10 +67,6 @@ export default [
67
67
  }
68
68
  ],
69
69
  "@typescript-eslint/dot-notation": "error",
70
- "@typescript-eslint/method-signature-style": [
71
- "error",
72
- "property"
73
- ],
74
70
  "@typescript-eslint/no-array-delete": "error",
75
71
  "@typescript-eslint/no-base-to-string": "error",
76
72
  "@typescript-eslint/no-confusing-void-expression": "error",
@@ -194,7 +190,6 @@ export default [
194
190
  "getBeforeSet"
195
191
  ],
196
192
  "guard-for-in": "error",
197
- "import/newline-after-import": "error",
198
193
  "import/no-extraneous-dependencies": [
199
194
  "error",
200
195
  {
@@ -215,9 +210,7 @@ export default [
215
210
  "jsdoc/reject-function-type": "error",
216
211
  "jsdoc/require-next-type": "error",
217
212
  "jsdoc/require-returns-check": "error",
218
- "jsdoc/require-throws-type": "error",
219
213
  "jsdoc/require-yields-check": "error",
220
- "jsdoc/require-yields-type": "error",
221
214
  "jsdoc/ts-no-empty-object-type": "error",
222
215
  "jsdoc/valid-types": "error",
223
216
  "max-depth": [
@@ -433,12 +426,6 @@ export default [
433
426
  "sonarjs/reduce-initial-value": "error",
434
427
  "symbol-description": "error",
435
428
  "unicorn/no-for-loop": "warn",
436
- "unicorn/prefer-export-from": [
437
- "error",
438
- {
439
- "ignoreUsedVariables": true
440
- }
441
- ],
442
429
  "unused-imports/no-unused-imports": "error",
443
430
  "yoda": "error"
444
431
  },
@@ -453,7 +440,6 @@ export default [
453
440
  "@typescript-eslint/consistent-return": "off",
454
441
  "@typescript-eslint/consistent-type-exports": "off",
455
442
  "@typescript-eslint/dot-notation": "off",
456
- "@typescript-eslint/method-signature-style": "off",
457
443
  "@typescript-eslint/naming-convention": "off",
458
444
  "@typescript-eslint/no-array-delete": "off",
459
445
  "@typescript-eslint/no-base-to-string": "off",
@@ -512,7 +498,6 @@ export default [
512
498
  "@typescript-eslint/unbound-method": "off",
513
499
  "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
514
500
  "dot-notation": "off",
515
- "getter-return": "error",
516
501
  "no-array-constructor": "off",
517
502
  "no-dupe-args": "error",
518
503
  "no-empty-function": "off",
@@ -523,7 +508,6 @@ export default [
523
508
  "no-shadow": "off",
524
509
  "no-throw-literal": "off",
525
510
  "no-undef": "error",
526
- "no-unreachable": "error",
527
511
  "no-useless-constructor": "off",
528
512
  "prefer-const": [
529
513
  "error",
@@ -757,7 +741,6 @@ export default [
757
741
  "@typescript-eslint/await-thenable": "off",
758
742
  "@typescript-eslint/consistent-type-exports": "off",
759
743
  "@typescript-eslint/dot-notation": "off",
760
- "@typescript-eslint/method-signature-style": "off",
761
744
  "@typescript-eslint/no-array-delete": "off",
762
745
  "@typescript-eslint/no-base-to-string": "off",
763
746
  "@typescript-eslint/no-confusing-void-expression": "off",
@@ -837,10 +820,10 @@ export default [
837
820
  },
838
821
 
839
822
  // OxLint integration — disables rules already covered by OxLint
840
- ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint", ...c })),
841
- ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-typescript", ...c })),
842
- ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-unicorn", ...c })),
843
- ...[oxlintPlugin.configs["flat/import"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-import", ...c })),
844
- ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsdoc", ...c })),
823
+ ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint" + (array.length > 1 ? "-" + (index + 1) : "") })),
824
+ ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-typescript" + (array.length > 1 ? "-" + (index + 1) : "") })),
825
+ ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-unicorn" + (array.length > 1 ? "-" + (index + 1) : "") })),
826
+ ...[oxlintPlugin.configs["flat/import"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-import" + (array.length > 1 ? "-" + (index + 1) : "") })),
827
+ ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsdoc" + (array.length > 1 ? "-" + (index + 1) : "") })),
845
828
 
846
829
  ]
@@ -9,12 +9,12 @@ import globals from "globals"
9
9
  import importXPlugin from "eslint-plugin-import-x"
10
10
  import jsdocPlugin from "eslint-plugin-jsdoc"
11
11
  import jsonPlugin from "@eslint/json"
12
- import jsxA11yPlugin from "eslint-plugin-jsx-a11y"
13
12
  import oxlintPlugin from "eslint-plugin-oxlint"
14
13
  import packageJsonPlugin from "eslint-plugin-package-json"
15
14
  import perfectionistPlugin from "eslint-plugin-perfectionist"
16
15
  import playwrightPlugin from "eslint-plugin-playwright"
17
16
  import reactEffectPlugin from "eslint-plugin-react-you-might-not-need-an-effect"
17
+ import reactHooksPlugin from "eslint-plugin-react-hooks"
18
18
  import regexpPlugin from "eslint-plugin-regexp"
19
19
  import securityPlugin from "eslint-plugin-security"
20
20
  import sonarjsPlugin from "eslint-plugin-sonarjs"
@@ -26,7 +26,7 @@ import unicornPlugin from "eslint-plugin-unicorn"
26
26
  import unusedImportsPlugin from "eslint-plugin-unused-imports"
27
27
  import vitestPlugin from "@vitest/eslint-plugin"
28
28
 
29
- // React compat plugin — merges @eslint-react sub-plugins into a single `react/` namespace
29
+ // React compat plugin — maps @eslint-react rule families into the `react/` namespace
30
30
  // and aliases rules to legacy eslint-plugin-react names for OxLint compatibility.
31
31
  const reactCompatPlugin = (() => {
32
32
  const core = eslintReactPlugin.rules
@@ -52,7 +52,6 @@ const reactCompatPlugin = (() => {
52
52
  "no-unstable-nested-components": [core, "no-nested-component-definitions"],
53
53
  "display-name": [core, "no-missing-component-display-name"],
54
54
  "forward-ref-uses-ref": [core, "no-forward-ref"],
55
- "destructuring-assignment": [core, "prefer-destructuring-assignment"],
56
55
  "no-did-mount-set-state": [core, "no-set-state-in-component-did-mount"],
57
56
  "no-did-update-set-state": [core, "no-set-state-in-component-did-update"],
58
57
  "no-will-update-set-state": [core, "no-set-state-in-component-will-update"],
@@ -74,7 +73,7 @@ const reactCompatPlugin = (() => {
74
73
  // Identical-name aliases (core rules where legacy name = @eslint-react name)
75
74
  const identicalCore = [
76
75
  "no-access-state-in-setstate", "no-array-index-key",
77
- "no-direct-mutation-state", "no-redundant-should-component-update",
76
+ "no-direct-mutation-state",
78
77
  "no-unused-class-component-members", "no-unused-state",
79
78
  ]
80
79
  for (const n of identicalCore) aliases[n] = [core, n]
@@ -128,9 +127,9 @@ export default [
128
127
  "de-morgan": deMorganPlugin,
129
128
  "import": importXPlugin,
130
129
  "jsdoc": jsdocPlugin,
131
- "jsx-a11y": jsxA11yPlugin,
132
130
  "perfectionist": perfectionistPlugin,
133
131
  "react": reactCompatPlugin,
132
+ "react-hooks": reactHooksPlugin,
134
133
  "react-you-might-not-need-an-effect": reactEffectPlugin,
135
134
  "regexp": regexpPlugin,
136
135
  "security": securityPlugin,
@@ -233,10 +232,6 @@ export default [
233
232
  ]
234
233
  }
235
234
  ],
236
- "@typescript-eslint/method-signature-style": [
237
- "error",
238
- "property"
239
- ],
240
235
  "@typescript-eslint/naming-convention": [
241
236
  "error",
242
237
  {
@@ -484,7 +479,6 @@ export default [
484
479
  "getBeforeSet"
485
480
  ],
486
481
  "guard-for-in": "error",
487
- "import/newline-after-import": "error",
488
482
  "import/no-extraneous-dependencies": [
489
483
  "error",
490
484
  {
@@ -506,13 +500,9 @@ export default [
506
500
  "jsdoc/reject-function-type": "error",
507
501
  "jsdoc/require-next-type": "error",
508
502
  "jsdoc/require-returns-check": "error",
509
- "jsdoc/require-throws-type": "error",
510
503
  "jsdoc/require-yields-check": "error",
511
- "jsdoc/require-yields-type": "error",
512
504
  "jsdoc/ts-no-empty-object-type": "error",
513
505
  "jsdoc/valid-types": "error",
514
- "jsx-a11y/interactive-supports-focus": "error",
515
- "jsx-a11y/no-noninteractive-element-interactions": "error",
516
506
  "logical-assignment-operators": [
517
507
  "error",
518
508
  "always",
@@ -670,24 +660,36 @@ export default [
670
660
  "prefer-template": "error",
671
661
  "preserve-caught-error": "error",
672
662
  "radix": "error",
663
+ "react-hooks/config": "error",
664
+ "react-hooks/error-boundaries": "error",
665
+ "react-hooks/gating": "error",
666
+ "react-hooks/globals": "error",
667
+ "react-hooks/immutability": "error",
668
+ "react-hooks/incompatible-library": "warn",
669
+ "react-hooks/preserve-manual-memoization": "error",
670
+ "react-hooks/purity": "error",
671
+ "react-hooks/refs": "error",
672
+ "react-hooks/set-state-in-effect": "error",
673
+ "react-hooks/set-state-in-render": "error",
674
+ "react-hooks/static-components": "error",
675
+ "react-hooks/unsupported-syntax": "warn",
676
+ "react-hooks/use-memo": "error",
677
+ "react-hooks/void-use-memo": "error",
673
678
  "react-you-might-not-need-an-effect/no-adjust-state-on-prop-change": "warn",
674
679
  "react-you-might-not-need-an-effect/no-chain-state-updates": "error",
675
680
  "react-you-might-not-need-an-effect/no-derived-state": "error",
676
- "react-you-might-not-need-an-effect/no-empty-effect": "error",
677
681
  "react-you-might-not-need-an-effect/no-event-handler": "error",
682
+ "react-you-might-not-need-an-effect/no-external-store-subscription": "error",
678
683
  "react-you-might-not-need-an-effect/no-initialize-state": "error",
679
684
  "react-you-might-not-need-an-effect/no-pass-data-to-parent": "error",
680
685
  "react-you-might-not-need-an-effect/no-pass-live-state-to-parent": "error",
681
686
  "react-you-might-not-need-an-effect/no-reset-all-state-on-prop-change": "error",
682
- "react/component-hook-factories": "error",
683
687
  "react/context-name": "warn",
684
- "react/destructuring-assignment": "warn",
685
- "react/error-boundaries": "error",
686
- "react/exhaustive-deps": "warn",
687
688
  "react/function-definition": "error",
688
689
  "react/id-name": "warn",
689
690
  "react/jsx-key-before-spread": "error",
690
691
  "react/jsx-no-children-prop-with-children": "error",
692
+ "react/jsx-no-leaked-dollar": "warn",
691
693
  "react/jsx-no-leaked-render": "error",
692
694
  "react/jsx-no-leaked-semicolon": "warn",
693
695
  "react/no-access-state-in-setstate": "error",
@@ -702,39 +704,30 @@ export default [
702
704
  "react/no-component-will-update": "error",
703
705
  "react/no-context-provider": "error",
704
706
  "react/no-create-ref": "error",
705
- "react/no-did-update-set-state": "warn",
706
707
  "react/no-duplicate-key": "error",
707
708
  "react/no-flush-sync": "error",
708
709
  "react/no-hydrate": "error",
709
710
  "react/no-implicit-key": "error",
710
711
  "react/no-leaked-event-listener": "error",
712
+ "react/no-leaked-fetch": "warn",
713
+ "react/no-leaked-intersection-observer": "warn",
711
714
  "react/no-leaked-interval": "error",
712
715
  "react/no-leaked-resize-observer": "error",
713
716
  "react/no-leaked-timeout": "error",
714
717
  "react/no-misused-capture-owner-stack": "error",
715
718
  "react/no-nested-lazy-component-declarations": "error",
716
- "react/no-object-type-as-default-prop": "error",
717
719
  "react/no-render": "error",
718
- "react/no-unnecessary-use-callback": "warn",
719
- "react/no-unnecessary-use-memo": "warn",
720
720
  "react/no-unnecessary-use-prefix": "warn",
721
721
  "react/no-unsafe-component-will-mount": "warn",
722
722
  "react/no-unsafe-component-will-receive-props": "warn",
723
723
  "react/no-unsafe-component-will-update": "warn",
724
724
  "react/no-unsafe-iframe-sandbox": "warn",
725
- "react/no-unstable-nested-components": "error",
726
725
  "react/no-unused-class-component-members": "warn",
727
726
  "react/no-unused-props": "warn",
728
727
  "react/no-unused-state": "error",
729
728
  "react/no-use-context": "error",
730
729
  "react/no-use-form-state": "error",
731
- "react/purity": "warn",
732
730
  "react/ref-name": "warn",
733
- "react/rules-of-hooks": "error",
734
- "react/set-state-in-effect": "warn",
735
- "react/set-state-in-render": "error",
736
- "react/unsupported-syntax": "error",
737
- "react/use-memo": "error",
738
731
  "regexp/confusing-quantifier": "warn",
739
732
  "regexp/control-character-escape": "error",
740
733
  "regexp/match-any": "error",
@@ -863,20 +856,14 @@ export default [
863
856
  "sonarjs/reduce-initial-value": "error",
864
857
  "symbol-description": "error",
865
858
  "unicorn/no-array-push-push": "error",
859
+ "unicorn/no-for-each": "error",
866
860
  "unicorn/no-for-loop": "error",
867
- "unicorn/prefer-export-from": [
868
- "error",
869
- {
870
- "ignoreUsedVariables": true
871
- }
872
- ],
873
861
  "unicorn/prefer-switch": [
874
862
  "error",
875
863
  {
876
864
  "minimumCases": 3
877
865
  }
878
866
  ],
879
- "unicorn/prevent-abbreviations": "error",
880
867
  "unused-imports/no-unused-imports": "error",
881
868
  "yoda": "error"
882
869
  },
@@ -892,7 +879,6 @@ export default [
892
879
  "@typescript-eslint/consistent-type-exports": "off",
893
880
  "@typescript-eslint/dot-notation": "off",
894
881
  "@typescript-eslint/member-ordering": "off",
895
- "@typescript-eslint/method-signature-style": "off",
896
882
  "@typescript-eslint/naming-convention": "off",
897
883
  "@typescript-eslint/no-array-delete": "off",
898
884
  "@typescript-eslint/no-base-to-string": "off",
@@ -951,7 +937,6 @@ export default [
951
937
  "@typescript-eslint/unbound-method": "off",
952
938
  "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
953
939
  "dot-notation": "off",
954
- "getter-return": "error",
955
940
  "no-array-constructor": "off",
956
941
  "no-dupe-args": "error",
957
942
  "no-empty-function": "off",
@@ -962,7 +947,6 @@ export default [
962
947
  "no-shadow": "off",
963
948
  "no-throw-literal": "off",
964
949
  "no-undef": "error",
965
- "no-unreachable": "error",
966
950
  "no-useless-constructor": "off",
967
951
  "prefer-const": [
968
952
  "error",
@@ -1212,7 +1196,6 @@ export default [
1212
1196
  "@typescript-eslint/consistent-type-exports": "off",
1213
1197
  "@typescript-eslint/dot-notation": "off",
1214
1198
  "@typescript-eslint/member-ordering": "off",
1215
- "@typescript-eslint/method-signature-style": "off",
1216
1199
  "@typescript-eslint/naming-convention": "off",
1217
1200
  "@typescript-eslint/no-array-delete": "off",
1218
1201
  "@typescript-eslint/no-base-to-string": "off",
@@ -1292,12 +1275,14 @@ export default [
1292
1275
  },
1293
1276
 
1294
1277
  // OxLint integration — disables rules already covered by OxLint
1295
- ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint", ...c })),
1296
- ...[oxlintPlugin.configs["flat/react"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-react", ...c })),
1297
- ...[oxlintPlugin.configs["flat/jsx-a11y"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsx-a11y", ...c })),
1298
- ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-typescript", ...c })),
1299
- ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-unicorn", ...c })),
1300
- ...[oxlintPlugin.configs["flat/import"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-import", ...c })),
1301
- ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsdoc", ...c })),
1278
+ ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint" + (array.length > 1 ? "-" + (index + 1) : "") })),
1279
+ ...[oxlintPlugin.configs["flat/react"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-react" + (array.length > 1 ? "-" + (index + 1) : "") })),
1280
+ ...[oxlintPlugin.configs["flat/jsx-a11y"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsx-a11y" + (array.length > 1 ? "-" + (index + 1) : "") })),
1281
+ ...[oxlintPlugin.configs["flat/react-hooks"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-react-hooks" + (array.length > 1 ? "-" + (index + 1) : "") })),
1282
+ ...[oxlintPlugin.configs["flat/react-perf"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-react-perf" + (array.length > 1 ? "-" + (index + 1) : "") })),
1283
+ ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-typescript" + (array.length > 1 ? "-" + (index + 1) : "") })),
1284
+ ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-unicorn" + (array.length > 1 ? "-" + (index + 1) : "") })),
1285
+ ...[oxlintPlugin.configs["flat/import"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-import" + (array.length > 1 ? "-" + (index + 1) : "") })),
1286
+ ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsdoc" + (array.length > 1 ? "-" + (index + 1) : "") })),
1302
1287
 
1303
1288
  ]
@@ -71,10 +71,6 @@ export default [
71
71
  }
72
72
  ],
73
73
  "@typescript-eslint/dot-notation": "error",
74
- "@typescript-eslint/method-signature-style": [
75
- "error",
76
- "property"
77
- ],
78
74
  "@typescript-eslint/no-array-delete": "error",
79
75
  "@typescript-eslint/no-base-to-string": "error",
80
76
  "@typescript-eslint/no-confusing-void-expression": "error",
@@ -197,7 +193,6 @@ export default [
197
193
  "getBeforeSet"
198
194
  ],
199
195
  "guard-for-in": "error",
200
- "import/newline-after-import": "error",
201
196
  "import/no-extraneous-dependencies": [
202
197
  "error",
203
198
  {
@@ -218,9 +213,7 @@ export default [
218
213
  "jsdoc/reject-function-type": "error",
219
214
  "jsdoc/require-next-type": "error",
220
215
  "jsdoc/require-returns-check": "error",
221
- "jsdoc/require-throws-type": "error",
222
216
  "jsdoc/require-yields-check": "error",
223
- "jsdoc/require-yields-type": "error",
224
217
  "jsdoc/ts-no-empty-object-type": "error",
225
218
  "jsdoc/valid-types": "error",
226
219
  "max-depth": [
@@ -465,12 +458,6 @@ export default [
465
458
  "sonarjs/reduce-initial-value": "error",
466
459
  "symbol-description": "error",
467
460
  "unicorn/no-for-loop": "warn",
468
- "unicorn/prefer-export-from": [
469
- "error",
470
- {
471
- "ignoreUsedVariables": true
472
- }
473
- ],
474
461
  "unused-imports/no-unused-imports": "error",
475
462
  "yoda": "error"
476
463
  },
@@ -485,7 +472,6 @@ export default [
485
472
  "@typescript-eslint/consistent-return": "off",
486
473
  "@typescript-eslint/consistent-type-exports": "off",
487
474
  "@typescript-eslint/dot-notation": "off",
488
- "@typescript-eslint/method-signature-style": "off",
489
475
  "@typescript-eslint/naming-convention": "off",
490
476
  "@typescript-eslint/no-array-delete": "off",
491
477
  "@typescript-eslint/no-base-to-string": "off",
@@ -544,7 +530,6 @@ export default [
544
530
  "@typescript-eslint/unbound-method": "off",
545
531
  "@typescript-eslint/use-unknown-in-catch-callback-variable": "off",
546
532
  "dot-notation": "off",
547
- "getter-return": "error",
548
533
  "no-array-constructor": "off",
549
534
  "no-dupe-args": "error",
550
535
  "no-empty-function": "off",
@@ -555,7 +540,6 @@ export default [
555
540
  "no-shadow": "off",
556
541
  "no-throw-literal": "off",
557
542
  "no-undef": "error",
558
- "no-unreachable": "error",
559
543
  "no-useless-constructor": "off",
560
544
  "prefer-const": [
561
545
  "error",
@@ -789,7 +773,6 @@ export default [
789
773
  "@typescript-eslint/await-thenable": "off",
790
774
  "@typescript-eslint/consistent-type-exports": "off",
791
775
  "@typescript-eslint/dot-notation": "off",
792
- "@typescript-eslint/method-signature-style": "off",
793
776
  "@typescript-eslint/no-array-delete": "off",
794
777
  "@typescript-eslint/no-base-to-string": "off",
795
778
  "@typescript-eslint/no-confusing-void-expression": "off",
@@ -869,11 +852,11 @@ export default [
869
852
  },
870
853
 
871
854
  // OxLint integration — disables rules already covered by OxLint
872
- ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint", ...c })),
873
- ...[oxlintPlugin.configs["flat/node"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-node", ...c })),
874
- ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-typescript", ...c })),
875
- ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-unicorn", ...c })),
876
- ...[oxlintPlugin.configs["flat/import"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-import", ...c })),
877
- ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c) => ({ name: "eslint-config-setup/oxlint-jsdoc", ...c })),
855
+ ...[oxlintPlugin.configs["flat/recommended"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint" + (array.length > 1 ? "-" + (index + 1) : "") })),
856
+ ...[oxlintPlugin.configs["flat/node"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-node" + (array.length > 1 ? "-" + (index + 1) : "") })),
857
+ ...[oxlintPlugin.configs["flat/typescript"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-typescript" + (array.length > 1 ? "-" + (index + 1) : "") })),
858
+ ...[oxlintPlugin.configs["flat/unicorn"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-unicorn" + (array.length > 1 ? "-" + (index + 1) : "") })),
859
+ ...[oxlintPlugin.configs["flat/import"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-import" + (array.length > 1 ? "-" + (index + 1) : "") })),
860
+ ...[oxlintPlugin.configs["flat/jsdoc"]].flat().map((c, index, array) => ({ ...c, name: "eslint-config-setup/oxlint-jsdoc" + (array.length > 1 ? "-" + (index + 1) : "") })),
878
861
 
879
862
  ]