Release govoplan-files v0.1.26: speed archive workflows and unify file tools
Module Package Release / publish-packages (push) Successful in 12s
Module Package Release / publish-packages (push) Successful in 12s
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
// 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.");
|
||||
Reference in New Issue
Block a user