import fs from "node:fs"; import { manifestPathForFeature, featureRootForFile } from "./_manifest-source.js"; /** @type {import("eslint").Rule.RuleModule} */ export default { meta: { type: "problem", docs: { description: "Every feature with use-case files must declare a feature.manifest.ts at its src/ root.", }, schema: [ { type: "object", properties: { repoRoot: { type: "string" }, }, additionalProperties: false, }, ], messages: { missingManifest: "Feature {{feature}} has use cases but no feature.manifest.ts. Run `pnpm turbo gen feature {{feature}}` or scaffold the manifest manually at {{expected}}.", }, }, create(context) { const opts = context.options[0] ?? {}; const repoRoot = opts.repoRoot ?? context.cwd ?? process.cwd(); return { Program(node) { const filename = context.filename; const featureRoot = featureRootForFile(filename, repoRoot); if (!featureRoot) return; // Only check use-case files if (!filename.includes("/application/use-cases/") || !filename.endsWith(".use-case.ts")) { return; } const manifestPath = manifestPathForFeature(featureRoot); if (fs.existsSync(manifestPath)) return; const featureName = featureRoot.split("/").pop(); context.report({ node, messageId: "missingManifest", data: { feature: featureName, expected: manifestPath }, }); }, }; }, };