update
This commit is contained in:
37
backend/mermaid_check.mjs
Normal file
37
backend/mermaid_check.mjs
Normal file
@@ -0,0 +1,37 @@
|
||||
// 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))
|
||||
Reference in New Issue
Block a user