feat(FN-4782): complete Step 2 — add view chunk manifest helper

Fusion-Task-Id: FN-4782
Fusion-Task-Lineage: 5d6b5632-a135-4d25-9382-57fa23e22484
This commit is contained in:
Fusion (runfusion.ai)
2026-05-17 01:41:55 -07:00
committed by gsxdsm
parent 24ad23bf6f
commit 6bb70dc805
2 changed files with 185 additions and 0 deletions

View File

@@ -0,0 +1,95 @@
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { afterEach, describe, expect, it } from "vitest";
import {
VIEW_SOURCE_MAP,
loadViewChunkManifest,
resetViewChunkManifestCache,
} from "../view-chunk-manifest";
function makeClientDir(name: string): string {
return join(tmpdir(), `fn-4782-${name}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
}
afterEach(() => {
resetViewChunkManifestCache();
});
describe("view chunk manifest", () => {
it("resolves hashed chunk paths", () => {
const clientDir = makeClientDir("resolve");
mkdirSync(join(clientDir, ".vite"), { recursive: true });
writeFileSync(
join(clientDir, ".vite", "manifest.json"),
JSON.stringify({
[VIEW_SOURCE_MAP.agents]: { file: "assets/AgentsView-abc123.js" },
[VIEW_SOURCE_MAP.chat]: { file: "assets/ChatView-def456.js" },
}),
);
const map = loadViewChunkManifest(clientDir);
expect(map.agents).toBe("/assets/AgentsView-abc123.js");
expect(map.chat).toBe("/assets/ChatView-def456.js");
rmSync(clientDir, { recursive: true, force: true });
});
it("returns empty map when manifest file is missing", () => {
const clientDir = makeClientDir("missing");
mkdirSync(clientDir, { recursive: true });
const map = loadViewChunkManifest(clientDir);
expect(map).toEqual({});
rmSync(clientDir, { recursive: true, force: true });
});
it("returns partial map when source entry is absent", () => {
const clientDir = makeClientDir("partial");
mkdirSync(join(clientDir, ".vite"), { recursive: true });
writeFileSync(
join(clientDir, ".vite", "manifest.json"),
JSON.stringify({
[VIEW_SOURCE_MAP.agents]: { file: "assets/AgentsView-abc123.js" },
}),
);
const map = loadViewChunkManifest(clientDir);
expect(map.agents).toBe("/assets/AgentsView-abc123.js");
expect(map.chat).toBeUndefined();
rmSync(clientDir, { recursive: true, force: true });
});
it("cache is invalidated by reset", () => {
const clientDir = makeClientDir("cache");
mkdirSync(join(clientDir, ".vite"), { recursive: true });
const manifestPath = join(clientDir, ".vite", "manifest.json");
writeFileSync(
manifestPath,
JSON.stringify({
[VIEW_SOURCE_MAP.agents]: { file: "assets/AgentsView-old.js" },
}),
);
const first = loadViewChunkManifest(clientDir);
expect(first.agents).toBe("/assets/AgentsView-old.js");
writeFileSync(
manifestPath,
JSON.stringify({
[VIEW_SOURCE_MAP.agents]: { file: "assets/AgentsView-new.js" },
}),
);
const cached = loadViewChunkManifest(clientDir);
expect(cached.agents).toBe("/assets/AgentsView-old.js");
resetViewChunkManifestCache();
const refreshed = loadViewChunkManifest(clientDir);
expect(refreshed.agents).toBe("/assets/AgentsView-new.js");
rmSync(clientDir, { recursive: true, force: true });
});
});