44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
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");
|