38 lines
1.4 KiB
JavaScript
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))
|