convert-buddy-js 0.9.5 → 0.9.6
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/README.md +325 -55
- package/dist/src/browser.d.ts +103 -3
- package/dist/src/browser.js +66 -2
- package/dist/src/browser.js.map +1 -1
- package/dist/src/index.d.ts +112 -2
- package/dist/src/index.js +350 -23
- package/dist/src/index.js.map +1 -1
- package/dist/src/node.d.ts +30 -3
- package/dist/src/node.js +15 -1
- package/dist/src/node.js.map +1 -1
- package/dist/wasm/nodejs/convert_buddy.d.ts +9 -5
- package/dist/wasm/nodejs/convert_buddy.js +28 -19
- package/dist/wasm/nodejs/convert_buddy_bg.wasm +0 -0
- package/dist/wasm/nodejs/convert_buddy_bg.wasm.d.ts +1 -0
- package/dist/wasm/web/convert_buddy.d.ts +10 -5
- package/dist/wasm/web/convert_buddy.js +28 -19
- package/dist/wasm/web/convert_buddy_bg.wasm +0 -0
- package/dist/wasm/web/convert_buddy_bg.wasm.d.ts +1 -0
- package/package.json +1 -1
package/dist/src/index.js.map
CHANGED
|
@@ -1 +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 recordElement?: string;\r\n};\r\n\r\nexport type DetectOptions = {\r\n maxBytes?: number;\r\n debug?: boolean;\r\n};\r\n\r\nexport type ProgressCallback = (stats: Stats) => void;\r\n\r\nexport type ConvertBuddyOptions = {\r\n debug?: boolean;\r\n profile?: boolean;\r\n inputFormat?: Format | \"auto\";\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 onProgress?: ProgressCallback;\r\n progressIntervalBytes?: number; // Trigger progress callback every N bytes (default: 1MB)\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 private aborted: boolean = false;\r\n private paused: boolean = false;\r\n private onProgress?: ProgressCallback;\r\n private progressIntervalBytes: number;\r\n private lastProgressBytes: number = 0;\r\n\r\n private constructor(converter: any, debug: boolean, profile: boolean, opts: ConvertBuddyOptions = {}) {\r\n this.converter = converter;\r\n this.debug = debug;\r\n this.profile = profile;\r\n this.onProgress = opts.onProgress;\r\n this.progressIntervalBytes = opts.progressIntervalBytes || 1024 * 1024; // 1MB default\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 // Handle auto-detection\r\n let inputFormat = opts.inputFormat;\r\n let csvConfig = opts.csvConfig;\r\n\r\n // We can't auto-detect without data, so we'll defer this to push()\r\n // For now, just validate the format if it's not \"auto\"\r\n if (inputFormat === \"auto\") {\r\n // Auto-detection will be handled on first push()\r\n inputFormat = undefined;\r\n }\r\n\r\n let converter;\r\n if (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 inputFormat,\r\n opts.outputFormat,\r\n opts.chunkTargetBytes || 1024 * 1024,\r\n profile,\r\n csvConfig || null,\r\n opts.xmlConfig || null\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, opts);\r\n }\r\n\r\n push(chunk: Uint8Array): Uint8Array {\r\n if (this.aborted) {\r\n throw new Error(\"Conversion has been aborted\");\r\n }\r\n\r\n if (this.paused) {\r\n throw new Error(\"Conversion is paused. Call resume() before pushing more data.\");\r\n }\r\n\r\n if (this.debug) console.log(\"[convert-buddy-js] push\", chunk.byteLength);\r\n const output = this.converter.push(chunk);\r\n\r\n // Check if we should trigger progress callback\r\n if (this.onProgress) {\r\n const stats = this.stats();\r\n if (stats.bytesIn - this.lastProgressBytes >= this.progressIntervalBytes) {\r\n this.onProgress(stats);\r\n this.lastProgressBytes = stats.bytesIn;\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n finish(): Uint8Array {\r\n if (this.aborted) {\r\n throw new Error(\"Conversion has been aborted\");\r\n }\r\n\r\n if (this.debug) console.log(\"[convert-buddy-js] finish\");\r\n const output = this.converter.finish();\r\n\r\n // Final progress callback\r\n if (this.onProgress) {\r\n this.onProgress(this.stats());\r\n }\r\n\r\n return output;\r\n }\r\n\r\n stats(): Stats {\r\n return this.converter.getStats();\r\n }\r\n\r\n abort(): void {\r\n this.aborted = true;\r\n if (this.debug) console.log(\"[convert-buddy-js] aborted\");\r\n }\r\n\r\n pause(): void {\r\n this.paused = true;\r\n if (this.debug) console.log(\"[convert-buddy-js] paused\");\r\n }\r\n\r\n resume(): void {\r\n this.paused = false;\r\n if (this.debug) console.log(\"[convert-buddy-js] resumed\");\r\n }\r\n\r\n isAborted(): boolean {\r\n return this.aborted;\r\n }\r\n\r\n isPaused(): boolean {\r\n return this.paused;\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// Helper to auto-detect format and CSV configuration from sample data\r\nexport async function autoDetectConfig(\r\n sample: Uint8Array,\r\n opts: { debug?: boolean } = {}\r\n): Promise<{ \r\n format: Format | \"unknown\"; \r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n}> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n \r\n const format = (wasmModule.detectFormat?.(sample) as Format) ?? \"unknown\";\r\n \r\n const result: { format: Format | \"unknown\"; csvConfig?: CsvConfig; xmlConfig?: XmlConfig } = { format };\r\n \r\n if (format === \"csv\") {\r\n const csvDetection = wasmModule.detectCsvFields?.(sample);\r\n if (csvDetection) {\r\n result.csvConfig = {\r\n delimiter: csvDetection.delimiter,\r\n hasHeaders: csvDetection.fields.length > 0,\r\n };\r\n }\r\n } else if (format === \"xml\") {\r\n const xmlDetection = wasmModule.detectXmlElements?.(sample);\r\n if (xmlDetection?.recordElement) {\r\n result.xmlConfig = {\r\n recordElement: xmlDetection.recordElement,\r\n };\r\n }\r\n }\r\n \r\n return result;\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
|
+
{"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 recordElement?: string;\r\n};\r\n\r\nexport type DetectOptions = {\r\n maxBytes?: number;\r\n debug?: boolean;\r\n};\r\n\r\nexport type ProgressCallback = (stats: Stats) => void;\r\n\r\nexport type ConvertBuddyOptions = {\r\n debug?: boolean;\r\n profile?: boolean;\r\n inputFormat?: Format | \"auto\";\r\n outputFormat?: Format;\r\n chunkTargetBytes?: number;\r\n parallelism?: number; // Node only - number of worker threads\r\n maxMemoryMB?: number; // Memory limit for conversions (future use)\r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n onProgress?: ProgressCallback;\r\n progressIntervalBytes?: number; // Trigger progress callback every N bytes (default: 1MB)\r\n};\r\n\r\nexport type ConvertOptions = {\r\n inputFormat?: Format | \"auto\";\r\n outputFormat: Format;\r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n onProgress?: ProgressCallback;\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 getSimdEnabled?: () => boolean;\r\n __wbg_set_wasm?: (wasm: unknown) => void;\r\n};\r\n\r\nlet wasmModuleInstance: WasmModule | null = null;\r\nlet wasmModuleLoadPromise: Promise<WasmModule> | null = null;\r\n\r\nasync function loadWasmModule(): Promise<WasmModule> {\r\n // Return cached instance if already loaded\r\n if (wasmModuleInstance) {\r\n return wasmModuleInstance;\r\n }\r\n\r\n // If load is in progress, wait for it\r\n if (wasmModuleLoadPromise) {\r\n return wasmModuleLoadPromise;\r\n }\r\n\r\n // Start loading\r\n wasmModuleLoadPromise = (async () => {\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\n try {\r\n wasmModuleInstance = await wasmModuleLoadPromise;\r\n return wasmModuleInstance;\r\n } finally {\r\n wasmModuleLoadPromise = null;\r\n }\r\n}\r\n\r\nlet wasmInitialized = false;\r\nlet wasmInitPromise: Promise<void> | null = null;\r\n\r\nasync function initWasm(debug: boolean): Promise<void> {\r\n // If already initialized, return immediately\r\n if (wasmInitialized) {\r\n return;\r\n }\r\n\r\n // If initialization is in progress, wait for it\r\n if (wasmInitPromise) {\r\n return wasmInitPromise;\r\n }\r\n\r\n // Start initialization\r\n wasmInitPromise = (async () => {\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 wasmInitialized = true;\r\n })();\r\n\r\n try {\r\n await wasmInitPromise;\r\n } finally {\r\n wasmInitPromise = null;\r\n }\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 private aborted: boolean = false;\r\n private paused: boolean = false;\r\n private onProgress?: ProgressCallback;\r\n private progressIntervalBytes: number;\r\n private lastProgressBytes: number = 0;\r\n private globalConfig: ConvertBuddyOptions;\r\n private initialized: boolean = false;\r\n public simd: boolean;\r\n\r\n /**\r\n * Create a new ConvertBuddy instance with global configuration.\r\n * This is useful when you want to set memory limits, debug mode, or other global settings.\r\n * \r\n * @example\r\n * const buddy = new ConvertBuddy({ maxMemoryMB: 512, debug: true });\r\n * const result = await buddy.convert(input, { outputFormat: \"json\" });\r\n */\r\n constructor(opts: ConvertBuddyOptions = {}) {\r\n // Initialize basic properties\r\n this.debug = !!opts.debug;\r\n this.profile = !!opts.profile;\r\n this.simd = false; // Will be set on first convert\r\n this.globalConfig = opts;\r\n this.progressIntervalBytes = opts.progressIntervalBytes || 1024 * 1024;\r\n this.onProgress = opts.onProgress;\r\n this.converter = null; // Will be initialized lazily\r\n this.initialized = false;\r\n }\r\n\r\n /**\r\n * Convert input (string, Buffer, File, URL, etc.) to the desired output format.\r\n * This is the main method for the new simplified API.\r\n * \r\n * @example\r\n * // Auto-detect everything\r\n * const buddy = new ConvertBuddy();\r\n * const result = await buddy.convert(\"https://example.com/data.csv\", { outputFormat: \"json\" });\r\n * \r\n * @example\r\n * // With configuration\r\n * const buddy = new ConvertBuddy({ maxMemoryMB: 512 });\r\n * const result = await buddy.convert(file, { inputFormat: \"csv\", outputFormat: \"json\" });\r\n */\r\n async convert(\r\n input: string | Uint8Array | File | Blob | ReadableStream<Uint8Array>,\r\n opts: ConvertOptions\r\n ): Promise<Uint8Array> {\r\n // Merge global and local options\r\n const mergedOpts: ConvertBuddyOptions = {\r\n ...this.globalConfig,\r\n ...opts,\r\n inputFormat: opts.inputFormat || this.globalConfig.inputFormat || \"auto\",\r\n };\r\n\r\n // Detect input type and convert accordingly\r\n if (typeof input === \"string\") {\r\n // Could be URL or raw data\r\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\r\n // Fetch from URL\r\n return this.convertFromUrl(input, mergedOpts);\r\n } else {\r\n // Treat as raw data\r\n return this.convertFromString(input, mergedOpts);\r\n }\r\n } else if (input instanceof Uint8Array) {\r\n return this.convertFromBuffer(input, mergedOpts);\r\n } else if (typeof File !== \"undefined\" && input instanceof File) {\r\n return this.convertFromFile(input as File, mergedOpts);\r\n } else if (typeof Blob !== \"undefined\" && input instanceof Blob) {\r\n return this.convertFromBlob(input as Blob, mergedOpts);\r\n } else if (typeof ReadableStream !== \"undefined\" && input instanceof ReadableStream) {\r\n return this.convertFromStream(input, mergedOpts);\r\n } else {\r\n throw new Error(\"Unsupported input type\");\r\n }\r\n }\r\n\r\n private async convertFromUrl(url: string, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n const response = await fetch(url);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${url}: ${response.statusText}`);\r\n }\r\n \r\n const stream = response.body;\r\n if (!stream) {\r\n throw new Error(\"Response body is null\");\r\n }\r\n\r\n return this.convertFromStream(stream, opts);\r\n }\r\n\r\n private async convertFromString(input: string, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n const inputBytes = new TextEncoder().encode(input);\r\n return this.convertFromBuffer(inputBytes, opts);\r\n }\r\n\r\n private async convertFromBuffer(input: Uint8Array, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const detected = await autoDetectConfig(input, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n\r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const output = buddy.push(input);\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 private async convertFromFile(file: File, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n return this.convertFromBlob(file, opts);\r\n }\r\n\r\n private async convertFromBlob(blob: Blob, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const sampleSize = 256 * 1024; // 256KB\r\n const sampleBlob = blob.slice(0, sampleSize);\r\n const sampleBuffer = await sampleBlob.arrayBuffer();\r\n const sample = new Uint8Array(sampleBuffer as ArrayBuffer);\r\n \r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n\r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n \r\n // Read blob as stream and process\r\n const stream = blob.stream();\r\n const reader = stream.getReader();\r\n \r\n const outputs: Uint8Array[] = [];\r\n \r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n \r\n const output = buddy.push(value);\r\n if (output.length > 0) {\r\n outputs.push(output);\r\n }\r\n }\r\n \r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n outputs.push(final);\r\n }\r\n \r\n // Combine all outputs\r\n const totalLength = outputs.reduce((sum, arr) => sum + arr.length, 0);\r\n const result = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const output of outputs) {\r\n result.set(output, offset);\r\n offset += output.length;\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 return result;\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n private async convertFromStream(stream: ReadableStream<Uint8Array>, opts: ConvertBuddyOptions): Promise<Uint8Array> {\r\n // Handle auto-detection by reading a sample first\r\n let actualOpts = { ...opts };\r\n let firstChunks: Uint8Array[] = [];\r\n let totalSampleBytes = 0;\r\n const maxSampleSize = 256 * 1024; // 256KB\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const reader = stream.getReader();\r\n \r\n try {\r\n while (totalSampleBytes < maxSampleSize) {\r\n const { done, value } = await reader.read();\r\n if (done || !value) break;\r\n \r\n firstChunks.push(value);\r\n totalSampleBytes += value.length;\r\n }\r\n \r\n // Concatenate sample\r\n const sample = new Uint8Array(totalSampleBytes);\r\n let offset = 0;\r\n for (const chunk of firstChunks) {\r\n sample.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n \r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n \r\n // Process buffered chunks from auto-detection\r\n const outputs: Uint8Array[] = [];\r\n for (const chunk of firstChunks) {\r\n const output = buddy.push(chunk);\r\n if (output.length > 0) {\r\n outputs.push(output);\r\n }\r\n }\r\n \r\n // Continue with the rest of the stream\r\n const reader = stream.getReader();\r\n \r\n try {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n \r\n const output = buddy.push(value);\r\n if (output.length > 0) {\r\n outputs.push(output);\r\n }\r\n }\r\n \r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n outputs.push(final);\r\n }\r\n \r\n // Combine all outputs\r\n const totalLength = outputs.reduce((sum, arr) => sum + arr.length, 0);\r\n const result = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const output of outputs) {\r\n result.set(output, offset);\r\n offset += output.length;\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 return result;\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n }\r\n\r\n /**\r\n * Legacy create method for backward compatibility.\r\n * Prefer using the constructor: new ConvertBuddy(opts)\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 // Initialize WASM once (singleton)\r\n await initWasm(debug);\r\n\r\n const wasmModule = await loadWasmModule();\r\n\r\n // Handle auto-detection\r\n let inputFormat = opts.inputFormat;\r\n let csvConfig = opts.csvConfig;\r\n\r\n // We can't auto-detect without data, so we'll defer this to push()\r\n // For now, just validate the format if it's not \"auto\"\r\n if (inputFormat === \"auto\") {\r\n // Auto-detection will be handled on first push()\r\n inputFormat = undefined;\r\n }\r\n\r\n // Optimize chunk size for better WASM performance\r\n // Larger chunks reduce boundary crossing overhead\r\n // Default: 512KB (was 1MB), but can be customized\r\n const chunkTargetBytes = opts.chunkTargetBytes || (512 * 1024);\r\n\r\n let converter;\r\n if (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 inputFormat,\r\n opts.outputFormat,\r\n chunkTargetBytes,\r\n profile,\r\n csvConfig || null,\r\n opts.xmlConfig || null\r\n );\r\n } else {\r\n converter = new wasmModule.Converter(debug);\r\n }\r\n\r\n // Check if SIMD is enabled\r\n const simdEnabled = (wasmModule as any).getSimdEnabled?.() ?? false;\r\n\r\n if (debug) console.log(\"[convert-buddy-js] initialized with chunkTargetBytes:\", chunkTargetBytes, \"simd:\", simdEnabled, opts);\r\n \r\n // Create instance using constructor and set internal properties\r\n const instance = new ConvertBuddy(opts);\r\n instance.converter = converter;\r\n instance.simd = simdEnabled;\r\n instance.initialized = true;\r\n \r\n return instance;\r\n }\r\n\r\n push(chunk: Uint8Array): Uint8Array {\r\n if (this.aborted) {\r\n throw new Error(\"Conversion has been aborted\");\r\n }\r\n\r\n if (this.paused) {\r\n throw new Error(\"Conversion is paused. Call resume() before pushing more data.\");\r\n }\r\n\r\n if (this.debug) console.log(\"[convert-buddy-js] push\", chunk.byteLength);\r\n const output = this.converter.push(chunk);\r\n\r\n // Check if we should trigger progress callback\r\n if (this.onProgress) {\r\n const stats = this.stats();\r\n if (stats.bytesIn - this.lastProgressBytes >= this.progressIntervalBytes) {\r\n this.onProgress(stats);\r\n this.lastProgressBytes = stats.bytesIn;\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n finish(): Uint8Array {\r\n if (this.aborted) {\r\n throw new Error(\"Conversion has been aborted\");\r\n }\r\n\r\n if (this.debug) console.log(\"[convert-buddy-js] finish\");\r\n const output = this.converter.finish();\r\n\r\n // Final progress callback\r\n if (this.onProgress) {\r\n this.onProgress(this.stats());\r\n }\r\n\r\n return output;\r\n }\r\n\r\n stats(): Stats {\r\n return this.converter.getStats();\r\n }\r\n\r\n abort(): void {\r\n this.aborted = true;\r\n if (this.debug) console.log(\"[convert-buddy-js] aborted\");\r\n }\r\n\r\n pause(): void {\r\n this.paused = true;\r\n if (this.debug) console.log(\"[convert-buddy-js] paused\");\r\n }\r\n\r\n resume(): void {\r\n this.paused = false;\r\n if (this.debug) console.log(\"[convert-buddy-js] resumed\");\r\n }\r\n\r\n isAborted(): boolean {\r\n return this.aborted;\r\n }\r\n\r\n isPaused(): boolean {\r\n return this.paused;\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 as ArrayBuffer);\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// Helper to auto-detect format and CSV configuration from sample data\r\nexport async function autoDetectConfig(\r\n sample: Uint8Array,\r\n opts: { debug?: boolean } = {}\r\n): Promise<{ \r\n format: Format | \"unknown\"; \r\n csvConfig?: CsvConfig;\r\n xmlConfig?: XmlConfig;\r\n}> {\r\n const wasmModule = await loadDetectionWasm(!!opts.debug);\r\n \r\n const format = (wasmModule.detectFormat?.(sample) as Format) ?? \"unknown\";\r\n \r\n const result: { format: Format | \"unknown\"; csvConfig?: CsvConfig; xmlConfig?: XmlConfig } = { format };\r\n \r\n if (format === \"csv\") {\r\n const csvDetection = wasmModule.detectCsvFields?.(sample);\r\n if (csvDetection) {\r\n result.csvConfig = {\r\n delimiter: csvDetection.delimiter,\r\n hasHeaders: csvDetection.fields.length > 0,\r\n };\r\n }\r\n } else if (format === \"xml\") {\r\n const xmlDetection = wasmModule.detectXmlElements?.(sample);\r\n if (xmlDetection?.recordElement) {\r\n result.xmlConfig = {\r\n recordElement: xmlDetection.recordElement,\r\n };\r\n }\r\n }\r\n \r\n return result;\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\r\n/**\r\n * Ultra-simple standalone convert function with auto-detection.\r\n * Accepts any input type (URL, File, Buffer, string, stream) and automatically detects format.\r\n * \r\n * @example\r\n * // From URL\r\n * import { convertAny } from \"convert-buddy-js\";\r\n * const result = await convertAny(\"https://example.com/data.csv\", { outputFormat: \"json\" });\r\n * \r\n * @example\r\n * // From File (browser)\r\n * const file = fileInput.files[0];\r\n * const result = await convertAny(file, { outputFormat: \"ndjson\" });\r\n * \r\n * @example\r\n * // From string data\r\n * const result = await convertAny('{\"name\":\"Ada\"}', { outputFormat: \"csv\" });\r\n */\r\nexport async function convertAny(\r\n input: string | Uint8Array | File | Blob | ReadableStream<Uint8Array>,\r\n opts: ConvertOptions\r\n): Promise<Uint8Array> {\r\n const buddy = new ConvertBuddy();\r\n return buddy.convert(input, opts);\r\n}\r\n\r\n/**\r\n * Ultra-simple standalone convert function that returns a string.\r\n * Same as convertAny but decodes the output to a string.\r\n * \r\n * @example\r\n * import { convertAnyToString } from \"convert-buddy-js\";\r\n * const json = await convertAnyToString(\"https://example.com/data.csv\", { outputFormat: \"json\" });\r\n * console.log(JSON.parse(json));\r\n */\r\nexport async function convertAnyToString(\r\n input: string | Uint8Array | File | Blob | ReadableStream<Uint8Array>,\r\n opts: ConvertOptions\r\n): Promise<string> {\r\n const result = await convertAny(input, opts);\r\n return new TextDecoder().decode(result);\r\n}\r\n\r\n// ===== Helper Functions =====\r\n// File format utilities for common use cases\r\n\r\n/**\r\n * Get MIME type for a given format\r\n * \r\n * @example\r\n * const mimeType = getMimeType(\"json\"); // \"application/json\"\r\n */\r\nexport function getMimeType(format: Format): string {\r\n switch (format) {\r\n case \"json\":\r\n return \"application/json\";\r\n case \"ndjson\":\r\n return \"application/x-ndjson\";\r\n case \"csv\":\r\n return \"text/csv\";\r\n case \"xml\":\r\n return \"application/xml\";\r\n }\r\n}\r\n\r\n/**\r\n * Get file extension for a given format (without the dot)\r\n * \r\n * @example\r\n * const ext = getExtension(\"json\"); // \"json\"\r\n */\r\nexport function getExtension(format: Format): string {\r\n return format;\r\n}\r\n\r\n/**\r\n * Get suggested filename for a converted file\r\n * \r\n * @param originalName - Original filename\r\n * @param outputFormat - Target format\r\n * @param includeTimestamp - Whether to include a timestamp (default: false)\r\n * \r\n * @example\r\n * const name = getSuggestedFilename(\"data.csv\", \"json\"); // \"data.json\"\r\n * const name = getSuggestedFilename(\"data.csv\", \"json\", true); // \"data_converted_1234567890.json\"\r\n */\r\nexport function getSuggestedFilename(\r\n originalName: string,\r\n outputFormat: Format,\r\n includeTimestamp = false\r\n): string {\r\n const baseName = originalName.replace(/\\.[^/.]+$/, \"\");\r\n const extension = getExtension(outputFormat);\r\n \r\n if (includeTimestamp) {\r\n return `${baseName}_converted_${Date.now()}.${extension}`;\r\n }\r\n \r\n return `${baseName}.${extension}`;\r\n}\r\n\r\n/**\r\n * Get File System Access API file type configuration for showSaveFilePicker\r\n * \r\n * @example\r\n * const types = getFileTypeConfig(\"json\");\r\n * const handle = await showSaveFilePicker({ types });\r\n */\r\nexport function getFileTypeConfig(format: Format): Array<{\r\n description: string;\r\n accept: Record<string, string[]>;\r\n}> {\r\n const mimeType = getMimeType(format);\r\n const extension = `.${getExtension(format)}`;\r\n \r\n return [\r\n {\r\n description: `${format.toUpperCase()} Files`,\r\n accept: { [mimeType]: [extension] },\r\n },\r\n ];\r\n}"],"mappings":"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","names":["require","mod","reader","chunks","total"]}
|
package/dist/src/node.d.ts
CHANGED
|
@@ -1,8 +1,35 @@
|
|
|
1
1
|
import { Transform } from 'node:stream';
|
|
2
2
|
import { PathLike } from 'node:fs';
|
|
3
|
-
import { ConvertBuddyOptions } from './index.js';
|
|
4
|
-
export { ConvertBuddy, ConvertBuddyTransformStream, CsvConfig, CsvDetection, DetectInput, DetectOptions, Format, ProgressCallback, Stats, XmlConfig, XmlDetection, autoDetectConfig,
|
|
3
|
+
import { ConvertOptions, ConvertBuddyOptions } from './index.js';
|
|
4
|
+
export { ConvertBuddy, ConvertBuddyTransformStream, CsvConfig, CsvDetection, DetectInput, DetectOptions, Format, ProgressCallback, Stats, XmlConfig, XmlDetection, autoDetectConfig, convertAny, convertAnyToString, detectCsvFieldsAndDelimiter, detectFormat, detectXmlElements, getExtension, getFileTypeConfig, getMimeType, getSuggestedFilename } from './index.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Ultra-simple convert function for Node.js.
|
|
8
|
+
* Auto-detects input type (file path, URL, Buffer, etc.) and format.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // From file path
|
|
12
|
+
* import { convert } from "convert-buddy-js/node";
|
|
13
|
+
* const result = await convert("data.csv", { outputFormat: "json" });
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // From URL
|
|
17
|
+
* const result = await convert("https://example.com/data.csv", { outputFormat: "json" });
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // From Buffer
|
|
21
|
+
* const result = await convert(buffer, { outputFormat: "json" });
|
|
22
|
+
*/
|
|
23
|
+
declare function convert(input: string | Uint8Array | PathLike | ReadableStream<Uint8Array>, opts: ConvertOptions): Promise<Uint8Array>;
|
|
24
|
+
/**
|
|
25
|
+
* Ultra-simple convert function that returns a string.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* import { convertToString } from "convert-buddy-js/node";
|
|
29
|
+
* const json = await convertToString("data.csv", { outputFormat: "json" });
|
|
30
|
+
* console.log(JSON.parse(json));
|
|
31
|
+
*/
|
|
32
|
+
declare function convertToString(input: string | Uint8Array | PathLike | ReadableStream<Uint8Array>, opts: ConvertOptions): Promise<string>;
|
|
6
33
|
declare function createNodeTransform(opts?: ConvertBuddyOptions): Promise<Transform>;
|
|
7
34
|
/**
|
|
8
35
|
* Convert a file from one format to another and return as a string.
|
|
@@ -85,4 +112,4 @@ declare function convertStream(inputStream: NodeJS.ReadableStream, opts?: Conver
|
|
|
85
112
|
*/
|
|
86
113
|
declare function convertBuffer(input: Buffer, opts?: ConvertBuddyOptions): Promise<Buffer>;
|
|
87
114
|
|
|
88
|
-
export { ConvertBuddyOptions, convertBuffer, convertFileToBuffer, convertFileToFile, convertFileToString, convertStream, createNodeTransform };
|
|
115
|
+
export { ConvertBuddyOptions, ConvertOptions, convert, convertBuffer, convertFileToBuffer, convertFileToFile, convertFileToString, convertStream, convertToString, createNodeTransform };
|
package/dist/src/node.js
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import { ConvertBuddy, autoDetectConfig } from "./index.js";
|
|
1
|
+
import { ConvertBuddy, autoDetectConfig, convertAny as convertAnyCore } from "./index.js";
|
|
2
2
|
export * from "./index.js";
|
|
3
|
+
async function convert(input, opts) {
|
|
4
|
+
if (typeof input === "string" && !input.startsWith("http://") && !input.startsWith("https://")) {
|
|
5
|
+
return convertFileToBuffer(input, { ...opts, inputFormat: opts.inputFormat || "auto" });
|
|
6
|
+
} else if (typeof input !== "string" && typeof input !== "undefined" && !(input instanceof Uint8Array) && !(input instanceof ReadableStream)) {
|
|
7
|
+
return convertFileToBuffer(input, { ...opts, inputFormat: opts.inputFormat || "auto" });
|
|
8
|
+
}
|
|
9
|
+
return convertAnyCore(input, opts);
|
|
10
|
+
}
|
|
11
|
+
async function convertToString(input, opts) {
|
|
12
|
+
const result = await convert(input, opts);
|
|
13
|
+
return new TextDecoder().decode(result);
|
|
14
|
+
}
|
|
3
15
|
async function loadNodeTransform() {
|
|
4
16
|
const isNode = typeof process !== "undefined" && !!process.versions?.node;
|
|
5
17
|
if (!isNode) {
|
|
@@ -317,11 +329,13 @@ async function convertBuffer(input, opts = {}) {
|
|
|
317
329
|
return Buffer.concat([Buffer.from(output), Buffer.from(final)]);
|
|
318
330
|
}
|
|
319
331
|
export {
|
|
332
|
+
convert,
|
|
320
333
|
convertBuffer,
|
|
321
334
|
convertFileToBuffer,
|
|
322
335
|
convertFileToFile,
|
|
323
336
|
convertFileToString,
|
|
324
337
|
convertStream,
|
|
338
|
+
convertToString,
|
|
325
339
|
createNodeTransform
|
|
326
340
|
};
|
|
327
341
|
//# sourceMappingURL=node.js.map
|
package/dist/src/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/node.ts"],"sourcesContent":["import type { Transform as NodeTransform } from \"node:stream\";\r\nimport type { PathLike } from \"node:fs\";\r\n\r\nimport { ConvertBuddy, type ConvertBuddyOptions, type Format, autoDetectConfig } from \"./index.js\";\r\n\r\nexport * from \"./index.js\";\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\r\n/**\r\n * Convert a file from one format to another and return as a string.\r\n * Handles file reading and streaming internally.\r\n * \r\n * @example\r\n * // Basic conversion\r\n * const result = await convertFileToString(\"input.csv\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * \r\n * @example\r\n * // With auto-detection\r\n * const result = await convertFileToString(\"data.csv\", {\r\n * inputFormat: \"auto\",\r\n * outputFormat: \"ndjson\",\r\n * onProgress: (stats) => {\r\n * console.log(`Processed ${stats.recordsProcessed} records`);\r\n * }\r\n * });\r\n */\r\nexport async function convertFileToString(\r\n inputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<string> {\r\n const bytes = await convertFileToBuffer(inputPath, opts);\r\n return bytes.toString(\"utf-8\");\r\n}\r\n\r\n/**\r\n * Convert a file from one format to another and return as a Buffer.\r\n * Handles file reading and streaming internally.\r\n * \r\n * @example\r\n * const buffer = await convertFileToBuffer(\"input.csv\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * console.log(buffer.toString());\r\n */\r\nexport async function convertFileToBuffer(\r\n inputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n const fs = await import(\"node:fs\");\r\n const path = await import(\"node:path\");\r\n \r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n // Read a sample for auto-detection\r\n const sampleSize = 256 * 1024; // 256KB\r\n const fileHandle = await fs.promises.open(inputPath, \"r\");\r\n const buffer = Buffer.allocUnsafe(sampleSize);\r\n const { bytesRead } = await fileHandle.read(buffer, 0, sampleSize, 0);\r\n await fileHandle.close();\r\n \r\n const sample = new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const readStream = fs.createReadStream(inputPath, { highWaterMark: 64 * 1024 });\r\n \r\n const chunks: Buffer[] = [];\r\n \r\n return new Promise((resolve, reject) => {\r\n readStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n readStream.destroy();\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n readStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n chunks.push(Buffer.from(final));\r\n }\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n resolve(Buffer.concat(chunks));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"error\", reject);\r\n });\r\n}\r\n\r\n/**\r\n * Convert a file from one format to another and write to an output file.\r\n * Handles file reading, conversion, and writing with streaming.\r\n * \r\n * @example\r\n * await convertFileToFile(\"input.csv\", \"output.json\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * \r\n * @example\r\n * // With progress tracking\r\n * await convertFileToFile(\"large-data.csv\", \"output.ndjson\", {\r\n * inputFormat: \"auto\",\r\n * outputFormat: \"ndjson\",\r\n * onProgress: (stats) => {\r\n * const percent = (stats.bytesIn / totalSize * 100).toFixed(1);\r\n * console.log(`Progress: ${percent}%`);\r\n * }\r\n * });\r\n */\r\nexport async function convertFileToFile(\r\n inputPath: PathLike,\r\n outputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<void> {\r\n const fs = await import(\"node:fs\");\r\n \r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const sampleSize = 256 * 1024;\r\n const fileHandle = await fs.promises.open(inputPath, \"r\");\r\n const buffer = Buffer.allocUnsafe(sampleSize);\r\n const { bytesRead } = await fileHandle.read(buffer, 0, sampleSize, 0);\r\n await fileHandle.close();\r\n \r\n const sample = new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const readStream = fs.createReadStream(inputPath, { highWaterMark: 64 * 1024 });\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n return new Promise((resolve, reject) => {\r\n readStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n readStream.destroy();\r\n writeStream.destroy();\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n writeStream.write(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n readStream.destroy();\r\n writeStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n writeStream.write(Buffer.from(final));\r\n }\r\n \r\n writeStream.end();\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n } catch (error) {\r\n writeStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n writeStream.on(\"finish\", () => resolve());\r\n writeStream.on(\"error\", reject);\r\n readStream.on(\"error\", reject);\r\n });\r\n}\r\n\r\n/**\r\n * Convert data from a Node.js Readable stream.\r\n * Useful for processing data from HTTP requests, stdin, or other stream sources.\r\n * \r\n * @example\r\n * import { createReadStream } from 'fs';\r\n * const stream = createReadStream('input.csv');\r\n * const result = await convertStream(stream, {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n */\r\nexport async function convertStream(\r\n inputStream: NodeJS.ReadableStream,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n // Handle auto-detection by buffering initial chunk\r\n let actualOpts = { ...opts };\r\n let firstChunk: Buffer | null = null;\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n // We need to peek at the first chunk for detection\r\n const sampleSize = 256 * 1024;\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n \r\n await new Promise<void>((resolve, reject) => {\r\n const onData = (chunk: Buffer) => {\r\n chunks.push(chunk);\r\n totalSize += chunk.length;\r\n \r\n if (totalSize >= sampleSize) {\r\n inputStream.removeListener(\"data\", onData);\r\n if ('pause' in inputStream && typeof inputStream.pause === 'function') {\r\n inputStream.pause();\r\n }\r\n resolve();\r\n }\r\n };\r\n \r\n const onEnd = () => {\r\n inputStream.removeListener(\"data\", onData);\r\n resolve();\r\n };\r\n \r\n inputStream.on(\"data\", onData);\r\n inputStream.once(\"end\", onEnd);\r\n inputStream.once(\"error\", reject);\r\n });\r\n \r\n const sample = Buffer.concat(chunks).slice(0, sampleSize);\r\n const detected = await autoDetectConfig(new Uint8Array(sample), { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format.\");\r\n }\r\n \r\n // Store the buffered data to process it first\r\n firstChunk = Buffer.concat(chunks);\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const chunks: Buffer[] = [];\r\n \r\n return new Promise((resolve, reject) => {\r\n // Process the buffered first chunk if we did auto-detection\r\n if (firstChunk) {\r\n try {\r\n const output = buddy.push(new Uint8Array(firstChunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n return reject(error);\r\n }\r\n }\r\n \r\n inputStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n if ('destroy' in inputStream && typeof inputStream.destroy === 'function') {\r\n inputStream.destroy();\r\n }\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n if ('destroy' in inputStream && typeof inputStream.destroy === 'function') {\r\n inputStream.destroy();\r\n }\r\n reject(error);\r\n }\r\n });\r\n \r\n inputStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n chunks.push(Buffer.from(final));\r\n }\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n resolve(Buffer.concat(chunks));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n \r\n inputStream.on(\"error\", reject);\r\n \r\n // Resume if we paused for auto-detection\r\n if (firstChunk && 'resume' in inputStream && typeof inputStream.resume === 'function') {\r\n inputStream.resume();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Convert a Buffer directly (useful when you already have data in memory).\r\n * \r\n * @example\r\n * const buffer = Buffer.from(csvData);\r\n * const result = await convertBuffer(buffer, {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n */\r\nexport async function convertBuffer(\r\n input: Buffer,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const sampleSize = Math.min(256 * 1024, input.length);\r\n const sample = new Uint8Array(input.buffer, input.byteOffset, sampleSize);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const output = buddy.push(new Uint8Array(input));\r\n const final = buddy.finish();\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n return Buffer.concat([Buffer.from(output), Buffer.from(final)]);\r\n}\r\n"],"mappings":"AAGA,SAAS,cAAqD,wBAAwB;AAEtF,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;AAuBA,eAAsB,oBACpB,WACA,OAA4B,CAAC,GACZ;AACjB,QAAM,QAAQ,MAAM,oBAAoB,WAAW,IAAI;AACvD,SAAO,MAAM,SAAS,OAAO;AAC/B;AAaA,eAAsB,oBACpB,WACA,OAA4B,CAAC,GACZ;AACjB,QAAM,KAAK,MAAM,OAAO,SAAS;AACjC,QAAM,OAAO,MAAM,OAAO,WAAW;AAGrC,MAAI,aAAa,EAAE,GAAG,KAAK;AAE3B,MAAI,KAAK,gBAAgB,QAAQ;AAE/B,UAAM,aAAa,MAAM;AACzB,UAAM,aAAa,MAAM,GAAG,SAAS,KAAK,WAAW,GAAG;AACxD,UAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,UAAM,EAAE,UAAU,IAAI,MAAM,WAAW,KAAK,QAAQ,GAAG,YAAY,CAAC;AACpE,UAAM,WAAW,MAAM;AAEvB,UAAM,SAAS,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,SAAS;AACzE,UAAM,WAAW,MAAM,iBAAiB,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;AAErE,QAAI,SAAS,WAAW,WAAW;AACjC,iBAAW,cAAc,SAAS;AAElC,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,KAAK,OAAO;AACd,gBAAQ,IAAI,yCAAyC,SAAS,MAAM;AAAA,MACtE;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,aAAa,OAAO,UAAU;AAClD,QAAM,aAAa,GAAG,iBAAiB,WAAW,EAAE,eAAe,KAAK,KAAK,CAAC;AAE9E,QAAM,SAAmB,CAAC;AAE1B,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,eAAW,GAAG,QAAQ,CAAC,UAAkB;AACvC,UAAI;AACF,YAAI,MAAM,UAAU,GAAG;AACrB,qBAAW,QAAQ;AACnB,iBAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC;AAC/C,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,QACjC;AAAA,MACF,SAAS,OAAO;AACd,mBAAW,QAAQ;AACnB,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,eAAW,GAAG,OAAO,MAAM;AACzB,UAAI;AACF,cAAM,QAAQ,MAAM,OAAO;AAC3B,YAAI,MAAM,SAAS,GAAG;AACpB,iBAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,QAChC;AAEA,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,sCAAsC,MAAM,MAAM,CAAC;AAAA,QACjE;AAEA,gBAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,eAAW,GAAG,SAAS,MAAM;AAAA,EAC/B,CAAC;AACH;AAuBA,eAAsB,kBACpB,WACA,YACA,OAA4B,CAAC,GACd;AACf,QAAM,KAAK,MAAM,OAAO,SAAS;AAGjC,MAAI,aAAa,EAAE,GAAG,KAAK;AAE3B,MAAI,KAAK,gBAAgB,QAAQ;AAC/B,UAAM,aAAa,MAAM;AACzB,UAAM,aAAa,MAAM,GAAG,SAAS,KAAK,WAAW,GAAG;AACxD,UAAM,SAAS,OAAO,YAAY,UAAU;AAC5C,UAAM,EAAE,UAAU,IAAI,MAAM,WAAW,KAAK,QAAQ,GAAG,YAAY,CAAC;AACpE,UAAM,WAAW,MAAM;AAEvB,UAAM,SAAS,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,SAAS;AACzE,UAAM,WAAW,MAAM,iBAAiB,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;AAErE,QAAI,SAAS,WAAW,WAAW;AACjC,iBAAW,cAAc,SAAS;AAElC,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,KAAK,OAAO;AACd,gBAAQ,IAAI,yCAAyC,SAAS,MAAM;AAAA,MACtE;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,aAAa,OAAO,UAAU;AAClD,QAAM,aAAa,GAAG,iBAAiB,WAAW,EAAE,eAAe,KAAK,KAAK,CAAC;AAC9E,QAAM,cAAc,GAAG,kBAAkB,UAAU;AAEnD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,eAAW,GAAG,QAAQ,CAAC,UAAkB;AACvC,UAAI;AACF,YAAI,MAAM,UAAU,GAAG;AACrB,qBAAW,QAAQ;AACnB,sBAAY,QAAQ;AACpB,iBAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC;AAC/C,YAAI,OAAO,SAAS,GAAG;AACrB,sBAAY,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,QACvC;AAAA,MACF,SAAS,OAAO;AACd,mBAAW,QAAQ;AACnB,oBAAY,QAAQ;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,eAAW,GAAG,OAAO,MAAM;AACzB,UAAI;AACF,cAAM,QAAQ,MAAM,OAAO;AAC3B,YAAI,MAAM,SAAS,GAAG;AACpB,sBAAY,MAAM,OAAO,KAAK,KAAK,CAAC;AAAA,QACtC;AAEA,oBAAY,IAAI;AAEhB,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,sCAAsC,MAAM,MAAM,CAAC;AAAA,QACjE;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,QAAQ;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,gBAAY,GAAG,UAAU,MAAM,QAAQ,CAAC;AACxC,gBAAY,GAAG,SAAS,MAAM;AAC9B,eAAW,GAAG,SAAS,MAAM;AAAA,EAC/B,CAAC;AACH;AAcA,eAAsB,cACpB,aACA,OAA4B,CAAC,GACZ;AAEjB,MAAI,aAAa,EAAE,GAAG,KAAK;AAC3B,MAAI,aAA4B;AAEhC,MAAI,KAAK,gBAAgB,QAAQ;AAE/B,UAAM,aAAa,MAAM;AACzB,UAAMA,UAAmB,CAAC;AAC1B,QAAI,YAAY;AAEhB,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,SAAS,CAAC,UAAkB;AAChC,QAAAA,QAAO,KAAK,KAAK;AACjB,qBAAa,MAAM;AAEnB,YAAI,aAAa,YAAY;AAC3B,sBAAY,eAAe,QAAQ,MAAM;AACzC,cAAI,WAAW,eAAe,OAAO,YAAY,UAAU,YAAY;AACrE,wBAAY,MAAM;AAAA,UACpB;AACA,kBAAQ;AAAA,QACV;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM;AAClB,oBAAY,eAAe,QAAQ,MAAM;AACzC,gBAAQ;AAAA,MACV;AAEA,kBAAY,GAAG,QAAQ,MAAM;AAC7B,kBAAY,KAAK,OAAO,KAAK;AAC7B,kBAAY,KAAK,SAAS,MAAM;AAAA,IAClC,CAAC;AAED,UAAM,SAAS,OAAO,OAAOA,OAAM,EAAE,MAAM,GAAG,UAAU;AACxD,UAAM,WAAW,MAAM,iBAAiB,IAAI,WAAW,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;AAErF,QAAI,SAAS,WAAW,WAAW;AACjC,iBAAW,cAAc,SAAS;AAElC,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,KAAK,OAAO;AACd,gBAAQ,IAAI,yCAAyC,SAAS,MAAM;AAAA,MACtE;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAGA,iBAAa,OAAO,OAAOA,OAAM;AAAA,EACnC;AAEA,QAAM,QAAQ,MAAM,aAAa,OAAO,UAAU;AAClD,QAAM,SAAmB,CAAC;AAE1B,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAEtC,QAAI,YAAY;AACd,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACpD,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,QACjC;AAAA,MACF,SAAS,OAAO;AACd,eAAO,OAAO,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,gBAAY,GAAG,QAAQ,CAAC,UAAkB;AACxC,UAAI;AACF,YAAI,MAAM,UAAU,GAAG;AACrB,cAAI,aAAa,eAAe,OAAO,YAAY,YAAY,YAAY;AACzE,wBAAY,QAAQ;AAAA,UACtB;AACA,iBAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC;AAC/C,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,KAAK,OAAO,KAAK,MAAM,CAAC;AAAA,QACjC;AAAA,MACF,SAAS,OAAO;AACd,YAAI,aAAa,eAAe,OAAO,YAAY,YAAY,YAAY;AACzE,sBAAY,QAAQ;AAAA,QACtB;AACA,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,gBAAY,GAAG,OAAO,MAAM;AAC1B,UAAI;AACF,cAAM,QAAQ,MAAM,OAAO;AAC3B,YAAI,MAAM,SAAS,GAAG;AACpB,iBAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,QAChC;AAEA,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,sCAAsC,MAAM,MAAM,CAAC;AAAA,QACjE;AAEA,gBAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,MAC/B,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,gBAAY,GAAG,SAAS,MAAM;AAG9B,QAAI,cAAc,YAAY,eAAe,OAAO,YAAY,WAAW,YAAY;AACrF,kBAAY,OAAO;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAYA,eAAsB,cACpB,OACA,OAA4B,CAAC,GACZ;AAEjB,MAAI,aAAa,EAAE,GAAG,KAAK;AAE3B,MAAI,KAAK,gBAAgB,QAAQ;AAC/B,UAAM,aAAa,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM;AACpD,UAAM,SAAS,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,UAAU;AACxE,UAAM,WAAW,MAAM,iBAAiB,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC;AAErE,QAAI,SAAS,WAAW,WAAW;AACjC,iBAAW,cAAc,SAAS;AAElC,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,KAAK,YAAY,EAAE,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,MAClG;AAEA,UAAI,KAAK,OAAO;AACd,gBAAQ,IAAI,yCAAyC,SAAS,MAAM;AAAA,MACtE;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,aAAa,OAAO,UAAU;AAClD,QAAM,SAAS,MAAM,KAAK,IAAI,WAAW,KAAK,CAAC;AAC/C,QAAM,QAAQ,MAAM,OAAO;AAE3B,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,sCAAsC,MAAM,MAAM,CAAC;AAAA,EACjE;AAEA,SAAO,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AAChE;","names":["chunks"]}
|
|
1
|
+
{"version":3,"sources":["../../src/node.ts"],"sourcesContent":["import type { Transform as NodeTransform } from \"node:stream\";\r\nimport type { PathLike } from \"node:fs\";\r\n\r\nimport { ConvertBuddy, type ConvertBuddyOptions, type ConvertOptions, type Format, autoDetectConfig, convertAny as convertAnyCore, convertAnyToString as convertAnyToStringCore } from \"./index.js\";\r\n\r\nexport * from \"./index.js\";\r\n\r\n/**\r\n * Ultra-simple convert function for Node.js.\r\n * Auto-detects input type (file path, URL, Buffer, etc.) and format.\r\n * \r\n * @example\r\n * // From file path\r\n * import { convert } from \"convert-buddy-js/node\";\r\n * const result = await convert(\"data.csv\", { outputFormat: \"json\" });\r\n * \r\n * @example\r\n * // From URL\r\n * const result = await convert(\"https://example.com/data.csv\", { outputFormat: \"json\" });\r\n * \r\n * @example\r\n * // From Buffer\r\n * const result = await convert(buffer, { outputFormat: \"json\" });\r\n */\r\nexport async function convert(\r\n input: string | Uint8Array | PathLike | ReadableStream<Uint8Array>,\r\n opts: ConvertOptions\r\n): Promise<Uint8Array> {\r\n // If input is a file path (string or PathLike but not URL), read it first\r\n if (typeof input === \"string\" && !input.startsWith(\"http://\") && !input.startsWith(\"https://\")) {\r\n // It's a file path\r\n return convertFileToBuffer(input, { ...opts, inputFormat: opts.inputFormat || \"auto\" });\r\n } else if (typeof input !== \"string\" && typeof input !== \"undefined\" && !(input instanceof Uint8Array) && !(input instanceof ReadableStream)) {\r\n // PathLike object (Buffer, URL object, etc.)\r\n return convertFileToBuffer(input as PathLike, { ...opts, inputFormat: opts.inputFormat || \"auto\" });\r\n }\r\n \r\n return convertAnyCore(input as string | Uint8Array | ReadableStream<Uint8Array>, opts);\r\n}\r\n\r\n/**\r\n * Ultra-simple convert function that returns a string.\r\n * \r\n * @example\r\n * import { convertToString } from \"convert-buddy-js/node\";\r\n * const json = await convertToString(\"data.csv\", { outputFormat: \"json\" });\r\n * console.log(JSON.parse(json));\r\n */\r\nexport async function convertToString(\r\n input: string | Uint8Array | PathLike | ReadableStream<Uint8Array>,\r\n opts: ConvertOptions\r\n): Promise<string> {\r\n const result = await convert(input, opts);\r\n return new TextDecoder().decode(result);\r\n}\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\r\n/**\r\n * Convert a file from one format to another and return as a string.\r\n * Handles file reading and streaming internally.\r\n * \r\n * @example\r\n * // Basic conversion\r\n * const result = await convertFileToString(\"input.csv\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * \r\n * @example\r\n * // With auto-detection\r\n * const result = await convertFileToString(\"data.csv\", {\r\n * inputFormat: \"auto\",\r\n * outputFormat: \"ndjson\",\r\n * onProgress: (stats) => {\r\n * console.log(`Processed ${stats.recordsProcessed} records`);\r\n * }\r\n * });\r\n */\r\nexport async function convertFileToString(\r\n inputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<string> {\r\n const bytes = await convertFileToBuffer(inputPath, opts);\r\n return bytes.toString(\"utf-8\");\r\n}\r\n\r\n/**\r\n * Convert a file from one format to another and return as a Buffer.\r\n * Handles file reading and streaming internally.\r\n * \r\n * @example\r\n * const buffer = await convertFileToBuffer(\"input.csv\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * console.log(buffer.toString());\r\n */\r\nexport async function convertFileToBuffer(\r\n inputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n const fs = await import(\"node:fs\");\r\n const path = await import(\"node:path\");\r\n \r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n // Read a sample for auto-detection\r\n const sampleSize = 256 * 1024; // 256KB\r\n const fileHandle = await fs.promises.open(inputPath, \"r\");\r\n const buffer = Buffer.allocUnsafe(sampleSize);\r\n const { bytesRead } = await fileHandle.read(buffer, 0, sampleSize, 0);\r\n await fileHandle.close();\r\n \r\n const sample = new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const readStream = fs.createReadStream(inputPath, { highWaterMark: 64 * 1024 });\r\n \r\n const chunks: Buffer[] = [];\r\n \r\n return new Promise((resolve, reject) => {\r\n readStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n readStream.destroy();\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n readStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n chunks.push(Buffer.from(final));\r\n }\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n resolve(Buffer.concat(chunks));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"error\", reject);\r\n });\r\n}\r\n\r\n/**\r\n * Convert a file from one format to another and write to an output file.\r\n * Handles file reading, conversion, and writing with streaming.\r\n * \r\n * @example\r\n * await convertFileToFile(\"input.csv\", \"output.json\", {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n * \r\n * @example\r\n * // With progress tracking\r\n * await convertFileToFile(\"large-data.csv\", \"output.ndjson\", {\r\n * inputFormat: \"auto\",\r\n * outputFormat: \"ndjson\",\r\n * onProgress: (stats) => {\r\n * const percent = (stats.bytesIn / totalSize * 100).toFixed(1);\r\n * console.log(`Progress: ${percent}%`);\r\n * }\r\n * });\r\n */\r\nexport async function convertFileToFile(\r\n inputPath: PathLike,\r\n outputPath: PathLike,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<void> {\r\n const fs = await import(\"node:fs\");\r\n \r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const sampleSize = 256 * 1024;\r\n const fileHandle = await fs.promises.open(inputPath, \"r\");\r\n const buffer = Buffer.allocUnsafe(sampleSize);\r\n const { bytesRead } = await fileHandle.read(buffer, 0, sampleSize, 0);\r\n await fileHandle.close();\r\n \r\n const sample = new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format. Please specify inputFormat explicitly.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const readStream = fs.createReadStream(inputPath, { highWaterMark: 64 * 1024 });\r\n const writeStream = fs.createWriteStream(outputPath);\r\n \r\n return new Promise((resolve, reject) => {\r\n readStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n readStream.destroy();\r\n writeStream.destroy();\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n writeStream.write(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n readStream.destroy();\r\n writeStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n readStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n writeStream.write(Buffer.from(final));\r\n }\r\n \r\n writeStream.end();\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n } catch (error) {\r\n writeStream.destroy();\r\n reject(error);\r\n }\r\n });\r\n \r\n writeStream.on(\"finish\", () => resolve());\r\n writeStream.on(\"error\", reject);\r\n readStream.on(\"error\", reject);\r\n });\r\n}\r\n\r\n/**\r\n * Convert data from a Node.js Readable stream.\r\n * Useful for processing data from HTTP requests, stdin, or other stream sources.\r\n * \r\n * @example\r\n * import { createReadStream } from 'fs';\r\n * const stream = createReadStream('input.csv');\r\n * const result = await convertStream(stream, {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n */\r\nexport async function convertStream(\r\n inputStream: NodeJS.ReadableStream,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n // Handle auto-detection by buffering initial chunk\r\n let actualOpts = { ...opts };\r\n let firstChunk: Buffer | null = null;\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n // We need to peek at the first chunk for detection\r\n const sampleSize = 256 * 1024;\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n \r\n await new Promise<void>((resolve, reject) => {\r\n const onData = (chunk: Buffer) => {\r\n chunks.push(chunk);\r\n totalSize += chunk.length;\r\n \r\n if (totalSize >= sampleSize) {\r\n inputStream.removeListener(\"data\", onData);\r\n if ('pause' in inputStream && typeof inputStream.pause === 'function') {\r\n inputStream.pause();\r\n }\r\n resolve();\r\n }\r\n };\r\n \r\n const onEnd = () => {\r\n inputStream.removeListener(\"data\", onData);\r\n resolve();\r\n };\r\n \r\n inputStream.on(\"data\", onData);\r\n inputStream.once(\"end\", onEnd);\r\n inputStream.once(\"error\", reject);\r\n });\r\n \r\n const sample = Buffer.concat(chunks).slice(0, sampleSize);\r\n const detected = await autoDetectConfig(new Uint8Array(sample), { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format.\");\r\n }\r\n \r\n // Store the buffered data to process it first\r\n firstChunk = Buffer.concat(chunks);\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const chunks: Buffer[] = [];\r\n \r\n return new Promise((resolve, reject) => {\r\n // Process the buffered first chunk if we did auto-detection\r\n if (firstChunk) {\r\n try {\r\n const output = buddy.push(new Uint8Array(firstChunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n return reject(error);\r\n }\r\n }\r\n \r\n inputStream.on(\"data\", (chunk: Buffer) => {\r\n try {\r\n if (buddy.isAborted()) {\r\n if ('destroy' in inputStream && typeof inputStream.destroy === 'function') {\r\n inputStream.destroy();\r\n }\r\n reject(new Error(\"Conversion aborted\"));\r\n return;\r\n }\r\n \r\n const output = buddy.push(new Uint8Array(chunk));\r\n if (output.length > 0) {\r\n chunks.push(Buffer.from(output));\r\n }\r\n } catch (error) {\r\n if ('destroy' in inputStream && typeof inputStream.destroy === 'function') {\r\n inputStream.destroy();\r\n }\r\n reject(error);\r\n }\r\n });\r\n \r\n inputStream.on(\"end\", () => {\r\n try {\r\n const final = buddy.finish();\r\n if (final.length > 0) {\r\n chunks.push(Buffer.from(final));\r\n }\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n resolve(Buffer.concat(chunks));\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n \r\n inputStream.on(\"error\", reject);\r\n \r\n // Resume if we paused for auto-detection\r\n if (firstChunk && 'resume' in inputStream && typeof inputStream.resume === 'function') {\r\n inputStream.resume();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Convert a Buffer directly (useful when you already have data in memory).\r\n * \r\n * @example\r\n * const buffer = Buffer.from(csvData);\r\n * const result = await convertBuffer(buffer, {\r\n * inputFormat: \"csv\",\r\n * outputFormat: \"json\"\r\n * });\r\n */\r\nexport async function convertBuffer(\r\n input: Buffer,\r\n opts: ConvertBuddyOptions = {}\r\n): Promise<Buffer> {\r\n // Handle auto-detection\r\n let actualOpts = { ...opts };\r\n \r\n if (opts.inputFormat === \"auto\") {\r\n const sampleSize = Math.min(256 * 1024, input.length);\r\n const sample = new Uint8Array(input.buffer, input.byteOffset, sampleSize);\r\n const detected = await autoDetectConfig(sample, { debug: opts.debug });\r\n \r\n if (detected.format !== \"unknown\") {\r\n actualOpts.inputFormat = detected.format as Format;\r\n \r\n if (detected.csvConfig) {\r\n actualOpts.csvConfig = opts.csvConfig ? { ...detected.csvConfig, ...opts.csvConfig } : detected.csvConfig;\r\n }\r\n \r\n if (detected.xmlConfig) {\r\n actualOpts.xmlConfig = opts.xmlConfig ? { ...detected.xmlConfig, ...opts.xmlConfig } : detected.xmlConfig;\r\n }\r\n \r\n if (opts.debug) {\r\n console.log(\"[convert-buddy] Auto-detected format:\", detected.format);\r\n }\r\n } else {\r\n throw new Error(\"Could not auto-detect input format.\");\r\n }\r\n }\r\n \r\n const buddy = await ConvertBuddy.create(actualOpts);\r\n const output = buddy.push(new Uint8Array(input));\r\n const final = buddy.finish();\r\n \r\n if (opts.profile) {\r\n console.log(\"[convert-buddy] Performance Stats:\", buddy.stats());\r\n }\r\n \r\n return Buffer.concat([Buffer.from(output), Buffer.from(final)]);\r\n}\r\n"],"mappings":"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","names":["chunks"]}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/* tslint:disable */
|
|
2
2
|
/* eslint-disable */
|
|
3
|
-
/**
|
|
4
|
-
* Detect CSV fields and delimiter from a sample of bytes.
|
|
5
|
-
*/
|
|
6
|
-
export function detectCsvFields(sample: Uint8Array): any;
|
|
7
|
-
export function init(debug_enabled: boolean): void;
|
|
8
3
|
/**
|
|
9
4
|
* Detect XML elements from a sample of bytes.
|
|
10
5
|
*/
|
|
@@ -13,6 +8,15 @@ export function detectXmlElements(sample: Uint8Array): any;
|
|
|
13
8
|
* Detect the input format from a sample of bytes.
|
|
14
9
|
*/
|
|
15
10
|
export function detectFormat(sample: Uint8Array): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Check if SIMD is enabled in this build.
|
|
13
|
+
*/
|
|
14
|
+
export function getSimdEnabled(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Detect CSV fields and delimiter from a sample of bytes.
|
|
17
|
+
*/
|
|
18
|
+
export function detectCsvFields(sample: Uint8Array): any;
|
|
19
|
+
export function init(debug_enabled: boolean): void;
|
|
16
20
|
/**
|
|
17
21
|
* A streaming converter state machine.
|
|
18
22
|
* Converts between CSV, NDJSON, JSON, and XML formats with high performance.
|
|
@@ -177,25 +177,6 @@ function passArray8ToWasm0(arg, malloc) {
|
|
|
177
177
|
WASM_VECTOR_LEN = arg.length;
|
|
178
178
|
return ptr;
|
|
179
179
|
}
|
|
180
|
-
/**
|
|
181
|
-
* Detect CSV fields and delimiter from a sample of bytes.
|
|
182
|
-
* @param {Uint8Array} sample
|
|
183
|
-
* @returns {any}
|
|
184
|
-
*/
|
|
185
|
-
module.exports.detectCsvFields = function(sample) {
|
|
186
|
-
const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
|
|
187
|
-
const len0 = WASM_VECTOR_LEN;
|
|
188
|
-
const ret = wasm.detectCsvFields(ptr0, len0);
|
|
189
|
-
return ret;
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* @param {boolean} debug_enabled
|
|
194
|
-
*/
|
|
195
|
-
module.exports.init = function(debug_enabled) {
|
|
196
|
-
wasm.init(debug_enabled);
|
|
197
|
-
};
|
|
198
|
-
|
|
199
180
|
/**
|
|
200
181
|
* Detect XML elements from a sample of bytes.
|
|
201
182
|
* @param {Uint8Array} sample
|
|
@@ -225,6 +206,34 @@ module.exports.detectFormat = function(sample) {
|
|
|
225
206
|
return v2;
|
|
226
207
|
};
|
|
227
208
|
|
|
209
|
+
/**
|
|
210
|
+
* Check if SIMD is enabled in this build.
|
|
211
|
+
* @returns {boolean}
|
|
212
|
+
*/
|
|
213
|
+
module.exports.getSimdEnabled = function() {
|
|
214
|
+
const ret = wasm.getSimdEnabled();
|
|
215
|
+
return ret !== 0;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Detect CSV fields and delimiter from a sample of bytes.
|
|
220
|
+
* @param {Uint8Array} sample
|
|
221
|
+
* @returns {any}
|
|
222
|
+
*/
|
|
223
|
+
module.exports.detectCsvFields = function(sample) {
|
|
224
|
+
const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
|
|
225
|
+
const len0 = WASM_VECTOR_LEN;
|
|
226
|
+
const ret = wasm.detectCsvFields(ptr0, len0);
|
|
227
|
+
return ret;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @param {boolean} debug_enabled
|
|
232
|
+
*/
|
|
233
|
+
module.exports.init = function(debug_enabled) {
|
|
234
|
+
wasm.init(debug_enabled);
|
|
235
|
+
};
|
|
236
|
+
|
|
228
237
|
function takeFromExternrefTable0(idx) {
|
|
229
238
|
const value = wasm.__wbindgen_export_3.get(idx);
|
|
230
239
|
wasm.__externref_table_dealloc(idx);
|
|
Binary file
|
|
@@ -11,6 +11,7 @@ export const converter_withConfig: (a: number, b: number, c: number, d: number,
|
|
|
11
11
|
export const detectCsvFields: (a: number, b: number) => any;
|
|
12
12
|
export const detectFormat: (a: number, b: number) => [number, number];
|
|
13
13
|
export const detectXmlElements: (a: number, b: number) => any;
|
|
14
|
+
export const getSimdEnabled: () => number;
|
|
14
15
|
export const init: (a: number) => void;
|
|
15
16
|
export const stats_bytes_in: (a: number) => number;
|
|
16
17
|
export const stats_bytes_out: (a: number) => number;
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
/* tslint:disable */
|
|
2
2
|
/* eslint-disable */
|
|
3
|
-
/**
|
|
4
|
-
* Detect CSV fields and delimiter from a sample of bytes.
|
|
5
|
-
*/
|
|
6
|
-
export function detectCsvFields(sample: Uint8Array): any;
|
|
7
|
-
export function init(debug_enabled: boolean): void;
|
|
8
3
|
/**
|
|
9
4
|
* Detect XML elements from a sample of bytes.
|
|
10
5
|
*/
|
|
@@ -13,6 +8,15 @@ export function detectXmlElements(sample: Uint8Array): any;
|
|
|
13
8
|
* Detect the input format from a sample of bytes.
|
|
14
9
|
*/
|
|
15
10
|
export function detectFormat(sample: Uint8Array): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Check if SIMD is enabled in this build.
|
|
13
|
+
*/
|
|
14
|
+
export function getSimdEnabled(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Detect CSV fields and delimiter from a sample of bytes.
|
|
17
|
+
*/
|
|
18
|
+
export function detectCsvFields(sample: Uint8Array): any;
|
|
19
|
+
export function init(debug_enabled: boolean): void;
|
|
16
20
|
/**
|
|
17
21
|
* A streaming converter state machine.
|
|
18
22
|
* Converts between CSV, NDJSON, JSON, and XML formats with high performance.
|
|
@@ -69,6 +73,7 @@ export interface InitOutput {
|
|
|
69
73
|
readonly detectCsvFields: (a: number, b: number) => any;
|
|
70
74
|
readonly detectFormat: (a: number, b: number) => [number, number];
|
|
71
75
|
readonly detectXmlElements: (a: number, b: number) => any;
|
|
76
|
+
readonly getSimdEnabled: () => number;
|
|
72
77
|
readonly init: (a: number) => void;
|
|
73
78
|
readonly stats_bytes_in: (a: number) => number;
|
|
74
79
|
readonly stats_bytes_out: (a: number) => number;
|
|
@@ -173,25 +173,6 @@ function passArray8ToWasm0(arg, malloc) {
|
|
|
173
173
|
WASM_VECTOR_LEN = arg.length;
|
|
174
174
|
return ptr;
|
|
175
175
|
}
|
|
176
|
-
/**
|
|
177
|
-
* Detect CSV fields and delimiter from a sample of bytes.
|
|
178
|
-
* @param {Uint8Array} sample
|
|
179
|
-
* @returns {any}
|
|
180
|
-
*/
|
|
181
|
-
export function detectCsvFields(sample) {
|
|
182
|
-
const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
|
|
183
|
-
const len0 = WASM_VECTOR_LEN;
|
|
184
|
-
const ret = wasm.detectCsvFields(ptr0, len0);
|
|
185
|
-
return ret;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* @param {boolean} debug_enabled
|
|
190
|
-
*/
|
|
191
|
-
export function init(debug_enabled) {
|
|
192
|
-
wasm.init(debug_enabled);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
176
|
/**
|
|
196
177
|
* Detect XML elements from a sample of bytes.
|
|
197
178
|
* @param {Uint8Array} sample
|
|
@@ -221,6 +202,34 @@ export function detectFormat(sample) {
|
|
|
221
202
|
return v2;
|
|
222
203
|
}
|
|
223
204
|
|
|
205
|
+
/**
|
|
206
|
+
* Check if SIMD is enabled in this build.
|
|
207
|
+
* @returns {boolean}
|
|
208
|
+
*/
|
|
209
|
+
export function getSimdEnabled() {
|
|
210
|
+
const ret = wasm.getSimdEnabled();
|
|
211
|
+
return ret !== 0;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Detect CSV fields and delimiter from a sample of bytes.
|
|
216
|
+
* @param {Uint8Array} sample
|
|
217
|
+
* @returns {any}
|
|
218
|
+
*/
|
|
219
|
+
export function detectCsvFields(sample) {
|
|
220
|
+
const ptr0 = passArray8ToWasm0(sample, wasm.__wbindgen_malloc);
|
|
221
|
+
const len0 = WASM_VECTOR_LEN;
|
|
222
|
+
const ret = wasm.detectCsvFields(ptr0, len0);
|
|
223
|
+
return ret;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* @param {boolean} debug_enabled
|
|
228
|
+
*/
|
|
229
|
+
export function init(debug_enabled) {
|
|
230
|
+
wasm.init(debug_enabled);
|
|
231
|
+
}
|
|
232
|
+
|
|
224
233
|
function takeFromExternrefTable0(idx) {
|
|
225
234
|
const value = wasm.__wbindgen_export_3.get(idx);
|
|
226
235
|
wasm.__externref_table_dealloc(idx);
|
|
Binary file
|
|
@@ -11,6 +11,7 @@ export const converter_withConfig: (a: number, b: number, c: number, d: number,
|
|
|
11
11
|
export const detectCsvFields: (a: number, b: number) => any;
|
|
12
12
|
export const detectFormat: (a: number, b: number) => [number, number];
|
|
13
13
|
export const detectXmlElements: (a: number, b: number) => any;
|
|
14
|
+
export const getSimdEnabled: () => number;
|
|
14
15
|
export const init: (a: number) => void;
|
|
15
16
|
export const stats_bytes_in: (a: number) => number;
|
|
16
17
|
export const stats_bytes_out: (a: number) => number;
|