Files
Ekklesia/packages/module-ui-build/src/cli.ts
T
ekklesia 2e0fe059c3
CI / verify (pull_request) Successful in 38s
CI / infrastructure-smoke (pull_request) Successful in 20s
CI / migration-smoke (pull_request) Successful in 59s
feat: add display kiosk host
2026-08-23 20:50:56 -05:00

51 lines
2.0 KiB
JavaScript

#!/usr/bin/env node
import path from "node:path";
import process from "node:process";
import { formatMessages } from "esbuild";
import { buildModuleUi, ModuleUiBuildError } from "./build-module-ui.js";
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
/**
* `ekklesia-build-module-ui` — the canonical module UI build command, run from a module directory.
*
* A module with neither UI role is not an error: backend-only modules stay first-class and this
* command reports that there was nothing to build and exits successfully. When one or both roles
* are declared, this one command builds exactly that set.
*/
async function main(): Promise<number> {
const moduleDirectory = process.argv[2] ?? process.cwd();
try {
const result = await buildModuleUi({ moduleDirectory });
if (result.artifacts.length === 0) {
process.stdout.write("No module UI entrypoints declared; skipping the module UI build.\n");
return 0;
}
for (const artifact of result.artifacts) {
process.stdout.write(
`Built module UI (${artifact.kind}): ${path.relative(moduleDirectory, artifact.outputFile)}\n`,
);
}
return 0;
} catch (error) {
if (error instanceof ModuleUiBuildError) {
process.stderr.write(`${error.kind ? `${error.kind}: ` : ""}${error.message}\n`);
// esbuild's own diagnostics carry the file, line, and reason a developer needs. They are
// printed here, never folded into the sanitized error message itself.
const diagnostics = isRecord(error) ? error.diagnostics : undefined;
if (Array.isArray(diagnostics) && diagnostics.length > 0) {
const formatted = await formatMessages(diagnostics, { kind: "error", color: true });
process.stderr.write(formatted.join(""));
}
return 1;
}
process.stderr.write("The module UI build failed unexpectedly.\n");
return 1;
}
}
process.exitCode = await main();