jtcsv 2.2.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +204 -115
  2. package/bin/jtcsv.ts +2612 -0
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1262 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +1736 -0
  23. package/dist/jtcsv-core.cjs.js.map +1 -0
  24. package/dist/jtcsv-core.esm.js +1708 -0
  25. package/dist/jtcsv-core.esm.js.map +1 -0
  26. package/dist/jtcsv-core.umd.js +1742 -0
  27. package/dist/jtcsv-core.umd.js.map +1 -0
  28. package/dist/jtcsv-full.cjs.js +2241 -0
  29. package/dist/jtcsv-full.cjs.js.map +1 -0
  30. package/dist/jtcsv-full.esm.js +2209 -0
  31. package/dist/jtcsv-full.esm.js.map +1 -0
  32. package/dist/jtcsv-full.umd.js +2247 -0
  33. package/dist/jtcsv-full.umd.js.map +1 -0
  34. package/dist/jtcsv-workers.esm.js +768 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -0
  36. package/dist/jtcsv-workers.umd.js +782 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -0
  38. package/dist/jtcsv.cjs.js +1996 -2048
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1992 -2048
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2209
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +112 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/dist/src/web-server/index.js +648 -0
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +665 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +446 -0
  131. package/examples/advanced/csv-parser.worker.ts +89 -0
  132. package/examples/advanced/nested-objects-example.ts +306 -0
  133. package/examples/advanced/performance-optimization.ts +504 -0
  134. package/examples/advanced/run-demo-server.ts +116 -0
  135. package/examples/advanced/web-worker-usage.html +874 -0
  136. package/examples/async-multithreaded-example.ts +335 -0
  137. package/examples/cli-advanced-usage.md +290 -0
  138. package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
  139. package/examples/{cli-tool.js → cli-tool.ts} +5 -8
  140. package/examples/{error-handling.js → error-handling.ts} +356 -324
  141. package/examples/{express-api.js → express-api.ts} +161 -164
  142. package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
  143. package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
  144. package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
  145. package/examples/react-integration.tsx +637 -0
  146. package/examples/{schema-validation.js → schema-validation.ts} +2 -2
  147. package/examples/simple-usage.ts +194 -0
  148. package/examples/{streaming-example.js → streaming-example.ts} +12 -12
  149. package/index.d.ts +187 -18
  150. package/package.json +75 -81
  151. package/plugins.d.ts +37 -0
  152. package/schema.d.ts +103 -0
  153. package/src/browser/browser-functions.ts +402 -0
  154. package/src/browser/core.ts +152 -0
  155. package/src/browser/csv-to-json-browser.d.ts +3 -0
  156. package/src/browser/csv-to-json-browser.ts +494 -0
  157. package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
  158. package/src/browser/extensions/plugins.ts +93 -0
  159. package/src/browser/extensions/workers.ts +39 -0
  160. package/src/browser/globals.d.ts +5 -0
  161. package/src/browser/index.ts +192 -0
  162. package/src/browser/json-to-csv-browser.d.ts +3 -0
  163. package/src/browser/json-to-csv-browser.ts +338 -0
  164. package/src/browser/streams.ts +403 -0
  165. package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
  166. package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
  167. package/src/core/delimiter-cache.ts +320 -0
  168. package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
  169. package/src/core/plugin-system.ts +588 -0
  170. package/src/core/transform-hooks.ts +566 -0
  171. package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
  172. package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
  173. package/src/errors.ts +1 -0
  174. package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
  175. package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
  176. package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
  177. package/src/types/index.ts +275 -0
  178. package/src/utils/bom-utils.ts +373 -0
  179. package/src/utils/encoding-support.ts +155 -0
  180. package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
  181. package/src/utils/transform-loader.ts +389 -0
  182. package/src/utils/validators.ts +35 -0
  183. package/src/utils/zod-adapter.ts +280 -0
  184. package/src/web-server/{index.js → index.ts} +19 -19
  185. package/src/workers/csv-multithreaded.ts +310 -0
  186. package/src/workers/csv-parser.worker.ts +227 -0
  187. package/src/workers/worker-pool.ts +409 -0
  188. package/bin/jtcsv.js +0 -2462
  189. package/csv-to-json.js +0 -688
  190. package/errors.js +0 -208
  191. package/examples/simple-usage.js +0 -282
  192. package/index.js +0 -68
  193. package/json-save.js +0 -254
  194. package/json-to-csv.js +0 -526
  195. package/plugins/README.md +0 -91
  196. package/plugins/express-middleware/README.md +0 -64
  197. package/plugins/express-middleware/example.js +0 -136
  198. package/plugins/express-middleware/index.d.ts +0 -114
  199. package/plugins/express-middleware/index.js +0 -360
  200. package/plugins/express-middleware/package.json +0 -52
  201. package/plugins/fastify-plugin/index.js +0 -406
  202. package/plugins/fastify-plugin/package.json +0 -55
  203. package/plugins/hono/README.md +0 -28
  204. package/plugins/hono/index.d.ts +0 -12
  205. package/plugins/hono/index.js +0 -36
  206. package/plugins/hono/package.json +0 -35
  207. package/plugins/nestjs/README.md +0 -35
  208. package/plugins/nestjs/index.d.ts +0 -25
  209. package/plugins/nestjs/index.js +0 -77
  210. package/plugins/nestjs/package.json +0 -37
  211. package/plugins/nextjs-api/README.md +0 -57
  212. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  213. package/plugins/nextjs-api/examples/api-convert.js +0 -69
  214. package/plugins/nextjs-api/index.js +0 -387
  215. package/plugins/nextjs-api/package.json +0 -63
  216. package/plugins/nextjs-api/route.js +0 -371
  217. package/plugins/nuxt/README.md +0 -24
  218. package/plugins/nuxt/index.js +0 -21
  219. package/plugins/nuxt/package.json +0 -35
  220. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  221. package/plugins/nuxt/runtime/plugin.js +0 -6
  222. package/plugins/remix/README.md +0 -26
  223. package/plugins/remix/index.d.ts +0 -16
  224. package/plugins/remix/index.js +0 -62
  225. package/plugins/remix/package.json +0 -35
  226. package/plugins/sveltekit/README.md +0 -28
  227. package/plugins/sveltekit/index.d.ts +0 -17
  228. package/plugins/sveltekit/index.js +0 -54
  229. package/plugins/sveltekit/package.json +0 -33
  230. package/plugins/trpc/README.md +0 -25
  231. package/plugins/trpc/index.d.ts +0 -7
  232. package/plugins/trpc/index.js +0 -32
  233. package/plugins/trpc/package.json +0 -34
  234. package/src/browser/browser-functions.js +0 -219
  235. package/src/browser/csv-to-json-browser.js +0 -700
  236. package/src/browser/index.js +0 -113
  237. package/src/browser/json-to-csv-browser.js +0 -309
  238. package/src/browser/streams.js +0 -393
  239. package/src/core/delimiter-cache.js +0 -186
  240. package/src/core/plugin-system.js +0 -476
  241. package/src/core/transform-hooks.js +0 -350
  242. package/src/errors.js +0 -26
  243. package/src/utils/transform-loader.js +0 -205
  244. package/stream-csv-to-json.js +0 -542
  245. package/stream-json-to-csv.js +0 -464
  246. /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-csv-to-json.js","sourceRoot":"","sources":["../stream-csv-to-json.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Stream CSV to JSON Converter - TypeScript Module\r\n * \r\n * A streaming implementation for converting CSV data to JSON format\r\n * with memory-efficient processing for large files.\r\n */\r\n\r\nimport {\r\n ValidationError,\r\n SecurityError,\r\n FileSystemError,\r\n ParsingError,\r\n LimitError,\r\n ConfigurationError,\r\n safeExecuteSync,\r\n safeExecuteAsync,\r\n ErrorCode\r\n} from './errors';\r\n\r\nimport { Transform, Readable, Writable, TransformCallback } from 'stream';\r\nimport { pipeline } from 'stream/promises';\r\nimport { CsvToJsonStreamOptions, AnyObject, AnyArray } from './src/types';\r\n\r\n// Import schema validator from utils\r\nimport { createSchemaValidators } from './src/utils/schema-validator';\r\nimport { createBomStripStream, detectBom, stripBomFromString } from './src/utils/bom-utils';\r\n\r\n/**\r\n * Creates a transform stream that converts CSV chunks to JSON objects\r\n * \r\n * @param options - Configuration options\r\n * @returns Transform stream\r\n * \r\n * @example\r\n * const { createCsvToJsonStream } = require('./stream-csv-to-json');\r\n * \r\n * const transformStream = createCsvToJsonStream({\r\n * delimiter: ',',\r\n * parseNumbers: true,\r\n * parseBooleans: true\r\n * });\r\n */\r\nexport function createCsvToJsonStream(options: CsvToJsonStreamOptions = {}): Transform {\r\n return safeExecuteSync(() => {\r\n const {\r\n delimiter,\r\n autoDetect = true,\r\n candidates = [';', ',', '\\t', '|'],\r\n hasHeaders = true,\r\n renameMap = {},\r\n trim = true,\r\n parseNumbers = false,\r\n parseBooleans = false,\r\n maxRows = Infinity,\r\n transform: customTransform,\r\n schema,\r\n useFastPath = true,\r\n fastPathMode = 'objects',\r\n onError = 'throw',\r\n errorHandler,\r\n repairRowShifts = true,\r\n normalizeQuotes = true\r\n } = options;\r\n \r\n // Validate options\r\n if (delimiter !== undefined && typeof delimiter !== 'string') {\r\n throw new ConfigurationError('Delimiter must be a string');\r\n }\r\n\r\n if (delimiter && delimiter.length !== 1) {\r\n throw new ConfigurationError('Delimiter must be a single character');\r\n }\r\n \r\n if (typeof hasHeaders !== 'boolean') {\r\n throw new ConfigurationError('hasHeaders must be a boolean');\r\n }\r\n \r\n if (renameMap && typeof renameMap !== 'object') {\r\n throw new ConfigurationError('renameMap must be an object');\r\n }\r\n \r\n if (maxRows !== Infinity && (typeof maxRows !== 'number' || maxRows <= 0)) {\r\n throw new ConfigurationError('maxRows must be a positive number or Infinity');\r\n }\r\n\r\n if (customTransform !== undefined && typeof customTransform !== 'function') {\r\n throw new ConfigurationError('transform must be a function');\r\n }\r\n\r\n if (schema && typeof schema !== 'object') {\r\n throw new ConfigurationError('schema must be an object');\r\n }\r\n\r\n if (onError !== undefined && !['skip', 'warn', 'throw'].includes(onError)) {\r\n throw new ConfigurationError('onError must be \"skip\", \"warn\", or \"throw\"');\r\n }\r\n\r\n if (errorHandler !== undefined && typeof errorHandler !== 'function') {\r\n throw new ConfigurationError('errorHandler must be a function');\r\n }\r\n \r\n // Create schema validator if schema is provided\r\n // TODO: Fix schema validator types\r\n const schemaValidators = schema ? createSchemaValidators(schema) : null;\r\n \r\n let buffer = '';\r\n let headers: string[] = [];\r\n let finalHeaders: string[] = [];\r\n let headersProcessed = false;\r\n let rowCount = 0;\r\n let inputLineNumber = 0;\r\n let finalDelimiter = delimiter;\r\n let pendingRow: AnyObject | null = null;\r\n let pendingRowLineNumber: number | null = null;\r\n let pendingRowLine: string | null = null;\r\n\r\n const normalizeValue = (value: any): any => {\r\n let normalized = value;\r\n if (trim && typeof normalized === 'string') {\r\n normalized = normalized.trim();\r\n }\r\n if (typeof normalized === 'string') {\r\n if (normalized === '') {\r\n return null;\r\n }\r\n if (normalized[0] === \"'\" && normalized.length > 1) {\r\n const candidate = normalized.slice(1);\r\n const leading = trim ? candidate.trimStart() : candidate;\r\n const firstChar = leading[0];\r\n if (firstChar === '=' || firstChar === '+' || firstChar === '-' || firstChar === '@') {\r\n normalized = candidate;\r\n }\r\n }\r\n }\r\n if (parseNumbers && typeof normalized === 'string' && normalized.trim() !== '' && !isNaN(Number(normalized))) {\r\n normalized = Number(normalized);\r\n }\r\n if (parseBooleans && normalized !== null && normalized !== undefined) {\r\n const lowerValue = String(normalized).toLowerCase();\r\n if (lowerValue === 'true' || lowerValue === 'false') {\r\n normalized = lowerValue === 'true';\r\n }\r\n }\r\n return normalized;\r\n };\r\n\r\n const isEmptyValue = (value: any): boolean =>\r\n value === undefined || value === null || value === '';\r\n\r\n const hasOddQuotes = (value: any): boolean => {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n let count = 0;\r\n for (let i = 0; i < value.length; i++) {\r\n if (value[i] === '\"') {\r\n count++;\r\n }\r\n }\r\n return count % 2 === 1;\r\n };\r\n\r\n const hasAnyQuotes = (value: any): boolean =>\r\n typeof value === 'string' && value.includes('\"');\r\n\r\n const normalizeQuotesInField = (value: any): any => {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n // Не нормализуем кавычки в JSON-строках - это ломает структуру JSON\r\n // Проверяем, выглядит ли значение как JSON (объект или массив)\r\n if ((value.startsWith('{') && value.endsWith('}')) ||\r\n (value.startsWith('[') && value.endsWith(']'))) {\r\n return value; // Возвращаем как есть для JSON\r\n }\r\n \r\n let normalized = value.replace(/\"{2,}/g, '\"');\r\n // Убираем правило, которое ломает JSON: не заменяем \",\" на \",\"\r\n // normalized = normalized.replace(/\"\\s*,\\s*\"/g, ',');\r\n normalized = normalized.replace(/\"\\n/g, '\\n').replace(/\\n\"/g, '\\n');\r\n if (normalized.length >= 2 && normalized.startsWith('\"') && normalized.endsWith('\"')) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n return normalized;\r\n };\r\n\r\n const normalizePhoneValue = (value: any): any => {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n const trimmed = value.trim();\r\n if (trimmed === '') {\r\n return trimmed;\r\n }\r\n return trimmed.replace(/[\"'\\\\]/g, '');\r\n };\r\n\r\n const normalizeRowQuotes = (row: AnyObject, headersList: string[]): AnyObject => {\r\n const normalized: AnyObject = {};\r\n const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\r\n for (const header of headersList) {\r\n const baseValue = normalizeQuotesInField(row[header]);\r\n if (phoneKeys.has(String(header).toLowerCase())) {\r\n normalized[header] = normalizePhoneValue(baseValue);\r\n } else {\r\n normalized[header] = baseValue;\r\n }\r\n }\r\n return normalized;\r\n };\r\n\r\n const looksLikeUserAgent = (value: any): boolean => {\r\n if (typeof value !== 'string') {\r\n return false;\r\n }\r\n return /Mozilla\\/|Opera\\/|MSIE|AppleWebKit|Gecko|Safari|Chrome\\//.test(value);\r\n };\r\n\r\n const isHexColor = (value: any): boolean =>\r\n typeof value === 'string' && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(value);\r\n\r\n const attemptMergeRows = (row: AnyObject, nextRow: AnyObject): AnyObject | null => {\r\n const headerCount = finalHeaders.length;\r\n if (headerCount === 0) {\r\n return null;\r\n }\r\n const values = finalHeaders.map((header) => row[header]);\r\n let lastNonEmpty = -1;\r\n for (let i = headerCount - 1; i >= 0; i--) {\r\n if (!isEmptyValue(values[i])) {\r\n lastNonEmpty = i;\r\n break;\r\n }\r\n }\r\n const missingCount = headerCount - 1 - lastNonEmpty;\r\n if (lastNonEmpty >= 0 && missingCount > 0) {\r\n const nextValues = finalHeaders.map((header) => nextRow[header]);\r\n const nextTrailingEmpty = nextValues\r\n .slice(headerCount - missingCount)\r\n .every((value) => isEmptyValue(value));\r\n const leadValues = nextValues\r\n .slice(0, missingCount)\r\n .filter((value) => !isEmptyValue(value));\r\n const shouldMerge = nextTrailingEmpty\r\n && leadValues.length > 0\r\n && (hasOddQuotes(values[lastNonEmpty]) || hasAnyQuotes(values[lastNonEmpty]));\r\n\r\n if (shouldMerge) {\r\n const toAppend = leadValues.map((value) => String(value));\r\n if (toAppend.length > 0) {\r\n const base = isEmptyValue(values[lastNonEmpty]) ? '' : String(values[lastNonEmpty]);\r\n values[lastNonEmpty] = base ? `${base}\\n${toAppend.join('\\n')}` : toAppend.join('\\n');\r\n }\r\n for (let i = 0; i < missingCount; i++) {\r\n values[lastNonEmpty + 1 + i] = nextValues[missingCount + i];\r\n }\r\n const merged: AnyObject = {};\r\n for (let i = 0; i < headerCount; i++) {\r\n merged[finalHeaders[i]] = values[i];\r\n }\r\n return merged;\r\n }\r\n }\r\n\r\n if (headerCount >= 6) {\r\n const nextValues = finalHeaders.map((header) => nextRow[header]);\r\n const nextHex = nextValues[4];\r\n const nextUserAgentHead = nextValues[2];\r\n const nextUserAgentTail = nextValues[3];\r\n const shouldMergeUserAgent = isEmptyValue(values[4])\r\n && isEmptyValue(values[5])\r\n && isHexColor(nextHex)\r\n && (looksLikeUserAgent(nextUserAgentHead) || looksLikeUserAgent(nextUserAgentTail));\r\n\r\n if (shouldMergeUserAgent) {\r\n const addressParts = [values[3], nextValues[0], nextValues[1]]\r\n .filter((value) => !isEmptyValue(value))\r\n .map((value) => String(value));\r\n values[3] = addressParts.join('\\n');\r\n const uaHead = isEmptyValue(nextUserAgentHead) ? '' : String(nextUserAgentHead);\r\n const uaTail = isEmptyValue(nextUserAgentTail) ? '' : String(nextUserAgentTail);\r\n const joiner = uaHead && uaTail ? (uaTail.startsWith(' ') ? '' : ',') : '';\r\n values[4] = uaHead + joiner + uaTail;\r\n values[5] = String(nextHex);\r\n const merged: AnyObject = {};\r\n for (let i = 0; i < headerCount; i++) {\r\n merged[finalHeaders[i]] = values[i];\r\n }\r\n return merged;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const finalizeHeaders = (nextHeaders: string[]) => {\r\n headers = nextHeaders;\r\n finalHeaders = headers.map((header) => renameMap[header] || header);\r\n headersProcessed = true;\r\n };\r\n\r\n const emitRow = (\r\n row: AnyObject,\r\n line: string,\r\n lineNumber: number,\r\n stream: Transform\r\n ) => {\r\n if (maxRows !== Infinity && rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n let outputRow = row;\r\n if (normalizeQuotes) {\r\n outputRow = normalizeRowQuotes(outputRow, finalHeaders);\r\n }\r\n\r\n if (schemaValidators && Object.keys(schemaValidators).length > 0) {\r\n for (const [field, validator] of Object.entries(schemaValidators)) {\r\n const typedValidator = validator as any;\r\n const value = outputRow[field];\r\n if (typeof typedValidator.validate === 'function' && !typedValidator.validate(value)) {\r\n throw new ValidationError(`Invalid value for field \"${field}\"`);\r\n }\r\n if (typeof typedValidator.format === 'function') {\r\n outputRow[field] = typedValidator.format(value);\r\n }\r\n }\r\n }\r\n\r\n if (customTransform) {\r\n let transformed: AnyObject;\r\n try {\r\n transformed = customTransform(outputRow);\r\n } catch (error: any) {\r\n throw new ValidationError(`Transform function error: ${error.message}`);\r\n }\r\n if (!transformed || typeof transformed !== 'object') {\r\n throw new ValidationError('Transform function must return an object');\r\n }\r\n stream.push(transformed);\r\n } else {\r\n stream.push(outputRow);\r\n }\r\n rowCount++;\r\n };\r\n\r\n const handleRowError = (error: Error, line: string, lineNumber: number): boolean => {\r\n if (error instanceof LimitError) {\r\n throw error;\r\n }\r\n if (errorHandler) {\r\n errorHandler(error, line, lineNumber);\r\n }\r\n if (onError === 'warn') {\r\n if (process.env['NODE_ENV'] !== 'test') {\r\n console.warn(`[jtcsv] Line ${lineNumber}: ${error.message}`);\r\n }\r\n return true;\r\n }\r\n if (onError === 'skip') {\r\n return true;\r\n }\r\n throw error;\r\n };\r\n \r\n // Create transform stream\r\n const transformStream = new Transform({\r\n readableObjectMode: true,\r\n writableObjectMode: false,\r\n \r\n transform(chunk: Buffer | string, encoding: BufferEncoding, callback: TransformCallback) {\r\n try {\r\n // Convert chunk to string\r\n const chunkStr = chunk.toString();\r\n buffer += chunkStr;\r\n \r\n // Process complete lines\r\n const lines = buffer.split('\\n');\r\n \r\n // Keep last incomplete line in buffer\r\n buffer = lines.pop() || '';\r\n \r\n // Process complete lines\r\n let errorLine = ''; // Объявляем вне цикла для доступа в catch\r\n let errorLineNumber = 0;\r\n for (const line of lines) {\r\n if (line.trim() === '') {\r\n continue; // Skip empty lines\r\n }\r\n inputLineNumber += 1;\r\n errorLine = line;\r\n errorLineNumber = inputLineNumber;\r\n \r\n // Check max rows limit\r\n if (rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n \r\n try {\r\n // Auto-detect delimiter on first line if needed\r\n if (!finalDelimiter && autoDetect && !headersProcessed) {\r\n finalDelimiter = autoDetectDelimiterFromLine(line, candidates);\r\n }\r\n \r\n if (!finalDelimiter) {\r\n finalDelimiter = ';'; // Default fallback\r\n }\r\n \r\n // Parse CSV line\r\n const values = parseCsvLine(line, finalDelimiter, trim, inputLineNumber);\r\n \r\n // Process headers\r\n if (!headersProcessed) {\r\n if (hasHeaders) {\r\n finalizeHeaders(values);\r\n continue;\r\n } else {\r\n // Generate default headers\r\n finalizeHeaders(values.map((_, index) => `column${index + 1}`));\r\n }\r\n }\r\n if (finalHeaders.length === 0) {\r\n finalHeaders = headers.map((header) => renameMap[header] || header);\r\n }\r\n \r\n // Handle field count mismatch\r\n if (values.length !== finalHeaders.length) {\r\n throw ParsingError.fieldCountMismatch(\r\n finalHeaders.length,\r\n values.length,\r\n inputLineNumber,\r\n line\r\n );\r\n }\r\n \r\n // Create JSON object\r\n const row: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n const value = normalizeValue(values[j]);\r\n row[finalHeaders[j]] = value;\r\n }\r\n\r\n if (repairRowShifts) {\r\n if (!pendingRow) {\r\n pendingRow = row;\r\n pendingRowLineNumber = inputLineNumber;\r\n pendingRowLine = line;\r\n continue;\r\n }\r\n\r\n const merged = attemptMergeRows(pendingRow, row);\r\n if (merged) {\r\n const baseLine = pendingRowLine ?? line;\r\n const baseLineNumber = pendingRowLineNumber ?? inputLineNumber;\r\n pendingRow = null;\r\n pendingRowLine = null;\r\n pendingRowLineNumber = null;\r\n errorLine = baseLine;\r\n errorLineNumber = baseLineNumber;\r\n emitRow(merged, baseLine, baseLineNumber, this);\r\n } else {\r\n const baseLine = pendingRowLine ?? line;\r\n const baseLineNumber = pendingRowLineNumber ?? inputLineNumber;\r\n const rowToEmit = pendingRow;\r\n pendingRow = row;\r\n pendingRowLine = line;\r\n pendingRowLineNumber = inputLineNumber;\r\n errorLine = baseLine;\r\n errorLineNumber = baseLineNumber;\r\n emitRow(rowToEmit, baseLine, baseLineNumber, this);\r\n }\r\n } else {\r\n emitRow(row, line, inputLineNumber, this);\r\n }\r\n } catch (error: any) {\r\n if (!headersProcessed && hasHeaders) {\r\n throw error;\r\n }\r\n if (handleRowError(error as Error, errorLine, errorLineNumber)) {\r\n continue;\r\n }\r\n }\r\n }\r\n \r\n callback();\r\n } catch (error: any) {\r\n callback(error);\r\n }\r\n },\r\n \r\n flush(callback: TransformCallback) {\r\n // Process any remaining data in buffer\r\n if (buffer.trim() !== '') {\r\n let errorLine = buffer; // Объявляем вне try для доступа в catch\r\n let errorLineNumber = inputLineNumber;\r\n try {\r\n // Check max rows limit\r\n if (rowCount >= maxRows) {\r\n throw new LimitError(\r\n `CSV size exceeds maximum limit of ${maxRows} rows`,\r\n maxRows,\r\n rowCount + 1\r\n );\r\n }\r\n if (rowCount < maxRows) {\r\n inputLineNumber += 1;\r\n errorLineNumber = inputLineNumber;\r\n // Auto-detect delimiter if needed\r\n if (!finalDelimiter && autoDetect && !headersProcessed) {\r\n finalDelimiter = autoDetectDelimiterFromLine(buffer, candidates);\r\n }\r\n \r\n if (!finalDelimiter) {\r\n finalDelimiter = ';';\r\n }\r\n \r\n const values = parseCsvLine(buffer, finalDelimiter, trim, inputLineNumber);\r\n \r\n if (!headersProcessed) {\r\n if (hasHeaders) {\r\n finalizeHeaders(values);\r\n } else {\r\n finalizeHeaders(values.map((_, index) => `column${index + 1}`));\r\n }\r\n } else {\r\n if (finalHeaders.length === 0) {\r\n finalHeaders = headers.map((header) => renameMap[header] || header);\r\n }\r\n \r\n if (values.length !== finalHeaders.length) {\r\n throw ParsingError.fieldCountMismatch(\r\n finalHeaders.length,\r\n values.length,\r\n inputLineNumber,\r\n buffer\r\n );\r\n }\r\n \r\n const row: AnyObject = {};\r\n for (let j = 0; j < finalHeaders.length; j++) {\r\n const value = normalizeValue(values[j]);\r\n row[finalHeaders[j]] = value;\r\n }\r\n\r\n if (repairRowShifts) {\r\n if (!pendingRow) {\r\n pendingRow = row;\r\n pendingRowLineNumber = inputLineNumber;\r\n pendingRowLine = buffer;\r\n } else {\r\n const merged = attemptMergeRows(pendingRow, row);\r\n if (merged) {\r\n const baseLine = pendingRowLine ?? buffer;\r\n const baseLineNumber = pendingRowLineNumber ?? inputLineNumber;\r\n pendingRow = null;\r\n pendingRowLine = null;\r\n pendingRowLineNumber = null;\r\n errorLine = baseLine;\r\n errorLineNumber = baseLineNumber;\r\n emitRow(merged, baseLine, baseLineNumber, this);\r\n } else {\r\n const baseLine = pendingRowLine ?? buffer;\r\n const baseLineNumber = pendingRowLineNumber ?? inputLineNumber;\r\n const rowToEmit = pendingRow;\r\n pendingRow = row;\r\n pendingRowLine = buffer;\r\n pendingRowLineNumber = inputLineNumber;\r\n errorLine = baseLine;\r\n errorLineNumber = baseLineNumber;\r\n emitRow(rowToEmit, baseLine, baseLineNumber, this);\r\n }\r\n }\r\n } else {\r\n emitRow(row, buffer, inputLineNumber, this);\r\n }\r\n }\r\n }\r\n } catch (error: any) {\r\n if (!headersProcessed && hasHeaders) {\r\n callback(error);\r\n return;\r\n }\r\n try {\r\n if (handleRowError(error as Error, errorLine, errorLineNumber)) {\r\n callback();\r\n return;\r\n }\r\n } catch (handledError: any) {\r\n callback(handledError);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (pendingRow) {\r\n const baseLine = pendingRowLine ?? '';\r\n const baseLineNumber = pendingRowLineNumber ?? inputLineNumber;\r\n try {\r\n emitRow(pendingRow, baseLine, baseLineNumber, this);\r\n } catch (error: any) {\r\n try {\r\n if (handleRowError(error as Error, baseLine, baseLineNumber)) {\r\n callback();\r\n return;\r\n }\r\n } catch (handledError: any) {\r\n callback(handledError);\r\n return;\r\n }\r\n }\r\n pendingRow = null;\r\n pendingRowLine = null;\r\n pendingRowLineNumber = null;\r\n }\r\n\r\n callback();\r\n }\r\n });\r\n \r\n return transformStream;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createCsvToJsonStream' });\r\n}\r\n\r\n/**\r\n * Creates a collector stream that accumulates JSON objects\r\n * \r\n * @param options - Stream options\r\n * @returns Transform stream that collects JSON data\r\n */\r\nexport function createJsonCollectorStream(\r\n options: CsvToJsonStreamOptions = {}\r\n): Transform {\r\n return safeExecuteSync(() => {\r\n const collectedData: AnyArray = [];\r\n \r\n const transformStream = new Transform({\r\n writableObjectMode: true,\r\n readableObjectMode: false,\r\n \r\n transform(chunk: AnyObject, encoding: BufferEncoding, callback: TransformCallback) {\r\n collectedData.push(chunk);\r\n (transformStream as any)._collectedData = collectedData;\r\n callback();\r\n },\r\n \r\n flush(callback: TransformCallback) {\r\n this.push(JSON.stringify(collectedData, null, 2));\r\n (transformStream as any)._collectedData = collectedData;\r\n callback();\r\n }\r\n });\r\n\r\n (transformStream as any)._collectedData = collectedData;\r\n \r\n // Pipe through CSV to JSON converter if options provided\r\n if (Object.keys(options).length > 0) {\r\n const csvToJsonStream = createCsvToJsonStream(options);\r\n csvToJsonStream.pipe(transformStream);\r\n return csvToJsonStream;\r\n }\r\n \r\n return transformStream;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createJsonCollectorStream' });\r\n}\r\n\r\n/**\r\n * Streams CSV data to JSON format\r\n * \r\n * @param csv - CSV string to convert\r\n * @param options - Conversion options\r\n * @returns Promise with JSON array\r\n */\r\nexport async function streamCsvToJson(\r\n csv: string,\r\n options?: CsvToJsonStreamOptions\r\n): Promise<AnyArray>;\r\nexport async function streamCsvToJson(\r\n readableStream: Readable,\r\n writableStream: Writable,\r\n options?: CsvToJsonStreamOptions\r\n): Promise<void>;\r\nexport async function streamCsvToJson(\r\n csvOrStream: string | Readable,\r\n outputOrOptions: Writable | CsvToJsonStreamOptions = {},\r\n options: CsvToJsonStreamOptions = {}\r\n): Promise<AnyArray | void> {\r\n return safeExecuteAsync(async () => {\r\n const isReadableStream = (value: any): value is Readable =>\r\n value instanceof Readable || (value && typeof value.pipe === 'function');\r\n const isWritableStream = (value: any): value is Writable =>\r\n value instanceof Writable || (value && typeof value.write === 'function');\r\n\r\n if (isReadableStream(csvOrStream) && isWritableStream(outputOrOptions)) {\r\n const csvToJsonStream = createCsvToJsonStream(options);\r\n await pipeline(\r\n csvOrStream,\r\n csvToJsonStream,\r\n outputOrOptions\r\n );\r\n return;\r\n }\r\n\r\n const streamOptions = (outputOrOptions as CsvToJsonStreamOptions) || {};\r\n // Create readable stream from CSV string\r\n const readableStream = new Readable({\r\n read() {\r\n this.push(csvOrStream as string);\r\n this.push(null);\r\n }\r\n });\r\n \r\n const csvToJsonStream = createCsvToJsonStream(streamOptions);\r\n const collectorStream = createJsonCollectorStream();\r\n \r\n await pipeline(\r\n readableStream,\r\n csvToJsonStream,\r\n collectorStream\r\n );\r\n \r\n return ((collectorStream as any)._collectedData as AnyArray) || [];\r\n }, 'STREAM_PROCESSING_ERROR', { function: 'streamCsvToJson' });\r\n}\r\n\r\n/**\r\n * Asynchronous version with worker thread support\r\n */\r\nexport async function streamCsvToJsonAsync(\r\n csv: string,\r\n options: CsvToJsonStreamOptions & {\r\n useWorkers?: boolean;\r\n workerCount?: number;\r\n chunkSize?: number;\r\n onProgress?: (progress: { processed: number; total: number; percentage: number }) => void;\r\n } = {}\r\n): Promise<AnyArray> {\r\n return safeExecuteAsync(async () => {\r\n const { useWorkers = false, workerCount, chunkSize, onProgress, ...streamOptions } = options;\r\n \r\n // For now, use the standard streaming version\r\n // TODO: Implement worker thread support for large datasets\r\n return streamCsvToJson(csv, streamOptions);\r\n }, 'STREAM_PROCESSING_ERROR', { function: 'streamCsvToJsonAsync' });\r\n}\r\n\r\n/**\r\n * Creates a CSV file to JSON stream pipeline\r\n * \r\n * @param filePath - Path to CSV file\r\n * @param options - Conversion options\r\n * @returns Readable stream of JSON objects\r\n */\r\nexport async function createCsvFileToJsonStream(\r\n filePath: string,\r\n options: CsvToJsonStreamOptions & { validatePath?: boolean } = {}\r\n): Promise<Readable> {\r\n return safeExecuteAsync(async () => {\r\n const { validatePath = true, ...streamOptions } = options;\r\n\r\n const fs = require('fs');\r\n const path = require('path');\r\n let safePath = filePath;\r\n\r\n // Validate file path if requested\r\n if (validatePath) {\r\n if (typeof filePath !== 'string' || filePath.trim().length === 0) {\r\n throw new ValidationError('File path must be a non-empty string');\r\n }\r\n const normalized = path.normalize(filePath.trim());\r\n const traversalPattern = /(^|[\\\\/])\\.\\.([\\\\/]|$)/;\r\n if (traversalPattern.test(normalized)) {\r\n throw new SecurityError('Directory traversal detected in file path');\r\n }\r\n if (path.extname(normalized).toLowerCase() !== '.csv') {\r\n throw new ValidationError('File must have .csv extension');\r\n }\r\n safePath = normalized;\r\n }\r\n\r\n try {\r\n await fs.promises.access(safePath);\r\n } catch (error: any) {\r\n if (error?.code === 'ENOENT') {\r\n throw new FileSystemError(`File not found: ${safePath}`, error);\r\n }\r\n throw error;\r\n }\r\n\r\n const fileStream = fs.createReadStream(safePath, 'utf8');\r\n const csvToJsonStream = createCsvToJsonStream(streamOptions);\r\n \r\n // Handle BOM stripping\r\n const bomStripStream = createBomStripStream();\r\n \r\n // Create pipeline\r\n const { pipeline } = require('stream');\r\n const { PassThrough } = require('stream');\r\n \r\n const outputStream = new PassThrough({ objectMode: true });\r\n \r\n pipeline(\r\n fileStream,\r\n bomStripStream,\r\n csvToJsonStream,\r\n outputStream,\r\n (error: any) => {\r\n if (error) {\r\n outputStream.emit('error', error);\r\n }\r\n }\r\n );\r\n \r\n return outputStream;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createCsvFileToJsonStream' });\r\n}\r\n\r\n// ============================================================================\r\n// Helper functions\r\n// ============================================================================\r\n\r\n/**\r\n * Auto-detects delimiter from a single CSV line\r\n */\r\nfunction autoDetectDelimiterFromLine(\r\n line: string,\r\n candidates: string[]\r\n): string {\r\n let bestDelimiter = candidates[0];\r\n let bestScore = -1;\r\n \r\n for (const delimiter of candidates) {\r\n let score = 0;\r\n \r\n // Count occurrences\r\n for (let i = 0; i < line.length; i++) {\r\n if (line[i] === delimiter) {\r\n score++;\r\n }\r\n }\r\n \r\n // Bonus for consistent field count (check for quotes)\r\n const fields = line.split(delimiter);\r\n let hasQuotes = false;\r\n let consistent = true;\r\n \r\n for (const field of fields) {\r\n if (field.includes('\"') || field.includes(\"'\")) {\r\n hasQuotes = true;\r\n }\r\n }\r\n \r\n if (!hasQuotes && fields.length > 1) {\r\n score += 10;\r\n }\r\n \r\n if (score > bestScore) {\r\n bestScore = score;\r\n bestDelimiter = delimiter;\r\n }\r\n }\r\n \r\n return bestDelimiter;\r\n}\r\n\r\n/**\r\n * Parses a single CSV line\r\n */\r\nfunction parseCsvLine(\r\n line: string,\r\n delimiter: string,\r\n trim: boolean,\r\n lineNumber?: number\r\n): string[] {\r\n const result: string[] = [];\r\n let currentField = '';\r\n let inQuotes = false;\r\n let quoteChar = '\"';\r\n let escapeNext = false;\r\n \r\n for (let i = 0; i < line.length; i++) {\r\n const char = line[i];\r\n const nextChar = i < line.length - 1 ? line[i + 1] : '';\r\n\r\n if (escapeNext) {\r\n currentField += char;\r\n escapeNext = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\') {\r\n escapeNext = true;\r\n continue;\r\n }\r\n \r\n if (!inQuotes && char === delimiter) {\r\n result.push(trim ? currentField.trim() : currentField);\r\n currentField = '';\r\n } else if (!inQuotes && (char === '\"' || char === \"'\")) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (inQuotes && char === quoteChar && nextChar === quoteChar) {\r\n currentField += char;\r\n if (i + 2 === line.length) {\r\n inQuotes = false;\r\n }\r\n i++;\r\n } else if (inQuotes && char === quoteChar) {\r\n inQuotes = false;\r\n } else {\r\n currentField += char;\r\n }\r\n }\r\n\r\n if (escapeNext) {\r\n currentField += '\\\\';\r\n }\r\n \r\n result.push(trim ? currentField.trim() : currentField);\r\n \r\n if (inQuotes) {\r\n throw ParsingError.unclosedQuotes(\r\n lineNumber ?? null,\r\n null,\r\n line.substring(0, 100)\r\n );\r\n }\r\n \r\n return result;\r\n}\r\n"]}
