diff --git a/packages/core/src/hook/hook-name.ts b/packages/core/src/hook/hook-name.ts index 82d4f63fbc..a876f0aba5 100644 --- a/packages/core/src/hook/hook-name.ts +++ b/packages/core/src/hook/hook-name.ts @@ -1,3 +1,9 @@ +/** + * Catch all identifiers that begin with "use" followed by an uppercase Latin + * character to exclude identifiers like "user". + * @param name The name of the identifier to check. + * @see https://github.com/facebook/react/blob/1d6c8168db1d82713202e842df3167787ffa00ed/packages/eslint-plugin-react-hooks/src/rules/RulesOfHooks.ts#L16 + */ export function isReactHookName(name: string) { - return name.startsWith("use"); + return name === "use" || /^use[A-Z0-9]/.test(name); } diff --git a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.spec.ts b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.spec.ts index b574fa1e1d..f55c81818e 100644 --- a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.spec.ts +++ b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.spec.ts @@ -141,6 +141,11 @@ ruleTester.run(RULE_NAME, rule, { // Allow empty functions. const useNoop = () => {}; `, + tsx` + export const userInitials = () => { + return; + }; + `, tsx` import { useState } from "react"; @@ -155,6 +160,11 @@ ruleTester.run(RULE_NAME, rule, { return useSWR(key); } `, + tsx` + const useData = (key) => { + return swr.useSWR(key); + } + `, tsx` function useData(key) { return useSWR(key);