{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export interface CsvOptions {\n  /** Delimiter. If omitted, we'll auto-detect among , ; \\t | */\n  delimiter?: string;\n  /** Use first row as headers (default true). You can also pass explicit headers. */\n  headers?: boolean | string[];\n  /** Keep header case (default: false = trim + toLowerCase) */\n  preserveHeaderCase?: boolean;\n  /** Treat lines starting with this as comments (e.g. '#') */\n  comment?: string;\n  /** Skip empty lines (default true) */\n  skipEmptyLines?: boolean;\n  /** Fill missing cells with this value (default null) */\n  defval?: unknown;\n  /** Try to coerce numbers/booleans/null (default false) */\n  inferTypes?: boolean;\n  /** Trim cells (default true) */\n  trimCells?: boolean;\n}\n\nexport type CsvRow = Record<string, unknown>;\n\nexport async function parseCSV(\n  input: File | Blob | ArrayBuffer | Buffer | string,\n  opts: CsvOptions = {}\n): Promise<CsvRow[]> {\n  const {\n    headers: headersOption = true,\n    preserveHeaderCase = false,\n    comment,\n    skipEmptyLines = true,\n    defval = null,\n    inferTypes = false,\n    trimCells = true,\n  } = opts;\n\n  const text = await toText(input);\n  const cleaned = stripBOM(text);\n  const delimiter = opts.delimiter ?? detectDelimiter(cleaned);\n  const rows = parseRows(cleaned, delimiter, {\n    comment,\n    skipEmptyLines: opts.skipEmptyLines ?? true,\n  });\n\n  if (!rows.length) return [];\n\n  let headerNames: string[];\n  let dataStart = 0;\n\n  if (Array.isArray(headersOption)) {\n    headerNames = normalizeHeaders(headersOption, preserveHeaderCase);\n    dataStart = 1; // <-- change this from 0 to 1 to drop the first CSV line\n  } else if (headersOption === false) {\n    headerNames = rows[0].map((_, i) => `c${i}`);\n  } else {\n    headerNames = normalizeHeaders(rows[0], preserveHeaderCase);\n    dataStart = 1;\n  }\n\n  const width = Math.max(headerNames.length, widestRow(rows));\n  if (headerNames.length < width) {\n    for (let i = headerNames.length; i < width; i++) headerNames.push(`c${i}`);\n  }\n\n  const out: CsvRow[] = [];\n  for (let i = dataStart; i < rows.length; i++) {\n    const row = rows[i];\n    const csvRow: CsvRow = {};\n    for (let c = 0; c < width; c++) {\n      const key = headerNames[c];\n      let cell = row[c];\n      if (typeof cell === \"string\" && trimCells) cell = cell.trim();\n      csvRow[key] = inferTypes ? convertToJsTypes(cell) : cell ?? defval;\n    }\n    out.push(csvRow);\n  }\n  return out;\n}\n\nasync function toText(\n  input: File | Blob | ArrayBuffer | Buffer | string\n): Promise<string> {\n  if (typeof input === \"string\") return input;\n\n  if (typeof (input as Blob).text === \"function\") {\n    return (input as Blob).text();\n  }\n\n  if (input instanceof ArrayBuffer) {\n    return new TextDecoder(\"utf-8\").decode(new Uint8Array(input));\n  }\n\n  // Node Buffer\n  // @ts-ignore - Buffer exists in Node\n  if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(input)) {\n    const buf = input as unknown as Buffer;\n    return buf.toString(\"utf8\");\n  }\n\n  throw new Error(\n    \"Unsupported input type. Provide a string, File, Blob, ArrayBuffer, or Buffer.\"\n  );\n}\n\nfunction stripBOM(s: string): string {\n  return s.charCodeAt(0) === 0xfeff ? s.slice(1) : s;\n}\n\nfunction detectDelimiter(s: string): string {\n  const candidates = [\",\", \";\", \"\\t\", \"|\"];\n  const sample = s.split(/\\r?\\n/, 5).filter(Boolean);\n\n  let best = \",\";\n  let maxColumns = 1;\n\n  for (const d of candidates) {\n    const cols = sample.map((line) => line.split(d).length);\n    const avg = cols.reduce((a, b) => a + b, 0) / cols.length;\n\n    if (avg > maxColumns) {\n      maxColumns = avg;\n      best = d;\n    }\n  }\n\n  return best;\n}\n\nfunction normalizeHeaders(headers: string[], preserve?: boolean): string[] {\n  return headers.map((h) => {\n    const v = (h ?? \"\").trim().replace(/^\\uFEFF/, \"\");\n    return preserve ? v : v.toLowerCase();\n  });\n}\n\nfunction convertToJsTypes(v: unknown): unknown {\n  if (v == null) return v;\n  if (typeof v !== \"string\") return v;\n  const s = v.trim();\n  if (s === \"\") return \"\";\n  if (/^(true|false)$/i.test(s)) return /^true$/i.test(s);\n  if (/^null$/i.test(s)) return null;\n  if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(s)) {\n    const n = Number(s);\n    if (!Number.isNaN(n)) return n;\n  }\n  return s;\n}\n\nfunction parseRows(\n  text: string,\n  delimiter: string,\n  opts: { comment?: string; skipEmptyLines: boolean }\n): string[][] {\n  const lines: string[][] = [];\n  let field = \"\";\n  let row: string[] = [];\n  let inQuotes = false;\n\n  const pushField = () => {\n    row.push(field);\n    field = \"\";\n  };\n  const pushRow = () => {\n    if (!(opts.skipEmptyLines && row.length === 1 && row[0].trim() === \"\")) {\n      lines.push(row);\n    }\n    row = [];\n  };\n\n  const d = delimiter;\n  const comment = opts.comment;\n  const len = text.length;\n\n  for (let i = 0; i < len; i++) {\n    const ch = text[i];\n    const next = i + 1 < len ? text[i + 1] : \"\";\n\n    // start-of-line comment\n    if (\n      !inQuotes &&\n      field === \"\" &&\n      row.length === 0 &&\n      comment &&\n      ch === comment\n    ) {\n      while (i < len && text[i] !== \"\\n\") i++;\n      continue;\n    }\n\n    if (ch === '\"') {\n      if (inQuotes && next === '\"') {\n        field += '\"';\n        i++;\n      } else {\n        inQuotes = !inQuotes;\n      }\n      continue;\n    }\n\n    if (!inQuotes && ch === d) {\n      pushField();\n      continue;\n    }\n\n    if (!inQuotes && (ch === \"\\n\" || ch === \"\\r\")) {\n      // handle CRLF\n      if (ch === \"\\r\" && next === \"\\n\") i++;\n      pushField();\n      pushRow();\n      continue;\n    }\n\n    field += ch;\n  }\n\n  pushField();\n  if (row.length > 1 || row[0] !== \"\") pushRow();\n  return lines;\n}\n\nfunction widestRow(rows: string[][]): number {\n  let w = 0;\n  for (let i = 0; i < rows.length; i++)\n    if (rows[i].length > w) w = rows[i].length;\n  return w;\n}\n\nexport default parseCSV;\n"]}