import fs from "node:fs"; import path from "node:path"; function isComponentFile(filename) { if (!filename.endsWith(".tsx")) return false; const base = path.basename(filename); if ( base === "index.tsx" || base.endsWith(".test.tsx") || base.endsWith(".stories.tsx") || base.endsWith(".spec.tsx") ) { return false; } return ( filename.includes("/packages/core-ui/src/") || /\/packages\/[^/]+\/src\/ui\//.test(filename) ); } /** @type {import("eslint").Rule.RuleModule} */ export default { meta: { type: "problem", docs: { description: "Every component file must have a sibling *.test.tsx for behavioural coverage.", }, schema: [], messages: { missingTest: "Component {{filename}} has no sibling test at {{expected}}. Write the red test first.", }, }, create(context) { return { Program(node) { const filename = context.filename; if (!isComponentFile(filename)) return; const expected = filename.replace(/\.tsx$/, ".test.tsx"); if (fs.existsSync(expected)) return; context.report({ node, messageId: "missingTest", data: { filename: path.basename(filename), expected: path.basename(expected), }, }); }, }; }, };