forgejo-pdf/worker/pdf/scripts/generate-manifest.js
codex 1ce1370983
Some checks failed
pdfexport / pdfexport-worker-fixtures (push) Has been cancelled
Add server-side Markdown→PDF export (v0.1)
2025-12-16 17:52:53 +00:00

88 lines
3.3 KiB
JavaScript

const crypto = require("node:crypto");
const fs = require("node:fs");
const path = require("node:path");
function sha256File(p) {
const h = crypto.createHash("sha256");
h.update(fs.readFileSync(p));
return h.digest("hex");
}
function sha256String(s) {
return crypto.createHash("sha256").update(s).digest("hex");
}
function tryReadJSON(p) {
try {
return JSON.parse(fs.readFileSync(p, "utf8"));
} catch {
return null;
}
}
function main() {
const root = path.resolve(__dirname, "..");
const pkg = tryReadJSON(path.join(root, "package.json")) || {};
const lock = tryReadJSON(path.join(root, "package-lock.json")) || {};
const code = {
"src/index.js": sha256File(path.join(root, "src/index.js")),
"src/render_pdf.js": sha256File(path.join(root, "src/render_pdf.js")),
"src/validate.js": sha256File(path.join(root, "src/validate.js")),
"src/errors.js": sha256File(path.join(root, "src/errors.js")),
"src/logger.js": sha256File(path.join(root, "src/logger.js")),
"scripts/test-fixtures.js": sha256File(path.join(root, "scripts/test-fixtures.js")),
"scripts/copy-assets.js": sha256File(path.join(root, "scripts/copy-assets.js")),
"scripts/generate-manifest.js": sha256File(path.join(root, "scripts/generate-manifest.js"))
};
const assets = {
"assets/js/mermaid.min.js": sha256File(path.join(root, "assets/js/mermaid.min.js")),
"assets/js/paged.polyfill.js": sha256File(path.join(root, "assets/js/paged.polyfill.js")),
"assets/css/basic.css": sha256File(path.join(root, "assets/css/basic.css")),
"assets/css/professional.css": sha256File(path.join(root, "assets/css/professional.css")),
"assets/fonts/ibm-plex-sans-latin-400-normal.woff2": sha256File(path.join(root, "assets/fonts/ibm-plex-sans-latin-400-normal.woff2")),
"assets/fonts/ibm-plex-sans-latin-600-normal.woff2": sha256File(path.join(root, "assets/fonts/ibm-plex-sans-latin-600-normal.woff2")),
"assets/fonts/ibm-plex-mono-latin-400-normal.woff2": sha256File(path.join(root, "assets/fonts/ibm-plex-mono-latin-400-normal.woff2"))
};
let chromePath = null;
let chromeSha = null;
let chromeVersion = null;
try {
const puppeteer = require("puppeteer");
chromePath = puppeteer.executablePath();
chromeSha = sha256File(chromePath);
if (typeof puppeteer.browserVersion === "function") {
chromeVersion = puppeteer.browserVersion();
}
} catch {
// noop
}
const deps = (pkg && pkg.dependencies) || {};
const manifestCore = {
versions: {
worker: pkg.version || "0.0.0",
node: process.version,
puppeteer: deps.puppeteer || null,
mermaid: deps.mermaid || null,
pagedjs: deps.pagedjs || null,
markdownIt: deps["markdown-it"] || null,
sanitizeHtml: deps["sanitize-html"] || null,
ibmPlexSans: deps["@fontsource/ibm-plex-sans"] || null,
ibmPlexMono: deps["@fontsource/ibm-plex-mono"] || null,
lockfileVersion: lock.lockfileVersion || null
},
chromium: chromePath ? { sha256: chromeSha, version: chromeVersion || null } : null,
code,
assets
};
const canonical = JSON.stringify(manifestCore);
const manifest = { ...manifestCore, manifest_sha: sha256String(canonical) };
fs.writeFileSync(path.join(root, "manifest.json"), JSON.stringify(manifest, null, 2));
}
main();