/** * One CSV cell, quoted when it has to be, and never a formula. * * A spreadsheet runs a cell that starts with `=`, `+`, `-` or `@` (or a tab or a * carriage return in front of one) as a formula. The audit export carries text * a member chose — a refused blob's kind, a file name — so such a cell is given * a leading apostrophe, which spreadsheets read as "this is text", and which is * what other exports do. */ export function csvCell(value) { let s = value == null ? '' : String(value); if (/^[=+\-@\t\r]/.test(s)) s = `'${s}`; return /[",\n\r]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; }