46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import { colorize, isRich, theme } from "../terminal/theme.js";
|
|
|
|
const formatKv = (line: string, rich: boolean) => {
|
|
const idx = line.indexOf(": ");
|
|
if (idx <= 0) return colorize(rich, theme.muted, line);
|
|
const key = line.slice(0, idx);
|
|
const value = line.slice(idx + 2);
|
|
|
|
const valueColor =
|
|
key === "Gateway target" || key === "Config"
|
|
? theme.command
|
|
: key === "Source"
|
|
? theme.muted
|
|
: theme.info;
|
|
|
|
return `${colorize(rich, theme.muted, `${key}:`)} ${colorize(rich, valueColor, value)}`;
|
|
};
|
|
|
|
export function formatHealthCheckFailure(err: unknown, opts: { rich?: boolean } = {}): string {
|
|
const rich = opts.rich ?? isRich();
|
|
const raw = String(err);
|
|
const message = err instanceof Error ? err.message : raw;
|
|
|
|
if (!rich) return `Health check failed: ${raw}`;
|
|
|
|
const lines = message
|
|
.split("\n")
|
|
.map((l) => l.trimEnd())
|
|
.filter(Boolean);
|
|
const detailsIdx = lines.findIndex((l) => l.startsWith("Gateway target: "));
|
|
|
|
const summaryLines = (detailsIdx >= 0 ? lines.slice(0, detailsIdx) : lines)
|
|
.map((l) => l.trim())
|
|
.filter(Boolean);
|
|
const detailLines = detailsIdx >= 0 ? lines.slice(detailsIdx) : [];
|
|
|
|
const summary = summaryLines.length > 0 ? summaryLines.join(" ") : message;
|
|
const header = colorize(rich, theme.error.bold, "Health check failed");
|
|
|
|
const out: string[] = [`${header}: ${summary}`];
|
|
for (const line of detailLines) {
|
|
out.push(` ${formatKv(line, rich)}`);
|
|
}
|
|
return out.join("\n");
|
|
}
|