cli/src/format.tsblame
View source
0d9d7231export const STATUS_COLORS: Record<string, string> = {
0d9d7232 passed: "\x1b[32m",
0d9d7233 failed: "\x1b[31m",
0d9d7234 running: "\x1b[33m",
0d9d7235 pending: "\x1b[90m",
0d9d7236 cancelled: "\x1b[90m",
0d9d7237 skipped: "\x1b[90m",
0d9d7238};
0d9d7239
0d9d72310export const STATUS_ICONS: Record<string, string> = {
0d9d72311 passed: "\x1b[32m✓\x1b[0m",
0d9d72312 failed: "\x1b[31m✗\x1b[0m",
0d9d72313 running: "\x1b[33m●\x1b[0m",
0d9d72314 pending: "\x1b[90m○\x1b[0m",
0d9d72315 cancelled: "\x1b[90m⊘\x1b[0m",
0d9d72316 skipped: "\x1b[90m-\x1b[0m",
0d9d72317};
0d9d72318
0d9d72319export const RESET = "\x1b[0m";
0d9d72320
0d9d72321export function colorStatus(status: string): string {
0d9d72322 return `${STATUS_COLORS[status] ?? ""}${status}${RESET}`;
0d9d72323}
0d9d72324
0d9d72325export function formatDuration(ms: number | null): string {
0d9d72326 if (!ms) return "-";
0d9d72327 if (ms < 1000) return `${ms}ms`;
0d9d72328 const s = Math.round(ms / 1000);
0d9d72329 if (s < 60) return `${s}s`;
0d9d72330 return `${Math.floor(s / 60)}m${s % 60}s`;
0d9d72331}
0d9d72332
0d9d72333export function formatDurationRange(start: string | null, end: string | null): string {
0d9d72334 if (!start) return "";
0d9d72335 const s = new Date(start + "Z").getTime();
0d9d72336 const e = end ? new Date(end + "Z").getTime() : Date.now();
0d9d72337 return formatDuration(e - s);
0d9d72338}
0d9d72339
0d9d72340export function formatTime(iso: string | null): string {
0d9d72341 if (!iso) return "-";
0d9d72342 const d = new Date(iso + "Z");
0d9d72343 return d.toLocaleString();
0d9d72344}