@@ -2,14 +2,36 @@ import { formatToon } from "./toon.js"
22
33export type OutputFormat = "json" | "table" | "toon"
44
5+ export interface OutputOptions {
6+ fields ?: string [ ]
7+ maxLines ?: number
8+ }
9+
10+ let _outputOptions : OutputOptions = { }
11+
12+ export function setOutputOptions ( options : OutputOptions ) : void {
13+ _outputOptions = options
14+ }
15+
516export function formatOutput ( data : unknown , format : OutputFormat ) : string {
17+ const processed = _outputOptions . fields
18+ ? filterFields ( data , _outputOptions . fields )
19+ : data
20+
21+ let result : string
622 if ( format === "table" ) {
7- return formatTable ( data )
23+ result = formatTable ( processed )
24+ } else if ( format === "toon" ) {
25+ result = formatToon ( processed )
26+ } else {
27+ result = JSON . stringify ( processed , null , 2 )
828 }
9- if ( format === "toon" ) {
10- return formatToon ( data )
29+
30+ if ( _outputOptions . maxLines != null ) {
31+ result = truncateOutput ( result , _outputOptions . maxLines )
1132 }
12- return JSON . stringify ( data , null , 2 )
33+
34+ return result
1335}
1436
1537function formatTable ( data : unknown ) : string {
@@ -57,3 +79,36 @@ function formatTable(data: unknown): string {
5779
5880 return String ( data )
5981}
82+
83+ function pickFields (
84+ obj : Record < string , unknown > ,
85+ fields : string [ ] ,
86+ ) : Record < string , unknown > {
87+ const result : Record < string , unknown > = { }
88+ for ( const field of fields ) {
89+ if ( field in obj ) {
90+ result [ field ] = obj [ field ]
91+ }
92+ }
93+ return result
94+ }
95+
96+ function filterFields ( data : unknown , fields : string [ ] ) : unknown {
97+ if ( Array . isArray ( data ) ) {
98+ return data . map ( item => filterFields ( item , fields ) )
99+ }
100+ if ( data && typeof data === "object" ) {
101+ return pickFields ( data as Record < string , unknown > , fields )
102+ }
103+ return data
104+ }
105+
106+ function truncateOutput ( text : string , maxLines : number ) : string {
107+ const lines = text . split ( "\n" )
108+ if ( lines . length <= maxLines ) return text
109+ const omitted = lines . length - maxLines
110+ return (
111+ lines . slice ( 0 , maxLines ) . join ( "\n" ) +
112+ `\n... (${ omitted } more line${ omitted === 1 ? "" : "s" } )`
113+ )
114+ }
0 commit comments