convert-buddy-js 0.9.0 → 0.9.1

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.
Files changed (36) hide show
  1. package/dist/src/{src/index.d.ts → index.d.ts} +5 -1
  2. package/dist/src/{src/index.js → index.js} +9 -2
  3. package/dist/src/index.js.map +1 -0
  4. package/dist/src/{src/node.d.ts → node.d.ts} +1 -1
  5. package/dist/src/node.js.map +1 -0
  6. package/dist/src/smoke-test.js.map +1 -0
  7. package/dist/wasm/nodejs/convert_buddy.d.ts +4 -0
  8. package/dist/wasm/nodejs/convert_buddy.js +12 -0
  9. package/dist/wasm/nodejs/convert_buddy_bg.wasm +0 -0
  10. package/dist/wasm/nodejs/convert_buddy_bg.wasm.d.ts +1 -0
  11. package/dist/wasm/web/convert_buddy.d.ts +5 -0
  12. package/dist/wasm/web/convert_buddy.js +12 -0
  13. package/dist/wasm/web/convert_buddy_bg.wasm +0 -0
  14. package/dist/wasm/web/convert_buddy_bg.wasm.d.ts +1 -0
  15. package/package.json +1 -1
  16. package/dist/chunk-DESHN2IK.js +0 -151
  17. package/dist/chunk-DESHN2IK.js.map +0 -1
  18. package/dist/chunk-EW7HKBIV.js +0 -193
  19. package/dist/chunk-EW7HKBIV.js.map +0 -1
  20. package/dist/chunk-KMYCJF2Y.js +0 -63
  21. package/dist/chunk-KMYCJF2Y.js.map +0 -1
  22. package/dist/src/bench/datasets.d.ts +0 -12
  23. package/dist/src/bench/datasets.js +0 -149
  24. package/dist/src/bench/datasets.js.map +0 -1
  25. package/dist/src/bench/runner-with-competitors.d.ts +0 -2
  26. package/dist/src/bench/runner-with-competitors.js +0 -330
  27. package/dist/src/bench/runner-with-competitors.js.map +0 -1
  28. package/dist/src/bench/runner.d.ts +0 -2
  29. package/dist/src/bench/runner.js +0 -160
  30. package/dist/src/bench/runner.js.map +0 -1
  31. package/dist/src/src/index.js.map +0 -1
  32. package/dist/src/src/node.js.map +0 -1
  33. package/dist/src/src/smoke-test.js.map +0 -1
  34. /package/dist/src/{src/node.js → node.js} +0 -0
  35. /package/dist/src/{src/smoke-test.d.ts → smoke-test.d.ts} +0 -0
  36. /package/dist/src/{src/smoke-test.js → smoke-test.js} +0 -0
@@ -4,6 +4,9 @@ type CsvDetection = {
4
4
  delimiter: string;
5
5
  fields: string[];
6
6
  };
