feat(devkit): add resumable workspace automation and UI review tooling
Verified with the coordinated workspace changes by devkit full run 2026-09-08T225814-186389-0000-3e3ed7cd (all seven phases passed). This shared UI pass does not mark the individual module reviews complete.
This commit is contained in:
Executable
+80
@@ -0,0 +1,80 @@
|
||||
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(<PlatformLanguageProvider preferredLanguageCode={language} moduleTranslations={[catalogs[index]]}>
|
||||
<PageTitle titleHelp={<DocumentationHelpLink reference={{ contextId: "heading-test" }} />}>{label}</PageTitle>
|
||||
</PlatformLanguageProvider>);
|
||||
}`,
|
||||
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(`<h1>${expected}</h1>`), `${name}: ${language} contextual heading`);
|
||||
assert(markup.includes(language === "de" ? "Benutzerdokumentation öffnen" : "Open user documentation"));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user