// Codegen contract validation check (ARCHITECTURE.md §10 P1-8 / §5.3) // // Runs graphql-codegen and fails if any output with skipDocumentsValidation:false // contains operations that reference non-existent schema fields. // This is the "codegen diff check" — it diffs operations against schema. // // Currently enforces: // - dashboard-types.ts output (skipDocumentsValidation: false, P1-7) // As more domains fix their operations, their outputs will be validated too. // // Usage: tsx scripts/check-codegen.ts // Exit: 0 = codegen success, 1 = validation errors // // Related: ARCHITECTURE.md §5.3 契约纪律, §10 P1-8 import { execSync } from "node:child_process"; function main(): void { console.log("=== Codegen Contract Validation Check ==="); console.log("Running: pnpm run codegen (normalize-schema + graphql-codegen)"); console.log(""); try { const output = execSync("pnpm run codegen", { cwd: process.cwd(), encoding: "utf8", stdio: ["pipe", "pipe", "pipe"], }); console.log(output); // Check for validation failures even on exit 0 (some may be warnings) if (output.includes("GraphQL Document Validation failed")) { console.log("❌ Codegen reported validation failures despite exit 0"); console.log("Result: FAIL"); process.exit(1); } console.log( "Result: PASS (codegen succeeded, all validated outputs clean)", ); process.exit(0); } catch (err: unknown) { const e = err as { stdout?: string; stderr?: string; message: string }; const output = `${e.stdout ?? ""}\n${e.stderr ?? ""}`; console.log(output); if (output.includes("GraphQL Document Validation failed")) { console.log( "❌ Codegen validation failed — operations reference non-existent schema fields", ); console.log( " Fix: update operations/*.graphql.ts to match combined-schema.graphql", ); console.log( " Or: keep skipDocumentsValidation: true for that output until schema is ready", ); } else { console.log(`❌ Codegen failed: ${e.message}`); } console.log("Result: FAIL"); process.exit(1); } } main();