From 2e75ba2908bd2a644a5e8cd0dbf5804a4f0a52df Mon Sep 17 00:00:00 2001 From: Djeeberjr Date: Mon, 20 Oct 2025 14:29:47 +0200 Subject: [PATCH] simplified csv generator --- web/src/lib/csv.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/web/src/lib/csv.ts b/web/src/lib/csv.ts index 3c9e5b5..697052c 100644 --- a/web/src/lib/csv.ts +++ b/web/src/lib/csv.ts @@ -1,10 +1,9 @@ interface CSVOptions { - delimiter?: string; // default: "," - includeHeader?: boolean; // default: true for object input, false for array-of-arrays unless headers provided - headerOrder?: string[]; // explicit ordering for columns that should come first - eol?: string; // default: "\r\n" - includeBOM?: boolean; // default: false (useful for Excel) - nullString?: string; // default: "" (how to render null/undefined) + delimiter?: string; + headerOrder?: string[]; + eol?: string; + includeBOM?: boolean; + nullString?: string; } type RowObject = Record; @@ -13,7 +12,6 @@ type InputRows = RowObject[]; export function generateCSVString(input: InputRows, opts: CSVOptions = {}): string { const { delimiter = ",", - includeHeader, headerOrder, eol = "\r\n", includeBOM = false, @@ -29,7 +27,7 @@ export function generateCSVString(input: InputRows, opts: CSVOptions = {}): stri const escapeCell = (raw: any): string => { if (raw === null || raw === undefined) return nullString; - let s = defaultStringify(raw); + let s = stringify(raw); // Replace quotes if (s.includes('"')) s = s.replace(/"/g, '""'); @@ -38,7 +36,7 @@ export function generateCSVString(input: InputRows, opts: CSVOptions = {}): stri }; // Transform the value of a cell into a string - function defaultStringify(v: any): string { + function stringify(v: any): string { if (v === null || v === undefined) return nullString; if (v instanceof Date) return v.toLocaleDateString(); if (typeof v === "boolean") return v ? "X" : ""; @@ -79,10 +77,9 @@ export function generateCSVString(input: InputRows, opts: CSVOptions = {}): stri finalHeaders = first.concat(rest); } - const shouldIncludeHeader = typeof includeHeader === "boolean" ? includeHeader : finalHeaders.length > 0; const rowsOut: string[] = []; - if (shouldIncludeHeader && finalHeaders.length) { + if (finalHeaders.length > 0) { rowsOut.push(finalHeaders.map(h => escapeCell(h)).join(delimiter)); }