fix: table format without header row #330

Merged
xiaomo merged 2 commits from fix/328-table-vertical into main 2026-05-18 13:48:17 +00:00
+22 -3
View File
@@ -2,7 +2,7 @@ import { stringify } from "yaml";
export type OutputFormat = "json" | "yaml" | "table";
function formatTable(data: Array<Record<string, unknown>>): string {
function formatHorizontalTable(data: Array<Record<string, unknown>>): string {
if (data.length === 0) return "";
const keys = Object.keys(data[0]);
const widths = keys.map((k) => {
@@ -20,6 +20,17 @@ function formatTable(data: Array<Record<string, unknown>>): string {
return [header, ...rows].join("\n");
}
function formatVerticalTable(data: Record<string, unknown>): string {
const entries = Object.entries(data);
if (entries.length === 0) return "";
const keyWidth = Math.max(...entries.map(([k]) => k.length));
const header = `${"KEY".padEnd(keyWidth)} VALUE`;
const rows = entries.map(
([k, v]) => `${k.padEnd(keyWidth)} ${typeof v === "object" ? JSON.stringify(v) : String(v)}`,
);
return [header, ...rows].join("\n");
}
export function formatOutput(data: unknown, format: OutputFormat): string {
switch (format) {
case "json":
@@ -27,8 +38,16 @@ export function formatOutput(data: unknown, format: OutputFormat): string {
case "yaml":
return stringify(data).trimEnd();
case "table":
if (Array.isArray(data) && data.length > 0 && typeof data[0] === "object" && data[0] !== null) {
return formatTable(data as Array<Record<string, unknown>>);
if (
Array.isArray(data) &&
data.length > 0 &&
typeof data[0] === "object" &&
data[0] !== null
) {
return formatHorizontalTable(data as Array<Record<string, unknown>>);
}
if (typeof data === "object" && data !== null && !Array.isArray(data)) {
return formatVerticalTable(data as Record<string, unknown>);
}
return stringify(data).trimEnd();
}