7
+ type XmlDetection = {
8
+ elements: string[];
9
+ };
7
10
  type DetectOptions = {
8
11
  maxBytes?: number;
9
12
  debug?: boolean;
@@ -54,10 +57,11 @@ declare class ConvertBuddy {
54
57
  }
55
58
  declare function detectFormat(input: DetectInput, opts?: DetectOptions): Promise<Format | "unknown">;
56
59
  declare function detectCsvFieldsAndDelimiter(input: DetectInput, opts?: DetectOptions): Promise<CsvDetection | null>;
60
+ declare function detectXmlElements(input: DetectInput, opts?: DetectOptions): Promise<XmlDetection | null>;
57
61
  declare class ConvertBuddyTransformStream extends TransformStream<Uint8Array, Uint8Array> {
58
62
  constructor(opts?: ConvertBuddyOptions);
59
63
  }
60
64
  declare function convert(input: Uint8Array | string, opts?: ConvertBuddyOptions): Promise<Uint8Array>;
61
65
  declare function convertToString(input: Uint8Array | string, opts?: ConvertBuddyOptions): Promise<string>;
62
66
 
63
- export { ConvertBuddy, type ConvertBuddyOptions, ConvertBuddyTransformStream, type CsvConfig, type CsvDetection, type DetectInput, type DetectOptions, type Format, type Stats, type XmlConfig, convert, convertToString, detectCsvFieldsAndDelimiter, detectFormat };
67
+ export { ConvertBuddy, type ConvertBuddyOptions, ConvertBuddyTransformStream, type CsvConfig, type CsvDetection, type DetectInput, type DetectOptions, type Format, type Stats, type XmlConfig, type XmlDetection, convert, convertToString, detectCsvFieldsAndDelimiter, detectFormat, detectXmlElements };
@@ -3,7 +3,7 @@ async function loadWasmModule() {
3
3
  if (isNode) {
4
4
  const { createRequire } = await import("node:module");
5
5
  const require2 = createRequire(import.meta.url);
6
- const mod2 = require2("../wasm-node.cjs");
6
+ const mod2 = require2("../../wasm-node.cjs");
7
7
  return mod2;
8
8
  }
9
9
  const wasmUrl = new URL("../wasm/web/convert_buddy.js", import.meta.url);
@@ -130,6 +130,12 @@ async function detectCsvFieldsAndDelimiter(input, opts = {}) {
130
130
  const result = wasmModule.detectCsvFields?.(sample);
131
131
  return result ?? null;
132
132
  }
133
+ async function detectXmlElements(input, opts = {}) {
134
+ const wasmModule = await loadDetectionWasm(!!opts.debug);
135
+ const sample = await readSample(input, opts.maxBytes);
136
+ const result = wasmModule.detectXmlElements?.(sample);
137
+ return result ?? null;
138
+ }
133
139
  class ConvertBuddyTransformStream extends TransformStream {
134
140
  constructor(opts = {}) {
135
141
  let buddy = null;
@@ -186,6 +192,7 @@ export {
186
192
  convert,
187
193
  convertToString,
188
194
  detectCsvFieldsAndDelimiter,
189
- detectFormat
195
+ detectFormat,
196
+ detectXmlElements
190
197
  };
191
198
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export type Format = \"csv\" | \"ndjson\" | \"json\" | \"xml\";\r\nexport type DetectInput =\r\n | Uint8Array\r\n | ArrayBuffer\r\n | string\r\n | ReadableStream<Uint8Array>\r\n | AsyncIterable<Uint8Array>;\r\n\r\nexport type CsvDetection = {\r\n delimiter: string;\r\n fields: string[];\r\n};\r\n\r\nexport type XmlDetection = {\r\n elements: string[];\r\n};\r\n\r\nexport type DetectOptions = {\r\n maxBytes?: number;\r\n debug?: boolean;\r\n};\r\n\r\nexport type ConvertBuddyOptions = {\r\n debug?: boolean;\r\n profile?: boolean;\r\n inputFormat?: Format;\r\n outputFormat?: Format;\r\n chunkTargetBytes?: number;\r\n parallelism?: number; // Node only - number of worker threads\r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n};\r\n\r\nexport type CsvConfig = {\r\n delimiter?: string;\r\n quote?: string;\r\n hasHeaders?: boolean;\r\n trimWhitespace?: boolean;\r\n};\r\n\r\nexport type XmlConfig = {\r\n recordElement?: string;\r\n trimText?: boolean;\r\n includeAttributes?: boolean;\r\n expandEntities?: boolean;\r\n};\r\n\r\nexport type Stats = {\r\n bytesIn: number;\r\n bytesOut: number;\r\n chunksIn: number;\r\n recordsProcessed: number;\r\n parseTimeMs: number;\r\n transformTimeMs: number;\r\n writeTimeMs: number;\r\n maxBufferSize: number;\r\n currentPartialSize: number;\r\n throughputMbPerSec: number;\r\n};\r\n\r\ntype WasmModule = {\r\n default?: unknown;\r\n init: (debugEnabled: boolean) => void;\r\n Converter: new (debug: boolean) => {\r\n push: (chunk: Uint8Array) => Uint8Array;\r\n finish: () => Uint8Array;\r\n getStats: () => Stats;\r\n };\r\n detectFormat?: (sample: Uint8Array) => string | null | undefined;\r\n detectCsvFields?: (sample: Uint8Array) => CsvDetection | null | undefined;\r\n detectXmlElements?: (sample: Uint8Array) => XmlDetection | null | undefined;\r\n __wbg_set_wasm?: (wasm: unknown) => void;\r\n};\r\n\r\nasync function loadWasmModule(): Promise<WasmModule> {\r\n const isNode =\r\n typeof process !== \"undefined\" &&\r\n !!(process as any).versions?.node;\r\n\r\n if (isNode) {\r\n const { createRequire } = await import(\"node:module\");\r\n const require = createRequire(import.meta.url);\r\n const mod = require(\"../../wasm-node.cjs\");\r\n return mod as WasmModule;\r\n }\r\n\r\n const wasmUrl = new URL(\"../wasm/web/convert_buddy.js\", import.meta.url);\r\n const mod = (await import(wasmUrl.href)) as unknown as WasmModule;\r\n return mod;\r\n}\r\n\r\nexport class ConvertBuddy {\r\n private converter: any;\r\n private debug: boolean;\r\n private profile: boolean;\r\n\r\n private constructor(converter: any, debug: boolean, profile: boolean) {\r\n this.converter = converter;\r\n this.debug = debug;\r\n this.profile = profile;\r\n }\r\n\r\n static async create(opts: ConvertBuddyOptions = {}): Promise<ConvertBuddy> {\r\n const debug = !!opts.debug;\r\n const profile = !!opts.profile;\r\n\r\n const wasmModule = await loadWasmModule();\r\n\r\n if (typeof wasmModule.default === \"function\") {\r\n await (wasmModule.default as () => Promise<void>)();\r\n }\r\n\r\n wasmModule.init(debug);\r\n\r\n let converter;\r\n if (opts.inputFormat && opts.outputFormat) {\r\n // Use withConfig for custom formats\r\n const Converter = (wasmModule as any).Converter;\r\n converter = Converter.withConfig(\r\n debug,\r\n opts.inputFormat,\r\n opts.outputFormat,\r\n opts.chunkTargetBytes || 1024 * 1024,\r\n profile,\r\n opts.csvConfig,\r\n opts.xmlConfig\r\n );\r\n } else {\r\n converter = new wasmModule.Converter(debug);\r\n }\r\n\r\n if (debug) console.log(\"[convert-buddy-js] initialized\", opts);\r\n return new ConvertBuddy(converter, debug, profile);\r\n }\r\n\r\n push(chunk: Uint8Array): Uint8Array {\r\n if (this.debug) console.log(\"[convert-buddy-js] push\", chunk.byteLength);\r\n return this.converter.push(chunk);\r\n }\r\n\r\n finish(): Uint8Array {\r\n if (this.debug) console.log(\"[convert-buddy-js] finish\");\r\n return this.converter.finish();\r\n }\r\n\r\n stats(): Stats {\r\n return this.converter.getStats();\r\n }\r\n}\r\n\r\nasync function readSample(\r\n input: DetectInput,\r\n maxBytes = 256 * 1024\r\n): Promise<Uint8Array> {\r\n if (typeof input === \"string\") {\r\n const encoded = new TextEncoder().encode(input);\r\n return encoded.length > maxBytes ? encoded.slice(0, maxBytes) : encoded;\r\n }\r\n\r\n if (input instanceof Uint8Array) {\r\n return input.length > maxBytes ? input.slice(0, maxBytes) : input;\r\n }\r\n\r\n if (input instanceof ArrayBuffer) {\r\n const bytes = new Uint8Array(input);\r\n return bytes.length > maxBytes ? bytes.slice(0, maxBytes) : bytes;\r\n }\r\n\r\n if (isReadableStream(input)) {\r\n const reader = input.getReader();\r\n const chunks: Uint8Array[] = [];\r\n let total = 0;\r\n\r\n while (total < maxBytes) {\r\n const { value, done } = await reader.read();\r\n if (done || !value) break;\r\n const slice = total + value.length > maxBytes\r\n ? value.slice(0, maxBytes - total)\r\n : value;\r\n chunks.push(slice);\r\n total += slice.length;\r\n }\r\n\r\n if (total >= maxBytes) {\r\n await reader.cancel();\r\n }\r\n\r\n return concatChunks(chunks, total);\r\n }\r\n\r\n const chunks: Uint8Array[] = [];\r\n let total = 0;\r\n\r\n for await (const chunk of input as AsyncIterable<Uint8Array>) {\r\n if (total >= maxBytes) {\r\n break;\r\n }\r\n const data = chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);\r\n const slice = total + data.length > maxBytes\r\n ? data.slice(0, maxBytes - total)\r\n : data;\r\n chunks.push(slice);\r\n total += slice.length;\r\n }\r\n\r\n return concatChunks(chunks, total);\r\n}\r\n\r\nfunction concatChunks(chunks: Uint8Array[], total: number): Uint8Array {\r\n const result = new Uint8Array(total);\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return result;\r\n}\r\n\r\nfunction isReadableStream(\r\n input: DetectInput\r\n): input is ReadableStream<Uint8Array> {\r\n return typeof (input as ReadableStream<Uint8Array>)?.getReader === \"function\";\r\n}\r\n\r\nasync function loadDetectionWasm(debug: boolean): Promise<WasmModule> {\r\n const wasmModule = await loadWasmModule();\r\n if (typeof wasmModule.default === \"function\") {\r\n await (wasmModule.default as () => Promise<void>)();\r\n }\r\n wasmModule.init(debug);\r\n return wasmModule;\r\n}\r\n\r\nexport async function detectFormat(\r\n input: DetectInput,\r\n opts: DetectOptions = {}\r\n): Promise<Format | \"unknown\"> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n const sample = await readSample(input, opts.maxBytes);\r\n const format = wasmModule.detectFormat?.(sample);\r\n return (format as Format) ?? \"unknown\";\r\n}\r\n\r\nexport async function detectCsvFieldsAndDelimiter(\r\n input: DetectInput,\r\n opts: DetectOptions = {}\r\n): Promise<CsvDetection | null> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n const sample = await readSample(input, opts.maxBytes);\r\n const result = wasmModule.detectCsvFields?.(sample);\r\n return result ?? null;\r\n}\r\n\r\nexport async function detectXmlElements(\r\n input: DetectInput,\r\n opts: DetectOptions = {}\r\n): Promise<XmlDetection | null> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n const sample = await readSample(input, opts.maxBytes);\r\n const result = wasmModule.detectXmlElements?.(sample);\r\n return result ?? null;\r\n}\r\n\r\n// Web Streams TransformStream adapter\r\nexport class ConvertBuddyTransformStream extends TransformStream<Uint8Array, Uint8Array> {\r\n constructor(opts: ConvertBuddyOptions = {}) {\r\n let buddy: ConvertBuddy | null = null;\r\n\r\n super({\r\n async start(controller) {\r\n buddy = await ConvertBuddy.create(opts);\r\n },\r\n\r\n transform(chunk, controller) {\r\n if (!buddy) {\r\n throw new Error(\"ConvertBuddy not initialized\");\r\n }\r\n\r\n const output = buddy.push(chunk);\r\n if (output.length > 0) {\r\n controller.enqueue(output);\r\n }\r\n },\r\n\r\n flush(controller) {\r\n if (!buddy) {\r\n return;\r\n }\r\n\r\n const output = buddy.finish();\r\n if (output.length > 0) {\r\n controller.enqueue(output);\r\n }\r\n\r\n if (opts.profile) {\r\n const stats = buddy.stats();\r\n console.log(\"[convert-buddy] Performance Stats:\", stats);\r\n }\r\n },\r\n });\r\n }\r\n}\r\n\r\n// Utility: Convert entire buffer/string\r\nexport async function convert(\r\n input: Uint8Array | string,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Uint8Array> {\r\n const buddy = await ConvertBuddy.create(opts);\r\n\r\n const inputBytes = typeof input === \"string\" \r\n ? new TextEncoder().encode(input)\r\n : input;\r\n\r\n const output = buddy.push(inputBytes);\r\n const final = buddy.finish();\r\n\r\n // Combine outputs\r\n const result = new Uint8Array(output.length + final.length);\r\n result.set(output, 0);\r\n result.set(final, output.length);\r\n\r\n if (opts.profile) {\r\n const stats = buddy.stats();\r\n console.log(\"[convert-buddy] Performance Stats:\", stats);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// Utility: Convert and return as string\r\nexport async function convertToString(\r\n input: Uint8Array | string,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<string> {\r\n const result = await convert(input, opts);\r\n return new TextDecoder().decode(result);\r\n}\r\n"],"mappings":"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","names":["require","mod","chunks","total"]}
@@ -1,6 +1,6 @@
1
1
  import { Transform } from 'node:stream';
2
2
  import { ConvertBuddyOptions } from './index.js';
3
- export { ConvertBuddy, ConvertBuddyTransformStream, CsvConfig, CsvDetection, DetectInput, DetectOptions, Format, Stats, XmlConfig, convert, convertToString, detectCsvFieldsAndDelimiter, detectFormat } from './index.js';
3
+ export { ConvertBuddy, ConvertBuddyTransformStream, CsvConfig, CsvDetection, DetectInput, DetectOptions, Format, Stats, XmlConfig, XmlDetection, convert, convertToString, detectCsvFieldsAndDelimiter, detectFormat, detectXmlElements } from './index.js';
4
4
 
5
5
  declare function createNodeTransform(opts?: ConvertBuddyOptions): Promise<Transform>;
6
6
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/node.ts"],"sourcesContent":["import type { Transform as NodeTransform } from \"node:stream\";\r\n\r\nimport { ConvertBuddy, type ConvertBuddyOptions } from \"./index\";\r\n\r\nexport * from \"./index\";\r\n\r\n// Node.js Transform Stream adapter\r\nasync function loadNodeTransform(): Promise<typeof import(\"node:stream\").Transform> {\r\n const isNode =\r\n typeof process !== \"undefined\" &&\r\n !!(process as any).versions?.node;\r\n\r\n if (!isNode) {\r\n throw new Error(\"createNodeTransform is only available in Node.js runtimes.\");\r\n }\r\n\r\n const streamModule = await import(\"node:stream\");\r\n return streamModule.Transform;\r\n}\r\n\r\nexport async function createNodeTransform(\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<NodeTransform> {\r\n let buddy: ConvertBuddy | null = null;\r\n let initPromise: Promise<void> | null = null;\r\n\r\n const Transform = await loadNodeTransform();\r\n const transform = new Transform({\r\n async transform(chunk: Buffer, encoding: string, callback: Function) {\r\n try {\r\n if (!buddy) {\r\n if (!initPromise) {\r\n initPromise = ConvertBuddy.create(opts).then((b) => {\r\n buddy = b;\r\n });\r\n }\r\n await initPromise;\r\n }\r\n\r\n const input = new Uint8Array(chunk);\r\n const output = buddy!.push(input);\r\n\r\n if (output.length > 0) {\r\n this.push(Buffer.from(output));\r\n }\r\n\r\n callback();\r\n } catch (err) {\r\n callback(err);\r\n }\r\n },\r\n\r\n async flush(callback: Function) {\r\n try {\r\n if (buddy) {\r\n const output = buddy.finish();\r\n if (output.length > 0) {\r\n this.push(Buffer.from(output));\r\n }\r\n\r\n if (opts.profile) {\r\n const stats = buddy.stats();\r\n console.log(\"[convert-buddy] Performance Stats:\", stats);\r\n }\r\n }\r\n callback();\r\n } catch (err) {\r\n callback(err);\r\n }\r\n },\r\n });\r\n\r\n return transform;\r\n}\r\n"],"mappings":"AAEA,SAAS,oBAA8C;AAEvD,cAAc;AAGd,eAAe,oBAAqE;AAClF,QAAM,SACJ,OAAO,YAAY,eACnB,CAAC,CAAE,QAAgB,UAAU;AAE/B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,QAAM,eAAe,MAAM,OAAO,aAAa;AAC/C,SAAO,aAAa;AACtB;AAEA,eAAsB,oBACpB,OAA4B,CAAC,GACL;AACxB,MAAI,QAA6B;AACjC,MAAI,cAAoC;AAExC,QAAM,YAAY,MAAM,kBAAkB;AAC1C,QAAM,YAAY,IAAI,UAAU;AAAA,IAC9B,MAAM,UAAU,OAAe,UAAkB,UAAoB;AACnE,UAAI;AACF,YAAI,CAAC,OAAO;AACV,cAAI,CAAC,aAAa;AAChB,0BAAc,aAAa,OAAO,IAAI,EAAE,KAAK,CAAC,MAAM;AAClD,sBAAQ;AAAA,YACV,CAAC;AAAA,UACH;AACA,gBAAM;AAAA,QACR;AAEA,cAAM,QAAQ,IAAI,WAAW,KAAK;AAClC,cAAM,SAAS,MAAO,KAAK,KAAK;AAEhC,YAAI,OAAO,SAAS,GAAG;AACrB,eAAK,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,QAC/B;AAEA,iBAAS;AAAA,MACX,SAAS,KAAK;AACZ,iBAAS,GAAG;AAAA,MACd;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,UAAoB;AAC9B,UAAI;AACF,YAAI,OAAO;AACT,gBAAM,SAAS,MAAM,OAAO;AAC5B,cAAI,OAAO,SAAS,GAAG;AACrB,iBAAK,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,UAC/B;AAEA,cAAI,KAAK,SAAS;AAChB,kBAAM,QAAQ,MAAM,MAAM;AAC1B,oBAAQ,IAAI,sCAAsC,KAAK;AAAA,UACzD;AAAA,QACF;AACA,iBAAS;AAAA,MACX,SAAS,KAAK;AACZ,iBAAS,GAAG;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/smoke-test.ts"],"sourcesContent":["import { ConvertBuddy, convert, convertToString } from \"./index.js\";\r\nimport { createNodeTransform } from \"../src/node.js\";\r\n\r\n\r\nasync function testBasicConversion() {\r\n console.log(\"\\n=== Test: Basic CSV to NDJSON ===\");\r\n \r\n const csvData = `name,age,city\r\nAlice,30,New York\r\nBob,25,London\r\nCharlie,35,Tokyo`;\r\n\r\n const result = await convertToString(csvData, {\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n debug: false,\r\n profile: true,\r\n });\r\n\r\n console.log(\"Input CSV:\");\r\n console.log(csvData);\r\n console.log(\"\\nOutput NDJSON:\");\r\n console.log(result);\r\n\r\n // Validate output\r\n const lines = result.trim().split(\"\\n\");\r\n if (lines.length !== 3) {\r\n throw new Error(`Expected 3 lines, got ${lines.length}`);\r\n }\r\n\r\n const firstRecord = JSON.parse(lines[0]);\r\n if (firstRecord.name !== \"Alice\") {\r\n throw new Error(`Expected name=Alice, got ${firstRecord.name}`);\r\n }\r\n\r\n console.log(\"✓ Basic conversion test passed\");\r\n}\r\n\r\nasync function testStreamingAPI() {\r\n console.log(\"\\n=== Test: Streaming API ===\");\r\n\r\n const buddy = await ConvertBuddy.create({\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n debug: false,\r\n });\r\n\r\n // Push data in chunks\r\n const header = new TextEncoder().encode(\"name,age\\n\");\r\n const row1 = new TextEncoder().encode(\"Alice,30\\n\");\r\n const row2 = new TextEncoder().encode(\"Bob,25\\n\");\r\n\r\n const out1 = buddy.push(header);\r\n const out2 = buddy.push(row1);\r\n const out3 = buddy.push(row2);\r\n const final = buddy.finish();\r\n\r\n const combined = new Uint8Array(\r\n out1.length + out2.length + out3.length + final.length\r\n );\r\n combined.set(out1, 0);\r\n combined.set(out2, out1.length);\r\n combined.set(out3, out1.length + out2.length);\r\n combined.set(final, out1.length + out2.length + out3.length);\r\n\r\n const result = new TextDecoder().decode(combined);\r\n console.log(\"Streaming result:\");\r\n console.log(result);\r\n\r\n console.log(\"✓ Streaming API test passed\");\r\n}\r\n\r\nasync function testNdjsonToJson() {\r\n console.log(\"\\n=== Test: NDJSON to JSON Array ===\");\r\n\r\n const ndjsonData = `{\"name\":\"Alice\",\"age\":30}\r\n{\"name\":\"Bob\",\"age\":25}\r\n{\"name\":\"Charlie\",\"age\":35}`;\r\n\r\n const result = await convertToString(ndjsonData, {\r\n inputFormat: \"ndjson\",\r\n outputFormat: \"json\",\r\n debug: false,\r\n });\r\n\r\n console.log(\"Input NDJSON:\");\r\n console.log(ndjsonData);\r\n console.log(\"\\nOutput JSON:\");\r\n console.log(result);\r\n\r\n // Validate it's valid JSON array\r\n const parsed = JSON.parse(result);\r\n if (!Array.isArray(parsed)) {\r\n throw new Error(\"Expected JSON array\");\r\n }\r\n if (parsed.length !== 3) {\r\n throw new Error(`Expected 3 items, got ${parsed.length}`);\r\n }\r\n\r\n console.log(\"✓ NDJSON to JSON test passed\");\r\n}\r\n\r\nasync function testQuotedCsv() {\r\n console.log(\"\\n=== Test: Quoted CSV with Commas ===\");\r\n\r\n const csvData = `name,description\r\n\"Alice\",\"Hello, World\"\r\n\"Bob\",\"Test, with, commas\"\r\n\"Charlie\",\"Normal text\"`;\r\n\r\n const result = await convertToString(csvData, {\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n debug: false,\r\n });\r\n\r\n console.log(\"Input CSV:\");\r\n console.log(csvData);\r\n console.log(\"\\nOutput NDJSON:\");\r\n console.log(result);\r\n\r\n const lines = result.trim().split(\"\\n\");\r\n const firstRecord = JSON.parse(lines[0]);\r\n \r\n if (!firstRecord.description.includes(\",\")) {\r\n throw new Error(\"Expected comma in description to be preserved\");\r\n }\r\n\r\n console.log(\"✓ Quoted CSV test passed\");\r\n}\r\n\r\nasync function testStats() {\r\n console.log(\"\\n=== Test: Performance Stats ===\");\r\n\r\n const csvData = `name,age\r\nAlice,30\r\nBob,25\r\nCharlie,35`;\r\n\r\n const result = await convert(new TextEncoder().encode(csvData), {\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n profile: true,\r\n });\r\n\r\n // Stats are logged automatically with profile: true\r\n console.log(\"✓ Stats test passed\");\r\n}\r\n\r\nasync function testPartialLines() {\r\n console.log(\"\\n=== Test: Partial Line Handling ===\");\r\n\r\n const buddy = await ConvertBuddy.create({\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n debug: false,\r\n });\r\n\r\n // Split a line across chunks\r\n const chunk1 = new TextEncoder().encode(\"name,age\\nAli\");\r\n const chunk2 = new TextEncoder().encode(\"ce,30\\nBob,25\\n\");\r\n\r\n const out1 = buddy.push(chunk1);\r\n const out2 = buddy.push(chunk2);\r\n const final = buddy.finish();\r\n\r\n const combined = new Uint8Array(out1.length + out2.length + final.length);\r\n combined.set(out1, 0);\r\n combined.set(out2, out1.length);\r\n combined.set(final, out1.length + out2.length);\r\n\r\n const result = new TextDecoder().decode(combined);\r\n console.log(\"Result with partial lines:\");\r\n console.log(result);\r\n\r\n const lines = result.trim().split(\"\\n\");\r\n if (lines.length !== 2) {\r\n throw new Error(`Expected 2 lines, got ${lines.length}`);\r\n }\r\n\r\n const firstRecord = JSON.parse(lines[0]);\r\n if (firstRecord.name !== \"Alice\") {\r\n throw new Error(`Expected name=Alice, got ${firstRecord.name}`);\r\n }\r\n\r\n console.log(\"✓ Partial line test passed\");\r\n}\r\n\r\nasync function testLargeDataset() {\r\n console.log(\"\\n=== Test: Large Dataset Performance ===\");\r\n\r\n // Generate large CSV\r\n const rows = 10000;\r\n let csv = \"id,name,value\\n\";\r\n for (let i = 0; i < rows; i++) {\r\n csv += `${i},name_${i},${i * 100}\\n`;\r\n }\r\n\r\n const start = performance.now();\r\n const result = await convert(new TextEncoder().encode(csv), {\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n profile: true,\r\n });\r\n const end = performance.now();\r\n\r\n const lines = new TextDecoder().decode(result).trim().split(\"\\n\");\r\n \r\n console.log(`Processed ${rows} rows in ${(end - start).toFixed(2)}ms`);\r\n console.log(`Throughput: ${((csv.length / (1024 * 1024)) / ((end - start) / 1000)).toFixed(2)} MB/s`);\r\n console.log(`Output lines: ${lines.length}`);\r\n\r\n if (lines.length !== rows) {\r\n throw new Error(`Expected ${rows} lines, got ${lines.length}`);\r\n }\r\n\r\n console.log(\"✓ Large dataset test passed\");\r\n}\r\n\r\nasync function testEmptyAndWhitespace() {\r\n console.log(\"\\n=== Test: Empty Lines and Whitespace ===\");\r\n\r\n const csvData = `name,age\r\n\r\nAlice,30\r\n\r\nBob,25\r\n`;\r\n\r\n const result = await convertToString(csvData, {\r\n inputFormat: \"csv\",\r\n outputFormat: \"ndjson\",\r\n debug: false,\r\n });\r\n\r\n console.log(\"Input CSV (with empty lines):\");\r\n console.log(JSON.stringify(csvData));\r\n console.log(\"\\nOutput NDJSON:\");\r\n console.log(result);\r\n\r\n const lines = result.trim().split(\"\\n\").filter(l => l.length > 0);\r\n if (lines.length !== 2) {\r\n throw new Error(`Expected 2 non-empty lines, got ${lines.length}`);\r\n }\r\n\r\n console.log(\"✓ Empty lines test passed\");\r\n}\r\n\r\n// Run all tests\r\nasync function runAllTests() {\r\n console.log(\"╔════════════════════════════════════════╗\");\r\n console.log(\"║ Convert Buddy - Smoke Test Suite ║\");\r\n console.log(\"╚════════════════════════════════════════╝\");\r\n\r\n try {\r\n await testBasicConversion();\r\n await testStreamingAPI();\r\n await testNdjsonToJson();\r\n await testQuotedCsv();\r\n await testStats();\r\n await testPartialLines();\r\n await testLargeDataset();\r\n await testEmptyAndWhitespace();\r\n\r\n console.log(\"\\n╔════════════════════════════════════════╗\");\r\n console.log(\"║ ✓ All tests passed successfully! ║\");\r\n console.log(\"╚════════════════════════════════════════╝\\n\");\r\n } catch (error) {\r\n console.error(\"\\n✗ Test failed:\", error);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nrunAllTests();\r\n"],"mappings":"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","names":[]}
@@ -5,6 +5,10 @@
5
5
  */
