import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { createRequire } from "node:module"; import { resolve } from "node:path"; import { test } from "node:test"; const root = resolve(import.meta.dirname, "../.."); const require = createRequire(resolve(root, "govoplan-core/webui/package.json")); const { buildSync } = require("esbuild"); const labels = { approvals: { "Approval requests": "Genehmigungsanträge" }, forms: { "Form meaning": "Formularbedeutung" }, "forms-runtime": { "Form instance": "Formularinstanz", "Forms runtime": "Formularlaufzeit" }, helpdesk: { "Helpdesk profiles": "Helpdesk-Profile" }, portal: { "Service directory": "Leistungsverzeichnis" }, projects: { Projects: "Projekte" }, reporting: { Reporting: "Reporting" }, "risk-compliance": { "Risk Compliance": "Risiko und Compliance" }, scheduling: { Scheduling: "Terminplanung" }, tickets: { Tickets: "Tickets" }, voting: { Ballots: "Abstimmungen" }, wiki: { Wiki: "Wiki" }, workflow: { Workflows: "Workflows", Workflow: "Workflow" }, idm: { "Direct changes to this governed function are": "Direkte Änderungen an dieser gesteuerten Funktion sind", "emergency overrides": "Notfallübersteuerungen", ". Use a request or grant above for the normal process.": ". Verwenden Sie für den regulären Prozess einen Antrag oder eine Vergabe.", }, }; // Render the actual Core heading/locale contract with one owning module at a // time. The in-memory bundle creates no shared component-build artifacts. const names = Object.keys(labels); const imports = names.map((name, index) => `import { generatedTranslations as t${index} } from ${JSON.stringify(resolve(root, `govoplan-${name}/webui/src/i18n/generatedTranslations.ts`))};`).join("\n"); const { outputFiles } = buildSync({ stdin: { contents: `${imports} import { renderToStaticMarkup } from 'react-dom/server'; import { PlatformLanguageProvider } from ${JSON.stringify(resolve(root, "govoplan-core/webui/src/i18n/LanguageContext.tsx"))}; import PageTitle from ${JSON.stringify(resolve(root, "govoplan-core/webui/src/components/PageTitle.tsx"))}; import DocumentationHelpLink from ${JSON.stringify(resolve(root, "govoplan-core/webui/src/components/help/DocumentationHelpLink.tsx"))}; export const catalogs = [${names.map((_, index) => `t${index}`).join(",")}]; export function heading(index, language, label) { return renderToStaticMarkup( }>{label} ); }`, loader: "tsx", resolveDir: resolve(root, "govoplan-core/webui"), }, bundle: true, write: false, platform: "node", format: "cjs", jsx: "automatic", external: ["react", "react-dom/server"], logLevel: "silent", }); const compiled = { exports: {} }; new Function("require", "module", "exports", outputFiles[0].text)(require, compiled, compiled.exports); const { catalogs, heading } = compiled.exports; test("new contextual labels render from their owning EN/DE catalogues", async (context) => { for (const [index, name] of names.entries()) { await context.test(name, () => { const moduleSource = readFileSync(resolve(root, `govoplan-${name}/webui/src/module.ts`), "utf8"); assert.match(moduleSource, /import\s*\{\s*generatedTranslations\s*\}\s*from\s*["']\.\/i18n\/generatedTranslations["']/); assert.match(moduleSource, /\btranslations(?:\s*:\s*generatedTranslations)?\s*,/); for (const [english, german] of Object.entries(labels[name])) { assert.equal(catalogs[index].en[english], english); assert.equal(catalogs[index].de[english], german); for (const [language, expected] of [["en", english], ["de", german]]) { const markup = heading(index, language, english); assert(markup.includes(`

${expected}

`), `${name}: ${language} contextual heading`); assert(markup.includes(language === "de" ? "Benutzerdokumentation öffnen" : "Open user documentation")); } } }); } });