@lmnr-ai/lmnr 0.8.39 → 0.8.40
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.cjs +2 -2
- package/dist/cli.d.cts +1 -1
- package/dist/cli.d.mts +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/{dist-oS06mAi1.cjs → dist-UjRFzemZ.cjs} +16 -6
- package/dist/dist-UjRFzemZ.cjs.map +1 -0
- package/dist/{dist-Dgq2z7AD.mjs → dist-YSVi-u1Q.mjs} +16 -6
- package/dist/dist-YSVi-u1Q.mjs.map +1 -0
- package/dist/{evaluations-gHrXUnIp.d.mts → evaluations-BVOIJvt0.d.mts} +32 -24
- package/dist/{evaluations-BUitiaxR.d.cts → evaluations-CDYtUG8k.d.cts} +32 -24
- package/dist/{file-utils-D0UCmQi0.mjs → file-utils-CZ-ctVUY.mjs} +2 -2
- package/dist/{file-utils-D0UCmQi0.mjs.map → file-utils-CZ-ctVUY.mjs.map} +1 -1
- package/dist/{file-utils-Bf15ARiL.cjs → file-utils-DTijgWTv.cjs} +2 -2
- package/dist/{file-utils-Bf15ARiL.cjs.map → file-utils-DTijgWTv.cjs.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +2 -2
- package/package.json +3 -3
- package/dist/dist-Dgq2z7AD.mjs.map +0 -1
- package/dist/dist-oS06mAi1.cjs.map +0 -1
|
@@ -109,25 +109,19 @@ type GetDatapointsResponse<D, T> = {
|
|
|
109
109
|
//#endregion
|
|
110
110
|
//#region src/session-block.d.ts
|
|
111
111
|
/**
|
|
112
|
-
* Shared contract for debugger-session blocks
|
|
112
|
+
* Shared contract for debugger-session blocks — an ordered list of blocks (see
|
|
113
|
+
* app-server `debugger_session_blocks`), each with a `type` and type-specific
|
|
114
|
+
* `content`:
|
|
113
115
|
*
|
|
114
|
-
*
|
|
115
|
-
* `
|
|
116
|
-
*
|
|
116
|
+
* - `trace` — a trace under the session; written at ingest.
|
|
117
|
+
* - `evaluation` — an eval under the session; written at eval creation.
|
|
118
|
+
* - `text` — a free-text note via `debug session add-note`.
|
|
119
|
+
* - `command` — a CLI command (`sql query`, `ask`) recorded into the session.
|
|
117
120
|
*
|
|
118
|
-
*
|
|
119
|
-
* written at ingest.
|
|
120
|
-
* - `evaluation` — an evaluation created under the session; written at eval
|
|
121
|
-
* creation.
|
|
122
|
-
* - `text` — a free-text note the agent attaches post-factum via
|
|
123
|
-
* `lmnr-cli debug session add-note` (keyed by session id, not tied to any
|
|
124
|
-
* trace / eval).
|
|
125
|
-
*
|
|
126
|
-
* `type` is a plain string on the wire so new block types can be added without
|
|
127
|
-
* a client bump; the union below is the set this SDK knows how to render.
|
|
121
|
+
* `type` is a plain string on the wire so new types need no client bump.
|
|
128
122
|
*/
|
|
129
123
|
/** Block type the CLI knows how to render. `type` is a plain string on the wire. */
|
|
130
|
-
type SessionBlockType = "trace" | "evaluation" | "text";
|
|
124
|
+
type SessionBlockType = "trace" | "evaluation" | "text" | "command";
|
|
131
125
|
/** `content` of a `trace` block. */
|
|
132
126
|
interface TraceBlockContent {
|
|
133
127
|
traceId: string;
|
|
@@ -144,15 +138,27 @@ interface EvaluationBlockContent {
|
|
|
144
138
|
interface TextBlockContent {
|
|
145
139
|
text: string;
|
|
146
140
|
}
|
|
141
|
+
/** `content` of a `command` block — a CLI command recorded into the session. */
|
|
142
|
+
interface CommandBlockContent {
|
|
143
|
+
/** The command path, e.g. `"sql query"` or `"ask"`. */
|
|
144
|
+
command: string;
|
|
145
|
+
/** The command's positional arguments (raw — may contain the query text). */
|
|
146
|
+
args: string[];
|
|
147
|
+
/** The process exit code observed at post-action time (0 on the success path). */
|
|
148
|
+
exitCode: number;
|
|
149
|
+
/** Captured stdout, truncated to a bounded prefix. Null when empty. */
|
|
150
|
+
output?: string | null;
|
|
151
|
+
/** Captured stderr, truncated to a bounded prefix. Null when empty. */
|
|
152
|
+
stderr?: string | null;
|
|
153
|
+
/** Agent reasoning for this step, via `--reasoning`. Null when not provided. */
|
|
154
|
+
reasoning?: string | null;
|
|
155
|
+
}
|
|
147
156
|
/** Union of the known block content shapes. */
|
|
148
|
-
type SessionBlockContent = TraceBlockContent | EvaluationBlockContent | TextBlockContent;
|
|
157
|
+
type SessionBlockContent = TraceBlockContent | EvaluationBlockContent | TextBlockContent | CommandBlockContent;
|
|
149
158
|
/**
|
|
150
|
-
* One block in a debugger session
|
|
151
|
-
* `
|
|
152
|
-
*
|
|
153
|
-
* `content` is typed loosely (`Record<string, unknown>`) because `type` is
|
|
154
|
-
* open-ended on the wire; narrow it with the `*BlockContent` interfaces above
|
|
155
|
-
* once `type` is known.
|
|
159
|
+
* One block in a debugger session (from `GET /v1/cli/rollouts/{sessionId}/blocks`).
|
|
160
|
+
* `content` is loose (`Record<string, unknown>`) since `type` is open-ended;
|
|
161
|
+
* narrow it with the `*BlockContent` interfaces above once `type` is known.
|
|
156
162
|
*/
|
|
157
163
|
interface SessionBlock {
|
|
158
164
|
/** Block id (deterministic UUIDv5 for trace/eval blocks; random for text). */
|
|
@@ -651,12 +657,14 @@ declare class RolloutSessionsResource extends BaseResource {
|
|
|
651
657
|
sessionId,
|
|
652
658
|
type,
|
|
653
659
|
content,
|
|
654
|
-
failOnNotFound
|
|
660
|
+
failOnNotFound,
|
|
661
|
+
signal
|
|
655
662
|
}: {
|
|
656
663
|
sessionId: string;
|
|
657
664
|
type: SessionBlockType;
|
|
658
665
|
content: SessionBlockContent;
|
|
659
666
|
failOnNotFound?: boolean;
|
|
667
|
+
signal?: AbortSignal;
|
|
660
668
|
}): Promise<string | null>;
|
|
661
669
|
/**
|
|
662
670
|
* List a debug session's blocks in creation order.
|
|
@@ -31361,4 +31369,4 @@ declare function evaluate<D, T, O>({
|
|
|
31361
31369
|
}: EvaluationConstructorProps<D, T, O>): Promise<EvaluationRunResult | undefined>;
|
|
31362
31370
|
//#endregion
|
|
31363
31371
|
export { TracingLevel as S, MaskInputOptions as _, HumanEvaluator as a, SpanType as b, InitializeOptions as c, LaminarClient as d, Dataset as f, LaminarSpanContext as g, Event as h, EvaluatorFunctionReturn as i, EvaluationDataset as l, EvaluationDatapointDatasetLink as m, Evaluation as n, evaluate as o, EvaluationDatapoint as p, EvaluatorFunction as r, StringUUID as s, Datapoint as t, LaminarDataset as u, PushDatapointsResponse as v, TraceType as x, SessionRecordingOptions as y };
|
|
31364
|
-
//# sourceMappingURL=evaluations-
|
|
31372
|
+
//# sourceMappingURL=evaluations-BVOIJvt0.d.mts.map
|
|
@@ -108,25 +108,19 @@ type GetDatapointsResponse<D, T> = {
|
|
|
108
108
|
//#endregion
|
|
109
109
|
//#region src/session-block.d.ts
|
|
110
110
|
/**
|
|
111
|
-
* Shared contract for debugger-session blocks
|
|
111
|
+
* Shared contract for debugger-session blocks — an ordered list of blocks (see
|
|
112
|
+
* app-server `debugger_session_blocks`), each with a `type` and type-specific
|
|
113
|
+
* `content`:
|
|
112
114
|
*
|
|
113
|
-
*
|
|
114
|
-
* `
|
|
115
|
-
*
|
|
115
|
+
* - `trace` — a trace under the session; written at ingest.
|
|
116
|
+
* - `evaluation` — an eval under the session; written at eval creation.
|
|
117
|
+
* - `text` — a free-text note via `debug session add-note`.
|
|
118
|
+
* - `command` — a CLI command (`sql query`, `ask`) recorded into the session.
|
|
116
119
|
*
|
|
117
|
-
*
|
|
118
|
-
* written at ingest.
|
|
119
|
-
* - `evaluation` — an evaluation created under the session; written at eval
|
|
120
|
-
* creation.
|
|
121
|
-
* - `text` — a free-text note the agent attaches post-factum via
|
|
122
|
-
* `lmnr-cli debug session add-note` (keyed by session id, not tied to any
|
|
123
|
-
* trace / eval).
|
|
124
|
-
*
|
|
125
|
-
* `type` is a plain string on the wire so new block types can be added without
|
|
126
|
-
* a client bump; the union below is the set this SDK knows how to render.
|
|
120
|
+
* `type` is a plain string on the wire so new types need no client bump.
|
|
127
121
|
*/
|
|
128
122
|
/** Block type the CLI knows how to render. `type` is a plain string on the wire. */
|
|
129
|
-
type SessionBlockType = "trace" | "evaluation" | "text";
|
|
123
|
+
type SessionBlockType = "trace" | "evaluation" | "text" | "command";
|
|
130
124
|
/** `content` of a `trace` block. */
|
|
131
125
|
interface TraceBlockContent {
|
|
132
126
|
traceId: string;
|
|
@@ -143,15 +137,27 @@ interface EvaluationBlockContent {
|
|
|
143
137
|
interface TextBlockContent {
|
|
144
138
|
text: string;
|
|
145
139
|
}
|
|
140
|
+
/** `content` of a `command` block — a CLI command recorded into the session. */
|
|
141
|
+
interface CommandBlockContent {
|
|
142
|
+
/** The command path, e.g. `"sql query"` or `"ask"`. */
|
|
143
|
+
command: string;
|
|
144
|
+
/** The command's positional arguments (raw — may contain the query text). */
|
|
145
|
+
args: string[];
|
|
146
|
+
/** The process exit code observed at post-action time (0 on the success path). */
|
|
147
|
+
exitCode: number;
|
|
148
|
+
/** Captured stdout, truncated to a bounded prefix. Null when empty. */
|
|
149
|
+
output?: string | null;
|
|
150
|
+
/** Captured stderr, truncated to a bounded prefix. Null when empty. */
|
|
151
|
+
stderr?: string | null;
|
|
152
|
+
/** Agent reasoning for this step, via `--reasoning`. Null when not provided. */
|
|
153
|
+
reasoning?: string | null;
|
|
154
|
+
}
|
|
146
155
|
/** Union of the known block content shapes. */
|
|
147
|
-
type SessionBlockContent = TraceBlockContent | EvaluationBlockContent | TextBlockContent;
|
|
156
|
+
type SessionBlockContent = TraceBlockContent | EvaluationBlockContent | TextBlockContent | CommandBlockContent;
|
|
148
157
|
/**
|
|
149
|
-
* One block in a debugger session
|
|
150
|
-
* `
|
|
151
|
-
*
|
|
152
|
-
* `content` is typed loosely (`Record<string, unknown>`) because `type` is
|
|
153
|
-
* open-ended on the wire; narrow it with the `*BlockContent` interfaces above
|
|
154
|
-
* once `type` is known.
|
|
158
|
+
* One block in a debugger session (from `GET /v1/cli/rollouts/{sessionId}/blocks`).
|
|
159
|
+
* `content` is loose (`Record<string, unknown>`) since `type` is open-ended;
|
|
160
|
+
* narrow it with the `*BlockContent` interfaces above once `type` is known.
|
|
155
161
|
*/
|
|
156
162
|
interface SessionBlock {
|
|
157
163
|
/** Block id (deterministic UUIDv5 for trace/eval blocks; random for text). */
|
|
@@ -650,12 +656,14 @@ declare class RolloutSessionsResource extends BaseResource {
|
|
|
650
656
|
sessionId,
|
|
651
657
|
type,
|
|
652
658
|
content,
|
|
653
|
-
failOnNotFound
|
|
659
|
+
failOnNotFound,
|
|
660
|
+
signal
|
|
654
661
|
}: {
|
|
655
662
|
sessionId: string;
|
|
656
663
|
type: SessionBlockType;
|
|
657
664
|
content: SessionBlockContent;
|
|
658
665
|
failOnNotFound?: boolean;
|
|
666
|
+
signal?: AbortSignal;
|
|
659
667
|
}): Promise<string | null>;
|
|
660
668
|
/**
|
|
661
669
|
* List a debug session's blocks in creation order.
|
|
@@ -31360,4 +31368,4 @@ declare function evaluate<D, T, O>({
|
|
|
31360
31368
|
}: EvaluationConstructorProps<D, T, O>): Promise<EvaluationRunResult | undefined>;
|
|
31361
31369
|
//#endregion
|
|
31362
31370
|
export { __exportAll as C, TracingLevel as S, MaskInputOptions as _, HumanEvaluator as a, SpanType as b, InitializeOptions as c, LaminarClient as d, Dataset as f, LaminarSpanContext as g, Event as h, EvaluatorFunctionReturn as i, EvaluationDataset as l, EvaluationDatapointDatasetLink as m, Evaluation as n, evaluate as o, EvaluationDatapoint as p, EvaluatorFunction as r, StringUUID as s, Datapoint as t, LaminarDataset as u, PushDatapointsResponse as v, TraceType as x, SessionRecordingOptions as y };
|
|
31363
|
-
//# sourceMappingURL=evaluations-
|
|
31371
|
+
//# sourceMappingURL=evaluations-CDYtUG8k.d.cts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as __toESM, n as __exportAll, r as __require, t as __commonJSMin } from "./rolldown-runtime-2rV9d50f.mjs";
|
|
2
|
-
import { U as errorMessage, c as initializeLogger } from "./dist-
|
|
2
|
+
import { U as errorMessage, c as initializeLogger } from "./dist-YSVi-u1Q.mjs";
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { createReadStream } from "fs";
|
|
5
5
|
import * as fs from "fs/promises";
|
|
@@ -514,4 +514,4 @@ const printToConsole = (data, format = "json") => {
|
|
|
514
514
|
//#endregion
|
|
515
515
|
export { writeToFile as i, loadFromPaths as n, printToConsole as r, file_utils_exports as t };
|
|
516
516
|
|
|
517
|
-
//# sourceMappingURL=file-utils-
|
|
517
|
+
//# sourceMappingURL=file-utils-CZ-ctVUY.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils-D0UCmQi0.mjs","names":["asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/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\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\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) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\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 { errorMessage } from '@lmnr-ai/types';\nimport 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: ${errorMessage(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: ${errorMessage(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}: ${errorMessage(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":";;;;;;;;CAAA,MAAM,EAAE,cAAA,UAAsB,QAAQ;CAEtC,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI;CAC7B,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI;CAC7B,MAAM,WAAW;EACf,QAAQ;EACR,SAAS;EACT,aAAa,EAAE,aAAa;EAC5B,YAAY,EAAE,YAAY;EAC1B,SAAS;EACT,OAAO;EACP,KAAK;EACL,WAAW;EACX,cAAc;EACd,WAAW;EACX,aAAa,OAAO;EACpB,QAAQ;EACR,kBAAkB;CACpB;CAEA,MAAM,iBAAiB,IAAI,IAAI;EAAC;EAAa;EAAe;CAAW,CAAC;CAExE,SAAS,eAAe,QAAQ;EAC9B,IAAI,OAAO,WAAW,UACpB,OAAO;EAGT,IAAI,eAAe,IAAI,MAAM,GAC3B,OAAO;EAGT,OAAO;CACT;CAEA,IAAM,YAAN,cAAwB,UAAU;EAChC,YAAa,OAAO,CAAC,GAAG;GACtB,MAAM;IAAE,YAAY;IAAM,eAAe;GAAG,CAAC;GAE7C,IAAI,MAAM,QAAQ,IAAI,GAAG,OAAO,EAAE,SAAS,KAAK;GAEhD,MAAM,UAAU,OAAO,OAAO,CAAC,GAAG,UAAU,IAAI;GAEhD,QAAQ,gBAAgB,QAAQ,YAAY,SAAS;GAErD,KAAK,MAAM,OAAO;IAAC;IAAW;IAAS;GAAW,GAChD,IAAI,OAAO,QAAQ,SAAS,aAC1B,CAAE,QAAQ,QAAQ,OAAO,KAAK,QAAQ,IAAI;GAK9C,QAAQ,UAAU,QAAQ,CAAC,EAAA,CAAG,SAAS,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,QAAQ;GAEhF,KAAK,QAAQ;IACX,OAAO,QAAQ,MAAM,OAAO,MAAM,CAAC,IAAI;IACvC,SAAS;IACT,OAAO;IACP,YAAY;IACZ,aAAa;IACb,WAAW;IACX,QAAQ;GACV;GAEA,KAAK,QAAQ;GAEb,IAAI,QAAQ,YAAY,OAEtB,QAAQ,SAAS;GAGnB,IAAI,QAAQ,WAAW,QAAQ,YAAY,OACzC,KAAK,MAAM,QAAQ;GAGrB,KAAK,UAAU;GACf,KAAK,UAAU,QAAQ;GACvB,KAAK,YAAY;EACnB;EAEA,UAAW,QAAQ,OAAO,KAAK;GAC7B,MAAM,EAAE,QAAQ,UAAU,KAAK;GAE/B,IAAI,OAAO,WAAW,SAAS,OAAO,MAAM,OAAO,OAAO;IACxD;IACA;GACF;GAEA,IAAI,IAAI;GAER,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;IAEhC,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO,OAC3D;IAGF,IAAI,MAAM,GACR,OAAO,KAAK,OAAO;IAErB;GACF;GAEA,OAAO,KAAK,WAAW,QAAQ,OAAO,CAAC;EACzC;EAEA,UAAW,QAAQ,OAAO,KAAK;GAC7B,MAAM,EAAE,eAAe,QAAQ,YAAY,WAAW,OAAO,WAAW,cAAc,cAAc,KAAK;GAEzG;GACA,IAAI,CAAC,iBAAiB,OAAO,UAAU,OAAO,MAAM,OAAO,IACzD;GAGF,MAAM,QAAQ;GACd,MAAM,QAAQ,CAAC;GACf,IAAI,WAAW;GACf,IAAI,SAAS;GAEb,IAAI,cAAc;IAChB,MAAM,OAAO,OAAO,iBAAiB,WAAW,eAAe;IAC/D,IAAI,OAAO,WAAW,OAAO,KAAK,IAAI,CAAC,CAAC,IACtC;GAEJ;GAEA,MAAM,YAAY,UAAU;IAC1B,IAAI,KAAK,MAAM,OACb,OAAO;IAGT,MAAM,QAAQ,MAAM;IACpB,MAAM,SAAS,KAAK,QAAQ;IAE5B,OAAO,UAAU;KAAE;KAAQ;KAAO;IAAM,CAAC;GAC3C;GAEA,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;IAChC,MAAM,kBAAkB,CAAC,YAAY,OAAO,OAAO;IACnD,MAAM,gBAAgB,YAAY,OAAO,OAAO,SAAS,IAAI,KAAK,OAAO,OAAO,IAAI,OAAO;IAC3F,MAAM,WAAW,YAAY,OAAO,OAAO,UAAU,IAAI,IAAI,OAAO,OAAO,IAAI,OAAO;IAEtF,IAAI,mBAAmB,eAAe;KACpC,WAAW,CAAC;KACZ;IACF,OAAO,IAAI,UAAU;KACnB;KACA;IACF;IAEA,IAAI,OAAO,OAAO,SAAS,CAAC,UAAU;KACpC,IAAI,QAAQ,KAAK,UAAU,QAAQ,QAAQ,CAAC;KAC5C,QAAQ,SAAS,KAAK;KACtB,MAAM,KAAK,KAAK;KAChB,SAAS,IAAI;IACf;GACF;GAEA,IAAI,SAAS,KAAK;IAChB,IAAI,QAAQ,KAAK,UAAU,QAAQ,QAAQ,GAAG;IAC9C,QAAQ,SAAS,KAAK;IACtB,MAAM,KAAK,KAAK;GAClB;GAEA,IAAI,OAAO,MAAM,OAAO,OACtB,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,CAAC;GAGvC,MAAM,OAAO,aAAa,YAAY,KAAK,MAAM;GACjD,KAAK,MAAM;GAEX,IAAI,KAAK,MAAM,SAAS,CAAC,MAAM;IAC7B,KAAK,MAAM,QAAQ;IACnB,KAAK,UAAU,MAAM,KAAK,QAAQ,UAAU;KAC1C,MAAM,SAAS,WAAW;MAAE;MAAQ;KAAM,CAAC;KAE3C,IAAI,WAAW,MACb,OAAO;KAGT,OAAO,eAAe,MAAM;IAC9B,CAAC;IAED,KAAK,KAAK,WAAW,KAAK,OAAO;IACjC;GACF;GAEA,IAAI,CAAC,QAAQ,KAAK,QAAQ,UAAU,MAAM,WAAW,KAAK,QAAQ,QAAQ;IACxE,MAAM,oBAAI,IAAI,WAAW,mCAAmC;IAC5D,KAAK,KAAK,SAAS,CAAC;GACtB,OACE,IAAI,CAAC,MAAM;IACT,MAAM,aAAa,KAAK,YAAY,OAAO,SAAS;IACpD,KAAK,SAAS,OAAO,UAAU;GACjC;EAEJ;EAEA,WAAY,QAAQ,OAAO,KAAK;GAC9B,IAAI,KAAK,QAAQ,KACf,OAAO,OAAO,MAAM,OAAO,GAAG;GAGhC,OAAO,OAAO,SAAS,SAAS,OAAO,GAAG;EAC5C;EAEA,SAAU,OAAO,YAAY;GAC3B,MAAM,UAAW,KAAK,YAAY,QAAS,MAAM,KAAK,OAAO,UAAU,KAAK,IAAI,KAAK;GAErF,MAAM,MAAM,MAAM,QAAQ,GAAG,MAAM,UAAU;IAC3C,MAAM,SAAS,QAAQ;IACvB,IAAI,WAAW,MAAM,OAAO;IAC5B,IAAI,WAAW,KAAA,GACb,EAAE,UAAU;SAEZ,EAAE,IAAI,WAAW;IAEnB,OAAO;GACT,GAAG,CAAC,CAAC;GAEL,IAAI,KAAK,QAAQ,kBACf,KAAK,KAAK;IAAE;IAAK;GAAW,CAAC;QAE7B,KAAK,KAAK,GAAG;EAEjB;EAEA,OAAQ,IAAI;GACV,IAAI,KAAK,MAAM,WAAW,CAAC,KAAK,OAAO,OAAO,GAAG;GACjD,KAAK,UAAU,KAAK,OAAO,KAAK,MAAM,aAAa,KAAK,MAAM,SAAS,CAAC;GACxE,GAAG;EACL;EAEA,WAAY,MAAM,KAAK,IAAI;GACzB,IAAI,OAAO,SAAS,UAClB,OAAO,OAAO,KAAK,IAAI;GAGzB,MAAM,EAAE,QAAQ,UAAU,KAAK;GAC/B,IAAI,QAAQ;GACZ,IAAI,SAAS;GACb,KAAK,aAAa,KAAK;GAEvB,IAAI,KAAK,OAAO;IACd,QAAQ,KAAK,MAAM;IACnB,SAAS,OAAO,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC;IACzC,KAAK,QAAQ;GACf;GAEA,MAAM,eAAe,OAAO;GAE5B,KAAK,IAAI,IAAI,OAAO,IAAI,cAAc,KAAK;IACzC,MAAM,MAAM,OAAO;IACnB,MAAM,UAAU,IAAI,IAAI,eAAe,OAAO,IAAI,KAAK;IAEvD,KAAK,MAAM;IACX,IAAI,KAAK,MAAM,YAAY,KAAK,QAAQ,aACtC,OAAO,mBAAG,IAAI,MAAM,8BAA8B,CAAC;IAGrD,IAAI,CAAC,KAAK,MAAM,WAAW,QAAQ,UAAU,YAAY,SAAS,MAAM,OAAO;KAC7E,KAAK,MAAM,UAAU;KACrB;IACF,OAAO,IAAI,QAAQ,OAAO;KACxB,IAAI,KAAK,MAAM,SACb,KAAK,MAAM,UAAU;UAGrB,KAAK,MAAM,SAAS,CAAC,KAAK,MAAM;KAElC;IACF;IAEA,IAAI,CAAC,KAAK,MAAM,QAAQ;KACtB,IAAI,KAAK,MAAM,SAAS,CAAC,KAAK,QAAQ;UAChC,QAAQ,IACV,KAAK,QAAQ,UAAU;WAClB,IAAI,QAAQ;WACb,YAAY,IACd,KAAK,QAAQ,UAAU;MAAA;KACzB;KAIJ,IAAI,QAAQ,KAAK,QAAQ,SAAS;MAChC,KAAK,UAAU,QAAQ,KAAK,MAAM,aAAa,IAAI,CAAC;MACpD,KAAK,MAAM,cAAc,IAAI;MAC7B,KAAK,MAAM,YAAY;KACzB;IACF;GACF;GAEA,IAAI,KAAK,MAAM,gBAAgB,cAAc;IAC3C,KAAK,MAAM,cAAc;IACzB,OAAO,GAAG;GACZ;GAEA,IAAI,eAAe,KAAK,MAAM,cAAc,KAAK,QAAQ;IACvD,KAAK,QAAQ;IACb,KAAK,MAAM,eAAgB,eAAe,KAAK;IAC/C,OAAO,GAAG;GACZ;GAEA,KAAK,QAAQ;GACb,GAAG;EACL;CACF;CAEA,OAAO,WAAW,SAAS,IAAI,UAAU,IAAI;;AClT7C,IAAA;;;;;AAAmG,EAAA,CAAA,MAAA,IAAA,CAAA,EAAA;AAAc,IAAA,KAAA,MAAA,GAAA,KAAA,MAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA;AAA0C,IAAA,IAAA;;;;;;;;;;;;;;;;;;;;AAAsU,GAAA,IAAA,QAAA,IAAA,KAAA,KAAA,MAAA,OAAA,OAAA,CAAA,GAAA,GAAA,CAAA;AAAmD,IAAA,IAAA,cAAA,MAAA;;;;;AAA6E;AAAC,IAAA,IAAA,cAAA,MAAA;;;;;AAA4E;AAAwF,IAAA,IAAA,cAAA,MAAA;;;;;AAAqF,GAAC,IAAA,SAAA,GAAA,GAAA;;;AAAqF,GAAA,KAAA,MAAA,OAAA,MAAA,WAAA,EAAA,EAAA,GAAA,IAAA,EAAA,CAAA,GAAA,KAAA,MAAA,OAAA,MAAA,WAAA,EAAA,EAAA,YAAA,IAAA,EAAA,CAAA,GAAA,KAAA,GAAA,GAAA,MAAA,EAAA,QAAA,GAAA,MAAA,EAAA,CAAA,GAAA,CAAA,GAAA,KAAA,OAAA,MAAA,EAAA,SAAA,EAAA,EAAA,CAAA,IAAA,CAAA,IAAA,GAAA,KAAA,OAAA,MAAA,EAAA,YAAA,EAAA,EAAA,EAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,GAAA,KAAA,OAAA,MAAA,EAAA,EAAA,CAAA,IAAA,EAAA,CAAA,IAAA,CAAA,GAAA,KAAA,OAAA,GAAA,MAAA,EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAAA,CAAA,CAAA,CAAA,GAAA,KAAA,OAAA,MAAA,EAAA,EAAA,CAAA,IAAA,EAAA,cAAA,GAAA,KAAA,GAAA,OAAA,MAAA;;;;;;;;;AAAsoB,GAAA,KAAA,GAAA,GAAA,OAAA,MAAA;;;;;;;;;;;AAAqL,GAAA,IAAA,GAAA,KAAA,MAAA,CAAA,MAAA,MAAA,CAAA,SAAA,CAAA,KAAA,QAAA,IAAA,CAAA,IAAA,KAAA,GAAA,MAAA;;;;;;AAAsO,GAAA,KAAA,GAAA,MAAA;;;;AAAuP,GAAA,KAAA,GAAA,MAAA;;;AAA+D,GAAA,KAAA,GAAA,MAAA;;;;AAA0J,GAAA,KAAA,GAAA,MAAA;;;;;;;;;AAG55E,GAAE,MAAA,OAAA,MAAA;;;;;AAA0N;;;;;;;;;ACOlO,MAAM,SAAS,iBAAiB;;;;AAKhC,MAAM,mBAAmB,SAA0B;CACjD,MAAM,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY;CAC3C,OAAO;EAAC;EAAS;EAAQ;CAAQ,CAAC,CAAC,SAAS,GAAG;AACjD;;;;;AAMA,MAAa,eAAe,OAC1B,OACA,YAAqB,UACC;CACtB,MAAM,iBAA2B,CAAC;CAElC,KAAK,MAAM,YAAY,OACrB,IAAI;EACF,MAAM,QAAQ,MAAM,GAAG,KAAK,QAAQ;EAEpC,IAAI,MAAM,OAAO,GACf,IAAI,gBAAgB,QAAQ,GAC1B,eAAe,KAAK,QAAQ;OAE5B,OAAO,KAAK,mCAAmC,UAAU;OAEtD,IAAI,MAAM,YAAY,GAAG;GAC9B,MAAM,UAAU,MAAM,GAAG,QAAQ,QAAQ;GAEzC,KAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,WAAW,KAAK,KAAK,UAAU,KAAK;IAC1C,MAAM,aAAa,MAAM,GAAG,KAAK,QAAQ;IAEzC,IAAI,WAAW,OAAO,KAAK,gBAAgB,QAAQ,GACjD,eAAe,KAAK,QAAQ;SACvB,IAAI,aAAa,WAAW,YAAY,GAAG;KAChD,MAAM,WAAW,MAAM,aAAa,CAAC,QAAQ,GAAG,IAAI;KACpD,eAAe,KAAK,GAAG,QAAQ;IACjC;GACF;EACF;CACF,SAAS,OAAO;EACd,OAAO,KACL,6CAA6C,SAAS,WAC1C,aAAa,KAAK,GAChC;CACF;CAGF,OAAO;AACT;;;;AAKA,MAAM,eAAe,OAAO,aAAqC;CAC/D,MAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;CACnD,MAAM,SAAS,KAAK,MAAM,OAAO;CACjC,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AACjD;;;;AAKA,MAAM,gBAAgB,YAAyB;CAE7C,IAAI,OAAO,YAAY,UACrB,OAAO;CAIT,MAAM,UAAU,QAAQ,KAAK;CAC7B,IAAI,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,GAAG,GACrD,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,MAAM,OAAO;CAC3B,SAAS,OAAO;EACd,OAAO,MACL,uBAAuB,aAAa,KAAK,GAC3C;EACA,OAAO;CACT;AACF;;;;AAKA,MAAM,eAAe,QAAqC;CACxD,MAAM,SAAc,CAAC;CACrB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAC3C,OAAO,OAAO,aAAa,KAAK;CAElC,OAAO;AACT;;;;AAKA,MAAM,cAAc,OAAO,aAAqC,IAAI,SAAS,SAAS,WAAW;CAC/F,MAAM,UAAiB,CAAC;CACxB,iBAAiB,QAAQ,CAAC,CACvB,MAAA,GAAA,kBAAA,QAAA,CAAS,CAAC,CAAC,CACX,GAAG,SAAS,SAAS,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,CACrD,GAAG,aAAa,QAAQ,OAAO,CAAC,CAAC,CACjC,GAAG,SAAS,MAAM;AACvB,CAAC;;;;AAKD,eAAe,cAAc,UAAkC;CAI7D,QAFc,MADQ,GAAG,SAAS,UAAU,OAAO,EAAA,CAC7B,MAAM,IAAI,CAAC,CAAC,QAAQ,SAAS,KAAK,KAAK,CAElD,CAAC,CAAC,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC;AAC7C;;;;AAKA,eAAe,SAAS,UAAkC;CACxD,MAAM,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,YAAY;CAE/C,IAAI,QAAQ,SACV,OAAO,aAAa,QAAQ;MACvB,IAAI,QAAQ,QACjB,OAAO,YAAY,QAAQ;MACtB,IAAI,QAAQ,UACjB,OAAO,cAAc,QAAQ;MAE7B,MAAM,IAAI,MAAM,0BAA0B,KAAK;AAEnD;;;;AAKA,MAAa,gBAAgB,OAC3B,OACA,YAAqB,UACU;CAC/B,MAAM,QAAQ,MAAM,aAAa,OAAO,SAAS;CAEjD,IAAI,MAAM,WAAW,GAAG;EACtB,OAAO,KAAK,iDAAiD;EAC7D,OAAO,CAAC;CACV;CAEA,OAAO,KAAK,SAAS,MAAM,OAAO,iBAAiB;CAEnD,MAAM,SAA4B,CAAC;CAEnC,KAAK,MAAM,QAAQ,OACjB,IAAI;EACF,MAAM,OAAO,MAAM,SAAS,IAAI;EAChC,OAAO,KAAK,GAAG,IAAI;EACnB,OAAO,KAAK,QAAQ,KAAK,OAAO,kBAAkB,MAAM;CAC1D,SAAS,OAAO;EACd,OAAO,MACL,sBAAsB,KAAK,IAAI,aAAa,KAAK,GACnD;EACA,MAAM;CACR;CAGF,OAAO;AACT;;;;AAKA,MAAM,gBAAgB,OACpB,UACA,SACkB;CAClB,MAAM,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC;CAC5C,MAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAC/C;;;;AAKA,MAAM,eAAe,OACnB,UACA,SACkB;CAClB,IAAI,KAAK,WAAW,GAClB,MAAM,IAAI,MAAM,yBAAyB;CAG3C,MAAM,gBAAgB,KAAK,KAAI,SAC7B,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAC3F,CAAC;CAKH,MAAM,YAAYA,EADAC,GAFAC,EAAS,EAAE,kBAAkB,KAAK,CAEd,CAAC,CAAC,CAAC,aACN,CAAC;CAEpC,MAAM,GAAG,UAAU,UAAU,WAAW,OAAO;AACjD;;;;AAKA,MAAM,iBAAiB,OACrB,UACA,SACkB;CAClB,MAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;CAChE,MAAM,GAAG,UAAU,UAAU,QAAQ,MAAM,OAAO;AACpD;;;;AAKA,MAAa,cAAc,OACzB,UACA,MACA,WACkB;CAElB,MAAM,MAAM,KAAK,QAAQ,QAAQ;CACjC,MAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;CAGvC,MAAM,MAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC;CAEpD,IAAI,UAAU,WAAW,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC,GACrD,OAAO,KACL,iBAAiB,OAAO,iCAAiC,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,CAAC,GACzF;CAGF,IAAI,QAAQ,QACV,MAAM,cAAc,UAAU,IAAI;MAC7B,IAAI,QAAQ,OACjB,MAAM,aAAa,UAAU,IAAI;MAC5B,IAAI,QAAQ,SACjB,MAAM,eAAe,UAAU,IAAI;MAEnC,MAAM,IAAI,MAAM,8BAA8B,KAAK;AAEvD;;;;;;;AAQA,MAAM,mBAAmB,UAAuB;CAC9C,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO;CAET,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAChD,OAAO,OAAO,KAAK;CAGrB,OAAO,KAAK,UAAU,KAAK;AAC7B;;;;AAKA,MAAa,kBACX,MACA,SAAmC,WAChC;CACH,IAAI,WAAW,QACb,QAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;MACpC,IAAI,WAAW,OAAO;EAC3B,IAAI,KAAK,WAAW,GAAG;GACrB,OAAO,MAAM,kBAAkB;GAC/B;EACF;EAEA,MAAM,gBAAgB,KAAK,KAAI,SAC7B,OAAO,YAAY,OAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAC3F,CAAC;EAKH,MAAM,YAAYF,EADAC,GAFAC,EAAS,EAAE,kBAAkB,KAAK,CAEd,CAAC,CAAC,CAAC,aACN,CAAC;EACpC,QAAQ,IAAI,SAAS;CACvB,OAAO,IAAI,WAAW,SACpB,KAAK,SAAS,SAAS,QAAQ,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC;MAExD,MAAM,IAAI,MACR,8BAA8B,OAAO,MAAM,EAAE,wCAE/C;AAEJ"}
|
|
1
|
+
{"version":3,"file":"file-utils-CZ-ctVUY.mjs","names":["asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/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\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\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) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\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 { errorMessage } from '@lmnr-ai/types';\nimport 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: ${errorMessage(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: ${errorMessage(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}: ${errorMessage(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_rolldown_runtime = require("./rolldown-runtime-CVvi-lCc.cjs");
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-UjRFzemZ.cjs");
|
|
3
3
|
let path = require("path");
|
|
4
4
|
path = require_rolldown_runtime.__toESM(path);
|
|
5
5
|
let fs = require("fs");
|
|
@@ -541,4 +541,4 @@ Object.defineProperty(exports, "writeToFile", {
|
|
|
541
541
|
}
|
|
542
542
|
});
|
|
543
543
|
|
|
544
|
-
//# sourceMappingURL=file-utils-
|
|
544
|
+
//# sourceMappingURL=file-utils-DTijgWTv.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils-Bf15ARiL.cjs","names":["initializeLogger","fs","errorMessage","asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/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\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\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) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\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 { errorMessage } from '@lmnr-ai/types';\nimport 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: ${errorMessage(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: ${errorMessage(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}: ${errorMessage(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-DTijgWTv.cjs","names":["initializeLogger","fs","errorMessage","asString","generateCsv","mkConfig"],"sources":["../../../node_modules/.pnpm/csv-parser@3.2.1/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\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction sanitizeHeader(header) {\n if (typeof header !== 'string') {\n return null\n }\n\n if (DANGEROUS_KEYS.has(header)) {\n return null\n }\n\n return header\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) => {\n const mapped = mapHeaders({ header, index })\n\n if (mapped === null) {\n return null\n }\n\n return sanitizeHeader(mapped)\n })\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 { errorMessage } from '@lmnr-ai/types';\nimport 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: ${errorMessage(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: ${errorMessage(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}: ${errorMessage(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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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-CVvi-lCc.cjs");
|
|
3
|
-
const require_dist = require("./dist-
|
|
3
|
+
const require_dist = require("./dist-UjRFzemZ.cjs");
|
|
4
4
|
const require_consts = require("./consts-DV6_Ea-8.cjs");
|
|
5
5
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
6
6
|
let _opentelemetry_context_async_hooks = require("@opentelemetry/context-async-hooks");
|
|
@@ -94,7 +94,7 @@ var LaminarDataset = class extends EvaluationDataset {
|
|
|
94
94
|
*/
|
|
95
95
|
async push(paths, recursive = false) {
|
|
96
96
|
if (!this.client) throw new Error("Client not set");
|
|
97
|
-
const { loadFromPaths } = await Promise.resolve().then(() => require("./file-utils-
|
|
97
|
+
const { loadFromPaths } = await Promise.resolve().then(() => require("./file-utils-DTijgWTv.cjs")).then((n) => n.file_utils_exports);
|
|
98
98
|
const data = await loadFromPaths(Array.isArray(paths) ? paths : [paths], recursive);
|
|
99
99
|
if (data.length === 0) {
|
|
100
100
|
console.warn("No data to push. Skipping");
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as __exportAll, S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-
|
|
1
|
+
import { C as __exportAll, S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-CDYtUG8k.cjs";
|
|
2
2
|
import { ServerResponse } from "node:http";
|
|
3
3
|
import { ReadableSpan, SpanExporter, SpanProcessor, TimedEvent } from "@opentelemetry/sdk-trace-base";
|
|
4
4
|
import { AttributeValue, Attributes, Context, Exception, HrTime, Link, Span, Span as Span$1, SpanContext, SpanKind, SpanStatus, TimeInput, Tracer, TracerProvider } from "@opentelemetry/api";
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-
|
|
1
|
+
import { S as TracingLevel, _ as MaskInputOptions, a as HumanEvaluator, b as SpanType, c as InitializeOptions, d as LaminarClient, f as Dataset, g as LaminarSpanContext, h as Event, i as EvaluatorFunctionReturn, l as EvaluationDataset, m as EvaluationDatapointDatasetLink, o as evaluate, p as EvaluationDatapoint, r as EvaluatorFunction, s as StringUUID, t as Datapoint, u as LaminarDataset, v as PushDatapointsResponse, x as TraceType, y as SessionRecordingOptions } from "./evaluations-BVOIJvt0.mjs";
|
|
2
2
|
import { AttributeValue, Attributes, Context, Exception, HrTime, Link, Span, Span as Span$1, SpanContext, SpanKind, SpanStatus, TimeInput, Tracer, TracerProvider } from "@opentelemetry/api";
|
|
3
3
|
import { Instrumentation, InstrumentationBase } from "@opentelemetry/instrumentation";
|
|
4
4
|
import { ReadableSpan, SpanExporter, SpanProcessor, TimedEvent } from "@opentelemetry/sdk-trace-base";
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as __require } from "./rolldown-runtime-2rV9d50f.mjs";
|
|
2
|
-
import { A as SPAN_INSTRUMENTATION_SOURCE, B as DEBUG_SESSION_DIR, C as PARENT_SPAN_IDS_PATH, D as SPAN_INPUT, E as SPAN_IDS_PATH, F as SPAN_TYPE, H as TracingLevel, I as TRACE_HAS_BROWSER_SESSION, L as TRACE_TYPE, M as SPAN_OUTPUT, N as SPAN_PATH, O as SPAN_INSTRUMENTATION_SCOPE_NAME, P as SPAN_SDK_VERSION, R as USER_ID, S as LaminarAttributes, T as SESSION_ID, U as errorMessage, V as DEBUG_SESSION_FILE, _ as tryToOtelSpanContext, b as ASSOCIATION_PROPERTIES_OVERRIDES, c as initializeLogger, d as newUUID, f as normalizeOtelSpanId, g as parseOtelHeaders, h as otelTraceIdToUUID, i as deserializeLaminarSpanContext, j as SPAN_LANGUAGE_VERSION, k as SPAN_INSTRUMENTATION_SCOPE_VERSION, l as loadEnv, m as otelSpanIdToUUID, n as NIL_UUID, o as getFrontendUrl, p as normalizeOtelTraceId, r as Semaphore, s as getOtelEnvVar, t as LaminarClient, u as metadataToAttributes, v as validateTracingConfig, w as PARENT_SPAN_PATH, x as HUMAN_EVALUATOR_OPTIONS, y as ASSOCIATION_PROPERTIES, z as version } from "./dist-
|
|
2
|
+
import { A as SPAN_INSTRUMENTATION_SOURCE, B as DEBUG_SESSION_DIR, C as PARENT_SPAN_IDS_PATH, D as SPAN_INPUT, E as SPAN_IDS_PATH, F as SPAN_TYPE, H as TracingLevel, I as TRACE_HAS_BROWSER_SESSION, L as TRACE_TYPE, M as SPAN_OUTPUT, N as SPAN_PATH, O as SPAN_INSTRUMENTATION_SCOPE_NAME, P as SPAN_SDK_VERSION, R as USER_ID, S as LaminarAttributes, T as SESSION_ID, U as errorMessage, V as DEBUG_SESSION_FILE, _ as tryToOtelSpanContext, b as ASSOCIATION_PROPERTIES_OVERRIDES, c as initializeLogger, d as newUUID, f as normalizeOtelSpanId, g as parseOtelHeaders, h as otelTraceIdToUUID, i as deserializeLaminarSpanContext, j as SPAN_LANGUAGE_VERSION, k as SPAN_INSTRUMENTATION_SCOPE_VERSION, l as loadEnv, m as otelSpanIdToUUID, n as NIL_UUID, o as getFrontendUrl, p as normalizeOtelTraceId, r as Semaphore, s as getOtelEnvVar, t as LaminarClient, u as metadataToAttributes, v as validateTracingConfig, w as PARENT_SPAN_PATH, x as HUMAN_EVALUATOR_OPTIONS, y as ASSOCIATION_PROPERTIES, z as version } from "./dist-YSVi-u1Q.mjs";
|
|
3
3
|
import { n as TRACEPARENT_HEADER, t as LAMINAR_SPAN_CONTEXT_HEADER } from "./consts-3AfXaMBI.mjs";
|
|
4
4
|
import { DiagConsoleLogger, DiagLogLevel, ROOT_CONTEXT, SpanKind, SpanStatusCode, TraceFlags, context, createContextKey, diag, isSpanContextValid, trace } from "@opentelemetry/api";
|
|
5
5
|
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
|
|
@@ -87,7 +87,7 @@ var LaminarDataset = class extends EvaluationDataset {
|
|
|
87
87
|
*/
|
|
88
88
|
async push(paths, recursive = false) {
|
|
89
89
|
if (!this.client) throw new Error("Client not set");
|
|
90
|
-
const { loadFromPaths } = await import("./file-utils-
|
|
90
|
+
const { loadFromPaths } = await import("./file-utils-CZ-ctVUY.mjs").then((n) => n.t);
|
|
91
91
|
const data = await loadFromPaths(Array.isArray(paths) ? paths : [paths], recursive);
|
|
92
92
|
if (data.length === 0) {
|
|
93
93
|
console.warn("No data to push. Skipping");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmnr-ai/lmnr",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.40",
|
|
4
4
|
"description": "TypeScript SDK for Laminar AI",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -114,8 +114,8 @@
|
|
|
114
114
|
"puppeteer-core": "^25.1.0",
|
|
115
115
|
"undici-types": "^8.0.2",
|
|
116
116
|
"unrun": "^0.3.0",
|
|
117
|
-
"@lmnr-ai/client": "0.8.
|
|
118
|
-
"@lmnr-ai/types": "0.8.
|
|
117
|
+
"@lmnr-ai/client": "0.8.40",
|
|
118
|
+
"@lmnr-ai/types": "0.8.40"
|
|
119
119
|
},
|
|
120
120
|
"scripts": {
|
|
121
121
|
"build": "tsdown",
|