From e402740835819620ec9c78bdc271b1862474c65c Mon Sep 17 00:00:00 2001 From: Rel1cx Date: Tue, 15 Apr 2025 15:46:02 +0800 Subject: [PATCH] feat(hooks-extra): add useMDXComponents to test and update rule logic to skip well-known hooks --- .../src/rules/no-unnecessary-use-prefix.md | 8 ++++++++ .../src/rules/no-unnecessary-use-prefix.spec.ts | 9 +++++++++ .../src/rules/no-unnecessary-use-prefix.ts | 17 +++++++++++------ pnpm-lock.yaml | 1 - 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.md b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.md index b8c99d524f..11f3b318a5 100644 --- a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.md +++ b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.md @@ -114,6 +114,14 @@ function useAuth() { } ``` +```tsx +export function useMDXComponents(components) { + return { + ...components, + }; +} +``` + ## Implementation - [Rule source](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.ts) 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 f55c81818e..037b3a5b87 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 @@ -186,5 +186,14 @@ ruleTester.run(RULE_NAME, rule, { return TEST_USER; } `, + tsx` + import type { MDXComponents } from 'mdx/types' + + export function useMDXComponents(components: MDXComponents): MDXComponents { + return { + ...components, + } + } + `, ], }); diff --git a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.ts b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.ts index a88fbf6acd..ee01e6dfa5 100644 --- a/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.ts +++ b/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-prefix.ts @@ -13,13 +13,14 @@ export const RULE_FEATURES = [] as const satisfies RuleFeature[]; export type MessageID = CamelCase; -function isNodeContainsUseCallComments( - context: RuleContext, - node: TSESTree.Node, -) { +const WELL_KNOWN_HOOKS = [ + "useMDXComponents", +]; + +function containsUseComments(context: RuleContext, node: TSESTree.Node) { return context.sourceCode .getCommentsInside(node) - .some((comment) => /use\w+\(/u.test(comment.value)); + .some(({ value }) => /use\([\s\S]*?\)/u.test(value) || /use[A-Z0-9]\w*\([\s\S]*?\)/u.test(value)); } export default createRule<[], MessageID>({ @@ -47,6 +48,10 @@ export function create(context: RuleContext): RuleListener { "Program:exit"(program) { const allHooks = ctx.getAllHooks(program); for (const { id, name, node, hookCalls } of allHooks.values()) { + // Skip well-known hooks + if (WELL_KNOWN_HOOKS.includes(name)) { + continue; + } // Skip empty functions if (AST.isEmptyFunction(node)) { continue; @@ -56,7 +61,7 @@ export function create(context: RuleContext): RuleListener { continue; } // Skip hooks with comments that contain calls to other hooks - if (isNodeContainsUseCallComments(context, node)) { + if (containsUseComments(context, node)) { continue; } context.report({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 128df7e56a..457c2630df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5719,7 +5719,6 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}