{"version":3,"sources":["../src/cli/commands/dataset/download.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { DatasetRecordResponse } from \"@/client-sdk/services/datasets/types\";\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { createDatasetService } from \"./service-factory\";\nimport { handleDatasetCommandError } from \"./error-handler\";\n\n/**\n * Escapes a value for inclusion in a CSV field.\n * Wraps in quotes if the value contains commas, quotes, or newlines.\n */\nexport const escapeCsvField = (value: unknown): string => {\n  if (value === null || value === undefined) return \"\";\n  const str = typeof value === \"string\" ? value : JSON.stringify(value);\n  if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n    return `\"${str.replace(/\"/g, '\"\"')}\"`;\n  }\n  return str;\n};\n\n/**\n * Converts records to CSV format.\n *\n * @param records - Array of dataset record responses\n * @returns CSV string with header row\n */\nexport const toCsv = (records: DatasetRecordResponse[]): string => {\n  if (records.length === 0) return \"\";\n\n  // Collect all keys from all entries\n  const allKeys = new Set<string>();\n  records.forEach((record) => {\n    Object.keys(record.entry).forEach((key) => allKeys.add(key));\n  });\n  const headers = Array.from(allKeys);\n\n  const headerRow = headers.map(escapeCsvField).join(\",\");\n  const dataRows = records.map((record) =>\n    headers.map((key) => escapeCsvField(record.entry[key])).join(\",\"),\n  );\n\n  return [headerRow, ...dataRows].join(\"\\n\");\n};\n\n/**\n * Converts records to JSONL format (one JSON object per line).\n */\nexport const toJsonl = (records: DatasetRecordResponse[]): string => {\n  return records.map((record) => JSON.stringify(record.entry)).join(\"\\n\");\n};\n\n/**\n * Downloads all records from a dataset and outputs as CSV or JSONL to stdout.\n */\nexport const downloadCommand = async (\n  slugOrId: string,\n  options: { format?: string },\n): Promise<void> => {\n  checkApiKey();\n\n  const format = options.format ?? \"csv\";\n  if (format !== \"csv\" && format !== \"jsonl\") {\n    console.error(\n      chalk.red(`Invalid format \"${format}\". Use \"csv\" or \"jsonl\".`),\n    );\n    process.exit(1);\n  }\n\n  const service = createDatasetService();\n  const spinner = ora(\n    `Downloading dataset \"${slugOrId}\" as ${format.toUpperCase()}...`,\n  ).start();\n\n  try {\n    // Fetch all records by paging through results\n    const allRecords: DatasetRecordResponse[] = [];\n    let page = 1;\n    const limit = 1000;\n\n    let result;\n    do {\n      result = await service.listRecords(slugOrId, { page, limit });\n      allRecords.push(...result.data);\n      page++;\n    } while (page <= result.pagination.totalPages);\n\n    spinner.stop();\n\n    // Output to stdout\n    if (format === \"csv\") {\n      const output = toCsv(allRecords);\n      if (output) {\n        process.stdout.write(output + \"\\n\");\n      }\n    } else {\n      const output = toJsonl(allRecords);\n      if (output) {\n        process.stdout.write(output + \"\\n\");\n      }\n    }\n\n    // Summary to stderr so it doesn't pollute piped output\n    process.stderr.write(\n      chalk.green(\n        `Downloaded ${allRecords.length} record${allRecords.length !== 1 ? \"s\" : \"\"} from \"${slugOrId}\"\\n`,\n      ),\n    );\n  } catch (error) {\n    handleDatasetCommandError({ spinner, error, context: \"download dataset\" });\n  }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,WAAW;AAClB,OAAO,SAAS;AAUT,IAAM,iBAAiB,CAAC,UAA2B;AACxD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACpE,MAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,IAAI,GAAG;AAChE,WAAO,IAAI,IAAI,QAAQ,MAAM,IAAI,CAAC;AAAA,EACpC;AACA,SAAO;AACT;AAQO,IAAM,QAAQ,CAAC,YAA6C;AACjE,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,QAAM,UAAU,oBAAI,IAAY;AAChC,UAAQ,QAAQ,CAAC,WAAW;AAC1B,WAAO,KAAK,OAAO,KAAK,EAAE,QAAQ,CAAC,QAAQ,QAAQ,IAAI,GAAG,CAAC;AAAA,EAC7D,CAAC;AACD,QAAM,UAAU,MAAM,KAAK,OAAO;AAElC,QAAM,YAAY,QAAQ,IAAI,cAAc,EAAE,KAAK,GAAG;AACtD,QAAM,WAAW,QAAQ;AAAA,IAAI,CAAC,WAC5B,QAAQ,IAAI,CAAC,QAAQ,eAAe,OAAO,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,EAClE;AAEA,SAAO,CAAC,WAAW,GAAG,QAAQ,EAAE,KAAK,IAAI;AAC3C;AAKO,IAAM,UAAU,CAAC,YAA6C;AACnE,SAAO,QAAQ,IAAI,CAAC,WAAW,KAAK,UAAU,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AACxE;AAKO,IAAM,kBAAkB,OAC7B,UACA,YACkB;AAzDpB;AA0DE,cAAY;AAEZ,QAAM,UAAS,aAAQ,WAAR,YAAkB;AACjC,MAAI,WAAW,SAAS,WAAW,SAAS;AAC1C,YAAQ;AAAA,MACN,MAAM,IAAI,mBAAmB,MAAM,0BAA0B;AAAA,IAC/D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,qBAAqB;AACrC,QAAM,UAAU;AAAA,IACd,wBAAwB,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,EAC9D,EAAE,MAAM;AAER,MAAI;AAEF,UAAM,aAAsC,CAAC;AAC7C,QAAI,OAAO;AACX,UAAM,QAAQ;AAEd,QAAI;AACJ,OAAG;AACD,eAAS,MAAM,QAAQ,YAAY,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5D,iBAAW,KAAK,GAAG,OAAO,IAAI;AAC9B;AAAA,IACF,SAAS,QAAQ,OAAO,WAAW;AAEnC,YAAQ,KAAK;AAGb,QAAI,WAAW,OAAO;AACpB,YAAM,SAAS,MAAM,UAAU;AAC/B,UAAI,QAAQ;AACV,gBAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,MACpC;AAAA,IACF,OAAO;AACL,YAAM,SAAS,QAAQ,UAAU;AACjC,UAAI,QAAQ;AACV,gBAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,MACpC;AAAA,IACF;AAGA,YAAQ,OAAO;AAAA,MACb,MAAM;AAAA,QACJ,cAAc,WAAW,MAAM,UAAU,WAAW,WAAW,IAAI,MAAM,EAAE,UAAU,QAAQ;AAAA;AAAA,MAC/F;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,8BAA0B,EAAE,SAAS,OAAO,SAAS,mBAAmB,CAAC;AAAA,EAC3E;AACF;","names":[]}