@lmnr-ai/lmnr 0.8.19 → 0.8.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/worker/build.cjs +1 -1
- package/dist/cli/worker/build.mjs +1 -1
- package/dist/cli/worker/index.cjs +1 -1
- package/dist/cli/worker/index.mjs +1 -1
- package/dist/cli.cjs +3 -3
- package/dist/cli.d.cts +1 -1
- package/dist/cli.d.mts +1 -1
- package/dist/cli.mjs +3 -3
- package/dist/{decorators-Bfz58XBx.mjs → decorators-BDFgXfgI.mjs} +820 -139
- package/dist/decorators-BDFgXfgI.mjs.map +1 -0
- package/dist/{decorators-D_KaLDRT.cjs → decorators-CaTC0lJq.cjs} +831 -138
- package/dist/decorators-CaTC0lJq.cjs.map +1 -0
- package/dist/{dist-CKxlEgac.mjs → dist-B5CmOQ4s.mjs} +3 -3
- package/dist/{dist-CKxlEgac.mjs.map → dist-B5CmOQ4s.mjs.map} +1 -1
- package/dist/{dist-DgIiKmoA.cjs → dist-B5cKzRzq.cjs} +3 -3
- package/dist/{dist-DgIiKmoA.cjs.map → dist-B5cKzRzq.cjs.map} +1 -1
- package/dist/{evaluations-D2duRqbG.d.cts → evaluations-BJkIwpmH.d.cts} +15 -1
- package/dist/{evaluations-DEbBIXng.d.mts → evaluations-tqpNgp0P.d.mts} +15 -1
- package/dist/{file-utils-C-auksVC.mjs → file-utils-CHoR9VB8.mjs} +2 -2
- package/dist/{file-utils-C-auksVC.mjs.map → file-utils-CHoR9VB8.mjs.map} +1 -1
- package/dist/file-utils-IBEBwZxq.cjs +2 -0
- package/dist/{file-utils-0mVr0eIv.cjs → file-utils-yJ5ephze.cjs} +2 -2
- package/dist/{file-utils-0mVr0eIv.cjs.map → file-utils-yJ5ephze.cjs.map} +1 -1
- package/dist/index.cjs +563 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +125 -3
- package/dist/index.d.mts +125 -3
- package/dist/index.mjs +564 -11
- package/dist/index.mjs.map +1 -1
- package/dist/{utils-BmWNkeX5.cjs → utils-C8Tl1vKD.cjs} +23 -1
- package/dist/utils-C8Tl1vKD.cjs.map +1 -0
- package/dist/{utils-0WC6BVqs.mjs → utils-CHJ0KZUR.mjs} +12 -2
- package/dist/utils-CHJ0KZUR.mjs.map +1 -0
- package/package.json +6 -5
- package/dist/decorators-Bfz58XBx.mjs.map +0 -1
- package/dist/decorators-D_KaLDRT.cjs.map +0 -1
- package/dist/file-utils-2hY2DP65.cjs +0 -2
- package/dist/utils-0WC6BVqs.mjs.map +0 -1
- package/dist/utils-BmWNkeX5.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils-C-auksVC.mjs","names":["asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.0/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => mapHeaders({ header, index }))\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import csv from 'csv-parser';\nimport { asString, generateCsv, mkConfig } from 'export-to-csv';\nimport { createReadStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Datapoint } from '../evaluations';\nimport { initializeLogger } from '../utils';\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return ['.json', '.csv', '.jsonl'].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. `\n + `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, 'utf-8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== 'string') {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(\n `Error parsing JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> => new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on('data', (data) => results.push(parseCsvRow(data)))\n .on('end', () => resolve(results))\n .on('error', reject);\n});\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, 'utf-8');\n const lines = content.split('\\n').filter((line) => line.trim());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === '.json') {\n return readJsonFile(filepath);\n } else if (ext === '.csv') {\n return readCsvFile(filepath);\n } else if (ext === '.jsonl') {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn('No supported files found in the specified paths');\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(\n `Error reading file ${file}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, 'utf-8');\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error('No data to write to CSV');\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, 'utf-8');\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join('\\n');\n await fs.writeFile(filepath, lines + '\\n', 'utf-8');\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: 'json' | 'csv' | 'jsonl',\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === 'json') {\n await writeJsonFile(filepath, data);\n } else if (ext === 'csv') {\n await writeCsvFile(filepath, data);\n } else if (ext === 'jsonl') {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: 'json' | 'csv' | 'jsonl' = 'json',\n) => {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === 'csv') {\n if (data.length === 0) {\n logger.error('No data to print');\n return;\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === 'jsonl') {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. `\n + \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-utils-CHoR9VB8.mjs","names":["asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.0/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => mapHeaders({ header, index }))\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import csv from 'csv-parser';\nimport { asString, generateCsv, mkConfig } from 'export-to-csv';\nimport { createReadStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Datapoint } from '../evaluations';\nimport { initializeLogger } from '../utils';\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return ['.json', '.csv', '.jsonl'].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. `\n + `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, 'utf-8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== 'string') {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(\n `Error parsing JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> => new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on('data', (data) => results.push(parseCsvRow(data)))\n .on('end', () => resolve(results))\n .on('error', reject);\n});\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, 'utf-8');\n const lines = content.split('\\n').filter((line) => line.trim());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === '.json') {\n return readJsonFile(filepath);\n } else if (ext === '.csv') {\n return readCsvFile(filepath);\n } else if (ext === '.jsonl') {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn('No supported files found in the specified paths');\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(\n `Error reading file ${file}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, 'utf-8');\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error('No data to write to CSV');\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, 'utf-8');\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join('\\n');\n await fs.writeFile(filepath, lines + '\\n', 'utf-8');\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: 'json' | 'csv' | 'jsonl',\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === 'json') {\n await writeJsonFile(filepath, data);\n } else if (ext === 'csv') {\n await writeCsvFile(filepath, data);\n } else if (ext === 'jsonl') {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: 'json' | 'csv' | 'jsonl' = 'json',\n) => {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === 'csv') {\n if (data.length === 0) {\n logger.error('No data to print');\n return;\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === 'jsonl') {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. `\n + \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Do9eywBl.cjs");
|
|
2
|
-
const require_utils = require("./utils-
|
|
2
|
+
const require_utils = require("./utils-C8Tl1vKD.cjs");
|
|
3
3
|
let path = require("path");
|
|
4
4
|
path = require_chunk.__toESM(path);
|
|
5
5
|
let fs = require("fs");
|
|
@@ -521,4 +521,4 @@ Object.defineProperty(exports, "writeToFile", {
|
|
|
521
521
|
}
|
|
522
522
|
});
|
|
523
523
|
|
|
524
|
-
//# sourceMappingURL=file-utils-
|
|
524
|
+
//# sourceMappingURL=file-utils-yJ5ephze.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils-0mVr0eIv.cjs","names":["initializeLogger","fs","asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.0/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => mapHeaders({ header, index }))\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import csv from 'csv-parser';\nimport { asString, generateCsv, mkConfig } from 'export-to-csv';\nimport { createReadStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Datapoint } from '../evaluations';\nimport { initializeLogger } from '../utils';\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return ['.json', '.csv', '.jsonl'].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. `\n + `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, 'utf-8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== 'string') {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(\n `Error parsing JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> => new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on('data', (data) => results.push(parseCsvRow(data)))\n .on('end', () => resolve(results))\n .on('error', reject);\n});\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, 'utf-8');\n const lines = content.split('\\n').filter((line) => line.trim());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === '.json') {\n return readJsonFile(filepath);\n } else if (ext === '.csv') {\n return readCsvFile(filepath);\n } else if (ext === '.jsonl') {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn('No supported files found in the specified paths');\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(\n `Error reading file ${file}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, 'utf-8');\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error('No data to write to CSV');\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, 'utf-8');\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join('\\n');\n await fs.writeFile(filepath, lines + '\\n', 'utf-8');\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: 'json' | 'csv' | 'jsonl',\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === 'json') {\n await writeJsonFile(filepath, data);\n } else if (ext === 'csv') {\n await writeCsvFile(filepath, data);\n } else if (ext === 'jsonl') {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: 'json' | 'csv' | 'jsonl' = 'json',\n) => {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === 'csv') {\n if (data.length === 0) {\n logger.error('No data to print');\n return;\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === 'jsonl') {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. `\n + \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-utils-yJ5ephze.cjs","names":["initializeLogger","fs","asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.0/node_modules/csv-parser/index.js","../../../node_modules/.pnpm/export-to-csv@1.4.0/node_modules/export-to-csv/output/index.js","../src/cli/file-utils.ts"],"sourcesContent":["const { Transform } = require('stream')\n\nconst [cr] = Buffer.from('\\r')\nconst [nl] = Buffer.from('\\n')\nconst defaults = {\n escape: '\"',\n headers: null,\n mapHeaders: ({ header }) => header,\n mapValues: ({ value }) => value,\n newline: '\\n',\n quote: '\"',\n raw: false,\n separator: ',',\n skipComments: false,\n skipLines: null,\n maxRowBytes: Number.MAX_SAFE_INTEGER,\n strict: false,\n outputByteOffset: false\n}\n\nclass CsvParser extends Transform {\n constructor (opts = {}) {\n super({ objectMode: true, highWaterMark: 16 })\n\n if (Array.isArray(opts)) opts = { headers: opts }\n\n const options = Object.assign({}, defaults, opts)\n\n options.customNewline = options.newline !== defaults.newline\n\n for (const key of ['newline', 'quote', 'separator']) {\n if (typeof options[key] !== 'undefined') {\n ([options[key]] = Buffer.from(options[key]))\n }\n }\n\n // if escape is not defined on the passed options, use the end value of quote\n options.escape = (opts || {}).escape ? Buffer.from(options.escape)[0] : options.quote\n\n this.state = {\n empty: options.raw ? Buffer.alloc(0) : '',\n escaped: false,\n first: true,\n lineNumber: 0,\n previousEnd: 0,\n rowLength: 0,\n quoted: false\n }\n\n this._prev = null\n\n if (options.headers === false) {\n // enforce, as the column length check will fail if headers:false\n options.strict = false\n }\n\n if (options.headers || options.headers === false) {\n this.state.first = false\n }\n\n this.options = options\n this.headers = options.headers\n this.bytesRead = 0\n }\n\n parseCell (buffer, start, end) {\n const { escape, quote } = this.options\n // remove quotes from quoted cells\n if (buffer[start] === quote && buffer[end - 1] === quote) {\n start++\n end--\n }\n\n let y = start\n\n for (let i = start; i < end; i++) {\n // check for escape characters and skip them\n if (buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote) {\n i++\n }\n\n if (y !== i) {\n buffer[y] = buffer[i]\n }\n y++\n }\n\n return this.parseValue(buffer, start, y)\n }\n\n parseLine (buffer, start, end) {\n const { customNewline, escape, mapHeaders, mapValues, quote, separator, skipComments, skipLines } = this.options\n\n end-- // trim newline\n if (!customNewline && buffer.length && buffer[end - 1] === cr) {\n end--\n }\n\n const comma = separator\n const cells = []\n let isQuoted = false\n let offset = start\n\n if (skipComments) {\n const char = typeof skipComments === 'string' ? skipComments : '#'\n if (buffer[start] === Buffer.from(char)[0]) {\n return\n }\n }\n\n const mapValue = (value) => {\n if (this.state.first) {\n return value\n }\n\n const index = cells.length\n const header = this.headers[index]\n\n return mapValues({ header, index, value })\n }\n\n for (let i = start; i < end; i++) {\n const isStartingQuote = !isQuoted && buffer[i] === quote\n const isEndingQuote = isQuoted && buffer[i] === quote && i + 1 <= end && buffer[i + 1] === comma\n const isEscape = isQuoted && buffer[i] === escape && i + 1 < end && buffer[i + 1] === quote\n\n if (isStartingQuote || isEndingQuote) {\n isQuoted = !isQuoted\n continue\n } else if (isEscape) {\n i++\n continue\n }\n\n if (buffer[i] === comma && !isQuoted) {\n let value = this.parseCell(buffer, offset, i)\n value = mapValue(value)\n cells.push(value)\n offset = i + 1\n }\n }\n\n if (offset < end) {\n let value = this.parseCell(buffer, offset, end)\n value = mapValue(value)\n cells.push(value)\n }\n\n if (buffer[end - 1] === comma) {\n cells.push(mapValue(this.state.empty))\n }\n\n const skip = skipLines && skipLines > this.state.lineNumber\n this.state.lineNumber++\n\n if (this.state.first && !skip) {\n this.state.first = false\n this.headers = cells.map((header, index) => mapHeaders({ header, index }))\n\n this.emit('headers', this.headers)\n return\n }\n\n if (!skip && this.options.strict && cells.length !== this.headers.length) {\n const e = new RangeError('Row length does not match headers')\n this.emit('error', e)\n } else {\n if (!skip) {\n const byteOffset = this.bytesRead - buffer.length + start\n this.writeRow(cells, byteOffset)\n }\n }\n }\n\n parseValue (buffer, start, end) {\n if (this.options.raw) {\n return buffer.slice(start, end)\n }\n\n return buffer.toString('utf-8', start, end)\n }\n\n writeRow (cells, byteOffset) {\n const headers = (this.headers === false) ? cells.map((value, index) => index) : this.headers\n\n const row = cells.reduce((o, cell, index) => {\n const header = headers[index]\n if (header === null) return o // skip columns\n if (header !== undefined) {\n o[header] = cell\n } else {\n o[`_${index}`] = cell\n }\n return o\n }, {})\n\n if (this.options.outputByteOffset) {\n this.push({ row, byteOffset })\n } else {\n this.push(row)\n }\n }\n\n _flush (cb) {\n if (this.state.escaped || !this._prev) return cb()\n this.parseLine(this._prev, this.state.previousEnd, this._prev.length + 1) // plus since online -1s\n cb()\n }\n\n _transform (data, enc, cb) {\n if (typeof data === 'string') {\n data = Buffer.from(data)\n }\n\n const { escape, quote } = this.options\n let start = 0\n let buffer = data\n this.bytesRead += data.byteLength\n\n if (this._prev) {\n start = this._prev.length\n buffer = Buffer.concat([this._prev, data])\n this._prev = null\n }\n\n const bufferLength = buffer.length\n\n for (let i = start; i < bufferLength; i++) {\n const chr = buffer[i]\n const nextChr = i + 1 < bufferLength ? buffer[i + 1] : null\n\n this.state.rowLength++\n if (this.state.rowLength > this.options.maxRowBytes) {\n return cb(new Error('Row exceeds the maximum size'))\n }\n\n if (!this.state.escaped && chr === escape && nextChr === quote && i !== start) {\n this.state.escaped = true\n continue\n } else if (chr === quote) {\n if (this.state.escaped) {\n this.state.escaped = false\n // non-escaped quote (quoting the cell)\n } else {\n this.state.quoted = !this.state.quoted\n }\n continue\n }\n\n if (!this.state.quoted) {\n if (this.state.first && !this.options.customNewline) {\n if (chr === nl) {\n this.options.newline = nl\n } else if (chr === cr) {\n if (nextChr !== nl) {\n this.options.newline = cr\n }\n }\n }\n\n if (chr === this.options.newline) {\n this.parseLine(buffer, this.state.previousEnd, i + 1)\n this.state.previousEnd = i + 1\n this.state.rowLength = 0\n }\n }\n }\n\n if (this.state.previousEnd === bufferLength) {\n this.state.previousEnd = 0\n return cb()\n }\n\n if (bufferLength - this.state.previousEnd < data.length) {\n this._prev = data\n this.state.previousEnd -= (bufferLength - data.length)\n return cb()\n }\n\n this._prev = buffer\n cb()\n }\n}\n\nmodule.exports = (opts) => new CsvParser(opts)\n","var q;(function(x){x[\"csv\"]=\"text/csv\";x[\"tsv\"]=\"text/tab-separated-values\";x[\"plain\"]=\"text/plain\"})(q||(q={}));var X=(W)=>W,z=(W)=>W,Z=X,_=X,Y=X,N=X,V=X;var h={fieldSeparator:\",\",decimalSeparator:\".\",quoteStrings:!0,quoteCharacter:'\"',showTitle:!1,title:\"My Generated Report\",filename:\"generated\",showColumnHeaders:!0,useTextFile:!1,fileExtension:\"csv\",mediaType:q.csv,useBom:!0,columnHeaders:[],useKeysAsHeaders:!1,boolDisplay:{true:\"TRUE\",false:\"FALSE\"},replaceUndefinedWith:\"\"},F=\"\\r\\n\",R=\"\\uFEFF\",G=(W)=>Object.assign({},h,W);class K extends Error{constructor(W){super(W);this.name=\"CsvGenerationError\"}}class B extends Error{constructor(W){super(W);this.name=\"EmptyHeadersError\"}}class L extends Error{constructor(W){super(W);this.name=\"CsvDownloadEnvironmentError\"}}class P extends Error{constructor(W){super(W);this.name=\"UnsupportedDataFormatError\"}}var s=function(W,$){if($=='\"'&&W.indexOf('\"')>-1)return W.replace(/\"/g,'\"\"');return W},w=(W)=>typeof W===\"object\"?N(W.key):N(W),y=(W)=>typeof W===\"object\"?V(W.displayLabel):V(W),T=(W,...$)=>$.reduce((j,x)=>x(j),W),E=(W)=>($)=>W.useBom?_(z($)+R):$,M=(W)=>($)=>W.showTitle?S(_(z($)+W.title))(Y(\"\")):$,S=(W)=>($)=>_(z(W)+z($)+F),O=(W)=>($,j)=>l(W)(Y(z($)+z(j))),l=(W)=>($)=>X(z($)+W.fieldSeparator),b=(W,$)=>(j)=>{if(!W.showColumnHeaders)return j;if($.length<1)throw new B(\"Option to show headers but none supplied. Make sure there are keys in your collection or that you've supplied headers through the config options.\");let x=Y(\"\");for(let A=0;A<$.length;A++){const J=y($[A]);x=O(W)(x,v(W,z(J)))}return x=Y(z(x).slice(0,-1)),S(j)(x)},C=(W,$,j)=>(x)=>{let A=x;for(var J=0;J<j.length;J++){let I=Y(\"\");for(let U=0;U<$.length;U++){const H=w($[U]),D=j[J][z(H)];I=O(W)(I,v(W,D))}I=Y(z(I).slice(0,-1)),A=S(A)(I)}return A},k=z,m=(W)=>+W===W&&(!isFinite(W)||Boolean(W%1)),p=(W,$)=>{if(m($)){if(W.decimalSeparator===\"locale\")return Z($.toLocaleString());if(W.decimalSeparator)return Z($.toString().replace(\".\",W.decimalSeparator))}return Z($.toString())},Q=(W,$)=>{let j=$;if(W.quoteStrings||W.fieldSeparator&&$.indexOf(W.fieldSeparator)>-1||W.quoteCharacter&&$.indexOf(W.quoteCharacter)>-1||$.indexOf(\"\\n\")>-1||$.indexOf(\"\\r\")>-1)j=W.quoteCharacter+s($,W.quoteCharacter)+W.quoteCharacter;return Z(j)},g=(W,$)=>{const j=$?\"true\":\"false\";return Z(W.boolDisplay[j])},r=(W,$)=>{if(typeof $===\"undefined\"&&W.replaceUndefinedWith!==void 0)return Q(W,W.replaceUndefinedWith+\"\");if($===null)return Q(W,\"null\");return Q(W,\"\")},v=(W,$)=>{if(typeof $===\"number\")return p(W,$);if(typeof $===\"string\")return Q(W,$);if(typeof $===\"boolean\"&&W.boolDisplay)return g(W,$);if($===null||typeof $===\"undefined\")return r(W,$);throw new P(`\n typeof ${typeof $} isn't supported. Only number, string, boolean, null and undefined are supported.\n Please convert the data in your object to one of those before generating the CSV.\n `)};var BW=(W)=>($)=>{const j=G(W),x=j.useKeysAsHeaders?Object.keys($[0]):j.columnHeaders;let A=T(_(\"\"),E(j),M(j),b(j,x),C(j,x,$));if(z(A).length<1)throw new K(\"Output is empty. Is your data formatted correctly?\");return A},f=(W)=>($)=>{const j=G(W),x=z($),A=j.useTextFile?\"text/plain\":j.mediaType;return new Blob([x],{type:`${A};charset=utf8;`})},LW=(W)=>($)=>{if(!window)throw new L(\"Downloading only supported in a browser environment.\");const j=f(W)($),x=G(W),A=x.useTextFile?\"txt\":x.fileExtension,J=`${x.filename}.${A}`,I=document.createElement(\"a\");I.download=J,I.href=URL.createObjectURL(j),I.setAttribute(\"visibility\",\"hidden\"),document.body.appendChild(I),I.click(),document.body.removeChild(I)};export{G as mkConfig,BW as generateCsv,LW as download,k as asString,f as asBlob,q as MediaType};\n","import csv from 'csv-parser';\nimport { asString, generateCsv, mkConfig } from 'export-to-csv';\nimport { createReadStream } from 'fs';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nimport { Datapoint } from '../evaluations';\nimport { initializeLogger } from '../utils';\n\nconst logger = initializeLogger();\n\n/**\n * Check if a file has a supported extension.\n */\nconst isSupportedFile = (file: string): boolean => {\n const ext = path.extname(file).toLowerCase();\n return ['.json', '.csv', '.jsonl'].includes(ext);\n};\n\n/**\n * Collect all supported files from the given paths.\n * Handles both files and directories.\n */\nexport const collectFiles = async (\n paths: string[],\n recursive: boolean = false,\n): Promise<string[]> => {\n const collectedFiles: string[] = [];\n\n for (const filepath of paths) {\n try {\n const stats = await fs.stat(filepath);\n\n if (stats.isFile()) {\n if (isSupportedFile(filepath)) {\n collectedFiles.push(filepath);\n } else {\n logger.warn(`Skipping unsupported file type: ${filepath}`);\n }\n } else if (stats.isDirectory()) {\n const entries = await fs.readdir(filepath);\n\n for (const entry of entries) {\n const fullPath = path.join(filepath, entry);\n const entryStats = await fs.stat(fullPath);\n\n if (entryStats.isFile() && isSupportedFile(fullPath)) {\n collectedFiles.push(fullPath);\n } else if (recursive && entryStats.isDirectory()) {\n const subFiles = await collectFiles([fullPath], true);\n collectedFiles.push(...subFiles);\n }\n }\n }\n } catch (error) {\n logger.warn(\n `Path does not exist or is not accessible: ${filepath}. `\n + `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return collectedFiles;\n};\n\n/**\n * Read a JSON file and return its contents.\n */\nconst readJsonFile = async (filepath: string): Promise<any[]> => {\n const content = await fs.readFile(filepath, 'utf-8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\n/**\n * Try to parse a string as JSON. If it fails, return the original string.\n */\nconst tryParseJson = (content: string): any => {\n // Don't try to parse if it's not a string or doesn't look like JSON\n if (typeof content !== 'string') {\n return content;\n }\n\n // If it doesn't start with { or [, it's probably not JSON\n const trimmed = content.trim();\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return content;\n }\n\n try {\n return JSON.parse(content);\n } catch (error) {\n logger.debug(\n `Error parsing JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n return content;\n }\n};\n\n/**\n * Parse each field in a CSV row, attempting to convert JSON strings back to objects.\n */\nconst parseCsvRow = (row: Record<string, string>): any => {\n const parsed: any = {};\n for (const [key, value] of Object.entries(row)) {\n parsed[key] = tryParseJson(value);\n }\n return parsed;\n};\n\n/**\n * Read a CSV file and return its contents as an array of objects.\n */\nconst readCsvFile = async (filepath: string): Promise<any[]> => new Promise((resolve, reject) => {\n const results: any[] = [];\n createReadStream(filepath)\n .pipe(csv())\n .on('data', (data) => results.push(parseCsvRow(data)))\n .on('end', () => resolve(results))\n .on('error', reject);\n});\n\n/**\n * Read a JSONL file and return its contents as an array of objects.\n */\nasync function readJsonlFile(filepath: string): Promise<any[]> {\n const content = await fs.readFile(filepath, 'utf-8');\n const lines = content.split('\\n').filter((line) => line.trim());\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return lines.map((line) => JSON.parse(line));\n}\n\n/**\n * Read a single file and return its contents.\n */\nasync function readFile(filepath: string): Promise<any[]> {\n const ext = path.extname(filepath).toLowerCase();\n\n if (ext === '.json') {\n return readJsonFile(filepath);\n } else if (ext === '.csv') {\n return readCsvFile(filepath);\n } else if (ext === '.jsonl') {\n return readJsonlFile(filepath);\n } else {\n throw new Error(`Unsupported file type: ${ext}`);\n }\n}\n\n/**\n * Load data from all files in the specified paths.\n */\nexport const loadFromPaths = async <D = any, T = any>(\n paths: string[],\n recursive: boolean = false,\n): Promise<Datapoint<D, T>[]> => {\n const files = await collectFiles(paths, recursive);\n\n if (files.length === 0) {\n logger.warn('No supported files found in the specified paths');\n return [];\n }\n\n logger.info(`Found ${files.length} file(s) to read`);\n\n const result: Datapoint<D, T>[] = [];\n\n for (const file of files) {\n try {\n const data = await readFile(file);\n result.push(...data);\n logger.info(`Read ${data.length} record(s) from ${file}`);\n } catch (error) {\n logger.error(\n `Error reading file ${file}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n\n return result;\n};\n\n/**\n * Write data to a JSON file.\n */\nconst writeJsonFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const content = JSON.stringify(data, null, 2);\n await fs.writeFile(filepath, content, 'utf-8');\n};\n\n/**\n * Write data to a CSV file.\n */\nconst writeCsvFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n if (data.length === 0) {\n throw new Error('No data to write to CSV');\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n\n await fs.writeFile(filepath, csvString, 'utf-8');\n};\n\n/**\n * Write data to a JSONL file.\n */\nconst writeJsonlFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n): Promise<void> => {\n const lines = data.map((item) => JSON.stringify(item)).join('\\n');\n await fs.writeFile(filepath, lines + '\\n', 'utf-8');\n};\n\n/**\n * Write data to a file based on the file extension.\n */\nexport const writeToFile = async <D, T>(\n filepath: string,\n data: Datapoint<D, T>[],\n format?: 'json' | 'csv' | 'jsonl',\n): Promise<void> => {\n // Create parent directories if they don't exist\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n\n // Determine the format\n const ext = format ?? path.extname(filepath).slice(1);\n\n if (format && format !== path.extname(filepath).slice(1)) {\n logger.warn(\n `Output format ${format} does not match file extension ${path.extname(filepath).slice(1)}`,\n );\n }\n\n if (ext === 'json') {\n await writeJsonFile(filepath, data);\n } else if (ext === 'csv') {\n await writeCsvFile(filepath, data);\n } else if (ext === 'jsonl') {\n await writeJsonlFile(filepath, data);\n } else {\n throw new Error(`Unsupported output format: ${ext}`);\n }\n};\n\n/**\n * Convert a value to a CSV-safe string.\n * - Strings and numbers pass through\n * - null/undefined become empty strings\n * - Objects and arrays are stringified to JSON\n */\nconst stringifyForCsv = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n // For objects and arrays, stringify to JSON\n return JSON.stringify(value);\n};\n\n/**\n * Print data to console in the specified format.\n */\nexport const printToConsole = <D, T>(\n data: Datapoint<D, T>[],\n format: 'json' | 'csv' | 'jsonl' = 'json',\n) => {\n if (format === 'json') {\n console.log(JSON.stringify(data, null, 2));\n } else if (format === 'csv') {\n if (data.length === 0) {\n logger.error('No data to print');\n return;\n }\n\n const formattedData = data.map(item =>\n Object.fromEntries(Object.entries(item).map(([key, value]) => [key, stringifyForCsv(value)]),\n ));\n\n const csvConfig = mkConfig({ useKeysAsHeaders: true });\n\n const csvOutput = generateCsv(csvConfig)(formattedData);\n const csvString = asString(csvOutput);\n console.log(csvString);\n } else if (format === 'jsonl') {\n data.forEach((item) => console.log(JSON.stringify(item)));\n } else {\n throw new Error(\n `Unsupported output format: ${String(format)}. `\n + \"(supported formats: json, csv, jsonl)\",\n );\n }\n};\n\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|