Results.utils.ts 2.2 KB

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