From 6f3aa0f7aefdf9dea049c44c5c32f0f4cad3ece4 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 17 Jul 2026 12:15:58 +0100 Subject: [PATCH] fix(release): point locale drift at generated sync --- scripts/control-ui-i18n-verify.ts | 14 ++++++++------ test/scripts/control-ui-i18n.test.ts | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/scripts/control-ui-i18n-verify.ts b/scripts/control-ui-i18n-verify.ts index 820b7b70a72a..ca33e1c10193 100644 --- a/scripts/control-ui-i18n-verify.ts +++ b/scripts/control-ui-i18n-verify.ts @@ -28,6 +28,13 @@ function toRepoPath(filePath: string): string { return path.relative(ROOT, filePath).split(path.sep).join("/"); } +export function formatControlUiCatalogFallbackDriftError(): string { + return [ + "control-ui catalog fallback baseline drift detected.", + "Run `pnpm ui:i18n:sync` (included in `pnpm release:prep`) and commit the generated locale artifacts.", + ].join("\n"); +} + async function importLocaleModule(filePath: string): Promise { const stats = await stat(filePath); return (await import(`${pathToFileURL(filePath).href}?ts=${stats.mtimeMs}`)) as T; @@ -206,12 +213,7 @@ export async function syncControlUiCatalogFallbackBaseline(options: { await writeFile(FALLBACK_BASELINE_PATH, expected, "utf8"); } if (options.checkOnly && current !== expected) { - throw new Error( - [ - "control-ui catalog fallback baseline drift detected.", - `Run \`pnpm ui:i18n:baseline\` and commit ${toRepoPath(FALLBACK_BASELINE_PATH)}.`, - ].join("\n"), - ); + throw new Error(formatControlUiCatalogFallbackDriftError()); } printCatalogFallbackSummary(baseline); } diff --git a/test/scripts/control-ui-i18n.test.ts b/test/scripts/control-ui-i18n.test.ts index e8a78c7a423e..aeb510894ede 100644 --- a/test/scripts/control-ui-i18n.test.ts +++ b/test/scripts/control-ui-i18n.test.ts @@ -14,6 +14,7 @@ import { import { analyzeControlUiCatalogs, flattenControlUiCatalog, + formatControlUiCatalogFallbackDriftError, } from "../../scripts/control-ui-i18n-verify.ts"; import { appendBoundedProcessOutput, @@ -158,6 +159,14 @@ async function waitForChildClose( } describe("control-ui-i18n process runner", () => { + it("points strict catalog drift at the generated release repair", () => { + const message = formatControlUiCatalogFallbackDriftError(); + + expect(message).toContain("pnpm ui:i18n:sync"); + expect(message).toContain("pnpm release:prep"); + expect(message).not.toContain("pnpm ui:i18n:baseline"); + }); + it("builds a deterministic fallback list without accepting catalog drift", () => { const source = flattenControlUiCatalog( { group: { first: "First {count}", second: "Second" } },