chore: initialize from frontend template 4dc033c
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import { readFile } from "node:fs/promises";
|
||||
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import {
|
||||
bundleOutputInventoryArtifactSchema,
|
||||
bundlePerformanceArtifactSchema,
|
||||
} from "../../scripts/contracts/release-artifacts.ts";
|
||||
|
||||
const sha256 = "a".repeat(64);
|
||||
|
||||
const inventory = {
|
||||
schemaVersion: 1,
|
||||
generatedAt: "2026-08-02T00:00:00.000Z",
|
||||
context: {
|
||||
nodeVersion: "v24.14.0",
|
||||
packageManager: "pnpm@11.17.0",
|
||||
runnerImage: "fixture@sha256:abc",
|
||||
},
|
||||
outputs: [
|
||||
{ path: "dist/assets/entry.js", bytes: 100, gzipBytes: 50, sha256 },
|
||||
{ path: "dist/assets/lazy.js", bytes: 80, gzipBytes: 40, sha256 },
|
||||
{ path: "dist/index.html", bytes: 20, gzipBytes: 15, sha256 },
|
||||
],
|
||||
} as const;
|
||||
|
||||
const completed = {
|
||||
...inventory,
|
||||
measurements: {
|
||||
initialJsGzipBytes: 50,
|
||||
lazyChunks: [{ path: "assets/lazy.js", gzipBytes: 40 }],
|
||||
},
|
||||
classification: {
|
||||
initialFiles: ["assets/entry.js"],
|
||||
lazyFiles: ["assets/lazy.js"],
|
||||
missingImports: [],
|
||||
},
|
||||
missingOutputs: [],
|
||||
thresholds: { initialJsGzipBytes: 60, lazyChunkGzipBytes: 45 },
|
||||
results: {
|
||||
initialPassed: true,
|
||||
lazyResults: [
|
||||
{ path: "assets/lazy.js", gzipBytes: 40, threshold: 45, passed: true },
|
||||
],
|
||||
passed: true,
|
||||
},
|
||||
fixtures: [
|
||||
{ name: "initial-js-over-budget", passed: true },
|
||||
{ name: "lazy-chunk-over-budget", passed: true },
|
||||
],
|
||||
passed: true,
|
||||
} as const;
|
||||
|
||||
describe("bundle artifact contracts", () => {
|
||||
it("separates the raw output inventory from final budget evidence", () => {
|
||||
expect(bundleOutputInventoryArtifactSchema.parse(inventory)).toEqual(inventory);
|
||||
expect(() => bundleOutputInventoryArtifactSchema.parse(completed)).toThrow();
|
||||
expect(bundlePerformanceArtifactSchema.parse(completed)).toEqual(completed);
|
||||
expect(() => bundlePerformanceArtifactSchema.parse(inventory)).toThrow();
|
||||
});
|
||||
|
||||
it.each([
|
||||
["initial total", { measurements: { ...completed.measurements, initialJsGzipBytes: 49 } }],
|
||||
["lazy classification", { classification: { ...completed.classification, lazyFiles: [] } }],
|
||||
["missing output", { missingOutputs: ["assets/missing.js"], passed: true }],
|
||||
["threshold result", { results: { ...completed.results, initialPassed: false } }],
|
||||
["lazy result", { results: { ...completed.results, lazyResults: [] } }],
|
||||
["fixture identity", { fixtures: [{ name: "other", passed: true }, completed.fixtures[1]] }],
|
||||
["overall result", { passed: false }],
|
||||
] as const)("rejects inconsistent %s evidence", (_name, mutation) => {
|
||||
expect(() =>
|
||||
bundlePerformanceArtifactSchema.parse({ ...completed, ...mutation })
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
it("publishes final evidence only through the validated atomic writer", async () => {
|
||||
const source = await readFile("scripts/check-bundle.ts", "utf8");
|
||||
expect(source).toContain("bundleOutputInventoryArtifactSchema.parse");
|
||||
expect(source).toContain("writeValidatedJsonArtifact");
|
||||
expect(source).not.toMatch(/\bwriteFile\s*\(/u);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user