#!/usr/bin/env node /** * Copy the Mermaid browser bundle into vendor/ so the server can render * diagrams (#1025). * * The copy comes from the UI's own dependency — deliberately the SAME install * the app renders Markdown with. Adding `mermaid` to the server's package.json * instead would create two versions that drift apart, which is precisely the * failure this tool exists to remove. * * vendor/ is gitignored and is already what the Docker image ships (noVNC lives * there too), so the runtime stage picks this up with the COPY it already has. * Runs at the end of `npm run build:ui`, when ui/node_modules is guaranteed. */ import { copyFileSync, mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const src = join(root, 'ui', 'node_modules', 'mermaid', 'dist', 'mermaid.min.js'); const pkg = join(root, 'ui', 'node_modules', 'mermaid', 'package.json'); const destDir = join(root, 'vendor', 'mermaid'); const dest = join(destDir, 'mermaid.min.js'); if (!existsSync(src)) { console.error(`[copy-mermaid-vendor] ${src} not found — run npm --prefix ui ci first.`); process.exit(1); } mkdirSync(destDir, { recursive: true }); copyFileSync(src, dest); const version = existsSync(pkg) ? JSON.parse(readFileSync(pkg, 'utf8')).version : 'unknown'; // The UMD bundle does not expose its own version, and package.json is not // copied — leave a sidecar so the tool can report what it validated with. writeFileSync(join(destDir, 'version.txt'), `${version}\n`); console.log(`[copy-mermaid-vendor] mermaid ${version} -> vendor/mermaid/mermaid.min.js`);