OverviewFilesCommitsIssuesDocsReleasesPeers

pgh / lib / output.js

45 lines · javascript ref:
/**
 * Output formatting for pgh CLI.
 */

export function formatOutput (data, format) {
  if (format === 'json') return JSON.stringify(data, null, 2)
  if (format === 'plain') return formatPlain(data)
  return formatTable(data)
}

function formatPlain (data) {
  if (typeof data === 'string') return data
  if (Array.isArray(data)) return data.map(formatPlain).join('\n')
  if (typeof data === 'object' && data !== null) {
    return Object.entries(data)
      .map(([k, v]) => `${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`)
      .join('\n')
  }
  return String(data)
}

function cellString (v) {
  if (v === null || v === undefined) return ''
  if (typeof v === 'object') return JSON.stringify(v)
  return String(v)
}

function formatTable (data) {
  if (typeof data === 'string') return data
  if (Array.isArray(data)) {
    if (data.length === 0) return '(empty)'
    const keys = Object.keys(data[0])
    const widths = keys.map(k =>
      Math.max(k.length, ...data.map(r => cellString(r[k]).length))
    )
    const header = keys.map((k, i) => k.padEnd(widths[i])).join('  ')
    const sep = widths.map(w => '-'.repeat(w)).join('  ')
    const rows = data.map(r =>
      keys.map((k, i) => cellString(r[k]).padEnd(widths[i])).join('  ')
    )
    return [header, sep, ...rows].join('\n')
  }
  return formatPlain(data)
}