{"version":3,"sources":["../../src/utils/csv.ts"],"names":[],"mappings":";;;AAUO,IAAM,gBAAA,GAAmB;AAEhC,IAAM,eAAA,GAAkB,yCAAA;AACxB,IAAM,cAAA,GAAiB,UAAA;AAGhB,SAAS,UAAU,KAAA,EAAwB;AAChD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,EAAA,IAAI,IAAA,GAAO,OAAO,KAAK,CAAA;AACvB,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7E,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1F,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,KAAA,CAAY,MAAuB,OAAA,EAA6C;AAC9F,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,SAAA,CAAU,EAAE,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,SAAA,CAAU,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAChF,EAAA,OAAO,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AACpC","file":"csv.cjs","sourcesContent":["/**\n * CSV serialization — ONE quoting rule for every export in the lib and the hub.\n *\n * Beyond RFC-4180 quoting, cells are FORMULA-NEUTRALIZED: a spreadsheet treats a\n * leading `=`, `+`, `-` or `@` as a formula, so an exported value like\n * `=HYPERLINK(\"http://evil\",\"click\")` executes on open (CSV injection). A cell\n * that starts with one of those AND is not a plain numeric literal gets a leading\n * apostrophe, which Excel/Sheets strip on display.\n */\n\nexport const CSV_CONTENT_TYPE = 'text/csv;charset=utf-8;';\n\nconst NUMERIC_LITERAL = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\nconst FORMULA_PREFIX = /^[=+\\-@]/;\n\n/** Quote + neutralize a single cell. */\nexport function csvEscape(value: unknown): string {\n  if (value === null || value === undefined) return '';\n  let cell = String(value);\n  if (FORMULA_PREFIX.test(cell) && !NUMERIC_LITERAL.test(cell)) cell = `'${cell}`;\n  if (cell.includes(',') || cell.includes('\"') || cell.includes('\\n') || cell.includes('\\r')) {\n    return `\"${cell.replace(/\"/g, '\"\"')}\"`;\n  }\n  return cell;\n}\n\nexport interface CsvColumn<TRow> {\n  /** Header text (escaped like any other cell). */\n  header: string;\n  /** Cell value for a row. */\n  value: (row: TRow) => unknown;\n}\n\n/** Serialize rows to a CSV document (header + `\\n`-joined rows). */\nexport function toCsv<TRow>(rows: readonly TRow[], columns: readonly CsvColumn<TRow>[]): string {\n  const header = columns.map(c => csvEscape(c.header)).join(',');\n  const body = rows.map(row => columns.map(c => csvEscape(c.value(row))).join(','));\n  return [header, ...body].join('\\n');\n}\n"]}