// Mermaid-Parse-Gate: prüft Diagramm-Quelltext mit DEMSELBEN Parser wie das Frontend. // stdin: JSON [{id, code}] → stdout: JSON [{id, fehler}, …] (nur die fehlerhaften). // Zwilling zu katex_check.mjs: was hier parst, rendert auch im Guide. // // Mermaid braucht zum Sanitisieren der Labels ein DOM — headless via jsdom, sonst // wirft parse() für JEDES Diagramm mit Label „DOMPurify.addHook is not a function" // (nicht ein Diagramm-Fehler, sondern ein Umgebungsfehler → alles fälschlich verworfen). import { createRequire } from 'node:module' import { readFileSync } from 'node:fs' function laden(name) { try { return createRequire(import.meta.url)(name) // Container: backend/node_modules } catch { const basis = process.env.MERMAID_BASE // Dev: frontend/node_modules return createRequire(basis.endsWith('/') ? basis : basis + '/')(name) } } const { JSDOM } = laden('jsdom') const dom = new JSDOM('') globalThis.window = dom.window globalThis.document = dom.window.document const mermaid = laden('mermaid').default mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' }) const diagramme = JSON.parse(readFileSync(0, 'utf8')) const fehler = [] for (const d of diagramme) { try { await mermaid.parse(d.code) // wirft bei Syntaxfehler } catch (e) { fehler.push({ id: d.id, fehler: String(e.message || e).slice(0, 160) }) } } process.stdout.write(JSON.stringify(fehler))