#!/usr/bin/env node
// One Chromium process per build; each diagram gets a fresh page and stable IDs.
import { readFileSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import puppeteer from "puppeteer";
import { renderMermaid } from "@mermaid-js/mermaid-cli";
const { output, diagrams } = JSON.parse(readFileSync(0, "utf8"));
const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || "/usr/bin/chromium",
args: ["--no-sandbox", "--disable-dev-shm-usage"],
});
try {
for (const [id, { source, code }] of Object.entries(diagrams)) {
try {
const { data } = await renderMermaid(browser, code, "svg", {
svgId: `diagram-${id}`,
backgroundColor: "transparent",
mermaidConfig: {
securityLevel: "strict",
deterministicIds: true,
deterministicIDSeed: id,
theme: "base",
themeVariables: {
fontFamily: "Open Sans",
fontSize: "15px",
primaryColor: "#f5f3ee",
primaryTextColor: "#29312f",
primaryBorderColor: "#66706c",
lineColor: "#66706c",
secondaryColor: "#fffefa",
tertiaryColor: "#fffefa",
},
flowchart: { htmlLabels: false },
},
});
writeFileSync(join(output, `${id}.svg`), data);
} catch (error) {
throw new Error(`Mermaid diagram in ${source}`, { cause: error });
}
}
} finally {
await browser.close();
}