/** * ESLint Rule: No useMutation in Client Components * * Forbids the use of useMutation from @tanstack/react-query in client components. * All write operations must go through Next.js Server Actions. */ module.exports = { meta: { type: 'problem', docs: { description: 'Forbid useMutation usage in client components', category: 'Architecture', recommended: true, }, messages: { noUseMutation: 'useMutation from @tanstack/react-query is forbidden. Use Next.js Server Actions for all write operations. See docs/architecture/website/FORM_SUBMISSION.md', }, schema: [], }, create(context) { return { ImportDeclaration(node) { if (node.source.value === '@tanstack/react-query') { const useMutationSpecifier = node.specifiers.find( (specifier) => specifier.type === 'ImportSpecifier' && specifier.imported.name === 'useMutation' ); if (useMutationSpecifier) { context.report({ node: useMutationSpecifier, messageId: 'noUseMutation', }); } } }, CallExpression(node) { if (node.callee.type === 'Identifier' && node.callee.name === 'useMutation') { context.report({ node, messageId: 'noUseMutation', }); } }, }; }, };