6
6
  export function detectCsvFields(sample: Uint8Array): any;
7
7
  export function init(debug_enabled: boolean): void;
8
+ /**
9
+ * Detect XML elements from a sample of bytes.
10
+ */
11
+ export function detectXmlElements(sample: Uint8Array): any;
8
12
  /**
9
13
  * Detect the input format from a sample of bytes.
10
14
  */
@@ -196,6 +196,18 @@ module.exports.init = function(debug_enabled) {
196
196
  wasm.init(debug_enabled);
197
197
  };
198
198
 
199
+ /**
200
+ * Detect XML elements from a sample of bytes.
201
+ * @param {Uint8Array} sample
202
+ * @returns {any}
203
+ */
204
+ module.exports.detectXmlElements = function(sample) {
205
+ const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
206
+ const len0 = WASM_VECTOR_LEN;
207
+ const ret = wasm.detectXmlElements(ptr0, len0);
208
+ return ret;
209
+ };
210
+
199
211
  /**
200
212
  * Detect the input format from a sample of bytes.
201
213
  * @param {Uint8Array} sample
@@ -10,6 +10,7 @@ export const converter_push: (a: number, b: number, c: number) => [number, numbe
10
10
  export const converter_withConfig: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: any, i: any) => [number, number, number];
11
11
  export const detectCsvFields: (a: number, b: number) => any;
12
12
  export const detectFormat: (a: number, b: number) => [number, number];
13
+ export const detectXmlElements: (a: number, b: number) => any;
13
14
  export const init: (a: number) => void;
14
15
  export const stats_bytes_in: (a: number) => number;
15
16
  export const stats_bytes_out: (a: number) => number;
@@ -5,6 +5,10 @@
5
5
  */
