import { describe, expect, it } from "vitest"; import { parseBuildManifestArtifact, parseReleaseArtifact, parseRuntimeConfigArtifact, projectReleaseTokens, } from "../../scripts/contracts/release-artifacts.ts"; const EMPTY_CONTRACT_SET_DIGEST = "sha256:ad6aab71fea6a9ff87cbd170b984b339965afc90d85bb57f87801c9e0c020da2"; const releaseV2 = { schemaVersion: 2, appVersion: "0.1.0", buildId: "build-a", commitSha: "abc1234", configSchemaVersion: "2.0", assetManifestHash: "asset-hash", releaseId: "release-a", builtAt: "2026-08-01T00:00:00.000Z", routeChunks: { "route-home": "assets/home.js" }, contractSet: { setAlgorithm: "CA_CONTRACT_SET_V1", setDigest: EMPTY_CONTRACT_SET_DIGEST, packages: [], }, } as const; const buildManifest = { schemaVersion: 1, buildId: "build-a", commitSha: "abc1234", releaseId: "release-a", moduleInventoryHash: "inventory-hash", generatedAt: "2026-08-01T00:00:00.000Z", buildContext: { nodeVersion: "v24.14.0", packageManagerVersion: "11.17.0", runnerImage: "linux-x64", sourceDateEpoch: null, }, outputs: { directory: "dist", viteManifest: "dist/.vite/manifest.json", moduleInventory: "artifacts/quality/vite-module-inventory.json", routeChunks: { "route-home": "assets/home.js" }, runtimeConfigSchema: "dist/runtime-config.schema.json", }, } as const; describe("release artifact contracts", () => { it("projects the nested V2 contract-set digest without a legacy scalar", () => { const release = parseReleaseArtifact(releaseV2); expect(projectReleaseTokens(release)).toMatchObject({ schemaVersion: 2, buildId: "build-a", contractSetDigest: EMPTY_CONTRACT_SET_DIGEST, }); expect(projectReleaseTokens(release)).not.toHaveProperty( "apiContractVersion", ); }); it("projects the legacy scalar only for V1", () => { const { contractSet: _contractSet, ...releaseWithoutContractSet } = releaseV2; void _contractSet; const release = parseReleaseArtifact({ ...releaseWithoutContractSet, schemaVersion: 1, configSchemaVersion: "1", apiContractVersion: "1.4.0", }); expect(projectReleaseTokens(release)).toMatchObject({ schemaVersion: 1, apiContractVersion: "1.4.0", }); expect(projectReleaseTokens(release)).not.toHaveProperty( "contractSetDigest", ); }); it("rejects a V2 release carrying the removed scalar", () => { expect(() => parseReleaseArtifact({ ...releaseV2, apiContractVersion: "1", }), ).toThrow(); }); it("accepts the exact build manifest emitted by the generator", () => { expect(parseBuildManifestArtifact(buildManifest)).toEqual(buildManifest); }); it("rejects unknown build manifest output fields", () => { expect(() => parseBuildManifestArtifact({ ...buildManifest, outputs: { ...buildManifest.outputs, unexpected: "value" }, }), ).toThrow(); }); it("accepts Runtime Config V2 without a legacy API scalar", () => { expect( parseRuntimeConfigArtifact({ APP_ENV: "local", API_BASE_URL: "http://localhost:8080/", REQUEST_TIMEOUT_MS: 10_000, MAX_RETRY_ATTEMPTS: 2, TELEMETRY_ENABLED: false, AUTH_MODE: "demo", CONFIG_SCHEMA_VERSION: "2.0", RELEASE_MANIFEST_URL: "/release-manifest.json", BUILD_ID: "build-a", RELEASE_ID: "release-a", CAPABILITY_OVERRIDES: { REALTIME: "DEFAULT", WEB_WORKER: "DEFAULT", SERVICE_WORKER: "DEFAULT", OFFLINE_COMMANDS: "DEFAULT", }, }), ).not.toHaveProperty("API_CONTRACT_VERSION"); }); });