#!/usr/bin/env node import console from "node:console"; import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { dirname, join } from "node:path"; import process from "node:process"; import { spawnSync } from "node:child_process"; import { fileURLToPath } from "node:url"; const root = join(dirname(fileURLToPath(import.meta.url)), ".."); const temporaryRoot = mkdtempSync(join(tmpdir(), "wrnexus-ui-reference-")); function runGenerator() { const result = spawnSync( process.execPath, [join(temporaryRoot, "scripts", "generate-ui-component-reference.mjs")], { encoding: "utf8", }, ); if (result.status !== 0) { throw new Error(result.stderr || result.stdout || "UI component reference generator failed"); } } try { mkdirSync(join(temporaryRoot, "scripts"), { recursive: true }); mkdirSync(join(temporaryRoot, "packages", "ui"), { recursive: true }); cpSync( join(root, "scripts", "generate-ui-component-reference.mjs"), join(temporaryRoot, "scripts", "generate-ui-component-reference.mjs"), ); cpSync( join(root, "packages", "ui", "components"), join(temporaryRoot, "packages", "ui", "components"), { recursive: true, }, ); for (const name of ["component-catalog.json", "component-reference.json", "COMPONENTS.md"]) { cpSync(join(root, "packages", "ui", name), join(temporaryRoot, "packages", "ui", name)); } const jsonFiles = ["component-catalog.json", "component-reference.json"]; const before = new Map(); for (const name of jsonFiles) { const path = join(temporaryRoot, "packages", "ui", name); const crlf = readFileSync(path, "utf8").replace(/\r\n?/g, "\n").replace(/\n/g, "\r\n"); writeFileSync(path, crlf); before.set(name, readFileSync(path)); } runGenerator(); for (const name of jsonFiles) { const path = join(temporaryRoot, "packages", "ui", name); if (!readFileSync(path).equals(before.get(name))) { throw new Error(`${name} was rewritten even though only line endings differed`); } } const referencePath = join(temporaryRoot, "packages", "ui", "component-reference.json"); const stale = readFileSync(referencePath, "utf8").replace('"count": 108', '"count": 107'); writeFileSync(referencePath, stale); runGenerator(); const restored = JSON.parse(readFileSync(referencePath, "utf8")); if (restored.count !== 108) { throw new Error("genuinely stale component reference content was not regenerated"); } console.log("UI reference generation is line-ending stable and still repairs stale content."); } finally { rmSync(temporaryRoot, { recursive: true, force: true }); }