@@ -0,0 +1,389 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createJsonToCsvStream = createJsonToCsvStream;
4
+ exports.createJsonReadableStream = createJsonReadableStream;
5
+ exports.createCsvCollectorStream = createCsvCollectorStream;
6
+ exports.streamJsonToCsv = streamJsonToCsv;
7
+ exports.streamJsonToCsvAsync = streamJsonToCsvAsync;
8
+ exports.saveJsonStreamAsCsv = saveJsonStreamAsCsv;
9
+ const errors_1 = require("./errors");
10
+ const stream_1 = require("stream");
11
+ const promises_1 = require("stream/promises");
12
+ const schema_validator_1 = require("./src/utils/schema-validator");
13
+ function createJsonToCsvStream(options = {}) {
14
+ return (0, errors_1.safeExecuteSync)(() => {
15
+ const { delimiter = ';', includeHeaders = true, renameMap = {}, template = {}, maxRecords = Infinity, transform: customTransform, schema, addBOM = false, preventCsvInjection = true, rfc4180Compliant = true, normalizeQuotes = true, flatten = false, flattenSeparator = '.', flattenMaxDepth = 5, arrayHandling = 'stringify' } = options;
16
+ if (typeof delimiter !== 'string') {
17
+ throw new errors_1.ConfigurationError('Delimiter must be a string');
18
+ }
19
+ if (delimiter.length !== 1) {
20
+ throw new errors_1.ConfigurationError('Delimiter must be a single character');
21
+ }
22
+ if (typeof includeHeaders !== 'boolean') {
23
+ throw new errors_1.ConfigurationError('includeHeaders must be a boolean');
24
+ }
25
+ if (renameMap && typeof renameMap !== 'object') {
26
+ throw new errors_1.ConfigurationError('renameMap must be an object');
27
+ }
28
+ if (template && typeof template !== 'object') {
29
+ throw new errors_1.ConfigurationError('template must be an object');
30
+ }
31
+ if (maxRecords !== Infinity && (typeof maxRecords !== 'number' || maxRecords <= 0)) {
32
+ throw new errors_1.ConfigurationError('maxRecords must be a positive number or Infinity');
33
+ }
34
+ if (customTransform !== undefined && typeof customTransform !== 'function') {
35
+ throw new errors_1.ConfigurationError('transform must be a function');
36
+ }
37
+ if (schema && typeof schema !== 'object') {
38
+ throw new errors_1.ConfigurationError('schema must be an object');
39
+ }
40
+ if (normalizeQuotes !== undefined && typeof normalizeQuotes !== 'boolean') {
41
+ throw new errors_1.ConfigurationError('normalizeQuotes must be a boolean');
42
+ }
43
+ const schemaValidators = schema ? (0, schema_validator_1.createSchemaValidators)(schema) : null;
44
+ let headers = [];
45
+ let outputHeaders = [];
46
+ let headersWritten = false;
47
+ let recordCount = 0;
48
+ const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);
49
+ const normalizeQuotesInField = (value) => {
50
+ if ((value.startsWith('{') && value.endsWith('}')) ||
51
+ (value.startsWith('[') && value.endsWith(']'))) {
52
+ return value;
53
+ }
54
+ let normalized = value.replace(/"{2,}/g, '"');
55
+ normalized = normalized.replace(/"\n/g, '\n').replace(/\n"/g, '\n');
56
+ if (normalized.length >= 2 && normalized.startsWith('"') && normalized.endsWith('"')) {
57
+ normalized = normalized.slice(1, -1);
58
+ }
59
+ return normalized;
60
+ };
61
+ const normalizePhoneValue = (value) => {
62
+ const trimmed = value.trim();
63
+ if (trimmed === '') {
64
+ return trimmed;
65
+ }
66
+ return trimmed.replace(/["'\\]/g, '');
67
+ };
68
+ const normalizeValueForCsv = (value, key) => {
69
+ if (!normalizeQuotes || typeof value !== 'string') {
70
+ return value;
71
+ }
72
+ const base = normalizeQuotesInField(value);
73
+ if (phoneKeys.has(String(key).toLowerCase())) {
74
+ return normalizePhoneValue(base);
75
+ }
76
+ return base;
77
+ };
78
+ const transformStream = new stream_1.Transform({
79
+ objectMode: true,
80
+ transform(chunk, encoding, callback) {
81
+ try {
82
+ if (recordCount >= maxRecords) {
83
+ throw new errors_1.LimitError(`Data size exceeds maximum limit of ${maxRecords} records`, maxRecords, recordCount + 1);
84
+ }
85
+ if (typeof chunk !== 'object' || chunk === null) {
86
+ throw new errors_1.ValidationError('Input data must be objects');
87
+ }
88
+ let row = chunk;
89
+ if (schemaValidators && Object.keys(schemaValidators).length > 0) {
90
+ for (const [field, validator] of Object.entries(schemaValidators)) {
91
+ const typedValidator = validator;
92
+ const value = row[field];
93
+ if (typeof typedValidator.validate === 'function' && !typedValidator.validate(value)) {
94
+ throw new errors_1.ValidationError(`Invalid value for field "${field}"`);
95
+ }
96
+ if (typeof typedValidator.format === 'function') {
97
+ row[field] = typedValidator.format(value);
98
+ }
99
+ }
100
+ }
101
+ if (customTransform) {
102
+ let transformed;
103
+ try {
104
+ transformed = customTransform(row);
105
+ }
106
+ catch (error) {
107
+ throw new errors_1.ValidationError(`Transform function error: ${error.message}`);
108
+ }
109
+ if (!transformed || typeof transformed !== 'object') {
110
+ throw new errors_1.ValidationError('Transform function must return an object');
111
+ }
112
+ row = transformed;
113
+ }
114
+ if (flatten) {
115
+ row = flattenObject(row, flattenSeparator, flattenMaxDepth, arrayHandling);
116
+ }
117
+ if (!headersWritten) {
118
+ const resolvedHeaders = determineHeaders(row, template, renameMap);
119
+ headers = resolvedHeaders.headers;
120
+ outputHeaders = resolvedHeaders.outputHeaders;
121
+ if (addBOM && includeHeaders) {
122
+ this.push('\uFEFF');
123
+ }
124
+ if (includeHeaders) {
125
+ const headerRow = formatCsvRow(outputHeaders, delimiter, rfc4180Compliant);
126
+ this.push(headerRow);
127
+ }
128
+ headersWritten = true;
129
+ }
130
+ const values = headers.map(header => {
131
+ let value = row[header];
132
+ if (value === undefined || value === null) {
133
+ return '';
134
+ }
135
+ if (Array.isArray(value)) {
136
+ switch (arrayHandling) {
137
+ case 'stringify':
138
+ value = JSON.stringify(value);
139
+ break;
140
+ case 'join':
141
+ value = value.join(', ');
142
+ break;
143
+ case 'expand':
144
+ value = value.join('; ');
145
+ break;
146
+ }
147
+ }
148
+ value = normalizeValueForCsv(value, header);
149
+ const stringValue = String(value);
150
+ if (preventCsvInjection && isPotentialFormula(stringValue)) {
151
+ return escapeCsvInjection(stringValue);
152
+ }
153
+ return stringValue;
154
+ });
155
+ const csvRow = formatCsvRow(values, delimiter, rfc4180Compliant);
156
+ this.push(csvRow);
157
+ recordCount++;
158
+ callback();
159
+ }
160
+ catch (error) {
161
+ callback(error);
162
+ }
163
+ },
164
+ flush(callback) {
165
+ try {
166
+ if (!headersWritten && includeHeaders) {
167
+ const templateKeys = Object.keys(template || {});
168
+ if (templateKeys.length > 0) {
169
+ headers = templateKeys;
170
+ outputHeaders = headers.map(header => renameMap[header] || header);
171
+ if (addBOM) {
172
+ this.push('\uFEFF');
173
+ }
174
+ const headerRow = formatCsvRow(outputHeaders, delimiter, rfc4180Compliant);
175
+ this.push(headerRow);
176
+ headersWritten = true;
177
+ }
178
+ }
179
+ callback();
180
+ }
181
+ catch (error) {
182
+ callback(error);
183
+ }
184
+ }
185
+ });
186
+ return transformStream;
187
+ }, 'STREAM_CREATION_ERROR', { function: 'createJsonToCsvStream' });
188
+ }
189
+ function createJsonReadableStream(data, options = {}) {
190
+ return (0, errors_1.safeExecuteSync)(() => {
191
+ const { objectMode = true } = options;
192
+ if (!Array.isArray(data) && (typeof data !== 'object' || data === null)) {
193
+ throw new errors_1.ValidationError('Data must be an array or object');
194
+ }
195
+ const items = Array.isArray(data) ? data : [data];
196
+ let index = 0;
197
+ const readable = new stream_1.Readable({
198
+ objectMode,
199
+ read() {
200
+ if (index < items.length) {
201
+ this._index = index + 1;
202
+ this.push(items[index]);
203
+ index++;
204
+ }
205
+ else {
206
+ this._index = index;
207
+ this.push(null);
208
+ }
209
+ }
210
+ });
211
+ readable._index = index;
212
+ return readable;
213
+ }, 'STREAM_CREATION_ERROR', { function: 'createJsonReadableStream' });
214
+ }
215
+ function createCsvCollectorStream(options = {}) {
216
+ return (0, errors_1.safeExecuteSync)(() => {
217
+ let collectedData = '';
218
+ const transformStream = new stream_1.Transform({
219
+ writableObjectMode: false,
220
+ readableObjectMode: false,
221
+ transform(chunk, encoding, callback) {
222
+ collectedData += chunk.toString();
223
+ transformStream._collectedData = collectedData;
224
+ callback();
225
+ },
226
+ flush(callback) {
227
+ this.push(collectedData);
228
+ transformStream._collectedData = collectedData;
229
+ callback();
230
+ }
231
+ });
232
+ transformStream._collectedData = collectedData;
233
+ if (Object.keys(options).length > 0) {
234
+ const jsonToCsvStream = createJsonToCsvStream(options);
235
+ jsonToCsvStream.pipe(transformStream);
236
+ return jsonToCsvStream;
237
+ }
238
+ return transformStream;
239
+ }, 'STREAM_CREATION_ERROR', { function: 'createCsvCollectorStream' });
240
+ }
241
+ async function streamJsonToCsv(dataOrStream, outputOrOptions = {}, options = {}) {
242
+ return (0, errors_1.safeExecuteAsync)(async () => {
243
+ const isReadableStream = dataOrStream instanceof stream_1.Readable
244
+ || (dataOrStream && typeof dataOrStream.pipe === 'function');
245
+ const isWritableStream = outputOrOptions instanceof stream_1.Writable
246
+ || (outputOrOptions && typeof outputOrOptions.write === 'function');
247
+ if (isReadableStream && isWritableStream) {
248
+ const jsonToCsvStream = createJsonToCsvStream(options);
249
+ await (0, promises_1.pipeline)(dataOrStream, jsonToCsvStream, outputOrOptions);
250
+ return;
251
+ }
252
+ const streamOptions = outputOrOptions || {};
253
+ const readableStream = createJsonReadableStream(dataOrStream);
254
+ const jsonToCsvStream = createJsonToCsvStream(streamOptions);
255
+ const collectorStream = createCsvCollectorStream();
256
+ await (0, promises_1.pipeline)(readableStream, jsonToCsvStream, collectorStream);
257
+ return collectorStream._collectedData || '';
258
+ }, 'STREAM_PROCESSING_ERROR', { function: 'streamJsonToCsv' });
259
+ }
260
+ async function streamJsonToCsvAsync(data, options = {}) {
261
+ return (0, errors_1.safeExecuteAsync)(async () => {
262
+ const { useWorkers = false, workerCount, chunkSize, onProgress, ...streamOptions } = options;
263
+ return streamJsonToCsv(data, streamOptions);
264
+ }, 'STREAM_PROCESSING_ERROR', { function: 'streamJsonToCsvAsync' });
265
+ }
266
+ async function saveJsonStreamAsCsv(readableStream, filePath, options = {}) {
267
+ return (0, errors_1.safeExecuteAsync)(async () => {
268
+ const { validatePath = true, ...streamOptions } = options;
269
+ const fs = require('fs');
270
+ const path = require('path');
271
+ let safePath = filePath;
272
+ if (validatePath) {
273
+ if (typeof filePath !== 'string' || filePath.trim().length === 0) {
274
+ throw new errors_1.ValidationError('File path must be a non-empty string');
275
+ }
276
+ const normalized = path.normalize(filePath.trim());
277
+ const traversalPattern = /(^|[\\/])\.\.([\\/]|$)/;
278
+ if (traversalPattern.test(normalized)) {
279
+ throw new errors_1.SecurityError('Directory traversal detected in file path');
280
+ }
281
+ if (path.extname(normalized).toLowerCase() !== '.csv') {
282
+ throw new errors_1.ValidationError('File must have .csv extension');
283
+ }
284
+ safePath = normalized;
285
+ }
286
+ const resolvedOptions = {
287
+ ...streamOptions,
288
+ addBOM: streamOptions.addBOM !== undefined ? streamOptions.addBOM : true
289
+ };
290
+ const jsonToCsvStream = createJsonToCsvStream(resolvedOptions);
291
+ const dir = path.dirname(safePath);
292
+ await fs.promises.mkdir(dir, { recursive: true });
293
+ const writableStream = fs.createWriteStream(safePath);
294
+ await (0, promises_1.pipeline)(readableStream, jsonToCsvStream, writableStream);
295
+ return;
296
+ }, 'FILE_SYSTEM_ERROR', { function: 'saveJsonStreamAsCsv' });
297
+ }
298
+ function determineHeaders(row, template, renameMap) {
299
+ let headers = Object.keys(template);
300
+ if (headers.length === 0) {
301
+ headers = Object.keys(row);
302
+ }
303
+ else {
304
+ const extraKeys = Object.keys(row).filter((key) => !headers.includes(key));
305
+ headers = headers.concat(extraKeys);
306
+ }
307
+ const outputHeaders = headers.map(header => renameMap[header] || header);
308
+ return { headers, outputHeaders };
309
+ }
310
+ function formatCsvRow(values, delimiter, rfc4180Compliant) {
311
+ const escapedValues = values.map(value => {
312
+ if (rfc4180Compliant) {
313
+ if (value.includes('"') || value.includes(delimiter) || value.includes('\n') || value.includes('\r')) {
314
+ return `"${value.replace(/"/g, '""')}"`;
315
+ }
316
+ return value;
317
+ }
318
+ else {
319
+ if (value.includes(delimiter) || value.includes('\n')) {
320
+ return `"${value}"`;
321
+ }
322
+ return value;
323
+ }
324
+ });
325
+ return escapedValues.join(delimiter) + '\n';
326
+ }
327
+ function isPotentialFormula(value) {
328
+ let idx = 0;
329
+ while (idx < value.length) {
330
+ const code = value.charCodeAt(idx);
331
+ if (code === 32 || code === 9 || code === 10 || code === 13 || code === 0xfeff) {
332
+ idx++;
333
+ continue;
334
+ }
335
+ break;
336
+ }
337
+ if (idx < value.length && (value[idx] === '"' || value[idx] === "'")) {
338
+ idx++;
339
+ while (idx < value.length) {
340
+ const code = value.charCodeAt(idx);
341
+ if (code === 32 || code === 9) {
342
+ idx++;
343
+ continue;
344
+ }
345
+ break;
346
+ }
347
+ }
348
+ if (idx >= value.length) {
349
+ return false;
350
+ }
351
+ const char = value[idx];
352
+ return char === '=' || char === '+' || char === '-' || char === '@';
353
+ }
354
+ function escapeCsvInjection(value) {
355
+ return `'${value}`;
356
+ }
357
+ function flattenObject(obj, separator, maxDepth, arrayHandling) {
358
+ const result = {};
359
+ function flatten(current, prefix, depth) {
360
+ if (depth > maxDepth) {
361
+ return;
362
+ }
363
+ if (Array.isArray(current)) {
364
+ switch (arrayHandling) {
365
+ case 'stringify':
366
+ result[prefix] = JSON.stringify(current);
367
+ break;
368
+ case 'join':
369
+ result[prefix] = current.join(', ');
370
+ break;
371
+ case 'expand':
372
+ result[prefix] = current.join(separator);
373
+ break;
374
+ }
375
+ }
376
+ else if (typeof current === 'object' && current !== null) {
377
+ for (const [key, value] of Object.entries(current)) {
378
+ const newPrefix = prefix ? `${prefix}${separator}${key}` : key;
379
+ flatten(value, newPrefix, depth + 1);
380
+ }
381
+ }
382
+ else {
383
+ result[prefix] = current;
384
+ }
385
+ }
386
+ flatten(obj, '', 0);
387
+ return result;
388
+ }
389
+ //# sourceMappingURL=stream-json-to-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-json-to-csv.js","sourceRoot":"","sources":["../stream-json-to-csv.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Stream JSON to CSV Converter - TypeScript Module\r\n * \r\n * A streaming implementation for converting JSON data to CSV format\r\n * with memory-efficient processing for large files.\r\n */\r\n\r\nimport {\r\n ValidationError,\r\n SecurityError,\r\n LimitError,\r\n ConfigurationError,\r\n safeExecuteSync,\r\n safeExecuteAsync,\r\n ErrorCode\r\n} from './errors';\r\n\r\nimport { Transform, Readable, Writable, TransformCallback } from 'stream';\r\nimport { pipeline } from 'stream/promises';\r\nimport { JsonToCsvStreamOptions, AnyObject, AnyArray } from './src/types';\r\n\r\n// Import schema validator from utils\r\nimport { createSchemaValidators } from './src/utils/schema-validator';\r\n\r\n/**\r\n * Creates a transform stream that converts JSON objects to CSV rows\r\n * \r\n * @param options - Configuration options\r\n * @returns Transform stream\r\n * \r\n * @example\r\n * const { createJsonToCsvStream } = require('./stream-json-to-csv');\r\n * \r\n * const transformStream = createJsonToCsvStream({\r\n * delimiter: ',',\r\n * renameMap: { id: 'ID', name: 'Full Name' }\r\n * });\r\n * \r\n * // Pipe JSON objects to CSV\r\n * jsonReadableStream.pipe(transformStream).pipe(csvWritableStream);\r\n */\r\nexport function createJsonToCsvStream(options: JsonToCsvStreamOptions = {}): Transform {\r\n return safeExecuteSync(() => {\r\n const {\r\n delimiter = ';',\r\n includeHeaders = true,\r\n renameMap = {},\r\n template = {},\r\n maxRecords = Infinity,\r\n transform: customTransform,\r\n schema,\r\n addBOM = false,\r\n preventCsvInjection = true,\r\n rfc4180Compliant = true,\r\n normalizeQuotes = true,\r\n flatten = false,\r\n flattenSeparator = '.',\r\n flattenMaxDepth = 5,\r\n arrayHandling = 'stringify'\r\n } = options;\r\n \r\n // Validate options\r\n if (typeof delimiter !== 'string') {\r\n throw new ConfigurationError('Delimiter must be a string');\r\n }\r\n \r\n if (delimiter.length !== 1) {\r\n throw new ConfigurationError('Delimiter must be a single character');\r\n }\r\n \r\n if (typeof includeHeaders !== 'boolean') {\r\n throw new ConfigurationError('includeHeaders must be a boolean');\r\n }\r\n \r\n if (renameMap && typeof renameMap !== 'object') {\r\n throw new ConfigurationError('renameMap must be an object');\r\n }\r\n\r\n if (template && typeof template !== 'object') {\r\n throw new ConfigurationError('template must be an object');\r\n }\r\n \r\n if (maxRecords !== Infinity && (typeof maxRecords !== 'number' || maxRecords <= 0)) {\r\n throw new ConfigurationError('maxRecords must be a positive number or Infinity');\r\n }\r\n\r\n if (customTransform !== undefined && typeof customTransform !== 'function') {\r\n throw new ConfigurationError('transform must be a function');\r\n }\r\n\r\n if (schema && typeof schema !== 'object') {\r\n throw new ConfigurationError('schema must be an object');\r\n }\r\n\r\n if (normalizeQuotes !== undefined && typeof normalizeQuotes !== 'boolean') {\r\n throw new ConfigurationError('normalizeQuotes must be a boolean');\r\n }\r\n \r\n // Create schema validator if schema is provided\r\n // TODO: Fix schema validator types\r\n const schemaValidators = schema ? createSchemaValidators(schema) : null;\r\n \r\n let headers: string[] = [];\r\n let outputHeaders: string[] = [];\r\n let headersWritten = false;\r\n let recordCount = 0;\r\n const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\r\n\r\n const normalizeQuotesInField = (value: string): string => {\r\n // Не нормализуем кавычки в JSON-строках - это ломает структуру JSON\r\n // Проверяем, выглядит ли значение как JSON (объект или массив)\r\n if ((value.startsWith('{') && value.endsWith('}')) ||\r\n (value.startsWith('[') && value.endsWith(']'))) {\r\n return value; // Возвращаем как есть для JSON\r\n }\r\n \r\n let normalized = value.replace(/\"{2,}/g, '\"');\r\n // Убираем правило, которое ломает JSON: не заменяем \",\" на \",\"\r\n // normalized = normalized.replace(/\"\\s*,\\s*\"/g, ',');\r\n normalized = normalized.replace(/\"\\n/g, '\\n').replace(/\\n\"/g, '\\n');\r\n if (normalized.length >= 2 && normalized.startsWith('\"') && normalized.endsWith('\"')) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n return normalized;\r\n };\r\n\r\n const normalizePhoneValue = (value: string): string => {\r\n const trimmed = value.trim();\r\n if (trimmed === '') {\r\n return trimmed;\r\n }\r\n return trimmed.replace(/[\"'\\\\]/g, '');\r\n };\r\n\r\n const normalizeValueForCsv = (value: any, key: string) => {\r\n if (!normalizeQuotes || typeof value !== 'string') {\r\n return value;\r\n }\r\n const base = normalizeQuotesInField(value);\r\n if (phoneKeys.has(String(key).toLowerCase())) {\r\n return normalizePhoneValue(base);\r\n }\r\n return base;\r\n };\r\n \r\n // Create transform stream\r\n const transformStream = new Transform({\r\n objectMode: true,\r\n \r\n transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback) {\r\n try {\r\n // Check max records limit\r\n if (recordCount >= maxRecords) {\r\n throw new LimitError(\r\n `Data size exceeds maximum limit of ${maxRecords} records`,\r\n maxRecords,\r\n recordCount + 1\r\n );\r\n }\r\n \r\n // Validate chunk is an object\r\n if (typeof chunk !== 'object' || chunk === null) {\r\n throw new ValidationError('Input data must be objects');\r\n }\r\n \r\n let row: AnyObject = chunk;\r\n \r\n // Apply schema validation if provided\r\n if (schemaValidators && Object.keys(schemaValidators).length > 0) {\r\n for (const [field, validator] of Object.entries(schemaValidators)) {\r\n const typedValidator = validator as any;\r\n const value = row[field];\r\n if (typeof typedValidator.validate === 'function' && !typedValidator.validate(value)) {\r\n throw new ValidationError(`Invalid value for field \"${field}\"`);\r\n }\r\n if (typeof typedValidator.format === 'function') {\r\n row[field] = typedValidator.format(value);\r\n }\r\n }\r\n }\r\n \r\n // Apply custom transform if provided\r\n if (customTransform) {\r\n let transformed: AnyObject;\r\n try {\r\n transformed = customTransform(row);\r\n } catch (error: any) {\r\n throw new ValidationError(`Transform function error: ${error.message}`);\r\n }\r\n if (!transformed || typeof transformed !== 'object') {\r\n throw new ValidationError('Transform function must return an object');\r\n }\r\n row = transformed;\r\n }\r\n \r\n // Flatten nested objects if enabled\r\n if (flatten) {\r\n row = flattenObject(row, flattenSeparator, flattenMaxDepth, arrayHandling);\r\n }\r\n \r\n // Determine headers on first row\r\n if (!headersWritten) {\r\n const resolvedHeaders = determineHeaders(row, template, renameMap);\r\n headers = resolvedHeaders.headers;\r\n outputHeaders = resolvedHeaders.outputHeaders;\r\n \r\n // Write BOM if enabled\r\n if (addBOM && includeHeaders) {\r\n this.push('\\uFEFF');\r\n }\r\n \r\n // Write headers if enabled\r\n if (includeHeaders) {\r\n const headerRow = formatCsvRow(outputHeaders, delimiter, rfc4180Compliant);\r\n this.push(headerRow);\r\n }\r\n \r\n headersWritten = true;\r\n }\r\n \r\n // Convert row to CSV\r\n const values = headers.map(header => {\r\n let value = row[header];\r\n \r\n // Handle undefined/null values\r\n if (value === undefined || value === null) {\r\n return '';\r\n }\r\n \r\n // Handle arrays based on arrayHandling option\r\n if (Array.isArray(value)) {\r\n switch (arrayHandling) {\r\n case 'stringify':\r\n value = JSON.stringify(value);\r\n break;\r\n case 'join':\r\n value = value.join(', ');\r\n break;\r\n case 'expand':\r\n // For expand, we would need to handle differently\r\n // For now, join with semicolon\r\n value = value.join('; ');\r\n break;\r\n }\r\n }\r\n \r\n value = normalizeValueForCsv(value, header);\r\n\r\n // Convert to string\r\n const stringValue = String(value);\r\n \r\n // Prevent CSV injection if enabled\r\n if (preventCsvInjection && isPotentialFormula(stringValue)) {\r\n return escapeCsvInjection(stringValue);\r\n }\r\n \r\n return stringValue;\r\n });\r\n \r\n const csvRow = formatCsvRow(values, delimiter, rfc4180Compliant);\r\n this.push(csvRow);\r\n \r\n recordCount++;\r\n callback();\r\n } catch (error: any) {\r\n callback(error);\r\n }\r\n },\r\n \r\n flush(callback: TransformCallback) {\r\n try {\r\n if (!headersWritten && includeHeaders) {\r\n const templateKeys = Object.keys(template || {});\r\n if (templateKeys.length > 0) {\r\n headers = templateKeys;\r\n outputHeaders = headers.map(header => renameMap[header] || header);\r\n \r\n if (addBOM) {\r\n this.push('\\uFEFF');\r\n }\r\n const headerRow = formatCsvRow(outputHeaders, delimiter, rfc4180Compliant);\r\n this.push(headerRow);\r\n headersWritten = true;\r\n }\r\n }\r\n callback();\r\n } catch (error: any) {\r\n callback(error);\r\n }\r\n }\r\n });\r\n \r\n return transformStream;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createJsonToCsvStream' });\r\n}\r\n\r\n/**\r\n * Creates a readable stream from JSON data\r\n * \r\n * @param data - JSON data (array or object)\r\n * @param options - Stream options\r\n * @returns Readable stream\r\n */\r\nexport function createJsonReadableStream(\r\n data: AnyArray | AnyObject,\r\n options: { objectMode?: boolean } = {}\r\n): Readable {\r\n return safeExecuteSync(() => {\r\n const { objectMode = true } = options;\r\n \r\n if (!Array.isArray(data) && (typeof data !== 'object' || data === null)) {\r\n throw new ValidationError('Data must be an array or object');\r\n }\r\n \r\n const items = Array.isArray(data) ? data : [data];\r\n let index = 0;\r\n \r\n const readable = new Readable({\r\n objectMode,\r\n \r\n read() {\r\n if (index < items.length) {\r\n (this as any)._index = index + 1;\r\n this.push(items[index]);\r\n index++;\r\n } else {\r\n (this as any)._index = index;\r\n this.push(null);\r\n }\r\n }\r\n });\r\n (readable as any)._index = index;\r\n return readable;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createJsonReadableStream' });\r\n}\r\n\r\n/**\r\n * Creates a collector stream that accumulates CSV output\r\n * \r\n * @param options - Stream options\r\n * @returns Transform stream that collects CSV data\r\n */\r\nexport function createCsvCollectorStream(\r\n options: JsonToCsvStreamOptions = {}\r\n): Transform {\r\n return safeExecuteSync(() => {\r\n let collectedData = '';\r\n \r\n const transformStream = new Transform({\r\n writableObjectMode: false,\r\n readableObjectMode: false,\r\n \r\n transform(chunk: Buffer | string, encoding: BufferEncoding, callback: TransformCallback) {\r\n collectedData += chunk.toString();\r\n (transformStream as any)._collectedData = collectedData;\r\n callback();\r\n },\r\n \r\n flush(callback: TransformCallback) {\r\n this.push(collectedData);\r\n (transformStream as any)._collectedData = collectedData;\r\n callback();\r\n }\r\n });\r\n\r\n (transformStream as any)._collectedData = collectedData;\r\n \r\n // Pipe through JSON to CSV converter if options provided\r\n if (Object.keys(options).length > 0) {\r\n const jsonToCsvStream = createJsonToCsvStream(options);\r\n jsonToCsvStream.pipe(transformStream);\r\n return jsonToCsvStream;\r\n }\r\n \r\n return transformStream;\r\n }, 'STREAM_CREATION_ERROR', { function: 'createCsvCollectorStream' });\r\n}\r\n\r\n/**\r\n * Streams JSON data to CSV format\r\n * \r\n * @param data - JSON data to convert\r\n * @param options - Conversion options\r\n * @returns Promise with CSV string\r\n */\r\nexport async function streamJsonToCsv(\r\n data: AnyArray | AnyObject,\r\n options?: JsonToCsvStreamOptions\r\n): Promise<string>;\r\nexport async function streamJsonToCsv(\r\n readableStream: Readable,\r\n writableStream: Writable,\r\n options?: JsonToCsvStreamOptions\r\n): Promise<void>;\r\nexport async function streamJsonToCsv(\r\n dataOrStream: AnyArray | AnyObject | Readable,\r\n outputOrOptions: Writable | JsonToCsvStreamOptions = {},\r\n options: JsonToCsvStreamOptions = {}\r\n): Promise<string | void> {\r\n return safeExecuteAsync(async () => {\r\n const isReadableStream = dataOrStream instanceof Readable\r\n || (dataOrStream && typeof (dataOrStream as Readable).pipe === 'function');\r\n const isWritableStream = outputOrOptions instanceof Writable\r\n || (outputOrOptions && typeof (outputOrOptions as Writable).write === 'function');\r\n\r\n if (isReadableStream && isWritableStream) {\r\n const jsonToCsvStream = createJsonToCsvStream(options);\r\n await pipeline(\r\n dataOrStream as Readable,\r\n jsonToCsvStream,\r\n outputOrOptions as Writable\r\n );\r\n return;\r\n }\r\n\r\n const streamOptions = (outputOrOptions as JsonToCsvStreamOptions) || {};\r\n const readableStream = createJsonReadableStream(dataOrStream as AnyArray | AnyObject);\r\n const jsonToCsvStream = createJsonToCsvStream(streamOptions);\r\n const collectorStream = createCsvCollectorStream();\r\n \r\n await pipeline(\r\n readableStream,\r\n jsonToCsvStream,\r\n collectorStream\r\n );\r\n \r\n return (collectorStream as any)._collectedData || '';\r\n }, 'STREAM_PROCESSING_ERROR', { function: 'streamJsonToCsv' });\r\n}\r\n\r\n/**\r\n * Asynchronous version with worker thread support\r\n */\r\nexport async function streamJsonToCsvAsync(\r\n data: AnyArray | AnyObject,\r\n options: JsonToCsvStreamOptions & {\r\n useWorkers?: boolean;\r\n workerCount?: number;\r\n chunkSize?: number;\r\n onProgress?: (progress: { processed: number; total: number; percentage: number }) => void;\r\n } = {}\r\n): Promise<string> {\r\n return safeExecuteAsync(async () => {\r\n const { useWorkers = false, workerCount, chunkSize, onProgress, ...streamOptions } = options;\r\n \r\n // For now, use the standard streaming version\r\n // TODO: Implement worker thread support for large datasets\r\n return streamJsonToCsv(data, streamOptions);\r\n }, 'STREAM_PROCESSING_ERROR', { function: 'streamJsonToCsvAsync' });\r\n}\r\n\r\n/**\r\n * Saves JSON stream as CSV file\r\n * \r\n * @param readableStream - Readable stream of JSON objects\r\n * @param filePath - Path to save CSV file\r\n * @param options - Conversion options\r\n * @returns Promise<void>\r\n */\r\nexport async function saveJsonStreamAsCsv(\r\n readableStream: Readable,\r\n filePath: string,\r\n options: JsonToCsvStreamOptions & { validatePath?: boolean } = {}\r\n): Promise<void> {\r\n return safeExecuteAsync(async () => {\r\n const { validatePath = true, ...streamOptions } = options;\r\n\r\n const fs = require('fs');\r\n const path = require('path');\r\n let safePath = filePath;\r\n \r\n // Validate file path if requested\r\n if (validatePath) {\r\n if (typeof filePath !== 'string' || filePath.trim().length === 0) {\r\n throw new ValidationError('File path must be a non-empty string');\r\n }\r\n const normalized = path.normalize(filePath.trim());\r\n const traversalPattern = /(^|[\\\\/])\\.\\.([\\\\/]|$)/;\r\n if (traversalPattern.test(normalized)) {\r\n throw new SecurityError('Directory traversal detected in file path');\r\n }\r\n if (path.extname(normalized).toLowerCase() !== '.csv') {\r\n throw new ValidationError('File must have .csv extension');\r\n }\r\n safePath = normalized;\r\n }\r\n\r\n const resolvedOptions = {\r\n ...streamOptions,\r\n addBOM: streamOptions.addBOM !== undefined ? streamOptions.addBOM : true\r\n };\r\n const jsonToCsvStream = createJsonToCsvStream(resolvedOptions);\r\n const dir = path.dirname(safePath);\r\n await fs.promises.mkdir(dir, { recursive: true });\r\n const writableStream = fs.createWriteStream(safePath);\r\n \r\n await pipeline(\r\n readableStream,\r\n jsonToCsvStream,\r\n writableStream\r\n );\r\n \r\n return;\r\n }, 'FILE_SYSTEM_ERROR', { function: 'saveJsonStreamAsCsv' });\r\n}\r\n\r\n// ============================================================================\r\n// Helper functions\r\n// ============================================================================\r\n\r\n/**\r\n * Determines headers from data, template, and rename map\r\n */\r\nfunction determineHeaders(\r\n row: AnyObject,\r\n template: AnyObject,\r\n renameMap: Record<string, string>\r\n): { headers: string[]; outputHeaders: string[] } {\r\n // Start with template keys if provided\r\n let headers = Object.keys(template);\r\n \r\n // If no template, use row keys\r\n if (headers.length === 0) {\r\n headers = Object.keys(row);\r\n } else {\r\n const extraKeys = Object.keys(row).filter((key) => !headers.includes(key));\r\n headers = headers.concat(extraKeys);\r\n }\r\n \r\n // Apply rename map\r\n const outputHeaders = headers.map(header => renameMap[header] || header);\r\n \r\n return { headers, outputHeaders };\r\n}\r\n\r\n/**\r\n * Formats a CSV row with proper quoting\r\n */\r\nfunction formatCsvRow(\r\n values: string[],\r\n delimiter: string,\r\n rfc4180Compliant: boolean\r\n): string {\r\n const escapedValues = values.map(value => {\r\n if (rfc4180Compliant) {\r\n // RFC 4180 compliant escaping\r\n if (value.includes('\"') || value.includes(delimiter) || value.includes('\\n') || value.includes('\\r')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n } else {\r\n // Simple escaping\r\n if (value.includes(delimiter) || value.includes('\\n')) {\r\n return `\"${value}\"`;\r\n }\r\n return value;\r\n }\r\n });\r\n \r\n return escapedValues.join(delimiter) + '\\n';\r\n}\r\n\r\n/**\r\n * Checks if a string is a potential CSV injection\r\n */\r\nfunction isPotentialFormula(value: string): boolean {\r\n let idx = 0;\r\n while (idx < value.length) {\r\n const code = value.charCodeAt(idx);\r\n if (code === 32 || code === 9 || code === 10 || code === 13 || code === 0xfeff) {\r\n idx++;\r\n continue;\r\n }\r\n break;\r\n }\r\n if (idx < value.length && (value[idx] === '\"' || value[idx] === \"'\")) {\r\n idx++;\r\n while (idx < value.length) {\r\n const code = value.charCodeAt(idx);\r\n if (code === 32 || code === 9) {\r\n idx++;\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n if (idx >= value.length) {\r\n return false;\r\n }\r\n const char = value[idx];\r\n return char === '=' || char === '+' || char === '-' || char === '@';\r\n}\r\n\r\n/**\r\n * Escapes CSV injection characters\r\n */\r\nfunction escapeCsvInjection(value: string): string {\r\n // Prefix with apostrophe to prevent formula execution in Excel\r\n return `'${value}`;\r\n}\r\n\r\n/**\r\n * Flattens nested objects\r\n */\r\nfunction flattenObject(\r\n obj: AnyObject,\r\n separator: string,\r\n maxDepth: number,\r\n arrayHandling: string\r\n): AnyObject {\r\n const result: AnyObject = {};\r\n \r\n function flatten(current: any, prefix: string, depth: number) {\r\n if (depth > maxDepth) {\r\n return;\r\n }\r\n \r\n if (Array.isArray(current)) {\r\n switch (arrayHandling) {\r\n case 'stringify':\r\n result[prefix] = JSON.stringify(current);\r\n break;\r\n case 'join':\r\n result[prefix] = current.join(', ');\r\n break;\r\n case 'expand':\r\n // For expand, we would create multiple columns\r\n // For now, join with separator\r\n result[prefix] = current.join(separator);\r\n break;\r\n }\r\n } else if (typeof current === 'object' && current !== null) {\r\n for (const [key, value] of Object.entries(current)) {\r\n const newPrefix = prefix ? `${prefix}${separator}${key}` : key;\r\n flatten(value, newPrefix, depth + 1);\r\n }\r\n } else {\r\n result[prefix] = current;\r\n }\r\n }\r\n \r\n flatten(obj, '', 0);\r\n return result;\r\n}\r\n"]}