import { mkdir, readFile, writeFile } from "node:fs/promises"; import { classifyObjectSchemaChange } from "../src/application/policies/compatibility.js"; const fixtures = JSON.parse( await readFile("config/compatibility/fixtures.json", "utf8"), ); const results = []; for (const [family, cases] of Object.entries(fixtures.families)) { for (const expected of ["additive", "breaking"]) { const fixture = cases[expected]; const actual = classifyObjectSchemaChange(fixture.before, fixture.after); results.push({ family, expected, actual, passed: actual === expected }); } } await mkdir("artifacts/release", { recursive: true }); await writeFile( "artifacts/release/compatibility.json", `${JSON.stringify( { schemaVersion: 1, generatedAt: new Date().toISOString(), rules: [ "additive changes preserve required fields", "breaking changes require version bump and migration, discard, fallback, or rollback", "config and API major versions must match", "incompatible persisted cache is discarded by default", "rollback uses a coherent compatibility tuple", ], results, }, null, 2, )}\n`, ); if (results.some((result) => !result.passed)) { process.stderr.write("Compatibility fixture classification failed.\n"); process.exit(1); } process.stdout.write("Compatibility fixtures: PASS\n");