diff --git a/.pkgs/configs/eslint.js b/.pkgs/configs/eslint.js index db2a7b102..7e864076e 100644 --- a/.pkgs/configs/eslint.js +++ b/.pkgs/configs/eslint.js @@ -88,130 +88,124 @@ const p11tGroups = { }, groups: ["id", "type", "meta", "alias", "rules", "unknown"], }; -export const strictTypeChecked = defineConfig([ - { - ignores: GLOB_JS, - }, - { - extends: [ - js.configs.recommended, - ...tseslint.configs.strict, +export const strictTypeChecked = defineConfig({ + ignores: GLOB_JS, +}, { + extends: [ + js.configs.recommended, + ...tseslint.configs.strict, + ], + files: GLOB_TS, + rules: { + eqeqeq: ["error", "smart"], + "no-console": "error", + "no-else-return": "error", + "no-fallthrough": ["error", { commentPattern: ".*intentional fallthrough.*" }], + "no-implicit-coercion": ["error", { allow: ["!!"] }], + "prefer-object-has-own": "error", + "no-restricted-syntax": [ + "error", + { + message: "no typescript named import", + selector: "ImportDeclaration[source.value='typescript'] ImportSpecifier", + }, ], - files: GLOB_TS, - rules: { - eqeqeq: ["error", "smart"], - "no-console": "error", - "no-else-return": "error", - "no-fallthrough": ["error", { commentPattern: ".*intentional fallthrough.*" }], - "no-implicit-coercion": ["error", { allow: ["!!"] }], - "prefer-object-has-own": "error", - "no-restricted-syntax": [ - "error", - { - message: "no typescript named import", - selector: "ImportDeclaration[source.value='typescript'] ImportSpecifier", - }, - ], - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "ts-check": false, - "ts-expect-error": "allow-with-description", - "ts-ignore": true, - "ts-nocheck": true, - }, - ], - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/consistent-type-exports": "error", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-confusing-void-expression": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/no-misused-promises": "warn", - "@typescript-eslint/no-namespace": "off", - "@typescript-eslint/no-unnecessary-parameter-property-assignment": "warn", - "@typescript-eslint/no-unused-vars": ["warn", { caughtErrors: "all" }], - "@typescript-eslint/strict-boolean-expressions": ["error", { - allowAny: false, - allowNullableBoolean: false, - allowNullableEnum: false, - allowNullableNumber: false, - allowNullableObject: false, - allowNullableString: false, - allowNumber: true, - allowString: false, - }], - }, - }, - { - extends: [ - jsdoc({ config: "flat/recommended-typescript-error" }), - pluginDeMorgan.configs.recommended, - pluginPerfectionist.configs["recommended-natural"], - pluginRegexp.configs["flat/recommended"], + "@typescript-eslint/ban-ts-comment": [ + "error", + { + "ts-check": false, + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + }, ], - files: GLOB_TS, - plugins: { - ["@stylistic"]: stylistic, - ["function"]: pluginFunction, - ["unicorn"]: pluginUnicorn, - }, - rules: { - "function/function-return-boolean": ["error", { pattern: "/^(is|has|can|should)/" }], - "@stylistic/arrow-parens": ["warn", "always"], - "@stylistic/no-multi-spaces": ["warn"], - "@stylistic/operator-linebreak": "off", - "@stylistic/quote-props": ["error", "as-needed"], - "perfectionist/sort-exports": "off", - "perfectionist/sort-imports": "off", - "perfectionist/sort-interfaces": [ - "warn", - { ...p11tOptions, ...p11tGroups }, - ], - "perfectionist/sort-intersection-types": "off", - "perfectionist/sort-modules": "off", - "perfectionist/sort-named-exports": "off", - "perfectionist/sort-named-imports": "off", - "perfectionist/sort-object-types": [ - "warn", - { ...p11tOptions, ...p11tGroups }, - ], - "perfectionist/sort-objects": [ - "warn", - { ...p11tOptions, ...p11tGroups }, - ], - "perfectionist/sort-switch-case": "off", - "perfectionist/sort-union-types": "off", - "jsdoc/check-param-names": "warn", - "jsdoc/check-tag-names": "warn", - "jsdoc/informative-docs": "off", - "jsdoc/lines-before-block": "off", - "jsdoc/require-jsdoc": "off", - "jsdoc/require-param": "warn", - "jsdoc/require-param-description": "warn", - "jsdoc/require-returns": "off", - "jsdoc/require-yields": "warn", - "jsdoc/tag-lines": "off", - "unicorn/template-indent": [ - "warn", - { - comments: templateIndentTags, - tags: templateIndentTags, - }, - ], - }, + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/consistent-type-exports": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-confusing-void-expression": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-misused-promises": "warn", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-unnecessary-parameter-property-assignment": "warn", + "@typescript-eslint/no-unused-vars": ["warn", { caughtErrors: "all" }], + "@typescript-eslint/strict-boolean-expressions": ["error", { + allowAny: false, + allowNullableBoolean: false, + allowNullableEnum: false, + allowNullableNumber: false, + allowNullableObject: false, + allowNullableString: false, + allowNumber: true, + allowString: false, + }], }, -]); -export const disableTypeChecked = defineConfig([ - { - extends: [ - tseslint.configs.disableTypeChecked, +}, { + extends: [ + jsdoc({ config: "flat/recommended-typescript-error" }), + pluginDeMorgan.configs.recommended, + pluginPerfectionist.configs["recommended-natural"], + pluginRegexp.configs["flat/recommended"], + ], + files: GLOB_TS, + plugins: { + ["@stylistic"]: stylistic, + ["function"]: pluginFunction, + ["unicorn"]: pluginUnicorn, + }, + rules: { + "function/function-return-boolean": ["error", { pattern: "/^(is|has|can|should)/" }], + "@stylistic/arrow-parens": ["warn", "always"], + "@stylistic/no-multi-spaces": ["warn"], + "@stylistic/operator-linebreak": "off", + "@stylistic/quote-props": ["error", "as-needed"], + "perfectionist/sort-exports": "off", + "perfectionist/sort-imports": "off", + "perfectionist/sort-interfaces": [ + "warn", + { ...p11tOptions, ...p11tGroups }, ], - rules: { - "function/function-return-boolean": "off", - }, + "perfectionist/sort-intersection-types": "off", + "perfectionist/sort-modules": "off", + "perfectionist/sort-named-exports": "off", + "perfectionist/sort-named-imports": "off", + "perfectionist/sort-object-types": [ + "warn", + { ...p11tOptions, ...p11tGroups }, + ], + "perfectionist/sort-objects": [ + "warn", + { ...p11tOptions, ...p11tGroups }, + ], + "perfectionist/sort-switch-case": "off", + "perfectionist/sort-union-types": "off", + "jsdoc/check-param-names": "warn", + "jsdoc/check-tag-names": "warn", + "jsdoc/informative-docs": "off", + "jsdoc/lines-before-block": "off", + "jsdoc/require-jsdoc": "off", + "jsdoc/require-param": "warn", + "jsdoc/require-param-description": "warn", + "jsdoc/require-returns": "off", + "jsdoc/require-yields": "warn", + "jsdoc/tag-lines": "off", + "unicorn/template-indent": [ + "warn", + { + comments: templateIndentTags, + tags: templateIndentTags, + }, + ], + }, +}); +export const disableTypeChecked = defineConfig({ + extends: [ + tseslint.configs.disableTypeChecked, + ], + rules: { + "function/function-return-boolean": "off", }, -]); +}); /** * Common ESLint JS rules to disable that are problematic when using TypeScript. */ diff --git a/.pkgs/configs/eslint.ts b/.pkgs/configs/eslint.ts index cb0435ce4..3906a6eed 100644 --- a/.pkgs/configs/eslint.ts +++ b/.pkgs/configs/eslint.ts @@ -98,7 +98,7 @@ const p11tGroups = { groups: ["id", "type", "meta", "alias", "rules", "unknown"], }; -export const strictTypeChecked: Linter.Config[] = defineConfig([ +export const strictTypeChecked: Linter.Config[] = defineConfig( { ignores: GLOB_JS, }, @@ -217,9 +217,9 @@ export const strictTypeChecked: Linter.Config[] = defineConfig([ ], }, }, -]); +); -export const disableTypeChecked: Linter.Config[] = defineConfig([ +export const disableTypeChecked: Linter.Config[] = defineConfig( { extends: [ tseslint.configs.disableTypeChecked, @@ -228,7 +228,7 @@ export const disableTypeChecked: Linter.Config[] = defineConfig([ "function/function-return-boolean": "off", }, }, -]); +); /** * Common ESLint JS rules to disable that are problematic when using TypeScript. diff --git a/README.md b/README.md index 8605c6215..d84eee39c 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ import eslintJs from "@eslint/js"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], @@ -111,7 +111,7 @@ export default defineConfig([ "@eslint-react/no-missing-key": "warn", }, }, -]); +); ``` [Full Installation Guide ↗](https://eslint-react.xyz/docs/getting-started/typescript) diff --git a/apps/website/content/docs/getting-started/javascript.mdx b/apps/website/content/docs/getting-started/javascript.mdx index ab25694a1..c107682a2 100644 --- a/apps/website/content/docs/getting-started/javascript.mdx +++ b/apps/website/content/docs/getting-started/javascript.mdx @@ -29,7 +29,7 @@ import { Step, Steps } from "fumadocs-ui/components/steps"; import eslintReact from "@eslint-react/eslint-plugin"; import { defineConfig } from "eslint/config"; - export default defineConfig([ + export default defineConfig( { files: ["**/*.js", "**/*.jsx"], @@ -56,7 +56,7 @@ import { Step, Steps } from "fumadocs-ui/components/steps"; "@eslint-react/no-missing-key": "warn", }, }, - ]); + ); ``` diff --git a/apps/website/content/docs/getting-started/typescript.mdx b/apps/website/content/docs/getting-started/typescript.mdx index 766e2d0f2..a467ea61e 100644 --- a/apps/website/content/docs/getting-started/typescript.mdx +++ b/apps/website/content/docs/getting-started/typescript.mdx @@ -29,7 +29,7 @@ import { Step, Steps } from "fumadocs-ui/components/steps"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; - export default defineConfig([ + export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], @@ -59,7 +59,7 @@ import { Step, Steps } from "fumadocs-ui/components/steps"; "@eslint-react/no-missing-key": "warn", }, }, - ]); + ); ``` diff --git a/apps/website/eslint.config.ts b/apps/website/eslint.config.ts index 479e66b58..dbdaf21b3 100644 --- a/apps/website/eslint.config.ts +++ b/apps/website/eslint.config.ts @@ -25,8 +25,7 @@ const GLOB_IGNORES = [ const dirname = fileURLToPath(new URL(".", import.meta.url)); const gitignore = fileURLToPath(new URL(".gitignore", import.meta.url)); -export default defineConfig([ - // @ts-expect-error - types issue +export default defineConfig( includeIgnoreFile(gitignore, "Imported .gitignore patterns"), globalIgnores(GLOB_IGNORES), { @@ -89,4 +88,4 @@ export default defineConfig([ "no-undef": "off", }, }, -]); +); diff --git a/eslint.config.ts b/eslint.config.ts index e68abf763..b69c2e6f2 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -21,7 +21,7 @@ import tseslint from "typescript-eslint"; const dirname = fileURLToPath(new URL(".", import.meta.url)); const gitignore = fileURLToPath(new URL(".gitignore", import.meta.url)); -export default defineConfig([ +export default defineConfig( includeIgnoreFile(gitignore, "Imported .gitignore patterns") as never, globalIgnores([ ...GLOB_IGNORES, @@ -106,4 +106,4 @@ export default defineConfig([ }, }, disableProblematicEslintJsRules, -]); +); diff --git a/examples/next/eslint.config.js b/examples/next/eslint.config.js index a0d380874..9139adc0a 100644 --- a/examples/next/eslint.config.js +++ b/examples/next/eslint.config.js @@ -17,7 +17,7 @@ const GLOB_CONFIG = ["**/*.config.{js,mjs,ts,tsx}"]; const gitignore = fileURLToPath(new URL(".gitignore", import.meta.url)); -export default defineConfig([ +export default defineConfig( includeIgnoreFile(gitignore, "Imported .gitignore patterns"), { files: GLOB_TS, @@ -68,4 +68,4 @@ export default defineConfig([ "no-console": "off", }, }, -]); +); diff --git a/examples/react-dom-js/eslint.config.js b/examples/react-dom-js/eslint.config.js index 9524b89db..ce8299fb7 100644 --- a/examples/react-dom-js/eslint.config.js +++ b/examples/react-dom-js/eslint.config.js @@ -8,7 +8,7 @@ import globals from "globals"; import JSCONFIG_APP from "./jsconfig.app.json" with { type: "json" }; import JSCONFIG_NODE from "./jsconfig.node.json" with { type: "json" }; -export default defineConfig([ +export default defineConfig( // base configuration for browser environment source files { files: JSCONFIG_APP.include, @@ -56,4 +56,4 @@ export default defineConfig([ eslintPluginReactRefresh.configs.recommended, ], }, -]); +); diff --git a/examples/react-dom/eslint.config.js b/examples/react-dom/eslint.config.js index 3bea987dd..cc6be746f 100644 --- a/examples/react-dom/eslint.config.js +++ b/examples/react-dom/eslint.config.js @@ -12,7 +12,7 @@ import TSCONFIG_NODE from "./tsconfig.node.json" with { type: "json" }; const GLOB_TS = ["**/*.ts", "**/*.tsx"]; -export default defineConfig([ +export default defineConfig( { files: GLOB_TS, extends: [ @@ -58,4 +58,4 @@ export default defineConfig([ eslintPluginReactRefresh.configs.recommended, ], }, -]); +); diff --git a/examples/with-babel-eslint-parser/eslint.config.js b/examples/with-babel-eslint-parser/eslint.config.js index 484dcc81b..defac3304 100644 --- a/examples/with-babel-eslint-parser/eslint.config.js +++ b/examples/with-babel-eslint-parser/eslint.config.js @@ -21,7 +21,7 @@ const disableProblematicEslintJsRules = { }, }; -export default defineConfig([ +export default defineConfig( // base configuration for browser environment source files { files: JSCONFIG_APP.include, @@ -80,4 +80,4 @@ export default defineConfig([ ], }, disableProblematicEslintJsRules, -]); +); diff --git a/examples/with-ts-blank-eslint-parser/eslint.config.js b/examples/with-ts-blank-eslint-parser/eslint.config.js index 87f943685..1de72c524 100644 --- a/examples/with-ts-blank-eslint-parser/eslint.config.js +++ b/examples/with-ts-blank-eslint-parser/eslint.config.js @@ -17,7 +17,7 @@ const disableProblematicEslintJsRules = { }, }; -export default defineConfig([ +export default defineConfig( // base configuration for browser environment source files { files: TSCONFIG_APP.include, @@ -54,4 +54,4 @@ export default defineConfig([ ], }, disableProblematicEslintJsRules, -]); +); diff --git a/packages/plugins/eslint-plugin-react-debug/README.md b/packages/plugins/eslint-plugin-react-debug/README.md index d357acfd7..6cbb6f1d3 100644 --- a/packages/plugins/eslint-plugin-react-debug/README.md +++ b/packages/plugins/eslint-plugin-react-debug/README.md @@ -22,7 +22,7 @@ import reactDebug from "eslint-plugin-react-debug"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -42,7 +42,7 @@ export default defineConfig([ "react-debug/function-component": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin-react-dom/README.md b/packages/plugins/eslint-plugin-react-dom/README.md index b59f0a040..ec235d856 100644 --- a/packages/plugins/eslint-plugin-react-dom/README.md +++ b/packages/plugins/eslint-plugin-react-dom/README.md @@ -20,7 +20,7 @@ import reactDom from "eslint-plugin-react-dom"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -40,7 +40,7 @@ export default defineConfig([ "react-dom/no-dangerously-set-innerhtml": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin-react-hooks-extra/README.md b/packages/plugins/eslint-plugin-react-hooks-extra/README.md index 1985f0b21..060e3810a 100644 --- a/packages/plugins/eslint-plugin-react-hooks-extra/README.md +++ b/packages/plugins/eslint-plugin-react-hooks-extra/README.md @@ -20,7 +20,7 @@ import reactHooksExtra from "eslint-plugin-react-hooks-extra"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -40,7 +40,7 @@ export default defineConfig([ "react-hooks-extra/no-direct-set-state-in-use-effect": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin-react-naming-convention/README.md b/packages/plugins/eslint-plugin-react-naming-convention/README.md index ef9f182dd..46aa9a459 100644 --- a/packages/plugins/eslint-plugin-react-naming-convention/README.md +++ b/packages/plugins/eslint-plugin-react-naming-convention/README.md @@ -20,7 +20,7 @@ import reactNamingConvention from "eslint-plugin-react-naming-convention"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -42,7 +42,7 @@ export default defineConfig([ "react-naming-convention/component-name": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin-react-web-api/README.md b/packages/plugins/eslint-plugin-react-web-api/README.md index 551d32100..e1c1f6ee0 100644 --- a/packages/plugins/eslint-plugin-react-web-api/README.md +++ b/packages/plugins/eslint-plugin-react-web-api/README.md @@ -20,7 +20,7 @@ import reactWebApi from "eslint-plugin-react-web-api"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -40,7 +40,7 @@ export default defineConfig([ "react-web-api/no-leaked-event-listener": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin-react-x/README.md b/packages/plugins/eslint-plugin-react-x/README.md index 5da492ab1..b97bc930b 100644 --- a/packages/plugins/eslint-plugin-react-x/README.md +++ b/packages/plugins/eslint-plugin-react-x/README.md @@ -20,7 +20,7 @@ import react from "eslint-plugin-react-x"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], extends: [ @@ -40,7 +40,7 @@ export default defineConfig([ "react-x/no-class-component": "warn", }, }, -]); +); ``` ## Rules diff --git a/packages/plugins/eslint-plugin/README.md b/packages/plugins/eslint-plugin/README.md index aed01649f..38d1c8f63 100644 --- a/packages/plugins/eslint-plugin/README.md +++ b/packages/plugins/eslint-plugin/README.md @@ -81,7 +81,7 @@ import eslintJs from "@eslint/js"; import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; -export default defineConfig([ +export default defineConfig( { files: ["**/*.ts", "**/*.tsx"], @@ -111,7 +111,7 @@ export default defineConfig([ "@eslint-react/no-missing-key": "warn", }, }, -]); +); ``` [Full Installation Guide ↗](https://eslint-react.xyz/docs/getting-started/typescript)