From 641d094ffc9c1a744094bda3a072098e59ba2dcf Mon Sep 17 00:00:00 2001 From: Eva1ent Date: Tue, 19 Nov 2024 08:36:27 +0800 Subject: [PATCH] refactor: update the default behavior of import check, closes #858 --- .../docs/functions/isInitializedFromReact.md | 2 +- .../core/src/is-initialized-from-react.ts | 4 +- .../src/rules/is-from-react.spec.ts | 42 +++++++-------- .../eslint-plugin-react-dom/src/index.ts | 1 - .../src/rules/use-state.spec.ts | 51 +++++++++++++++++++ .../eslint-plugin-react-web-api/src/index.ts | 4 +- .../eslint-plugin-react-x/src/index.ts | 2 +- .../src/rules/no-children-count.spec.ts | 2 +- .../src/rules/no-children-for-each.spec.ts | 2 +- .../src/rules/no-children-map.spec.ts | 2 +- .../src/rules/no-children-only.spec.ts | 2 +- .../src/rules/no-children-to-array.spec.ts | 2 +- .../src/rules/no-useless-fragment.spec.ts | 2 +- .../rules/prefer-shorthand-fragment.spec.ts | 2 +- .../INITIAL_ESLINT_REACT_SETTINGS.md | 6 --- packages/shared/src/schemas.ts | 2 +- packages/shared/src/settings.ts | 4 +- 17 files changed, 86 insertions(+), 46 deletions(-) diff --git a/packages/core/docs/functions/isInitializedFromReact.md b/packages/core/docs/functions/isInitializedFromReact.md index 7b47c9116..8167a0973 100644 --- a/packages/core/docs/functions/isInitializedFromReact.md +++ b/packages/core/docs/functions/isInitializedFromReact.md @@ -20,7 +20,7 @@ The top-level identifier's name Initial scope to search for the identifier -• **settings**: `Partial`\<`Pick`\<`object`, `"importSource"` \| `"skipImportCheck"`\>\> +• **settings**: `Partial`\<`Pick`\<`object`, `"importSource"` \| `"strictImportCheck"`\>\> ESLint React settings diff --git a/packages/core/src/is-initialized-from-react.ts b/packages/core/src/is-initialized-from-react.ts index aa80fc410..35b8a1995 100644 --- a/packages/core/src/is-initialized-from-react.ts +++ b/packages/core/src/is-initialized-from-react.ts @@ -15,9 +15,9 @@ import { isMatching, match } from "ts-pattern"; export function isInitializedFromReact( name: string, initialScope: Scope, - settings: Partial>, + settings: Partial>, ): boolean { - if (settings.skipImportCheck) return true; + if (!settings.strictImportCheck) return true; // Optimistic assertion when identifier is named react if (name.toLowerCase() === "react") return true; const { importSource = "react" } = settings; diff --git a/packages/plugins/eslint-plugin-react-debug/src/rules/is-from-react.spec.ts b/packages/plugins/eslint-plugin-react-debug/src/rules/is-from-react.spec.ts index 39cc39a3f..d7eeb6abe 100644 --- a/packages/plugins/eslint-plugin-react-debug/src/rules/is-from-react.spec.ts +++ b/packages/plugins/eslint-plugin-react-debug/src/rules/is-from-react.spec.ts @@ -27,7 +27,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -45,7 +45,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -66,7 +66,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -85,7 +85,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -107,7 +107,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -132,7 +132,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -154,7 +154,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -171,7 +171,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -189,7 +189,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -210,7 +210,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -229,7 +229,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -251,7 +251,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -276,7 +276,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "@pika/react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -296,7 +296,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -316,7 +316,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -330,7 +330,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -342,7 +342,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -354,7 +354,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -366,7 +366,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -380,7 +380,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, @@ -396,7 +396,7 @@ ruleTester.run(RULE_NAME, rule, { settings: { "react-x": { importSource: "react", - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-dom/src/index.ts b/packages/plugins/eslint-plugin-react-dom/src/index.ts index 5f0cf45fe..70aeeed8c 100644 --- a/packages/plugins/eslint-plugin-react-dom/src/index.ts +++ b/packages/plugins/eslint-plugin-react-dom/src/index.ts @@ -27,7 +27,6 @@ const DEFAULT_ESLINT_REACT_SETTINGS = { ], }, ], - skipImportCheck: false, } as const satisfies ESLintReactSettings; export default { diff --git a/packages/plugins/eslint-plugin-react-naming-convention/src/rules/use-state.spec.ts b/packages/plugins/eslint-plugin-react-naming-convention/src/rules/use-state.spec.ts index 164d25b35..f50f91b85 100644 --- a/packages/plugins/eslint-plugin-react-naming-convention/src/rules/use-state.spec.ts +++ b/packages/plugins/eslint-plugin-react-naming-convention/src/rules/use-state.spec.ts @@ -3,6 +3,43 @@ import rule, { RULE_NAME } from "./use-state"; ruleTester.run(RULE_NAME, rule, { invalid: [ + { + code: /* tsx */ ` + function Component() { + const [state, setValue] = useState(0); + + return
; + } + `, + errors: [{ + messageId: "useState", + data: { + setterName: "setState", + stateName: "state", + }, + }], + }, + { + code: /* tsx */ ` + function Component() { + const [state, setValue] = useState(0); + + return
; + } + `, + errors: [{ + messageId: "useState", + data: { + setterName: "setState", + stateName: "state", + }, + }], + settings: { + "react-x": { + strictImportCheck: false, + }, + }, + }, { code: /* tsx */ ` import { useState } from "react"; @@ -112,5 +149,19 @@ ruleTester.run(RULE_NAME, rule, { return
; } `, + { + code: /* tsx */ ` + function Component() { + const [state, setValue] = useState(0); + + return
; + } + `, + settings: { + "react-x": { + strictImportCheck: true, + }, + }, + }, ], }); diff --git a/packages/plugins/eslint-plugin-react-web-api/src/index.ts b/packages/plugins/eslint-plugin-react-web-api/src/index.ts index c6496dd7e..bdf9e65d3 100644 --- a/packages/plugins/eslint-plugin-react-web-api/src/index.ts +++ b/packages/plugins/eslint-plugin-react-web-api/src/index.ts @@ -6,9 +6,7 @@ import noLeakedInterval from "./rules/no-leaked-interval"; import noLeakedResizeObserver from "./rules/no-leaked-resize-observer"; import noLeakedTimeout from "./rules/no-leaked-timeout"; -const DEFAULT_ESLINT_REACT_SETTINGS = { - skipImportCheck: true, -} as const satisfies ESLintReactSettings; +const DEFAULT_ESLINT_REACT_SETTINGS = {} as const satisfies ESLintReactSettings; export default { meta: { diff --git a/packages/plugins/eslint-plugin-react-x/src/index.ts b/packages/plugins/eslint-plugin-react-x/src/index.ts index 660dc8eee..6fb8769a3 100644 --- a/packages/plugins/eslint-plugin-react-x/src/index.ts +++ b/packages/plugins/eslint-plugin-react-x/src/index.ts @@ -59,7 +59,7 @@ const DEFAULT_ESLINT_REACT_SETTINGS = { useLayoutEffect: ["useIsomorphicLayoutEffect"], }, polymorphicPropName: "as", - skipImportCheck: false, + strictImportCheck: true, version: "detect", } as const satisfies ESLintReactSettings; diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-count.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-count.spec.ts index fca160161..42709f495 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-count.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-count.spec.ts @@ -96,7 +96,7 @@ ruleTester.run(RULE_NAME, rule, { `, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-for-each.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-for-each.spec.ts index 221ab6bfa..f0de11a71 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-for-each.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-for-each.spec.ts @@ -92,7 +92,7 @@ ruleTester.run(RULE_NAME, rule, { `, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-map.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-map.spec.ts index 00a0db46f..af855096b 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-map.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-map.spec.ts @@ -106,7 +106,7 @@ ruleTester.run(RULE_NAME, rule, { `, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-only.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-only.spec.ts index dcbf2dd52..dec444be9 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-only.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-only.spec.ts @@ -71,7 +71,7 @@ ruleTester.run(RULE_NAME, rule, { `, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-to-array.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-to-array.spec.ts index d53c6b380..c12214a76 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-children-to-array.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-children-to-array.spec.ts @@ -103,7 +103,7 @@ ruleTester.run(RULE_NAME, rule, { `, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-useless-fragment.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-useless-fragment.spec.ts index 7e741c0f8..805fd6d10 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/no-useless-fragment.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-useless-fragment.spec.ts @@ -202,7 +202,7 @@ ruleTester.run(RULE_NAME, rule, { code: /* tsx */ ``, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/prefer-shorthand-fragment.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/prefer-shorthand-fragment.spec.ts index 07cb1cd95..079f00694 100644 --- a/packages/plugins/eslint-plugin-react-x/src/rules/prefer-shorthand-fragment.spec.ts +++ b/packages/plugins/eslint-plugin-react-x/src/rules/prefer-shorthand-fragment.spec.ts @@ -37,7 +37,7 @@ ruleTester.run(RULE_NAME, rule, { code: /* tsx */ ``, settings: { "react-x": { - skipImportCheck: false, + strictImportCheck: true, }, }, }, diff --git a/packages/shared/docs/variables/INITIAL_ESLINT_REACT_SETTINGS.md b/packages/shared/docs/variables/INITIAL_ESLINT_REACT_SETTINGS.md index eded4748d..b68952c30 100644 --- a/packages/shared/docs/variables/INITIAL_ESLINT_REACT_SETTINGS.md +++ b/packages/shared/docs/variables/INITIAL_ESLINT_REACT_SETTINGS.md @@ -9,9 +9,3 @@ > `const` **INITIAL\_ESLINT\_REACT\_SETTINGS**: `object` The initial settings for "react-x". - -## Type declaration - -### skipImportCheck - -> `readonly` **skipImportCheck**: `false` = `false` diff --git a/packages/shared/src/schemas.ts b/packages/shared/src/schemas.ts index 65e98941a..b89cc9b62 100644 --- a/packages/shared/src/schemas.ts +++ b/packages/shared/src/schemas.ts @@ -122,7 +122,7 @@ export const ESLintReactSettingsSchema = object({ /** * @internal */ - skipImportCheck: optional(boolean(), true), + strictImportCheck: optional(boolean()), /** * React version to use, "detect" means auto detect React version from the project’s dependencies. * If `importSource` is specified, an equivalent version of React should be provided here. diff --git a/packages/shared/src/settings.ts b/packages/shared/src/settings.ts index 182d3c2d3..f5c4d97f1 100644 --- a/packages/shared/src/settings.ts +++ b/packages/shared/src/settings.ts @@ -13,9 +13,7 @@ import { ESLintSettingsSchema } from "./schemas"; /** * The initial settings for "react-x". */ -export const INITIAL_ESLINT_REACT_SETTINGS = { - skipImportCheck: false, -} as const satisfies ESLintReactSettings; +export const INITIAL_ESLINT_REACT_SETTINGS = {} as const satisfies ESLintReactSettings; // #endregion