// Run the owning Files read helpers and real Core request cache, replacing only network I/O. import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { createRequire } from "node:module"; import vm from "node:vm"; const coreRoot = new URL("../../../govoplan-core/webui/", import.meta.url); const require = createRequire(new URL("package.json", coreRoot)); const { transformSync } = require("esbuild"); const compile = (url) => transformSync(readFileSync(url, "utf8"), { loader: "ts", format: "cjs", target: "es2022", define: { "import.meta.env": "{}" } }).code; const coreCode = compile(new URL("src/api/client.ts", coreRoot)); const filesCode = compile(new URL("../src/api/files.ts", import.meta.url)); const settings = { apiBaseUrl: "https://fixture.invalid", apiKey: "", accessToken: "" }; const owner = { owner_type: "user", owner_id: "fixture-user" }; const fresh = { cache: "no-store" }; function harness(respond) { const requests = []; const context = vm.createContext({ Headers, Response, FormData, URL, URLSearchParams, AbortController, console, document: { cookie: "" }, fetch: async (url, init) => { const request = { url: new URL(url), ...init }; requests.push(request); assert.equal(init?.method ?? "GET", "GET", "Reload read helpers must never mutate"); return new Response(JSON.stringify(respond(request)), { status: 200, headers: { "content-type": "application/json" } }); } }); function load(code, dependencies) { context.module = { exports: {} }; context.exports = context.module.exports; context.require = (name) => { assert.ok(name in dependencies, `Unexpected module import: ${name}`); return dependencies[name]; }; vm.runInContext(`(function(module, exports, require) {\n${code}\n})(module, exports, require);`, context); return context.module.exports; } const core = load(coreCode, { "../platform/temporal": { temporalRequestHeaders: () => ({}) } }); return { api: load(filesCode, { "@govoplan/core-webui": core }), requests }; } for (const kind of ["spaces", "connector"]) { const { api, requests } = harness(() => kind === "spaces" ? { spaces: [] } : { items: [], path: "source/nested" }); const read = (options) => kind === "spaces" ? api.listFileSpaces(settings, options) : api.browseFileConnectorProfile(settings, "fixture-profile", { path: "source/nested" }, options); await read(); await read(); assert.equal(requests.length, 1, "normal reads retain short-lived request reuse"); await read(fresh); await read(fresh); assert.equal(requests.length, 3, "each explicit Reload bypasses the shared recent-response cache"); assert.equal(requests[2].cache, "no-store"); } { const { api, requests } = harness(({ url }) => { const next = url.searchParams.has("cursor"); if (url.pathname.endsWith("/folders")) return { folders: [], total: 0, next_cursor: next ? null : "folders-2", watermark: "start" }; if (url.pathname.endsWith("/delta")) return { full: false, files: [], folders: [], deleted: [], has_more: url.searchParams.get("since") === "start", watermark: url.searchParams.get("since") === "start" ? "middle" : "end" }; return { files: [], total: 0, next_cursor: next ? null : "files-2" }; }); await api.listManagedFileSnapshot(settings, owner, fresh); await api.listManagedFileSnapshot(settings, owner, fresh); assert.equal(requests.length, 12, "two snapshots each re-read both folder/file pages and both reconciliation pages"); assert.ok(requests.every((request) => request.cache === "no-store")); } { const { api, requests } = harness(({ url }) => ({ files: [], total: 0, next_cursor: url.searchParams.has("cursor") ? null : "filtered-2" })); await api.listFilesByProperties(settings, { ...owner, campaign_usage: "linked", audit_relevant: true }, fresh); await api.listFilesByProperties(settings, { ...owner, campaign_usage: "linked", audit_relevant: true }, fresh); assert.equal(requests.length, 4, "each filtered Reload must re-read every server result page"); assert.ok(requests.every((request) => request.cache === "no-store" && request.url.searchParams.get("campaign_usage") === "linked" && request.url.searchParams.get("audit_relevant") === "true")); } console.log("Files Reload: 4 real-client cache, read-only, pagination and filter checks passed.");