Files
creator2/backend/mermaid_check.mjs
2026-07-12 16:13:50 +02:00

38 lines
1.4 KiB
JavaScript

// 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('<!DOCTYPE html><body></body>')
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))