43b6c63294
* update imports * move trpc router from features to trpc * update imports * wip * update imports * wip * wip * wip * fix import * create objectToCsv.ts * rename * fix: restore proper types and static imports in insights handlers - Add proper type definitions for all handler options instead of using 'any' - Restore static imports for PermissionCheckService and MembershipRole - Remove dynamic imports that were introduced during refactoring This ensures the refactoring is pure with no behavioral changes. Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update getEventTypeList import path after utils.ts deletion Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * remove handlers * fix * refactor * wip * rm * wip * select only needed + fix type error --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Eunjae Lee <hey@eunjae.dev>
22 lines
623 B
TypeScript
22 lines
623 B
TypeScript
export function objectToCsv(data: Record<string, string>[]) {
|
|
if (!data.length) return "";
|
|
|
|
const headers = Object.keys(data[0]);
|
|
const csvRows = [
|
|
headers.join(","),
|
|
...data.map((row) =>
|
|
headers
|
|
.map((header) => {
|
|
const value = row[header]?.toString() || "";
|
|
// Escape quotes and wrap in quotes if contains comma or newline
|
|
return value.includes(",") || value.includes("\n") || value.includes('"')
|
|
? `"${value.replace(/"/g, '""')}"` // escape double quotes
|
|
: value;
|
|
})
|
|
.join(",")
|
|
),
|
|
];
|
|
|
|
return csvRows.join("\n");
|
|
}
|