@tsfpp/eslint-config 1.1.0 → 2.1.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/README.md CHANGED
@@ -6,7 +6,8 @@ Enforces the machine-checkable subset of TSF++ rules via `@typescript-eslint` an
6
6
 
7
7
  ## Requirements
8
8
 
9
- - ESLint ≥ 9 (flat config format)
9
+ - ESLint 9 or 10 (flat config format)
10
+ - Node.js `^20.19.0 || ^22.13.0 || >=24` — the range ESLint 10 itself supports
10
11
  - TypeScript ≥ 5.3
11
12
  - A `tsconfig.json` reachable from each linted file
12
13
 
@@ -130,6 +131,8 @@ export default [
130
131
  | `no-restricted-syntax` → `TSModuleDeclaration[kind='namespace']` | 1.9 | MUST |
131
132
  | `no-restricted-syntax` → `BinaryExpression[operator="instanceof"]` | 1.9 | MUST |
132
133
  | `no-restricted-syntax` → `NewExpression` | 1.9 | MUST |
134
+ | `no-restricted-globals` → `isNaN`, `isFinite`, `parseInt`, `parseFloat` | 1.13 | MUST |
135
+ | `no-restricted-syntax` → `Date.now()`, `Math.random()`, `process.env` | 4.6 | MUST |
133
136
  | `functional/no-classes` | 1.9 | MUST |
134
137
  | `functional/no-this-expressions` | 1.9 | MUST |
135
138
  | `functional/no-let` | 2.1 | MUST |
@@ -209,6 +212,10 @@ throw new Error('unreachable')
209
212
 
210
213
  Several ESLint plugin packages ship types that lag behind the current `@eslint/core` `Plugin` interface. This package contains a single `coercePlugin` adapter (`plugin-compat.ts`) that isolates the necessary type cast at one auditable boundary per TSF++ DEVIATION(1.6). Consumers are unaffected — this is an internal concern of the config package itself.
211
214
 
215
+ ### ESLint 10 and the React profile
216
+
217
+ `eslint-plugin-react` (7.37.5) and `eslint-plugin-jsx-a11y` (6.10.2) have not yet released ESLint 10 support: both call rule-context methods that ESLint 10 removed. The React profile registers them through `coerceLegacyPlugin`, which wraps them with `fixupPluginRules` from `@eslint/compat`, so the profile works on ESLint 9 and 10 alike. Your package manager will still report an unmet `eslint` peer for those two plugins under ESLint 10 — that warning comes from the plugins' own manifests and is expected until they publish a compatible release.
218
+
212
219
  ## See also
213
220
 
214
221
  - [spec/standards/TSFPP_CODING_STANDARD.md §9](../../spec/standards/TSFPP_CODING_STANDARD.md#9--compiler-and-tooling-configuration) — normative rule reference
package/dist/base.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @tsfpp/eslint-config — base
3
3
  *
4
4
  * Shared ESLint flat configuration for TSF++ projects (pure TypeScript targets).
5
- * Enforces Rules 1.2–1.9, 2.1–2.3, 3.1–3.2, 3.4, 4.1, 4.2, 4.5, 6.2, 6.4, 11.2
5
+ * Enforces Rules 1.2–1.9, 1.13, 2.1–2.3, 3.1–3.2, 3.4, 4.1, 4.2, 4.5, 4.6, 6.2, 6.4, 11.2
6
6
  * from CODING_STANDARD.md via @typescript-eslint and eslint-plugin-functional.
7
7
  *
8
8
  * Usage (base only):
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAO,QAAQ,CAAA;AAMrC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EA0L1B,CAAA;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAO,QAAQ,CAAA;AAMrC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EA+M1B,CAAA;AAED,eAAe,MAAM,CAAA"}
package/dist/base.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @tsfpp/eslint-config — base
3
3
  *
4
4
  * Shared ESLint flat configuration for TSF++ projects (pure TypeScript targets).
5
- * Enforces Rules 1.2–1.9, 2.1–2.3, 3.1–3.2, 3.4, 4.1, 4.2, 4.5, 6.2, 6.4, 11.2
5
+ * Enforces Rules 1.2–1.9, 1.13, 2.1–2.3, 3.1–3.2, 3.4, 4.1, 4.2, 4.5, 4.6, 6.2, 6.4, 11.2
6
6
  * from CODING_STANDARD.md via @typescript-eslint and eslint-plugin-functional.
7
7
  *
8
8
  * Usage (base only):
@@ -81,6 +81,26 @@ const config = [
81
81
  selector: 'NewExpression',
82
82
  message: 'TSF++ Rule 1.9: new is forbidden outside adapter boundaries. Add DEVIATION(1.9) and an eslint-disable comment.',
83
83
  },
84
+ // Rule 4.6 — ambient nondeterminism is an effect (Appendix B); `new Date()` is already caught by Rule 1.9 above
85
+ {
86
+ selector: "CallExpression[callee.object.name='Date'][callee.property.name='now']",
87
+ message: 'TSF++ Rule 4.6: Date.now() is an effect; inject `now: () => Date` via Deps.',
88
+ },
89
+ {
90
+ selector: "CallExpression[callee.object.name='Math'][callee.property.name='random']",
91
+ message: 'TSF++ Rule 4.6: Math.random() is an effect; inject a seeded generator via Deps.',
92
+ },
93
+ {
94
+ selector: "MemberExpression[object.object.name='process'][object.property.name='env']",
95
+ message: 'TSF++ Rule 4.6: process.env is ambient input; load config at the boundary and inject it.',
96
+ },
97
+ ],
98
+ // Rule 1.13 — numeric hazards: coercing globals (Appendix B)
99
+ 'no-restricted-globals': ['error',
100
+ { name: 'isNaN', message: 'TSF++ Rule 1.13: use Number.isNaN — the global coerces its argument.' },
101
+ { name: 'isFinite', message: 'TSF++ Rule 1.13: use Number.isFinite — the global coerces its argument.' },
102
+ { name: 'parseInt', message: 'TSF++ Rule 1.13: coercion parsing is forbidden in the core; parse at the boundary via a smart constructor.' },
103
+ { name: 'parseFloat', message: 'TSF++ Rule 1.13: coercion parsing is forbidden in the core; parse at the boundary via a smart constructor.' },
84
104
  ],
85
105
  // ── Immutability & functional style ──────────────────────────────────────
86
106
  // Rule 2.1 — no `let`
package/dist/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../base.ts"],"names":[],"mappings":"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"}
@@ -27,4 +27,15 @@ import type { ESLint } from 'eslint';
27
27
  * type errors.
28
28
  */
29
29
  export declare const coercePlugin: (plugin: unknown) => ESLint.Plugin;
30
+ /**
31
+ * Coerces a plugin and additionally restores the rule-context methods ESLint 10
32
+ * removed (`context.getFilename()`, `context.getSourceCode()`, …).
33
+ *
34
+ * Use for plugins that have not shipped ESLint 10 support — currently
35
+ * eslint-plugin-react and eslint-plugin-jsx-a11y. Without the fixup,
36
+ * eslint-plugin-react 7.37.5 throws `contextOrFilename.getFilename is not a
37
+ * function` on the first linted file. Harmless under ESLint 9; drop the call
38
+ * for a plugin once its own peer range includes ESLint 10.
39
+ */
40
+ export declare const coerceLegacyPlugin: (plugin: unknown) => ESLint.Plugin;
30
41
  //# sourceMappingURL=plugin-compat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-compat.d.ts","sourceRoot":"","sources":["../plugin-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,OAAO,KAAG,MAAM,CAAC,MAE7B,CAAA"}
1
+ {"version":3,"file":"plugin-compat.d.ts","sourceRoot":"","sources":["../plugin-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAW,QAAQ,CAAA;AAGzC;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,OAAO,KAAG,MAAM,CAAC,MAE7B,CAAA;AAEzB;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,OAAO,KAAG,MAAM,CAAC,MACpB,CAAA"}
@@ -18,6 +18,7 @@
18
18
  * no runtime effect — this is a pure type-level coercion with zero behavior.
19
19
  * Reviewed and approved per TSF++ deviation procedure.
20
20
  */
21
+ import { fixupPluginRules } from '@eslint/compat';
21
22
  /**
22
23
  * Coerces a third-party ESLint plugin object to the canonical `ESLint.Plugin`
23
24
  * type accepted by flat config `plugins` records.
@@ -28,4 +29,15 @@
28
29
  export const coercePlugin = (plugin) =>
29
30
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- DEVIATION(1.6): see module JSDoc above
30
31
  plugin;
32
+ /**
33
+ * Coerces a plugin and additionally restores the rule-context methods ESLint 10
34
+ * removed (`context.getFilename()`, `context.getSourceCode()`, …).
35
+ *
36
+ * Use for plugins that have not shipped ESLint 10 support — currently
37
+ * eslint-plugin-react and eslint-plugin-jsx-a11y. Without the fixup,
38
+ * eslint-plugin-react 7.37.5 throws `contextOrFilename.getFilename is not a
39
+ * function` on the first linted file. Harmless under ESLint 9; drop the call
40
+ * for a plugin once its own peer range includes ESLint 10.
41
+ */
42
+ export const coerceLegacyPlugin = (plugin) => fixupPluginRules(coercePlugin(plugin));
31
43
  //# sourceMappingURL=plugin-compat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-compat.js","sourceRoot":"","sources":["../plugin-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAe,EAAiB,EAAE;AAC7D,mHAAmH;AACnH,MAAuB,CAAA"}
1
+ {"version":3,"file":"plugin-compat.js","sourceRoot":"","sources":["../plugin-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAe,EAAiB,EAAE;AAC7D,mHAAmH;AACnH,MAAuB,CAAA;AAEzB;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAe,EAAiB,EAAE,CACnE,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAS,QAAQ,CAAA;AASvC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAqG1B,CAAA;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAS,QAAQ,CAAA;AASvC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAsG1B,CAAA;AAED,eAAe,MAAM,CAAA"}
package/dist/react.js CHANGED
@@ -31,7 +31,7 @@ import reactHooksPlugin from 'eslint-plugin-react-hooks';
31
31
  import jsxA11yPlugin from 'eslint-plugin-jsx-a11y';
32
32
  import tanstackQueryPlugin from '@tanstack/eslint-plugin-query';
33
33
  import base from './base.js';
34
- import { coercePlugin } from './plugin-compat.js';
34
+ import { coerceLegacyPlugin, coercePlugin } from './plugin-compat.js';
35
35
  const config = [
36
36
  // ── Inherit all base TSF++ rules (applies to .ts and .tsx) ───────────────────
37
37
  ...base,
@@ -39,9 +39,10 @@ const config = [
39
39
  {
40
40
  files: ['**/*.tsx'],
41
41
  plugins: {
42
- 'react': coercePlugin(reactPlugin),
42
+ // react and jsx-a11y predate ESLint 10 — see coerceLegacyPlugin
43
+ 'react': coerceLegacyPlugin(reactPlugin),
43
44
  'react-hooks': coercePlugin(reactHooksPlugin),
44
- 'jsx-a11y': coercePlugin(jsxA11yPlugin),
45
+ 'jsx-a11y': coerceLegacyPlugin(jsxA11yPlugin),
45
46
  '@tanstack/query': coercePlugin(tanstackQueryPlugin),
46
47
  },
47
48
  settings: {
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,WAAW,MAAa,qBAAqB,CAAA;AACpD,OAAO,gBAAgB,MAAQ,2BAA2B,CAAA;AAC1D,wEAAwE;AACxE,OAAO,aAAa,MAAW,wBAAwB,CAAA;AACvD,OAAO,mBAAmB,MAAM,+BAA+B,CAAA;AAC/D,OAAO,IAAI,MAAoB,WAAW,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAQ,oBAAoB,CAAA;AAEnD,MAAM,MAAM,GAAoB;IAE9B,gFAAgF;IAChF,GAAG,IAAI;IAEP,gFAAgF;IAChF;QACE,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,OAAO,EAAE;YACP,OAAO,EAAc,YAAY,CAAC,WAAW,CAAC;YAC9C,aAAa,EAAQ,YAAY,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAW,YAAY,CAAC,aAAa,CAAC;YAChD,iBAAiB,EAAI,YAAY,CAAC,mBAAmB,CAAC;SACvD;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC7B;QACD,KAAK,EAAE;YAEL,0EAA0E;YAE1E,2EAA2E;YAC3E,4FAA4F;YAC5F,+CAA+C;YAC/C,qCAAqC,EAAE,CAAC,OAAO,EAAE;oBAC/C,eAAe,EAAK,gBAAgB;oBACpC,iBAAiB,EAAG,gBAAgB;iBACrC,CAAC;YAEF,gEAAgE;YAChE,sBAAsB,EAAO,KAAK;YAClC,0BAA0B,EAAG,KAAK;YAElC,0BAA0B;YAC1B,eAAe,EAAqB,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YAC/E,4BAA4B,EAAQ,OAAO,EAAI,2CAA2C;YAC1F,0BAA0B,EAAU,OAAO,EAAI,2BAA2B;YAC1E,qCAAqC,EAAE,OAAO,EAAE,oCAAoC;YACpF,yBAAyB,EAAW,OAAO;YAC3C,uBAAuB,EAAa,OAAO;YAC3C,+BAA+B,EAAK,OAAO;YAC3C,oBAAoB,EAAgB,OAAO;YAE3C,0EAA0E;YAE1E,8DAA8D;YAC9D,4BAA4B,EAAI,OAAO;YAEvC,2EAA2E;YAC3E,6BAA6B,EAAG,OAAO;YAEvC,2EAA2E;YAE3E,gEAAgE;YAChE,sFAAsF;YACtF,2EAA2E;YAE3E,2EAA2E;YAE3E,8DAA8D;YAC9D,uCAAuC,EAAG,OAAO;YACjD,yCAAyC,EAAE,OAAO;YAElD,0CAA0C;YAC1C,mBAAmB,EAAoB,OAAO;YAC9C,6BAA6B,EAAU,OAAO;YAC9C,uCAAuC,EAAE,OAAO;YAEhD,6BAA6B;YAC7B,qBAAqB,EAAG,OAAO;YAC/B,oBAAoB,EAAI,OAAO;YAE/B,sFAAsF;YACtF,uBAAuB,EAAE,MAAM;YAE/B,0EAA0E;YAE1E,+CAA+C;YAC/C,iCAAiC,EAAK,OAAO;YAE7C,uFAAuF;YACvF,uCAAuC,EAAE,OAAO;YAEhD,0EAA0E;YAC1E,qCAAqC,EAAE,OAAO;YAE9C,2EAA2E;YAE3E,yFAAyF;YACzF,kGAAkG;SACnG;KACF;IAED,gFAAgF;IAChF;QACE,KAAK,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;QACpC,KAAK,EAAE;YACL,4BAA4B,EAAG,OAAO;YACtC,6BAA6B,EAAE,OAAO;SACvC;KACF;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,WAAW,MAAa,qBAAqB,CAAA;AACpD,OAAO,gBAAgB,MAAQ,2BAA2B,CAAA;AAC1D,wEAAwE;AACxE,OAAO,aAAa,MAAW,wBAAwB,CAAA;AACvD,OAAO,mBAAmB,MAAM,+BAA+B,CAAA;AAC/D,OAAO,IAAI,MAAoB,WAAW,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErE,MAAM,MAAM,GAAoB;IAE9B,gFAAgF;IAChF,GAAG,IAAI;IAEP,gFAAgF;IAChF;QACE,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,OAAO,EAAE;YACP,gEAAgE;YAChE,OAAO,EAAc,kBAAkB,CAAC,WAAW,CAAC;YACpD,aAAa,EAAQ,YAAY,CAAC,gBAAgB,CAAC;YACnD,UAAU,EAAW,kBAAkB,CAAC,aAAa,CAAC;YACtD,iBAAiB,EAAI,YAAY,CAAC,mBAAmB,CAAC;SACvD;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC7B;QACD,KAAK,EAAE;YAEL,0EAA0E;YAE1E,2EAA2E;YAC3E,4FAA4F;YAC5F,+CAA+C;YAC/C,qCAAqC,EAAE,CAAC,OAAO,EAAE;oBAC/C,eAAe,EAAK,gBAAgB;oBACpC,iBAAiB,EAAG,gBAAgB;iBACrC,CAAC;YAEF,gEAAgE;YAChE,sBAAsB,EAAO,KAAK;YAClC,0BAA0B,EAAG,KAAK;YAElC,0BAA0B;YAC1B,eAAe,EAAqB,CAAC,OAAO,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;YAC/E,4BAA4B,EAAQ,OAAO,EAAI,2CAA2C;YAC1F,0BAA0B,EAAU,OAAO,EAAI,2BAA2B;YAC1E,qCAAqC,EAAE,OAAO,EAAE,oCAAoC;YACpF,yBAAyB,EAAW,OAAO;YAC3C,uBAAuB,EAAa,OAAO;YAC3C,+BAA+B,EAAK,OAAO;YAC3C,oBAAoB,EAAgB,OAAO;YAE3C,0EAA0E;YAE1E,8DAA8D;YAC9D,4BAA4B,EAAI,OAAO;YAEvC,2EAA2E;YAC3E,6BAA6B,EAAG,OAAO;YAEvC,2EAA2E;YAE3E,gEAAgE;YAChE,sFAAsF;YACtF,2EAA2E;YAE3E,2EAA2E;YAE3E,8DAA8D;YAC9D,uCAAuC,EAAG,OAAO;YACjD,yCAAyC,EAAE,OAAO;YAElD,0CAA0C;YAC1C,mBAAmB,EAAoB,OAAO;YAC9C,6BAA6B,EAAU,OAAO;YAC9C,uCAAuC,EAAE,OAAO;YAEhD,6BAA6B;YAC7B,qBAAqB,EAAG,OAAO;YAC/B,oBAAoB,EAAI,OAAO;YAE/B,sFAAsF;YACtF,uBAAuB,EAAE,MAAM;YAE/B,0EAA0E;YAE1E,+CAA+C;YAC/C,iCAAiC,EAAK,OAAO;YAE7C,uFAAuF;YACvF,uCAAuC,EAAE,OAAO;YAEhD,0EAA0E;YAC1E,qCAAqC,EAAE,OAAO;YAE9C,2EAA2E;YAE3E,yFAAyF;YACzF,kGAAkG;SACnG;KACF;IAED,gFAAgF;IAChF;QACE,KAAK,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;QACpC,KAAK,EAAE;YACL,4BAA4B,EAAG,OAAO;YACtC,6BAA6B,EAAE,OAAO;SACvC;KACF;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsfpp/eslint-config",
3
- "version": "1.1.0",
3
+ "version": "2.1.0",
4
4
  "description": "Shared ESLint flat configuration for TSF++ projects",
5
5
  "keywords": [
6
6
  "eslint",
@@ -36,14 +36,14 @@
36
36
  "test": "node --input-type=module --eval \"import './dist/base.js'\""
37
37
  },
38
38
  "engines": {
39
- "node": ">=18.18.0"
39
+ "node": "^20.19.0 || ^22.13.0 || >=24"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@tanstack/eslint-plugin-query": ">=5.0.0",
43
43
  "@typescript-eslint/eslint-plugin": ">=8.0.0",
44
44
  "@typescript-eslint/parser": ">=8.0.0",
45
- "eslint": ">=9.0.0",
46
- "eslint-plugin-functional": "^9.0.0",
45
+ "eslint": "^9.0.0 || ^10.0.0",
46
+ "eslint-plugin-functional": "^9.0.0 || ^10.0.0",
47
47
  "eslint-plugin-jsx-a11y": ">=6.0.0",
48
48
  "eslint-plugin-react": ">=7.0.0",
49
49
  "eslint-plugin-react-hooks": ">=5.0.0",
@@ -64,14 +64,17 @@
64
64
  }
65
65
  },
66
66
  "devDependencies": {
67
- "@tanstack/eslint-plugin-query": "^5.100.10",
68
- "@typescript-eslint/eslint-plugin": "^8.59.3",
69
- "@typescript-eslint/parser": "^8.59.3",
70
- "eslint": "^9.39.4",
71
- "eslint-plugin-functional": "^9.0.0",
67
+ "@tanstack/eslint-plugin-query": "^5.104.2",
68
+ "@typescript-eslint/eslint-plugin": "^8.71.2",
69
+ "@typescript-eslint/parser": "^8.71.2",
70
+ "eslint": "^10.12.0",
71
+ "eslint-plugin-functional": "^10.0.1",
72
72
  "eslint-plugin-jsx-a11y": "^6.10.2",
73
73
  "eslint-plugin-react": "^7.37.5",
74
74
  "eslint-plugin-react-hooks": "^7.1.1",
75
75
  "typescript": "^5.9.3"
76
+ },
77
+ "dependencies": {
78
+ "@eslint/compat": "^2.1.1"
76
79
  }
77
80
  }