everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
49 lines (47 loc) • 1.96 kB
JavaScript
import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { composeVersionManifest } from "every-plugin/version-manifest";
import { BuildEntryReportSchema } from "every-plugin/build/artifact-names";
//#region src/version-manifest-deploy.ts
/** Read a workspace dist's build-report.json (ticket 01's entry-name report). */
function readBuildReport(distRoot) {
const reportPath = join(distRoot, "build-report.json");
if (!existsSync(reportPath)) return null;
try {
return BuildEntryReportSchema.parse(JSON.parse(readFileSync(reportPath, "utf8")));
} catch {
return null;
}
}
/**
* Compose the workspace's version manifest from the dist build reports and
* the **server-computed** SRI map of the upload response (MAP decision 6 —
* SRI is authoritative from the storage boundary, never computed
* client-side). Returns null when the dist predates hashed entry names
* (no report, or the SRI map lacks the entry) — the deploy leg then aborts:
* uploaded workspaces must pin.
*/
function composeWorkspaceVersionManifest(input) {
const { report, ssrReport, integrityMap, files } = input;
const entryIntegrity = integrityMap[report.entry];
if (!entryIntegrity) return null;
const ssrEntry = ssrReport?.entry;
const ssrIntegrity = ssrEntry ? integrityMap[`ssr/${ssrEntry}`] : void 0;
return composeVersionManifest({
entry: report.entry,
entryIntegrity,
...ssrEntry && ssrIntegrity ? { ssr: {
entry: `ssr/${ssrEntry}`,
integrity: ssrIntegrity
} } : {},
...report.browserManifest && integrityMap[report.browserManifest] ? { browserManifest: {
file: report.browserManifest,
integrity: integrityMap[report.browserManifest]
} } : {},
...report.css && integrityMap[report.css] ? { assets: { css: integrityMap[report.css] } } : {},
...files ? { files } : {}
});
}
//#endregion
export { composeWorkspaceVersionManifest, readBuildReport };
//# sourceMappingURL=version-manifest-deploy.mjs.map