git » homepage.git » master » tree

[master] / tools / mermaid / render.mjs

#!/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();
}