{"version":3,"file":"primitives.mjs","names":[],"sources":["../../src/output/primitives.ts"],"sourcesContent":["import { escapeHtml, type OutputContext } from './styling.ts';\n\n// ── Table ───────────────────────────────────────────────────────────────\n\nexport type TableOptions = {\n  /** Explicit column keys to display (default: infer from first row's keys). */\n  columns?: string[];\n  /** Column key → display header name mapping. */\n  headers?: Record<string, string>;\n  /** Column key → text alignment. */\n  align?: Record<string, 'left' | 'right' | 'center'>;\n  /** Maximum column width before truncation. */\n  maxColumnWidth?: number;\n  /** Show borders (default: true for ansi/text, false for others). */\n  border?: boolean;\n};\n\nfunction stringifyCell(value: unknown): string {\n  if (value === undefined || value === null) return '';\n  if (typeof value === 'string') return value;\n  if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n  return JSON.stringify(value);\n}\n\nfunction truncate(text: string, max: number): string {\n  if (max <= 0 || text.length <= max) return text;\n  return max <= 1 ? '…' : `${text.slice(0, max - 1)}…`;\n}\n\nfunction padCell(text: string, width: number, alignment: 'left' | 'right' | 'center' = 'left'): string {\n  const pad = width - text.length;\n  if (pad <= 0) return text;\n  if (alignment === 'right') return ' '.repeat(pad) + text;\n  if (alignment === 'center') {\n    const left = Math.floor(pad / 2);\n    return ' '.repeat(left) + text + ' '.repeat(pad - left);\n  }\n  return text + ' '.repeat(pad);\n}\n\nexport function renderTable(data: Record<string, unknown>[], options: TableOptions | undefined, ctx: OutputContext): string {\n  if (data.length === 0) return '';\n  if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n\n  const columns = options?.columns ?? Object.keys(data[0]!);\n  if (columns.length === 0) return '';\n\n  const headers = columns.map((col) => options?.headers?.[col] ?? col);\n  const maxCol = options?.maxColumnWidth;\n\n  const rows = data.map((row) =>\n    columns.map((col) => {\n      const text = stringifyCell(row[col]);\n      return maxCol ? truncate(text, maxCol) : text;\n    }),\n  );\n\n  const colWidths = columns.map((_, i) => {\n    const headerWidth = headers[i]!.length;\n    const maxCellWidth = rows.reduce((max, row) => Math.max(max, row[i]!.length), 0);\n    return Math.max(headerWidth, maxCellWidth);\n  });\n\n  const getAlign = (i: number): 'left' | 'right' | 'center' => options?.align?.[columns[i]!] ?? 'left';\n\n  if (ctx.format === 'markdown') return renderTableMarkdown(headers, rows, colWidths, getAlign);\n  if (ctx.format === 'html') return renderTableHtml(columns, headers, rows, data, getAlign);\n  return renderTableText(headers, rows, colWidths, getAlign, options?.border !== false, ctx);\n}\n\nfunction renderTableText(\n  headers: string[],\n  rows: string[][],\n  colWidths: number[],\n  getAlign: (i: number) => 'left' | 'right' | 'center',\n  border: boolean,\n  ctx: OutputContext,\n): string {\n  const { styler } = ctx;\n  const formatRow = (cells: string[], style?: (s: string) => string) =>\n    cells.map((cell, i) => {\n      const padded = padCell(cell, colWidths[i]!, getAlign(i));\n      return style ? style(padded) : padded;\n    });\n\n  if (border) {\n    const sep = ctx.styler.meta('─');\n    const divider = colWidths.map((w) => sep.repeat(w + 2)).join(styler.meta('┼'));\n    const row = (cells: string[]) => cells.map((c, i) => ` ${padCell(c, colWidths[i]!, getAlign(i))} `).join(styler.meta('│'));\n    const headerRow = row(headers.map((h) => styler.label(h)));\n    const dataRows = rows.map((r) => row(r.map((c) => styler.description(c))));\n    return [headerRow, styler.meta('─') + divider + styler.meta('─'), ...dataRows].join('\\n');\n  }\n\n  const headerCells = formatRow(headers, styler.label);\n  const dataCells = rows.map((r) => formatRow(r, styler.description));\n  const gap = '  ';\n  return [headerCells.join(gap), ...dataCells.map((r) => r.join(gap))].join('\\n');\n}\n\nfunction renderTableMarkdown(\n  headers: string[],\n  rows: string[][],\n  colWidths: number[],\n  getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n  const headerLine = `| ${headers.map((h, i) => padCell(h, colWidths[i]!, 'left')).join(' | ')} |`;\n  const separatorLine =\n    '| ' +\n    colWidths\n      .map((w, i) => {\n        const a = getAlign(i);\n        const dashes = '─'.repeat(Math.max(w, 3));\n        if (a === 'center') return `:${dashes}:`;\n        if (a === 'right') return `${dashes}:`;\n        return dashes;\n      })\n      .join(' | ') +\n    ' |';\n  const dataLines = rows.map((r) => `| ${r.map((c, i) => padCell(c, colWidths[i]!, 'left')).join(' | ')} |`);\n  return [headerLine, separatorLine, ...dataLines].join('\\n');\n}\n\nfunction renderTableHtml(\n  columns: string[],\n  headers: string[],\n  _rows: string[][],\n  data: Record<string, unknown>[],\n  getAlign: (i: number) => 'left' | 'right' | 'center',\n): string {\n  const ths = headers.map((h, i) => {\n    const a = getAlign(i);\n    const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n    return `<th${style}>${escapeHtml(h)}</th>`;\n  });\n  const trs = data.map(\n    (row) =>\n      '<tr>' +\n      columns\n        .map((col, i) => {\n          const a = getAlign(i);\n          const style = a !== 'left' ? ` style=\"text-align: ${a};\"` : '';\n          return `<td${style}>${escapeHtml(stringifyCell(row[col]))}</td>`;\n        })\n        .join('') +\n      '</tr>',\n  );\n  return `<table><thead><tr>${ths.join('')}</tr></thead><tbody>${trs.join('')}</tbody></table>`;\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────\n\nexport type TreeNode = {\n  label: string;\n  children?: TreeNode[];\n};\n\nexport type TreeOptions = {\n  /** Characters per indent level (default: 2). */\n  indent?: number;\n  /** Show tree guide lines (default: true for ansi/text). */\n  guides?: boolean;\n};\n\nexport function renderTree(data: TreeNode | TreeNode[], options: TreeOptions | undefined, ctx: OutputContext): string {\n  const nodes = Array.isArray(data) ? data : [data];\n  if (nodes.length === 0) return '';\n  if (ctx.format === 'json') return JSON.stringify(nodes, null, 2);\n  if (ctx.format === 'markdown') return renderTreeMarkdown(nodes, 0);\n  if (ctx.format === 'html') return renderTreeHtml(nodes);\n\n  const guides = options?.guides !== false;\n  return renderTreeText(nodes, '', guides, ctx).join('\\n');\n}\n\nfunction renderTreeText(nodes: TreeNode[], prefix: string, guides: boolean, ctx: OutputContext): string[] {\n  const lines: string[] = [];\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i]!;\n    const isLast = i === nodes.length - 1;\n    if (guides) {\n      const connector = isLast ? '└── ' : '├── ';\n      const childPrefix = isLast ? '    ' : '│   ';\n      lines.push(prefix + ctx.styler.meta(connector) + ctx.styler.label(node.label));\n      if (node.children?.length) lines.push(...renderTreeText(node.children, prefix + ctx.styler.meta(childPrefix), guides, ctx));\n    } else {\n      const indent = prefix ? `${prefix}  ` : '';\n      lines.push(indent + ctx.styler.label(node.label));\n      if (node.children?.length) lines.push(...renderTreeText(node.children, indent, guides, ctx));\n    }\n  }\n  return lines;\n}\n\nfunction renderTreeMarkdown(nodes: TreeNode[], depth: number): string {\n  return nodes\n    .map((node) => {\n      const indent = '  '.repeat(depth);\n      const line = `${indent}- ${node.label}`;\n      if (!node.children?.length) return line;\n      return `${line}\\n${renderTreeMarkdown(node.children, depth + 1)}`;\n    })\n    .join('\\n');\n}\n\nfunction renderTreeHtml(nodes: TreeNode[]): string {\n  const items = nodes\n    .map((node) => {\n      const label = escapeHtml(node.label);\n      if (!node.children?.length) return `<li>${label}</li>`;\n      return `<li>${label}${renderTreeHtml(node.children)}</li>`;\n    })\n    .join('');\n  return `<ul>${items}</ul>`;\n}\n\n// ── List ────────────────────────────────────────────────────────────────\n\nexport type ListItem = string | { label: string; description?: string };\n\nexport type ListOptions = {\n  /** Bullet character (default: '•' for ansi, '-' for text). */\n  bullet?: string;\n  /** Use numbered list instead of bullets. */\n  numbered?: boolean;\n  /** Indent level (default: 0). */\n  indent?: number;\n};\n\nexport function renderList(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n  if (data.length === 0) return '';\n  if (ctx.format === 'json') {\n    const normalized = data.map((item) => (typeof item === 'string' ? { label: item } : item));\n    return JSON.stringify(normalized, null, 2);\n  }\n  if (ctx.format === 'markdown') return renderListMarkdown(data, options);\n  if (ctx.format === 'html') return renderListHtml(data, options);\n  return renderListText(data, options, ctx);\n}\n\nfunction renderListText(data: ListItem[], options: ListOptions | undefined, ctx: OutputContext): string {\n  const { styler } = ctx;\n  const numbered = options?.numbered ?? false;\n  const bullet = options?.bullet ?? (ctx.format === 'ansi' ? '•' : '-');\n  const baseIndent = '  '.repeat(options?.indent ?? 0);\n\n  return data\n    .map((item, i) => {\n      const prefix = numbered ? `${i + 1}.` : bullet;\n      const label = typeof item === 'string' ? item : item.label;\n      const desc = typeof item === 'object' && item.description ? item.description : undefined;\n      const line = `${baseIndent}${styler.meta(prefix)} ${styler.label(label)}`;\n      if (!desc) return line;\n      return `${line}  ${styler.description(desc)}`;\n    })\n    .join('\\n');\n}\n\nfunction renderListMarkdown(data: ListItem[], options: ListOptions | undefined): string {\n  const numbered = options?.numbered ?? false;\n  return data\n    .map((item, i) => {\n      const prefix = numbered ? `${i + 1}.` : '-';\n      const label = typeof item === 'string' ? item : item.label;\n      const desc = typeof item === 'object' && item.description ? item.description : undefined;\n      if (!desc) return `${prefix} ${label}`;\n      return `${prefix} **${label}** — ${desc}`;\n    })\n    .join('\\n');\n}\n\nfunction renderListHtml(data: ListItem[], options: ListOptions | undefined): string {\n  const tag = options?.numbered ? 'ol' : 'ul';\n  const items = data\n    .map((item) => {\n      const label = typeof item === 'string' ? item : item.label;\n      const desc = typeof item === 'object' && item.description ? item.description : undefined;\n      if (!desc) return `<li>${escapeHtml(label)}</li>`;\n      return `<li><strong>${escapeHtml(label)}</strong> — ${escapeHtml(desc)}</li>`;\n    })\n    .join('');\n  return `<${tag}>${items}</${tag}>`;\n}\n\n// ── Key-Value ───────────────────────────────────────────────────────────\n\nexport type KeyValueOptions = {\n  /** Separator between key and value (default: ': '). */\n  separator?: string;\n  /** Align values by padding keys to the same width. */\n  align?: boolean;\n  /** Key → display label mapping. */\n  labels?: Record<string, string>;\n};\n\nexport function renderKeyValue(data: Record<string, unknown>, options: KeyValueOptions | undefined, ctx: OutputContext): string {\n  const entries = Object.entries(data);\n  if (entries.length === 0) return '';\n  if (ctx.format === 'json') return JSON.stringify(data, null, 2);\n  if (ctx.format === 'markdown') return renderKeyValueMarkdown(entries, options);\n  if (ctx.format === 'html') return renderKeyValueHtml(entries, options);\n  return renderKeyValueText(entries, options, ctx);\n}\n\nfunction getLabel(key: string, labels?: Record<string, string>): string {\n  return labels?.[key] ?? key;\n}\n\nfunction renderKeyValueText(entries: [string, unknown][], options: KeyValueOptions | undefined, ctx: OutputContext): string {\n  const { styler } = ctx;\n  const sep = options?.separator ?? ': ';\n  const shouldAlign = options?.align !== false;\n\n  const displayLabels = entries.map(([k]) => getLabel(k, options?.labels));\n  const maxWidth = shouldAlign ? Math.max(...displayLabels.map((l) => l.length)) : 0;\n\n  return entries\n    .map(([_key, value], i) => {\n      const label = displayLabels[i]!;\n      const paddedLabel = shouldAlign ? label + ' '.repeat(maxWidth - label.length) : label;\n      return `${styler.label(paddedLabel)}${styler.meta(sep)}${styler.description(stringifyCell(value))}`;\n    })\n    .join('\\n');\n}\n\nfunction renderKeyValueMarkdown(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n  return entries.map(([key, value]) => `- **${getLabel(key, options?.labels)}**: ${stringifyCell(value)}`).join('\\n');\n}\n\nfunction renderKeyValueHtml(entries: [string, unknown][], options: KeyValueOptions | undefined): string {\n  const items = entries\n    .map(([key, value]) => `<dt>${escapeHtml(getLabel(key, options?.labels))}</dt><dd>${escapeHtml(stringifyCell(value))}</dd>`)\n    .join('');\n  return `<dl>${items}</dl>`;\n}\n"],"mappings":"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"}