#!/usr/bin/env node // Nachrichten-Pruefung fuer den Zertifikat-Manager (quick-261009-ikt), keine Abhaengigkeiten. // Aufruf: node check-cert-messages.cjs // Prueft: gleiche Schluessel in de.json und en.json, Mindestanzahl, certManager.title vorhanden, // keine Wörter zu Mandanten oder Lizenzen, keine Pfeil- und Mittelpunkt-Zeichen. const { execFileSync } = require('node:child_process'); const { readFileSync } = require('node:fs'); const { join } = require('node:path'); const root = execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim(); const min = Number(process.argv[2] ?? 0); function flatten(value, prefix, out) { if (value && typeof value === 'object') { for (const [key, inner] of Object.entries(value)) flatten(inner, `${prefix}.${key}`, out); } else { out.set(prefix, String(value)); } return out; } function load(name) { const data = JSON.parse(readFileSync(join(root, 'apps/web/src/messages', name), 'utf8')); return flatten(data.certManager ?? {}, 'certManager', new Map()); } const de = load('de.json'); const en = load('en.json'); const onlyDe = [...de.keys()].filter((k) => !en.has(k)); const onlyEn = [...en.keys()].filter((k) => !de.has(k)); if (onlyDe.length || onlyEn.length) { console.error(`key mismatch: only de [${onlyDe.join(', ')}] only en [${onlyEn.join(', ')}]`); process.exit(1); } if (de.size < min) { console.error(`too few keys: ${de.size} < ${min}`); process.exit(1); } if (!de.has('certManager.title') || !en.has('certManager.title')) { console.error('title missing'); process.exit(1); } const bad = /mandant|tenant|lizenz|licens|→|·/i; for (const map of [de, en]) { for (const value of map.values()) { if (bad.test(value)) { console.error(`bad text: ${value}`); process.exit(1); } } } console.log(`messages ok ${de.size}`);