SPB Git
2.3 KB · 26 lines typescript
1/** Database → CSV (title + one column per property, values keyed by property id in database_rows.values). */2import Papa from "papaparse";3import type { ExportSet } from "./data";4import { displayValue } from "@/lib/databases/values";5import type { Property } from "@/lib/databases/types";6export const asProperty = (p: ExportSet["properties"][number]): Property => ({ id: p.id, databaseId: p.databaseId, name: p.name, type: p.type as Property["type"], config: (p.config ?? {}) as Property["config"], position: p.position, width: p.width });78export function cellToString(v: unknown): string {9  if (v === null || v === undefined) return "";10  if (typeof v === "string") return v;11  if (typeof v === "number" || typeof v === "boolean") return String(v);12  if (v instanceof Date) return v.toISOString();13  if (Array.isArray(v)) return v.map((x) => (typeof x === "object" && x ? ((x as any).label ?? (x as any).name ?? (x as any).title ?? JSON.stringify(x)) : String(x))).join(", ");14  if (typeof v === "object") { const o = v as any; return o.label ?? o.name ?? o.title ?? o.url ?? JSON.stringify(o); }15  return String(v);16}17export function databaseCsv(set: ExportSet, databaseId: string): { name: string; csv: string } {18  const d = set.databases.find((x) => x.id === databaseId); if (!d) throw new Error("Database not found");19  const props = set.properties.filter((p) => p.databaseId === databaseId && p.type !== "title").sort((a, b) => a.position - b.position);20  const pageById = new Map(set.pages.map((p) => [p.id, p]));21  const rows = set.rows.filter((r) => r.databaseId === databaseId).sort((a, b) => a.position - b.position);22  const header = ["Title", ...props.map((p) => p.name), "Created", "Updated"];23  const data = rows.map((r) => { const page = pageById.get(r.pageId); const v = (r.values ?? {}) as Record<string, unknown>; return [page?.title ?? "", ...props.map((p) => { const raw = v[p.id] ?? v[p.name]; if (raw == null || raw === "") return ""; if (["date", "number", "created_time", "last_edited_time", "url", "text"].includes(p.type)) return cellToString(raw); try { return displayValue(asProperty(p), raw); } catch { return cellToString(raw); } }), (page?.createdAt ?? r.createdAt).toISOString(), (page?.updatedAt ?? r.updatedAt).toISOString()]; });24  return { name: d.name, csv: Papa.unparse({ fields: header, data }, { newline: "\n" }) + "\n" };25}26
Files · main
Menu

Theme