6
6
  export function detectCsvFields(sample: Uint8Array): any;
7
7
  export function init(debug_enabled: boolean): void;
8
+ /**
9
+ * Detect XML elements from a sample of bytes.
10
+ */
11
+ export function detectXmlElements(sample: Uint8Array): any;
8
12
  /**
9
13
  * Detect the input format from a sample of bytes.
10
14
  */
@@ -64,6 +68,7 @@ export interface InitOutput {
64
68
  readonly converter_withConfig: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: any, i: any) => [number, number, number];
65
69
  readonly detectCsvFields: (a: number, b: number) => any;
66
70
  readonly detectFormat: (a: number, b: number) => [number, number];
71
+ readonly detectXmlElements: (a: number, b: number) => any;
67
72
  readonly init: (a: number) => void;
68
73
  readonly stats_bytes_in: (a: number) => number;
69
74
  readonly stats_bytes_out: (a: number) => number;
@@ -192,6 +192,18 @@ export function init(debug_enabled) {
192
192
  wasm.init(debug_enabled);
193
193
  }
194
194
 
195
+ /**
196
+ * Detect XML elements from a sample of bytes.
197
+ * @param {Uint8Array} sample
198
+ * @returns {any}
199
+ */
200
+ export function detectXmlElements(sample) {
201
+ const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
202
+ const len0 = WASM_VECTOR_LEN;
203
+ const ret = wasm.detectXmlElements(ptr0, len0);
204
+ return ret;
205
+ }
206
+
195
207
  /**
196
208
  * Detect the input format from a sample of bytes.
197
209
  * @param {Uint8Array} sample
Binary file
@@ -10,6 +10,7 @@ export const converter_push: (a: number, b: number, c: number) => [number, numbe
10
10
  export const converter_withConfig: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: any, i: any) => [number, number, number];
11
11
  export const detectCsvFields: (a: number, b: number) => any;
12
12
  export const detectFormat: (a: number, b: number) => [number, number];
13
+ export const detectXmlElements: (a: number, b: number) => any;
13
14
  export const init: (a: number) => void;
14
15
  export const stats_bytes_in: (a: number) => number;
15
16
  export const stats_bytes_out: (a: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convert-buddy-js",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "TypeScript wrapper for convert-buddy (Rust/WASM core)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,151 +0,0 @@
1
- // bench/datasets.ts
2
- function generateCsvDataset(rows, cols) {
3
- const encoder = new TextEncoder();
4
- let csv = "";
5
- const headers = Array.from({ length: cols }, (_, i) => `column_${i}`);
6
- csv += headers.join(",") + "\n";
7
- for (let i = 0; i < rows; i++) {
8
- const row = Array.from({ length: cols }, (_, j) => {
9
- if (j % 4 === 0) {
10
- return `"text_${i}_${j}"`;
11
- } else if (j % 4 === 1) {
12
- return i * j;
13
- } else if (j % 4 === 2) {
14
- return `value_${i}`;
15
- } else {
16
- return `"quoted, with comma ${i}"`;
17
- }
18
- });
19
- csv += row.join(",") + "\n";
20
- }
21
- return encoder.encode(csv);
22
- }
23
- function generateNdjsonDataset(records, fields) {
24
- const encoder = new TextEncoder();
25
- let ndjson = "";
26
- for (let i = 0; i < records; i++) {
27
- const obj = {};
28
- for (let j = 0; j < fields; j++) {
29
- const key = `field_${j}`;
30
- if (j % 5 === 0) {
31
- obj[key] = `string_value_${i}_${j}`;
32
- } else if (j % 5 === 1) {
33
- obj[key] = i * j;
34
- } else if (j % 5 === 2) {
35
- obj[key] = i % 2 === 0;
36
- } else if (j % 5 === 3) {
37
- obj[key] = null;
38
- } else {
39
- obj[key] = { nested: `value_${i}`, count: j };
40
- }
41
- }
42
- ndjson += JSON.stringify(obj) + "\n";
43
- }
44
- return encoder.encode(ndjson);
45
- }
46
- function generateXmlDataset(records, fields) {
47
- const encoder = new TextEncoder();
48
- let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<root>\n';
49
- for (let i = 0; i < records; i++) {
50
- xml += ` <record id="${i}">
51
- `;
52
- for (let j = 0; j < fields; j++) {
53
- const value = `value_${i}_${j}`;
54
- xml += ` <field_${j}>${value}</field_${j}>
55
- `;
56
- }
57
- xml += ` </record>
58
- `;
59
- }
60
- xml += "</root>\n";
61
- return encoder.encode(xml);
62
- }
63
- function generateJsonDataset(records, fields) {
64
- const encoder = new TextEncoder();
65
- const array = [];
66
- for (let i = 0; i < records; i++) {
67
- const obj = {};
68
- for (let j = 0; j < fields; j++) {
69
- const key = `field_${j}`;
70
- if (j % 4 === 0) {
71
- obj[key] = `string_value_${i}_${j}`;
72
- } else if (j % 4 === 1) {
73
- obj[key] = i * j;
74
- } else if (j % 4 === 2) {
75
- obj[key] = i % 2 === 0;
76
- } else {
77
- obj[key] = { nested: `value_${i}` };
78
- }
79
- }
80
- array.push(obj);
81
- }
82
- return encoder.encode(JSON.stringify(array));
83
- }
84
- function generateRealisticCsv(rows) {
85
- const encoder = new TextEncoder();
86
- let csv = "id,name,email,age,city,description\n";
87
- const cities = ["New York", "London", "Tokyo", "Paris", "Berlin"];
88
- const names = ["Alice", "Bob", "Charlie", "Diana", "Eve"];
89
- for (let i = 0; i < rows; i++) {
90
- const name = names[i % names.length];
91
- const email = `${name.toLowerCase()}${i}@example.com`;
92
- const age = 20 + i % 50;
93
- const city = cities[i % cities.length];
94
- const description = `"This is a longer description with, commas and ""quotes"" for record ${i}"`;
95
- csv += `${i},${name},${email},${age},${city},${description}
96
- `;
97
- }
98
- return encoder.encode(csv);
99
- }
100
- function generateWideCsv(rows, cols = 100) {
101
- const encoder = new TextEncoder();
102
- const headers = Array.from({ length: cols }, (_, i) => `col_${i}`);
103
- let csv = headers.join(",") + "\n";
104
- for (let i = 0; i < rows; i++) {
105
- const row = Array.from({ length: cols }, (_, j) => i * cols + j);
106
- csv += row.join(",") + "\n";
107
- }
108
- return encoder.encode(csv);
109
- }
110
- function generateLargeObjectNdjson(records) {
111
- const encoder = new TextEncoder();
112
- let ndjson = "";
113
- for (let i = 0; i < records; i++) {
114
- const obj = {
115
- id: i,
116
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
117
- user: {
118
- name: `User ${i}`,
119
- email: `user${i}@example.com`,
120
- profile: {
121
- age: 20 + i % 50,
122
- city: "City",
123
- bio: "A".repeat(100)
124
- // Large string
125
- }
126
- },
127
- data: Array.from({ length: 10 }, (_, j) => ({
128
- key: `key_${j}`,
129
- value: i * j
130
- })),
131
- metadata: {
132
- created: (/* @__PURE__ */ new Date()).toISOString(),
133
- updated: (/* @__PURE__ */ new Date()).toISOString(),
134
- tags: ["tag1", "tag2", "tag3"]
135
- }
136
- };
137
- ndjson += JSON.stringify(obj) + "\n";
138
- }
139
- return encoder.encode(ndjson);
140
- }
141
-
142
- export {
143
- generateCsvDataset,
144
- generateNdjsonDataset,
145
- generateXmlDataset,
146
- generateJsonDataset,
147
- generateRealisticCsv,
148
- generateWideCsv,
149
- generateLargeObjectNdjson
150
- };
151
- //# sourceMappingURL=chunk-DESHN2IK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bench/datasets.ts"],"sourcesContent":["/**\r\n * Dataset generators for benchmarking\r\n */\r\n\r\nexport function generateCsvDataset(rows: number, cols: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n let csv = \"\";\r\n\r\n // Generate headers\r\n const headers = Array.from({ length: cols }, (_, i) => `column_${i}`);\r\n csv += headers.join(\",\") + \"\\n\";\r\n\r\n // Generate rows\r\n for (let i = 0; i < rows; i++) {\r\n const row = Array.from({ length: cols }, (_, j) => {\r\n // Mix of data types\r\n if (j % 4 === 0) {\r\n return `\"text_${i}_${j}\"`; // Quoted string\r\n } else if (j % 4 === 1) {\r\n return i * j; // Number\r\n } else if (j % 4 === 2) {\r\n return `value_${i}`; // Unquoted string\r\n } else {\r\n return `\"quoted, with comma ${i}\"`; // Quoted with comma\r\n }\r\n });\r\n csv += row.join(\",\") + \"\\n\";\r\n }\r\n\r\n return encoder.encode(csv);\r\n}\r\n\r\nexport function generateNdjsonDataset(records: number, fields: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n let ndjson = \"\";\r\n\r\n for (let i = 0; i < records; i++) {\r\n const obj: Record<string, any> = {};\r\n \r\n for (let j = 0; j < fields; j++) {\r\n const key = `field_${j}`;\r\n \r\n // Mix of data types\r\n if (j % 5 === 0) {\r\n obj[key] = `string_value_${i}_${j}`;\r\n } else if (j % 5 === 1) {\r\n obj[key] = i * j;\r\n } else if (j % 5 === 2) {\r\n obj[key] = i % 2 === 0;\r\n } else if (j % 5 === 3) {\r\n obj[key] = null;\r\n } else {\r\n obj[key] = { nested: `value_${i}`, count: j };\r\n }\r\n }\r\n \r\n ndjson += JSON.stringify(obj) + \"\\n\";\r\n }\r\n\r\n return encoder.encode(ndjson);\r\n}\r\n\r\nexport function generateXmlDataset(records: number, fields: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<root>\\n';\r\n\r\n for (let i = 0; i < records; i++) {\r\n xml += ` <record id=\"${i}\">\\n`;\r\n \r\n for (let j = 0; j < fields; j++) {\r\n const value = `value_${i}_${j}`;\r\n xml += ` <field_${j}>${value}</field_${j}>\\n`;\r\n }\r\n \r\n xml += ` </record>\\n`;\r\n }\r\n\r\n xml += \"</root>\\n\";\r\n return encoder.encode(xml);\r\n}\r\n\r\nexport function generateJsonDataset(records: number, fields: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n const array = [];\r\n\r\n for (let i = 0; i < records; i++) {\r\n const obj: Record<string, any> = {};\r\n \r\n for (let j = 0; j < fields; j++) {\r\n const key = `field_${j}`;\r\n \r\n if (j % 4 === 0) {\r\n obj[key] = `string_value_${i}_${j}`;\r\n } else if (j % 4 === 1) {\r\n obj[key] = i * j;\r\n } else if (j % 4 === 2) {\r\n obj[key] = i % 2 === 0;\r\n } else {\r\n obj[key] = { nested: `value_${i}` };\r\n }\r\n }\r\n \r\n array.push(obj);\r\n }\r\n\r\n return encoder.encode(JSON.stringify(array));\r\n}\r\n\r\n// Generate realistic CSV with various edge cases\r\nexport function generateRealisticCsv(rows: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n let csv = \"id,name,email,age,city,description\\n\";\r\n\r\n const cities = [\"New York\", \"London\", \"Tokyo\", \"Paris\", \"Berlin\"];\r\n const names = [\"Alice\", \"Bob\", \"Charlie\", \"Diana\", \"Eve\"];\r\n\r\n for (let i = 0; i < rows; i++) {\r\n const name = names[i % names.length];\r\n const email = `${name.toLowerCase()}${i}@example.com`;\r\n const age = 20 + (i % 50);\r\n const city = cities[i % cities.length];\r\n const description = `\"This is a longer description with, commas and \"\"quotes\"\" for record ${i}\"`;\r\n \r\n csv += `${i},${name},${email},${age},${city},${description}\\n`;\r\n }\r\n\r\n return encoder.encode(csv);\r\n}\r\n\r\n// Generate wide CSV (many columns)\r\nexport function generateWideCsv(rows: number, cols: number = 100): Uint8Array {\r\n const encoder = new TextEncoder();\r\n \r\n // Headers\r\n const headers = Array.from({ length: cols }, (_, i) => `col_${i}`);\r\n let csv = headers.join(\",\") + \"\\n\";\r\n\r\n // Data\r\n for (let i = 0; i < rows; i++) {\r\n const row = Array.from({ length: cols }, (_, j) => i * cols + j);\r\n csv += row.join(\",\") + \"\\n\";\r\n }\r\n\r\n return encoder.encode(csv);\r\n}\r\n\r\n// Generate NDJSON with large objects\r\nexport function generateLargeObjectNdjson(records: number): Uint8Array {\r\n const encoder = new TextEncoder();\r\n let ndjson = \"\";\r\n\r\n for (let i = 0; i < records; i++) {\r\n const obj = {\r\n id: i,\r\n timestamp: new Date().toISOString(),\r\n user: {\r\n name: `User ${i}`,\r\n email: `user${i}@example.com`,\r\n profile: {\r\n age: 20 + (i % 50),\r\n city: \"City\",\r\n bio: \"A\".repeat(100), // Large string\r\n },\r\n },\r\n data: Array.from({ length: 10 }, (_, j) => ({\r\n key: `key_${j}`,\r\n value: i * j,\r\n })),\r\n metadata: {\r\n created: new Date().toISOString(),\r\n updated: new Date().toISOString(),\r\n tags: [\"tag1\", \"tag2\", \"tag3\"],\r\n },\r\n };\r\n \r\n ndjson += JSON.stringify(obj) + \"\\n\";\r\n }\r\n\r\n return encoder.encode(ndjson);\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,193 +0,0 @@
1
- // src/index.ts
2
- async function loadWasmModule() {
3
- const isNode = typeof process !== "undefined" && !!process.versions?.node;
4
- if (isNode) {
5
- const { createRequire } = await import("module");
6
- const require2 = createRequire(import.meta.url);
7
- const mod2 = require2("../wasm-node.cjs");
8
- return mod2;
9
- }
10
- const wasmUrl = new URL("./web/convert_buddy.js", import.meta.url);
11
- const mod = await import(wasmUrl.href);
12
- return mod;
13
- }
14
- var ConvertBuddy = class _ConvertBuddy {
15
- converter;
16
- debug;
17
- profile;
18
- constructor(converter, debug, profile) {
19
- this.converter = converter;
20
- this.debug = debug;
21
- this.profile = profile;
22
- }
23
- static async create(opts = {}) {
24
- const debug = !!opts.debug;
25
- const profile = !!opts.profile;
26
- const wasmModule = await loadWasmModule();
27
- if (typeof wasmModule.default === "function") {
28
- await wasmModule.default();
29
- }
30
- wasmModule.init(debug);
31
- let converter;
32
- if (opts.inputFormat && opts.outputFormat) {
33
- const Converter = wasmModule.Converter;
34
- converter = Converter.withConfig(
35
- debug,
36
- opts.inputFormat,
37
- opts.outputFormat,
38
- opts.chunkTargetBytes || 1024 * 1024,
39
- profile,
40
- opts.csvConfig,
41
- opts.xmlConfig
42
- );
43
- } else {
44
- converter = new wasmModule.Converter(debug);
45
- }
46
- if (debug) console.log("[convert-buddy-js] initialized", opts);
47
- return new _ConvertBuddy(converter, debug, profile);
48
- }
49
- push(chunk) {
50
- if (this.debug) console.log("[convert-buddy-js] push", chunk.byteLength);
51
- return this.converter.push(chunk);
52
- }
53
- finish() {
54
- if (this.debug) console.log("[convert-buddy-js] finish");
55
- return this.converter.finish();
56
- }
57
- stats() {
58
- return this.converter.getStats();
59
- }
60
- };
61
- async function readSample(input, maxBytes = 256 * 1024) {
62
- if (typeof input === "string") {
63
- const encoded = new TextEncoder().encode(input);
64
- return encoded.length > maxBytes ? encoded.slice(0, maxBytes) : encoded;
65
- }
66
- if (input instanceof Uint8Array) {
67
- return input.length > maxBytes ? input.slice(0, maxBytes) : input;
68
- }
69
- if (input instanceof ArrayBuffer) {
70
- const bytes = new Uint8Array(input);
71
- return bytes.length > maxBytes ? bytes.slice(0, maxBytes) : bytes;
72
- }
73
- if (isReadableStream(input)) {
74
- const reader = input.getReader();
75
- const chunks2 = [];
76
- let total2 = 0;
77
- while (total2 < maxBytes) {
78
- const { value, done } = await reader.read();
79
- if (done || !value) break;
80
- const slice = total2 + value.length > maxBytes ? value.slice(0, maxBytes - total2) : value;
81
- chunks2.push(slice);
82
- total2 += slice.length;
83
- }
84
- if (total2 >= maxBytes) {
85
- await reader.cancel();
86
- }
87
- return concatChunks(chunks2, total2);
88
- }
89
- const chunks = [];
90
- let total = 0;
91
- for await (const chunk of input) {
92
- if (total >= maxBytes) {
93
- break;
94
- }
95
- const data = chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);
96
- const slice = total + data.length > maxBytes ? data.slice(0, maxBytes - total) : data;
97
- chunks.push(slice);
98
- total += slice.length;
99
- }
100
- return concatChunks(chunks, total);
101
- }
102
- function concatChunks(chunks, total) {
103
- const result = new Uint8Array(total);
104
- let offset = 0;
105
- for (const chunk of chunks) {
106
- result.set(chunk, offset);
107
- offset += chunk.length;
108
- }
109
- return result;
110
- }
111
- function isReadableStream(input) {
112
- return typeof input?.getReader === "function";
113
- }
114
- async function loadDetectionWasm(debug) {
115
- const wasmModule = await loadWasmModule();
116
- if (typeof wasmModule.default === "function") {
117
- await wasmModule.default();
118
- }
119
- wasmModule.init(debug);
120
- return wasmModule;
121
- }
122
- async function detectFormat(input, opts = {}) {
123
- const wasmModule = await loadDetectionWasm(!!opts.debug);
124
- const sample = await readSample(input, opts.maxBytes);
125
- const format = wasmModule.detectFormat?.(sample);
126
- return format ?? "unknown";
127
- }
128
- async function detectCsvFieldsAndDelimiter(input, opts = {}) {
129
- const wasmModule = await loadDetectionWasm(!!opts.debug);
130
- const sample = await readSample(input, opts.maxBytes);
131
- const result = wasmModule.detectCsvFields?.(sample);
132
- return result ?? null;
133
- }
134
- var ConvertBuddyTransformStream = class extends TransformStream {
135
- constructor(opts = {}) {
136
- let buddy = null;
137
- super({
138
- async start(controller) {
139
- buddy = await ConvertBuddy.create(opts);
140
- },
141
- transform(chunk, controller) {
142
- if (!buddy) {
143
- throw new Error("ConvertBuddy not initialized");
144
- }
145
- const output = buddy.push(chunk);
146
- if (output.length > 0) {
147
- controller.enqueue(output);
148
- }
149
- },
150
- flush(controller) {
151
- if (!buddy) {
152
- return;
153
- }
154
- const output = buddy.finish();
155
- if (output.length > 0) {
156
- controller.enqueue(output);
157
- }
158
- if (opts.profile) {
159
- const stats = buddy.stats();
160
- console.log("[convert-buddy] Performance Stats:", stats);
161
- }
162
- }
163
- });
164
- }
165
- };
166
- async function convert(input, opts = {}) {
167
- const buddy = await ConvertBuddy.create(opts);
168
- const inputBytes = typeof input === "string" ? new TextEncoder().encode(input) : input;
169
- const output = buddy.push(inputBytes);
170
- const final = buddy.finish();
171
- const result = new Uint8Array(output.length + final.length);
172
- result.set(output, 0);
173
- result.set(final, output.length);
174
- if (opts.profile) {
175
- const stats = buddy.stats();
176
- console.log("[convert-buddy] Performance Stats:", stats);
177
- }
178
- return result;
179
- }
180
- async function convertToString(input, opts = {}) {
181
- const result = await convert(input, opts);
182
- return new TextDecoder().decode(result);
183
- }
184
-
185
- export {
186
- ConvertBuddy,
187
- detectFormat,
188
- detectCsvFieldsAndDelimiter,
189
- ConvertBuddyTransformStream,
190
- convert,
191
- convertToString
192
- };
193
- //# sourceMappingURL=chunk-EW7HKBIV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type Format = \"csv\" | \"ndjson\" | \"json\" | \"xml\";\r\nexport type DetectInput =\r\n | Uint8Array\r\n | ArrayBuffer\r\n | string\r\n | ReadableStream<Uint8Array>\r\n | AsyncIterable<Uint8Array>;\r\n\r\nexport type CsvDetection = {\r\n delimiter: string;\r\n fields: string[];\r\n};\r\n\r\nexport type DetectOptions = {\r\n maxBytes?: number;\r\n debug?: boolean;\r\n};\r\n\r\nexport type ConvertBuddyOptions = {\r\n debug?: boolean;\r\n profile?: boolean;\r\n inputFormat?: Format;\r\n outputFormat?: Format;\r\n chunkTargetBytes?: number;\r\n parallelism?: number; // Node only - number of worker threads\r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n};\r\n\r\nexport type CsvConfig = {\r\n delimiter?: string;\r\n quote?: string;\r\n hasHeaders?: boolean;\r\n trimWhitespace?: boolean;\r\n};\r\n\r\nexport type XmlConfig = {\r\n recordElement?: string;\r\n trimText?: boolean;\r\n includeAttributes?: boolean;\r\n expandEntities?: boolean;\r\n};\r\n\r\nexport type Stats = {\r\n bytesIn: number;\r\n bytesOut: number;\r\n chunksIn: number;\r\n recordsProcessed: number;\r\n parseTimeMs: number;\r\n transformTimeMs: number;\r\n writeTimeMs: number;\r\n maxBufferSize: number;\r\n currentPartialSize: number;\r\n throughputMbPerSec: number;\r\n};\r\n\r\ntype WasmModule = {\r\n default?: unknown;\r\n init: (debugEnabled: boolean) => void;\r\n Converter: new (debug: boolean) => {\r\n push: (chunk: Uint8Array) => Uint8Array;\r\n finish: () => Uint8Array;\r\n getStats: () => Stats;\r\n };\r\n detectFormat?: (sample: Uint8Array) => string | null | undefined;\r\n detectCsvFields?: (sample: Uint8Array) => CsvDetection | null | undefined;\r\n __wbg_set_wasm?: (wasm: unknown) => void;\r\n};\r\n\r\nasync function loadWasmModule(): Promise<WasmModule> {\r\n const isNode =\r\n typeof process !== \"undefined\" &&\r\n !!(process as any).versions?.node;\r\n\r\n if (isNode) {\r\n const { createRequire } = await import(\"node:module\");\r\n const require = createRequire(import.meta.url);\r\n const mod = require(\"../wasm-node.cjs\");\r\n return mod as WasmModule;\r\n }\r\n\r\n const wasmUrl = new URL(\"./web/convert_buddy.js\", import.meta.url);\r\n const mod = (await import(wasmUrl.href)) as unknown as WasmModule;\r\n return mod;\r\n}\r\n\r\nexport class ConvertBuddy {\r\n private converter: any;\r\n private debug: boolean;\r\n private profile: boolean;\r\n\r\n private constructor(converter: any, debug: boolean, profile: boolean) {\r\n this.converter = converter;\r\n this.debug = debug;\r\n this.profile = profile;\r\n }\r\n\r\n static async create(opts: ConvertBuddyOptions = {}): Promise<ConvertBuddy> {\r\n const debug = !!opts.debug;\r\n const profile = !!opts.profile;\r\n\r\n const wasmModule = await loadWasmModule();\r\n\r\n if (typeof wasmModule.default === \"function\") {\r\n await (wasmModule.default as () => Promise<void>)();\r\n }\r\n\r\n wasmModule.init(debug);\r\n\r\n let converter;\r\n if (opts.inputFormat && opts.outputFormat) {\r\n // Use withConfig for custom formats\r\n const Converter = (wasmModule as any).Converter;\r\n converter = Converter.withConfig(\r\n debug,\r\n opts.inputFormat,\r\n opts.outputFormat,\r\n opts.chunkTargetBytes || 1024 * 1024,\r\n profile,\r\n opts.csvConfig,\r\n opts.xmlConfig\r\n );\r\n } else {\r\n converter = new wasmModule.Converter(debug);\r\n }\r\n\r\n if (debug) console.log(\"[convert-buddy-js] initialized\", opts);\r\n return new ConvertBuddy(converter, debug, profile);\r\n }\r\n\r\n push(chunk: Uint8Array): Uint8Array {\r\n if (this.debug) console.log(\"[convert-buddy-js] push\", chunk.byteLength);\r\n return this.converter.push(chunk);\r\n }\r\n\r\n finish(): Uint8Array {\r\n if (this.debug) console.log(\"[convert-buddy-js] finish\");\r\n return this.converter.finish();\r\n }\r\n\r\n stats(): Stats {\r\n return this.converter.getStats();\r\n }\r\n}\r\n\r\nasync function readSample(\r\n input: DetectInput,\r\n maxBytes = 256 * 1024\r\n): Promise<Uint8Array> {\r\n if (typeof input === \"string\") {\r\n const encoded = new TextEncoder().encode(input);\r\n return encoded.length > maxBytes ? encoded.slice(0, maxBytes) : encoded;\r\n }\r\n\r\n if (input instanceof Uint8Array) {\r\n return input.length > maxBytes ? input.slice(0, maxBytes) : input;\r\n }\r\n\r\n if (input instanceof ArrayBuffer) {\r\n const bytes = new Uint8Array(input);\r\n return bytes.length > maxBytes ? bytes.slice(0, maxBytes) : bytes;\r\n }\r\n\r\n if (isReadableStream(input)) {\r\n const reader = input.getReader();\r\n const chunks: Uint8Array[] = [];\r\n let total = 0;\r\n\r\n while (total < maxBytes) {\r\n const { value, done } = await reader.read();\r\n if (done || !value) break;\r\n const slice = total + value.length > maxBytes\r\n ? value.slice(0, maxBytes - total)\r\n : value;\r\n chunks.push(slice);\r\n total += slice.length;\r\n }\r\n\r\n if (total >= maxBytes) {\r\n await reader.cancel();\r\n }\r\n\r\n return concatChunks(chunks, total);\r\n }\r\n\r\n const chunks: Uint8Array[] = [];\r\n let total = 0;\r\n\r\n for await (const chunk of input as AsyncIterable<Uint8Array>) {\r\n if (total >= maxBytes) {\r\n break;\r\n }\r\n const data = chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk);\r\n const slice = total + data.length > maxBytes\r\n ? data.slice(0, maxBytes - total)\r\n : data;\r\n chunks.push(slice);\r\n total += slice.length;\r\n }\r\n\r\n return concatChunks(chunks, total);\r\n}\r\n\r\nfunction concatChunks(chunks: Uint8Array[], total: number): Uint8Array {\r\n const result = new Uint8Array(total);\r\n let offset = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return result;\r\n}\r\n\r\nfunction isReadableStream(\r\n input: DetectInput\r\n): input is ReadableStream<Uint8Array> {\r\n return typeof (input as ReadableStream<Uint8Array>)?.getReader === \"function\";\r\n}\r\n\r\nasync function loadDetectionWasm(debug: boolean): Promise<WasmModule> {\r\n const wasmModule = await loadWasmModule();\r\n if (typeof wasmModule.default === \"function\") {\r\n await (wasmModule.default as () => Promise<void>)();\r\n }\r\n wasmModule.init(debug);\r\n return wasmModule;\r\n}\r\n\r\nexport async function detectFormat(\r\n input: DetectInput,\r\n opts: DetectOptions = {}\r\n): Promise<Format | \"unknown\"> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n const sample = await readSample(input, opts.maxBytes);\r\n const format = wasmModule.detectFormat?.(sample);\r\n return (format as Format) ?? \"unknown\";\r\n}\r\n\r\nexport async function detectCsvFieldsAndDelimiter(\r\n input: DetectInput,\r\n opts: DetectOptions = {}\r\n): Promise<CsvDetection | null> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n const sample = await readSample(input, opts.maxBytes);\r\n const result = wasmModule.detectCsvFields?.(sample);\r\n return result ?? null;\r\n}\r\n\r\n// Web Streams TransformStream adapter\r\nexport class ConvertBuddyTransformStream extends TransformStream<Uint8Array, Uint8Array> {\r\n constructor(opts: ConvertBuddyOptions = {}) {\r\n let buddy: ConvertBuddy | null = null;\r\n\r\n super({\r\n async start(controller) {\r\n buddy = await ConvertBuddy.create(opts);\r\n },\r\n\r\n transform(chunk, controller) {\r\n if (!buddy) {\r\n throw new Error(\"ConvertBuddy not initialized\");\r\n }\r\n\r\n const output = buddy.push(chunk);\r\n if (output.length > 0) {\r\n controller.enqueue(output);\r\n }\r\n },\r\n\r\n flush(controller) {\r\n if (!buddy) {\r\n return;\r\n }\r\n\r\n const output = buddy.finish();\r\n if (output.length > 0) {\r\n controller.enqueue(output);\r\n }\r\n\r\n if (opts.profile) {\r\n const stats = buddy.stats();\r\n console.log(\"[convert-buddy] Performance Stats:\", stats);\r\n }\r\n },\r\n });\r\n }\r\n}\r\n\r\n// Utility: Convert entire buffer/string\r\nexport async function convert(\r\n input: Uint8Array | string,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Uint8Array> {\r\n const buddy = await ConvertBuddy.create(opts);\r\n\r\n const inputBytes = typeof input === \"string\" \r\n ? new TextEncoder().encode(input)\r\n : input;\r\n\r\n const output = buddy.push(inputBytes);\r\n const final = buddy.finish();\r\n\r\n // Combine outputs\r\n const result = new Uint8Array(output.length + final.length);\r\n result.set(output, 0);\r\n result.set(final, output.length);\r\n\r\n if (opts.profile) {\r\n const stats = buddy.stats();\r\n console.log(\"[convert-buddy] Performance Stats:\", stats);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// Utility: Convert and return as string\r\nexport async function convertToString(\r\n input: Uint8Array | string,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<string> {\r\n const result = await convert(input, opts);\r\n return new TextDecoder().decode(result);\r\n}\r\n"],"mappings":"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","names":["require","mod","chunks","total"]}