import { type TSESLint, type TSESTree } from '@typescript-eslint/utils'; import { type DeepReadonly } from 'ts-type-forge'; import { castNode, isReactApiCall } from './shared.mjs'; type MessageIds = 'disallowUseImperativeHandle'; export const banUseImperativeHandleHook: TSESLint.RuleModule = { meta: { type: 'suggestion', docs: { description: 'Restricts specific React hook usage patterns for consistent component styles.', }, schema: [], messages: { disallowUseImperativeHandle: 'Move logic to parent component instead of using React.useImperativeHandle.', }, }, create: (context) => ({ CallExpression: (node: DeepReadonly) => { if (isReactApiCall(context, node, 'useImperativeHandle')) { context.report({ node: castNode(node.callee), messageId: 'disallowUseImperativeHandle', }); } }, }), defaultOptions: [], } as const;