From 05527916ad9d46e80b9ddb8d085b65157ea4007a Mon Sep 17 00:00:00 2001 From: Nathan Bierema Date: Tue, 14 Oct 2025 10:16:27 -0400 Subject: [PATCH] Update --- eslint.js.config.base.mjs | 3 +- eslint.js.react.jest.config.base.mjs | 11 +- eslint.ts.config.base.mjs | 98 ++++++++--------- eslint.ts.jest.config.base.mjs | 114 ++++++++++---------- eslint.ts.react.config.base.mjs | 156 ++++++++++++++------------- eslint.ts.react.jest.config.base.mjs | 148 ++++++++++++------------- package.json | 1 - pnpm-lock.yaml | 18 ---- 8 files changed, 270 insertions(+), 279 deletions(-) diff --git a/eslint.js.config.base.mjs b/eslint.js.config.base.mjs index 31f147f9..66a155c8 100644 --- a/eslint.js.config.base.mjs +++ b/eslint.js.config.base.mjs @@ -1,4 +1,5 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import eslintConfigPrettier from 'eslint-config-prettier'; -export default [eslint.configs.recommended, eslintConfigPrettier]; +export default defineConfig([eslint.configs.recommended, eslintConfigPrettier]); diff --git a/eslint.js.react.jest.config.base.mjs b/eslint.js.react.jest.config.base.mjs index 47997596..9b615fb4 100644 --- a/eslint.js.react.jest.config.base.mjs +++ b/eslint.js.react.jest.config.base.mjs @@ -1,11 +1,11 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import react from 'eslint-plugin-react'; -import { fixupPluginRules } from '@eslint/compat'; -import eslintPluginReactHooks from 'eslint-plugin-react-hooks'; +import reactHooks from 'eslint-plugin-react-hooks'; import jest from 'eslint-plugin-jest'; import eslintConfigPrettier from 'eslint-config-prettier'; -export default [ +export default defineConfig([ { files: ['test/**/*.js', 'test/**/*.jsx'], ...eslint.configs.recommended, @@ -25,8 +25,9 @@ export default [ { files: ['test/**/*.js', 'test/**/*.jsx'], plugins: { - 'react-hooks': fixupPluginRules(eslintPluginReactHooks), + 'react-hooks': reactHooks, }, + extends: ['react-hooks/recommended'], }, { files: ['test/**/*.js', 'test/**/*.jsx'], @@ -40,4 +41,4 @@ export default [ files: ['test/**/*.js', 'test/**/*.jsx'], ...eslintConfigPrettier, }, -]; +]); diff --git a/eslint.ts.config.base.mjs b/eslint.ts.config.base.mjs index 2af98f40..095a5533 100644 --- a/eslint.ts.config.base.mjs +++ b/eslint.ts.config.base.mjs @@ -1,55 +1,57 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import eslintConfigPrettier from 'eslint-config-prettier'; -export default (tsconfigRootDir, files = ['**/*.ts'], project = true) => [ - { - files, - ...eslint.configs.recommended, - }, - ...tseslint.configs.recommendedTypeChecked.map((config) => ({ - files, - ...config, - })), - ...tseslint.configs.stylisticTypeChecked.map((config) => ({ - files, - ...config, - })), - { - files, - languageOptions: { - parserOptions: { - project, - tsconfigRootDir, +export default (tsconfigRootDir, files = ['**/*.ts'], project = true) => + defineConfig([ + { + files, + ...eslint.configs.recommended, + }, + ...tseslint.configs.recommendedTypeChecked.map((config) => ({ + files, + ...config, + })), + ...tseslint.configs.stylisticTypeChecked.map((config) => ({ + files, + ...config, + })), + { + files, + languageOptions: { + parserOptions: { + project, + tsconfigRootDir, + }, }, }, - }, - { - files, - ...eslintConfigPrettier, - }, - { - files, - rules: { - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/prefer-optional-chain': 'off', - '@typescript-eslint/no-base-to-string': 'off', - '@typescript-eslint/consistent-indexed-object-style': 'off', - '@typescript-eslint/prefer-nullish-coalescing': 'off', - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/prefer-for-of': 'off', - '@typescript-eslint/non-nullable-type-assertion-style': 'off', - '@typescript-eslint/class-literal-property-style': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/prefer-string-starts-ends-with': 'off', - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/prefer-function-type': 'off', + { + files, + ...eslintConfigPrettier, }, - }, -]; + { + files, + rules: { + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/prefer-optional-chain': 'off', + '@typescript-eslint/no-base-to-string': 'off', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/non-nullable-type-assertion-style': 'off', + '@typescript-eslint/class-literal-property-style': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', + '@typescript-eslint/prefer-string-starts-ends-with': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/prefer-function-type': 'off', + }, + }, + ]); diff --git a/eslint.ts.jest.config.base.mjs b/eslint.ts.jest.config.base.mjs index fd916a03..d3ebd7be 100644 --- a/eslint.ts.jest.config.base.mjs +++ b/eslint.ts.jest.config.base.mjs @@ -1,64 +1,66 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import jest from 'eslint-plugin-jest'; import eslintConfigPrettier from 'eslint-config-prettier'; -export default (tsconfigRootDir) => [ - { - files: ['test/**/*.ts'], - ...eslint.configs.recommended, - }, - ...tseslint.configs.recommendedTypeChecked.map((config) => ({ - files: ['test/**/*.ts'], - ...config, - })), - ...tseslint.configs.stylisticTypeChecked.map((config) => ({ - files: ['test/**/*.ts'], - ...config, - })), - { - files: ['test/**/*.ts'], - languageOptions: { - parserOptions: { - project: ['./tsconfig.test.json'], - tsconfigRootDir, +export default (tsconfigRootDir) => + defineConfig([ + { + files: ['test/**/*.ts'], + ...eslint.configs.recommended, + }, + ...tseslint.configs.recommendedTypeChecked.map((config) => ({ + files: ['test/**/*.ts'], + ...config, + })), + ...tseslint.configs.stylisticTypeChecked.map((config) => ({ + files: ['test/**/*.ts'], + ...config, + })), + { + files: ['test/**/*.ts'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.test.json'], + tsconfigRootDir, + }, }, }, - }, - { - files: ['test/**/*.ts'], - ...jest.configs['flat/recommended'], - }, - { - files: ['test/**/*.ts'], - ...jest.configs['jest/style'], - }, - { - files: ['test/**/*.ts'], - ...eslintConfigPrettier, - }, - { - files: ['test/**/*.ts'], - rules: { - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/prefer-optional-chain': 'off', - '@typescript-eslint/no-base-to-string': 'off', - '@typescript-eslint/consistent-indexed-object-style': 'off', - '@typescript-eslint/prefer-nullish-coalescing': 'off', - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/prefer-for-of': 'off', - '@typescript-eslint/non-nullable-type-assertion-style': 'off', - '@typescript-eslint/class-literal-property-style': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/prefer-string-starts-ends-with': 'off', - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/prefer-function-type': 'off', + { + files: ['test/**/*.ts'], + ...jest.configs['flat/recommended'], }, - }, -]; + { + files: ['test/**/*.ts'], + ...jest.configs['jest/style'], + }, + { + files: ['test/**/*.ts'], + ...eslintConfigPrettier, + }, + { + files: ['test/**/*.ts'], + rules: { + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/prefer-optional-chain': 'off', + '@typescript-eslint/no-base-to-string': 'off', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/non-nullable-type-assertion-style': 'off', + '@typescript-eslint/class-literal-property-style': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', + '@typescript-eslint/prefer-string-starts-ends-with': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/prefer-function-type': 'off', + }, + }, + ]); diff --git a/eslint.ts.react.config.base.mjs b/eslint.ts.react.config.base.mjs index 110f1e8a..bd7ae1b3 100644 --- a/eslint.ts.react.config.base.mjs +++ b/eslint.ts.react.config.base.mjs @@ -1,89 +1,91 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import react from 'eslint-plugin-react'; -import { fixupPluginRules } from '@eslint/compat'; -import eslintPluginReactHooks from 'eslint-plugin-react-hooks'; +import reactHooks from 'eslint-plugin-react-hooks'; import eslintConfigPrettier from 'eslint-config-prettier'; export default ( tsconfigRootDir, files = ['**/*.ts', '**/*.tsx'], project = true, -) => [ - { - files, - ...eslint.configs.recommended, - }, - ...tseslint.configs.recommendedTypeChecked.map((config) => ({ - files, - ...config, - })), - ...tseslint.configs.stylisticTypeChecked.map((config) => ({ - files, - ...config, - })), - { - files, - languageOptions: { - parserOptions: { - project, - tsconfigRootDir, - }, +) => + defineConfig([ + { + files, + ...eslint.configs.recommended, }, - }, - { - files, - ...react.configs.flat.recommended, - }, - { - files, - settings: { - react: { - version: 'detect', - }, - }, - }, - { - files, - plugins: { - 'react-hooks': fixupPluginRules(eslintPluginReactHooks), - }, - }, - { - files, - ...eslintConfigPrettier, - }, - { - files, - rules: { - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-misused-promises': [ - 'error', - { - checksVoidReturn: { - attributes: false, - }, + ...tseslint.configs.recommendedTypeChecked.map((config) => ({ + files, + ...config, + })), + ...tseslint.configs.stylisticTypeChecked.map((config) => ({ + files, + ...config, + })), + { + files, + languageOptions: { + parserOptions: { + project, + tsconfigRootDir, }, - ], - '@typescript-eslint/prefer-optional-chain': 'off', - '@typescript-eslint/no-base-to-string': 'off', - '@typescript-eslint/consistent-indexed-object-style': 'off', - '@typescript-eslint/prefer-nullish-coalescing': 'off', - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/prefer-for-of': 'off', - '@typescript-eslint/non-nullable-type-assertion-style': 'off', - '@typescript-eslint/class-literal-property-style': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/prefer-string-starts-ends-with': 'off', - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/prefer-function-type': 'off', - 'react/prop-types': 'off', + }, }, - }, -]; + { + files, + ...react.configs.flat.recommended, + }, + { + files, + settings: { + react: { + version: 'detect', + }, + }, + }, + { + files, + plugins: { + 'react-hooks': reactHooks, + }, + extends: ['react-hooks/recommended-latest'], + }, + { + files, + ...eslintConfigPrettier, + }, + { + files, + rules: { + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: { + attributes: false, + }, + }, + ], + '@typescript-eslint/prefer-optional-chain': 'off', + '@typescript-eslint/no-base-to-string': 'off', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/non-nullable-type-assertion-style': 'off', + '@typescript-eslint/class-literal-property-style': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', + '@typescript-eslint/prefer-string-starts-ends-with': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/prefer-function-type': 'off', + 'react/prop-types': 'off', + }, + }, + ]); diff --git a/eslint.ts.react.jest.config.base.mjs b/eslint.ts.react.jest.config.base.mjs index f0db2ab2..1c8d5924 100644 --- a/eslint.ts.react.jest.config.base.mjs +++ b/eslint.ts.react.jest.config.base.mjs @@ -1,85 +1,87 @@ +import { defineConfig } from 'eslint/config'; import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; import react from 'eslint-plugin-react'; -import { fixupPluginRules } from '@eslint/compat'; -import eslintPluginReactHooks from 'eslint-plugin-react-hooks'; +import reactHooks from 'eslint-plugin-react-hooks'; import jest from 'eslint-plugin-jest'; import eslintConfigPrettier from 'eslint-config-prettier'; -export default (tsconfigRootDir) => [ - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...eslint.configs.recommended, - }, - ...tseslint.configs.recommendedTypeChecked.map((config) => ({ - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...config, - })), - ...tseslint.configs.stylisticTypeChecked.map((config) => ({ - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...config, - })), - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - languageOptions: { - parserOptions: { - project: ['./tsconfig.test.json'], - tsconfigRootDir, +export default (tsconfigRootDir) => + defineConfig([ + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...eslint.configs.recommended, + }, + ...tseslint.configs.recommendedTypeChecked.map((config) => ({ + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...config, + })), + ...tseslint.configs.stylisticTypeChecked.map((config) => ({ + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...config, + })), + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + languageOptions: { + parserOptions: { + project: ['./tsconfig.test.json'], + tsconfigRootDir, + }, }, }, - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...react.configs.flat.recommended, - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - settings: { - react: { - version: 'detect', + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...react.configs.flat.recommended, + }, + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + settings: { + react: { + version: 'detect', + }, }, }, - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - plugins: { - 'react-hooks': fixupPluginRules(eslintPluginReactHooks), + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + plugins: { + 'react-hooks': reactHooks, + }, + extends: ['react-hooks/recommended-latest'], }, - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...jest.configs['flat/recommended'], - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...jest.configs['jest/style'], - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - ...eslintConfigPrettier, - }, - { - files: ['test/**/*.ts', 'test/**/*.tsx'], - rules: { - '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/prefer-optional-chain': 'off', - '@typescript-eslint/no-base-to-string': 'off', - '@typescript-eslint/consistent-indexed-object-style': 'off', - '@typescript-eslint/prefer-nullish-coalescing': 'off', - '@typescript-eslint/consistent-type-definitions': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/prefer-for-of': 'off', - '@typescript-eslint/non-nullable-type-assertion-style': 'off', - '@typescript-eslint/class-literal-property-style': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/prefer-string-starts-ends-with': 'off', - '@typescript-eslint/no-duplicate-type-constituents': 'off', - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/prefer-function-type': 'off', + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...jest.configs['flat/recommended'], }, - }, -]; + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...jest.configs['jest/style'], + }, + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + ...eslintConfigPrettier, + }, + { + files: ['test/**/*.ts', 'test/**/*.tsx'], + rules: { + '@typescript-eslint/no-unsafe-return': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/prefer-optional-chain': 'off', + '@typescript-eslint/no-base-to-string': 'off', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/prefer-for-of': 'off', + '@typescript-eslint/non-nullable-type-assertion-style': 'off', + '@typescript-eslint/class-literal-property-style': 'off', + '@typescript-eslint/no-redundant-type-constituents': 'off', + '@typescript-eslint/prefer-string-starts-ends-with': 'off', + '@typescript-eslint/no-duplicate-type-constituents': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/prefer-function-type': 'off', + }, + }, + ]); diff --git a/package.json b/package.json index e2d4f101..aec9b3dd 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "devDependencies": { "@babel/core": "^7.28.4", "@changesets/cli": "^2.29.7", - "@eslint/compat": "^1.4.0", "@eslint/js": "^9.37.0", "eslint": "^9.37.0", "eslint-config-prettier": "^10.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 272d12fc..ce024597 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,9 +25,6 @@ importers: '@changesets/cli': specifier: ^2.29.7 version: 2.29.7(@types/node@22.18.10) - '@eslint/compat': - specifier: ^1.4.0 - version: 1.4.0(eslint@9.37.0) '@eslint/js': specifier: ^9.37.0 version: 9.37.0 @@ -3862,15 +3859,6 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.4.0': - resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.40 || 9 - peerDependenciesMeta: - eslint: - optional: true - '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -11846,12 +11834,6 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.4.0(eslint@9.37.0)': - dependencies: - '@eslint/core': 0.16.0 - optionalDependencies: - eslint: 9.37.0 - '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6