Results.utils.ts71 lines · main
1import { markdownTable } from 'markdown-table'
2import Papa from 'papaparse'
3
4type ResultRow = Record<string, unknown>
5
6export function formatClipboardValue(value: unknown) {
7 if (value === null) return ''
8 if (typeof value == 'object' || Array.isArray(value)) {
9 return JSON.stringify(value)
10 }
11 return String(value)
12}
13
14export function formatCellValue(value: unknown) {
15 if (value === null) return 'NULL'
16 if (typeof value === 'string') return value
17 return JSON.stringify(value)
18}
19
20const LARGE_VALUE_CHAR_THRESHOLD = 60
21
22export function isLargeValue(value: unknown) {
23 if (value === null || value === undefined) return false
24 if (typeof value === 'object') return true
25 const str = String(value)
26 return str.length > LARGE_VALUE_CHAR_THRESHOLD || str.includes('\n')
27}
28
29export function formatResults(
30 results: ResultRow[]
31): Record<string, string | number | boolean | null | undefined>[] {
32 return results.map((row) => {
33 const formatted: Record<string, string | number | boolean> = {}
34 for (const key of Object.keys(row)) {
35 const value = row[key]
36 formatted[key] =
37 typeof value === 'object' ? JSON.stringify(value) : (value as string | number | boolean)
38 }
39 return formatted
40 })
41}
42
43export function convertResultsToMarkdown(results: ResultRow[]): string | undefined {
44 const formatted = formatResults(results)
45 if (formatted.length === 0) return undefined
46
47 const columns = Object.keys(formatted[0])
48 const rows = formatted.map((row) => columns.map((col) => String(row[col] ?? '')))
49 const table = [columns, ...rows]
50 return markdownTable(table)
51}
52
53export function convertResultsToJSON(results: ResultRow[]): string | undefined {
54 if (results.length === 0) return undefined
55 return JSON.stringify(results, null, 2)
56}
57
58export function getResultsHeaders(results: ResultRow[]): string[] | undefined {
59 const firstRow = Array.from(results)[0]
60 if (firstRow) return Object.keys(firstRow)
61 return undefined
62}
63
64export function convertResultsToCSV(results: ResultRow[]): string | undefined {
65 if (results.length === 0) return undefined
66
67 const headers = getResultsHeaders(results)
68 const formatted = formatResults(results)
69
70 return Papa.unparse(formatted, { columns: headers })
71}