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":"json-to-csv-browser.js","sourceRoot":"","sources":["../../../src/browser/json-to-csv-browser.ts"],"names":[],"mappings":"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","sourcesContent":["// Браузерная версия JSON to CSV конвертера\r\n// Адаптирована для работы в браузере без Node.js API\r\n\r\nimport {\r\n ValidationError,\r\n ConfigurationError,\r\n LimitError,\r\n safeExecute\r\n} from './errors-browser';\r\n\r\nimport type { JsonToCsvOptions } from '../types';\r\n\r\n/**\r\n * Валидация входных данных и опций\r\n * @private\r\n */\r\nfunction validateInput(data: any[], options: JsonToCsvOptions): boolean {\r\n // Validate data\r\n if (!Array.isArray(data)) {\r\n throw new ValidationError('Input data must be an array');\r\n }\r\n \r\n // Validate options\r\n if (options && typeof options !== 'object') {\r\n throw new ConfigurationError('Options must be an object');\r\n }\r\n \r\n // Validate delimiter\r\n if (options?.delimiter && typeof options.delimiter !== 'string') {\r\n throw new ConfigurationError('Delimiter must be a string');\r\n }\r\n \r\n if (options?.delimiter && options.delimiter.length !== 1) {\r\n throw new ConfigurationError('Delimiter must be a single character');\r\n }\r\n \r\n // Validate renameMap\r\n if (options?.renameMap && typeof options.renameMap !== 'object') {\r\n throw new ConfigurationError('renameMap must be an object');\r\n }\r\n \r\n // Validate maxRecords\r\n if (options && options.maxRecords !== undefined) {\r\n if (typeof options.maxRecords !== 'number' || options.maxRecords <= 0) {\r\n throw new ConfigurationError('maxRecords must be a positive number');\r\n }\r\n }\r\n \r\n // Validate preventCsvInjection\r\n if (options?.preventCsvInjection !== undefined && typeof options.preventCsvInjection !== 'boolean') {\r\n throw new ConfigurationError('preventCsvInjection must be a boolean');\r\n }\r\n \r\n // Validate rfc4180Compliant\r\n if (options?.rfc4180Compliant !== undefined && typeof options.rfc4180Compliant !== 'boolean') {\r\n throw new ConfigurationError('rfc4180Compliant must be a boolean');\r\n }\r\n\r\n if (options?.normalizeQuotes !== undefined && typeof options.normalizeQuotes !== 'boolean') {\r\n throw new ConfigurationError('normalizeQuotes must be a boolean');\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n * Экранирование CSV значений для предотвращения инъекций\r\n * @private\r\n */\r\nfunction escapeCsvValue(value: string, preventInjection: boolean = true): string {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n \r\n const str = String(value);\r\n const isPotentialFormula = (input: string): boolean => {\r\n let idx = 0;\r\n while (idx < input.length) {\r\n const code = input.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 < input.length && (input[idx] === '\"' || input[idx] === \"'\")) {\r\n idx++;\r\n while (idx < input.length) {\r\n const code = input.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 >= input.length) {\r\n return false;\r\n }\r\n const char = input[idx];\r\n return char === '=' || char === '+' || char === '-' || char === '@';\r\n };\r\n \r\n // Экранирование формул для предотвращения CSV инъекций\r\n if (preventInjection && isPotentialFormula(str)) {\r\n return \"'\" + str;\r\n }\r\n \r\n // Экранирование кавычек и переносов строк\r\n if (str.includes('\"') || str.includes('\\n') || str.includes('\\r') || str.includes(',')) {\r\n return '\"' + str.replace(/\"/g, '\"\"') + '\"';\r\n }\r\n \r\n return str;\r\n}\r\n\r\nfunction 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\nfunction 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\nfunction normalizeValueForCsv(value: any, key: string | undefined, normalizeQuotes: boolean): any {\r\n if (!normalizeQuotes || typeof value !== 'string') {\r\n return value;\r\n }\r\n const base = normalizeQuotesInField(value);\r\n if (!key) {\r\n return base;\r\n }\r\n const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\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/**\r\n * Извлечение всех уникальных ключей из массива объектов\r\n * @private\r\n */\r\nfunction extractAllKeys(data: any[]): string[] {\r\n const keys = new Set<string>();\r\n \r\n for (const item of data) {\r\n if (item && typeof item === 'object') {\r\n Object.keys(item).forEach(key => keys.add(key));\r\n }\r\n }\r\n \r\n return Array.from(keys);\r\n}\r\n\r\n/**\r\n * Конвертация массива объектов в CSV строку\r\n * \r\n * @param data - Массив объектов для конвертации\r\n * @param options - Опции конвертации\r\n * @returns CSV строка\r\n */\r\nexport function jsonToCsv(data: any[], options: JsonToCsvOptions = {}): string {\r\n return safeExecute(() => {\r\n validateInput(data, options);\r\n \r\n if (data.length === 0) {\r\n return '';\r\n }\r\n \r\n // Настройки по умолчанию\r\n const delimiter = options.delimiter || ';';\r\n const includeHeaders = options.includeHeaders !== false;\r\n const maxRecords = options.maxRecords || data.length;\r\n const preventInjection = options.preventCsvInjection !== false;\r\n const rfc4180Compliant = options.rfc4180Compliant !== false;\r\n const normalizeQuotes = options.normalizeQuotes !== false;\r\n \r\n // Ограничение количества записей\r\n const limitedData = data.slice(0, maxRecords);\r\n \r\n // Извлечение всех ключей\r\n const allKeys = extractAllKeys(limitedData);\r\n \r\n // Применение renameMap если есть\r\n const renameMap = options.renameMap || {};\r\n const finalKeys = allKeys.map(key => renameMap[key] || key);\r\n \r\n // Создание CSV строки\r\n const lines: string[] = [];\r\n \r\n // Заголовки\r\n if (includeHeaders) {\r\n const headerLine = finalKeys.map(key => escapeCsvValue(key, preventInjection)).join(delimiter);\r\n lines.push(headerLine);\r\n }\r\n \r\n // Данные\r\n for (const item of limitedData) {\r\n const rowValues = allKeys.map(key => {\r\n const value = item?.[key];\r\n const normalized = normalizeValueForCsv(value, key, normalizeQuotes);\r\n return escapeCsvValue(normalized, preventInjection);\r\n });\r\n \r\n lines.push(rowValues.join(delimiter));\r\n }\r\n \r\n // RFC 4180 compliance: CRLF line endings\r\n if (rfc4180Compliant) {\r\n return lines.join('\\r\\n');\r\n }\r\n \r\n return lines.join('\\n');\r\n });\r\n}\r\n\r\n/**\r\n * Асинхронная версия jsonToCsv\r\n */\r\nexport async function jsonToCsvAsync(data: any[], options: JsonToCsvOptions = {}): Promise<string> {\r\n return jsonToCsv(data, options);\r\n}\r\n\r\n/**\r\n * Создает итератор для потоковой конвертации JSON в CSV\r\n * \r\n * @param data - Массив объектов или async итератор\r\n * @param options - Опции конвертации\r\n * @returns AsyncIterator с CSV чанками\r\n */\r\nexport async function* jsonToCsvIterator(data: any[] | AsyncIterable<any>, options: JsonToCsvOptions = {}): AsyncGenerator<string> {\r\n validateInput(Array.isArray(data) ? data : [], options);\r\n \r\n const delimiter = options.delimiter || ';';\r\n const includeHeaders = options.includeHeaders !== false;\r\n const preventInjection = options.preventCsvInjection !== false;\r\n const rfc4180Compliant = options.rfc4180Compliant !== false;\r\n const normalizeQuotes = options.normalizeQuotes !== false;\r\n \r\n let isFirstChunk = true;\r\n let allKeys: string[] = [];\r\n let renameMap: Record<string, string> = {};\r\n \r\n // Если данные - массив, обрабатываем как массив\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) {\r\n return;\r\n }\r\n \r\n allKeys = extractAllKeys(data);\r\n renameMap = options.renameMap || {};\r\n const finalKeys = allKeys.map(key => renameMap[key] || key);\r\n \r\n // Заголовки\r\n if (includeHeaders) {\r\n const headerLine = finalKeys.map(key => escapeCsvValue(key, preventInjection)).join(delimiter);\r\n yield headerLine + (rfc4180Compliant ? '\\r\\n' : '\\n');\r\n }\r\n \r\n // Данные\r\n for (const item of data) {\r\n const rowValues = allKeys.map(key => {\r\n const value = item?.[key];\r\n const normalized = normalizeValueForCsv(value, key, normalizeQuotes);\r\n return escapeCsvValue(normalized, preventInjection);\r\n });\r\n \r\n yield rowValues.join(delimiter) + (rfc4180Compliant ? '\\r\\n' : '\\n');\r\n }\r\n } else {\r\n // Для async итератора нужна другая логика\r\n throw new ValidationError('Async iterators not yet implemented in browser version');\r\n }\r\n}\r\n\r\n/**\r\n * Асинхронная версия jsonToCsvIterator (псевдоним)\r\n */\r\nexport const jsonToCsvIteratorAsync = jsonToCsvIterator;\r\n\r\n/**\r\n * Безопасная конвертация с обработкой ошибок\r\n * \r\n * @param data - Массив объектов\r\n * @param options - Опции конвертации\r\n * @returns CSV строка или null при ошибке\r\n */\r\nexport function jsonToCsvSafe(data: any[], options: JsonToCsvOptions = {}): string | null {\r\n try {\r\n return jsonToCsv(data, options);\r\n } catch (error) {\r\n console.error('JSON to CSV conversion error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Асинхронная версия jsonToCsvSafe\r\n */\r\nexport async function jsonToCsvSafeAsync(data: any[], options: JsonToCsvOptions = {}): Promise<string | null> {\r\n try {\r\n return await jsonToCsvAsync(data, options);\r\n } catch (error) {\r\n console.error('JSON to CSV conversion error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// Экспорт для Node.js совместимости\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = {\r\n jsonToCsv,\r\n jsonToCsvAsync,\r\n jsonToCsvIterator,\r\n jsonToCsvIteratorAsync,\r\n jsonToCsvSafe,\r\n jsonToCsvSafeAsync\r\n };\r\n}\r\n"]}
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsonToCsvStream = jsonToCsvStream;
4
+ exports.jsonToNdjsonStream = jsonToNdjsonStream;
5
+ exports.csvToJsonStream = csvToJsonStream;
6
+ exports.jsonToCsvStreamAsync = jsonToCsvStreamAsync;
7
+ exports.jsonToNdjsonStreamAsync = jsonToNdjsonStreamAsync;
8
+ exports.csvToJsonStreamAsync = csvToJsonStreamAsync;
9
+ const errors_browser_1 = require("./errors-browser");
10
+ const csv_to_json_browser_1 = require("./csv-to-json-browser");
11
+ const DEFAULT_MAX_CHUNK_SIZE = 64 * 1024;
12
+ const PHONE_KEYS = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);
13
+ function isReadableStream(value) {
14
+ return value && typeof value.getReader === 'function';
15
+ }
16
+ function isAsyncIterable(value) {
17
+ return value && typeof value[Symbol.asyncIterator] === 'function';
18
+ }
19
+ function isIterable(value) {
20
+ return value && typeof value[Symbol.iterator] === 'function';
21
+ }
22
+ function createReadableStreamFromIterator(iterator) {
23
+ return new ReadableStream({
24
+ async pull(controller) {
25
+ try {
26
+ const { value, done } = await iterator.next();
27
+ if (done) {
28
+ controller.close();
29
+ return;
30
+ }
31
+ controller.enqueue(value);
32
+ }
33
+ catch (error) {
34
+ controller.error(error);
35
+ }
36
+ },
37
+ cancel() {
38
+ if (iterator.return) {
39
+ iterator.return();
40
+ }
41
+ }
42
+ });
43
+ }
44
+ function detectInputFormat(input, options) {
45
+ if (options && options.inputFormat) {
46
+ return options.inputFormat;
47
+ }
48
+ if (typeof input === 'string') {
49
+ const trimmed = input.trim();
50
+ if (trimmed === '') {
51
+ return 'unknown';
52
+ }
53
+ if (trimmed.includes('\n')) {
54
+ const lines = trimmed.split('\n').filter(line => line.trim() !== '');
55
+ if (lines.length > 0) {
56
+ try {
57
+ JSON.parse(lines[0]);
58
+ return 'ndjson';
59
+ }
60
+ catch {
61
+ }
62
+ }
63
+ }
64
+ try {
65
+ const parsed = JSON.parse(trimmed);
66
+ if (Array.isArray(parsed) || (parsed && typeof parsed === 'object')) {
67
+ return 'json';
68
+ }
69
+ }
70
+ catch {
71
+ }
72
+ if (trimmed.includes(',') || trimmed.includes(';') || trimmed.includes('\t')) {
73
+ return 'csv';
74
+ }
75
+ }
76
+ return 'unknown';
77
+ }
78
+ function normalizeQuotesInField(value) {
79
+ if ((value.startsWith('{') && value.endsWith('}')) ||
80
+ (value.startsWith('[') && value.endsWith(']'))) {
81
+ return value;
82
+ }
83
+ let normalized = value.replace(/"{2,}/g, '"');
84
+ normalized = normalized.replace(/"\n/g, '\n').replace(/\n"/g, '\n');
85
+ if (normalized.length >= 2 && normalized.startsWith('"') && normalized.endsWith('"')) {
86
+ normalized = normalized.slice(1, -1);
87
+ }
88
+ return normalized;
89
+ }
90
+ function normalizePhoneValue(value) {
91
+ const trimmed = value.trim();
92
+ if (trimmed === '') {
93
+ return trimmed;
94
+ }
95
+ return trimmed.replace(/["'\\]/g, '');
96
+ }
97
+ function normalizeValueForCsv(value, key, normalizeQuotes) {
98
+ if (!normalizeQuotes || typeof value !== 'string') {
99
+ return value;
100
+ }
101
+ const base = normalizeQuotesInField(value);
102
+ if (key && PHONE_KEYS.has(String(key).toLowerCase())) {
103
+ return normalizePhoneValue(base);
104
+ }
105
+ return base;
106
+ }
107
+ async function* jsonToCsvChunkIterator(input, options = {}) {
108
+ const format = detectInputFormat(input, options);
109
+ if (format === 'csv') {
110
+ throw new errors_browser_1.ValidationError('Input appears to be CSV, not JSON');
111
+ }
112
+ function toAsyncIterator(iterable) {
113
+ if (isAsyncIterable(iterable)) {
114
+ return iterable[Symbol.asyncIterator]();
115
+ }
116
+ if (isIterable(iterable)) {
117
+ const syncIterator = iterable[Symbol.iterator]();
118
+ return {
119
+ next: () => Promise.resolve(syncIterator.next()),
120
+ return: syncIterator.return ? () => Promise.resolve(syncIterator.return()) : undefined,
121
+ throw: syncIterator.throw ? (error) => Promise.resolve(syncIterator.throw(error)) : undefined
122
+ };
123
+ }
124
+ throw new errors_browser_1.ValidationError('Input is not iterable');
125
+ }
126
+ let iterator;
127
+ if (isAsyncIterable(input) || isIterable(input)) {
128
+ iterator = toAsyncIterator(input);
129
+ }
130
+ else if (typeof input === 'string') {
131
+ const parsed = JSON.parse(input);
132
+ if (Array.isArray(parsed)) {
133
+ iterator = toAsyncIterator(parsed);
134
+ }
135
+ else {
136
+ iterator = toAsyncIterator([parsed]);
137
+ }
138
+ }
139
+ else if (Array.isArray(input)) {
140
+ iterator = toAsyncIterator(input);
141
+ }
142
+ else {
143
+ iterator = toAsyncIterator([input]);
144
+ }
145
+ const delimiter = options.delimiter || ';';
146
+ const includeHeaders = options.includeHeaders !== false;
147
+ const preventInjection = options.preventCsvInjection !== false;
148
+ const normalizeQuotes = options.normalizeQuotes !== false;
149
+ const isPotentialFormula = (input) => {
150
+ let idx = 0;
151
+ while (idx < input.length) {
152
+ const code = input.charCodeAt(idx);
153
+ if (code === 32 || code === 9 || code === 10 || code === 13 || code === 0xfeff) {
154
+ idx++;
155
+ continue;
156
+ }
157
+ break;
158
+ }
159
+ if (idx < input.length && (input[idx] === '"' || input[idx] === "'")) {
160
+ idx++;
161
+ while (idx < input.length) {
162
+ const code = input.charCodeAt(idx);
163
+ if (code === 32 || code === 9) {
164
+ idx++;
165
+ continue;
166
+ }
167
+ break;
168
+ }
169
+ }
170
+ if (idx >= input.length) {
171
+ return false;
172
+ }
173
+ const char = input[idx];
174
+ return char === '=' || char === '+' || char === '-' || char === '@';
175
+ };
176
+ let isFirstChunk = true;
177
+ let headers = [];
178
+ while (true) {
179
+ const { value, done } = await iterator.next();
180
+ if (done)
181
+ break;
182
+ const item = value;
183
+ if (isFirstChunk) {
184
+ headers = Object.keys(item);
185
+ if (includeHeaders) {
186
+ const headerLine = headers.map(header => {
187
+ const escaped = header.includes('"') ? `"${header.replace(/"/g, '""')}"` : header;
188
+ return preventInjection && isPotentialFormula(escaped) ? `'${escaped}` : escaped;
189
+ }).join(delimiter);
190
+ yield headerLine + '\n';
191
+ }
192
+ isFirstChunk = false;
193
+ }
194
+ const row = headers.map(header => {
195
+ const value = item[header];
196
+ const normalized = normalizeValueForCsv(value, header, normalizeQuotes);
197
+ const strValue = normalized === null || normalized === undefined ? '' : String(normalized);
198
+ if (strValue.includes('"') || strValue.includes('\n') || strValue.includes('\r') || strValue.includes(delimiter)) {
199
+ return `"${strValue.replace(/"/g, '""')}"`;
200
+ }
201
+ if (preventInjection && isPotentialFormula(strValue)) {
202
+ return `'${strValue}`;
203
+ }
204
+ return strValue;
205
+ }).join(delimiter);
206
+ yield row + '\n';
207
+ }
208
+ }
209
+ async function* jsonToNdjsonChunkIterator(input, options = {}) {
210
+ const format = detectInputFormat(input, options);
211
+ function toAsyncIterator(iterable) {
212
+ if (isAsyncIterable(iterable)) {
213
+ return iterable[Symbol.asyncIterator]();
214
+ }
215
+ if (isIterable(iterable)) {
216
+ const syncIterator = iterable[Symbol.iterator]();
217
+ return {
218
+ next: () => Promise.resolve(syncIterator.next()),
219
+ return: syncIterator.return ? () => Promise.resolve(syncIterator.return()) : undefined,
220
+ throw: syncIterator.throw ? (error) => Promise.resolve(syncIterator.throw(error)) : undefined
221
+ };
222
+ }
223
+ throw new errors_browser_1.ValidationError('Input is not iterable');
224
+ }
225
+ let iterator;
226
+ if (isAsyncIterable(input) || isIterable(input)) {
227
+ iterator = toAsyncIterator(input);
228
+ }
229
+ else if (typeof input === 'string') {
230
+ if (format === 'ndjson') {
231
+ const lines = input.split('\n').filter(line => line.trim() !== '');
232
+ iterator = toAsyncIterator(lines);
233
+ }
234
+ else {
235
+ const parsed = JSON.parse(input);
236
+ if (Array.isArray(parsed)) {
237
+ iterator = toAsyncIterator(parsed);
238
+ }
239
+ else {
240
+ iterator = toAsyncIterator([parsed]);
241
+ }
242
+ }
243
+ }
244
+ else if (Array.isArray(input)) {
245
+ iterator = toAsyncIterator(input);
246
+ }
247
+ else {
248
+ iterator = toAsyncIterator([input]);
249
+ }
250
+ while (true) {
251
+ const { value, done } = await iterator.next();
252
+ if (done)
253
+ break;
254
+ let jsonStr;
255
+ if (typeof value === 'string') {
256
+ try {
257
+ JSON.parse(value);
258
+ jsonStr = value;
259
+ }
260
+ catch {
261
+ jsonStr = JSON.stringify(value);
262
+ }
263
+ }
264
+ else {
265
+ jsonStr = JSON.stringify(value);
266
+ }
267
+ yield jsonStr + '\n';
268
+ }
269
+ }
270
+ async function* csvToJsonChunkIterator(input, options = {}) {
271
+ if (typeof input === 'string') {
272
+ yield* (0, csv_to_json_browser_1.csvToJsonIterator)(input, options);
273
+ }
274
+ else if (input instanceof File || input instanceof Blob) {
275
+ const text = await input.text();
276
+ yield* (0, csv_to_json_browser_1.csvToJsonIterator)(text, options);
277
+ }
278
+ else if (isReadableStream(input)) {
279
+ const reader = input.getReader();
280
+ const decoder = new TextDecoder();
281
+ let buffer = '';
282
+ try {
283
+ while (true) {
284
+ const { value, done } = await reader.read();
285
+ if (done)
286
+ break;
287
+ buffer += decoder.decode(value, { stream: true });
288
+ const lines = buffer.split('\n');
289
+ buffer = lines.pop() || '';
290
+ for (const line of lines) {
291
+ if (line.trim()) {
292
+ yield { raw: line };
293
+ }
294
+ }
295
+ }
296
+ if (buffer.trim()) {
297
+ yield { raw: buffer };
298
+ }
299
+ }
300
+ finally {
301
+ reader.releaseLock();
302
+ }
303
+ }
304
+ else {
305
+ throw new errors_browser_1.ValidationError('Unsupported input type for CSV streaming');
306
+ }
307
+ }
308
+ function jsonToCsvStream(input, options = {}) {
309
+ const iterator = jsonToCsvChunkIterator(input, options);
310
+ return createReadableStreamFromIterator(iterator);
311
+ }
312
+ function jsonToNdjsonStream(input, options = {}) {
313
+ const iterator = jsonToNdjsonChunkIterator(input, options);
314
+ return createReadableStreamFromIterator(iterator);
315
+ }
316
+ function csvToJsonStream(input, options = {}) {
317
+ const iterator = csvToJsonChunkIterator(input, options);
318
+ return createReadableStreamFromIterator(iterator);
319
+ }
320
+ async function jsonToCsvStreamAsync(input, options = {}) {
321
+ return jsonToCsvStream(input, options);
322
+ }
323
+ async function jsonToNdjsonStreamAsync(input, options = {}) {
324
+ return jsonToNdjsonStream(input, options);
325
+ }
326
+ async function csvToJsonStreamAsync(input, options = {}) {
327
+ return csvToJsonStream(input, options);
328
+ }
329
+ if (typeof module !== 'undefined' && module.exports) {
330
+ module.exports = {
331
+ jsonToCsvStream,
332
+ jsonToCsvStreamAsync,
333
+ jsonToNdjsonStream,
334
+ jsonToNdjsonStreamAsync,
335
+ csvToJsonStream,
336
+ csvToJsonStreamAsync,
337
+ createReadableStreamFromIterator
338
+ };
339
+ }
340
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../src/browser/streams.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n ValidationError,\r\n ConfigurationError,\r\n LimitError\r\n} from './errors-browser';\r\nimport { csvToJsonIterator } from './csv-to-json-browser';\r\n\r\nimport type { CsvToJsonOptions, JsonToCsvOptions } from '../types';\r\n\r\nconst DEFAULT_MAX_CHUNK_SIZE = 64 * 1024;\r\nconst PHONE_KEYS = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\r\n\r\nfunction isReadableStream(value: any): value is ReadableStream {\r\n return value && typeof value.getReader === 'function';\r\n}\r\n\r\nfunction isAsyncIterable(value: any): value is AsyncIterable<any> {\r\n return value && typeof value[Symbol.asyncIterator] === 'function';\r\n}\r\n\r\nfunction isIterable(value: any): value is Iterable<any> {\r\n return value && typeof value[Symbol.iterator] === 'function';\r\n}\r\n\r\nfunction createReadableStreamFromIterator<T>(iterator: AsyncIterator<T>): ReadableStream<T> {\r\n return new ReadableStream({\r\n async pull(controller) {\r\n try {\r\n const { value, done } = await iterator.next();\r\n if (done) {\r\n controller.close();\r\n return;\r\n }\r\n controller.enqueue(value);\r\n } catch (error) {\r\n controller.error(error);\r\n }\r\n },\r\n cancel() {\r\n if (iterator.return) {\r\n iterator.return();\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction detectInputFormat(input: any, options: any): 'json' | 'ndjson' | 'csv' | 'unknown' {\r\n if (options && options.inputFormat) {\r\n return options.inputFormat;\r\n }\r\n\r\n if (typeof input === 'string') {\r\n const trimmed = input.trim();\r\n if (trimmed === '') {\r\n return 'unknown';\r\n }\r\n\r\n // Проверка на NDJSON (каждая строка - валидный JSON)\r\n if (trimmed.includes('\\n')) {\r\n const lines = trimmed.split('\\n').filter(line => line.trim() !== '');\r\n if (lines.length > 0) {\r\n try {\r\n JSON.parse(lines[0]);\r\n return 'ndjson';\r\n } catch {\r\n // Не NDJSON\r\n }\r\n }\r\n }\r\n\r\n // Проверка на JSON\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n if (Array.isArray(parsed) || (parsed && typeof parsed === 'object')) {\r\n return 'json';\r\n }\r\n } catch {\r\n // Не JSON\r\n }\r\n\r\n // Проверка на CSV\r\n if (trimmed.includes(',') || trimmed.includes(';') || trimmed.includes('\\t')) {\r\n return 'csv';\r\n }\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\nfunction 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\nfunction 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\nfunction normalizeValueForCsv(value: any, key: string | undefined, normalizeQuotes: boolean): any {\r\n if (!normalizeQuotes || typeof value !== 'string') {\r\n return value;\r\n }\r\n const base = normalizeQuotesInField(value);\r\n if (key && PHONE_KEYS.has(String(key).toLowerCase())) {\r\n return normalizePhoneValue(base);\r\n }\r\n return base;\r\n}\r\n\r\nasync function* jsonToCsvChunkIterator(input: any, options: JsonToCsvOptions = {}): AsyncGenerator<string> {\r\n const format = detectInputFormat(input, options);\r\n \r\n if (format === 'csv') {\r\n throw new ValidationError('Input appears to be CSV, not JSON');\r\n }\r\n\r\n // Вспомогательная функция для создания асинхронного итератора\r\n function toAsyncIterator<T>(iterable: Iterable<T> | AsyncIterable<T>): AsyncIterator<T> {\r\n if (isAsyncIterable(iterable)) {\r\n return iterable[Symbol.asyncIterator]();\r\n }\r\n \r\n if (isIterable(iterable)) {\r\n const syncIterator = iterable[Symbol.iterator]();\r\n return {\r\n next: () => Promise.resolve(syncIterator.next()),\r\n return: syncIterator.return ? () => Promise.resolve(syncIterator.return!()) : undefined,\r\n throw: syncIterator.throw ? (error: any) => Promise.resolve(syncIterator.throw!(error)) : undefined\r\n };\r\n }\r\n \r\n throw new ValidationError('Input is not iterable');\r\n }\r\n\r\n let iterator: AsyncIterator<any>;\r\n \r\n if (isAsyncIterable(input) || isIterable(input)) {\r\n iterator = toAsyncIterator(input);\r\n } else if (typeof input === 'string') {\r\n const parsed = JSON.parse(input);\r\n if (Array.isArray(parsed)) {\r\n iterator = toAsyncIterator(parsed);\r\n } else {\r\n iterator = toAsyncIterator([parsed]);\r\n }\r\n } else if (Array.isArray(input)) {\r\n iterator = toAsyncIterator(input);\r\n } else {\r\n iterator = toAsyncIterator([input]);\r\n }\r\n\r\n const delimiter = options.delimiter || ';';\r\n const includeHeaders = options.includeHeaders !== false;\r\n const preventInjection = options.preventCsvInjection !== false;\r\n const normalizeQuotes = options.normalizeQuotes !== false;\r\n const isPotentialFormula = (input: string): boolean => {\r\n let idx = 0;\r\n while (idx < input.length) {\r\n const code = input.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 < input.length && (input[idx] === '\"' || input[idx] === \"'\")) {\r\n idx++;\r\n while (idx < input.length) {\r\n const code = input.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 >= input.length) {\r\n return false;\r\n }\r\n const char = input[idx];\r\n return char === '=' || char === '+' || char === '-' || char === '@';\r\n };\r\n \r\n let isFirstChunk = true;\r\n let headers: string[] = [];\r\n \r\n while (true) {\r\n const { value, done } = await iterator.next();\r\n if (done) break;\r\n\r\n const item = value;\r\n \r\n if (isFirstChunk) {\r\n // Извлечение заголовков из первого элемента\r\n headers = Object.keys(item);\r\n \r\n if (includeHeaders) {\r\n const headerLine = headers.map(header => {\r\n const escaped = header.includes('\"') ? `\"${header.replace(/\"/g, '\"\"')}\"` : header;\r\n return preventInjection && isPotentialFormula(escaped) ? `'${escaped}` : escaped;\r\n }).join(delimiter);\r\n \r\n yield headerLine + '\\n';\r\n }\r\n \r\n isFirstChunk = false;\r\n }\r\n \r\n const row = headers.map(header => {\r\n const value = item[header];\r\n const normalized = normalizeValueForCsv(value, header, normalizeQuotes);\r\n const strValue = normalized === null || normalized === undefined ? '' : String(normalized);\r\n \r\n if (strValue.includes('\"') || strValue.includes('\\n') || strValue.includes('\\r') || strValue.includes(delimiter)) {\r\n return `\"${strValue.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n \r\n if (preventInjection && isPotentialFormula(strValue)) {\r\n return `'${strValue}`;\r\n }\r\n \r\n return strValue;\r\n }).join(delimiter);\r\n \r\n yield row + '\\n';\r\n }\r\n}\r\n\r\nasync function* jsonToNdjsonChunkIterator(input: any, options: any = {}): AsyncGenerator<string> {\r\n const format = detectInputFormat(input, options);\r\n \r\n // Вспомогательная функция для создания асинхронного итератора\r\n function toAsyncIterator<T>(iterable: Iterable<T> | AsyncIterable<T>): AsyncIterator<T> {\r\n if (isAsyncIterable(iterable)) {\r\n return iterable[Symbol.asyncIterator]();\r\n }\r\n \r\n if (isIterable(iterable)) {\r\n const syncIterator = iterable[Symbol.iterator]();\r\n return {\r\n next: () => Promise.resolve(syncIterator.next()),\r\n return: syncIterator.return ? () => Promise.resolve(syncIterator.return!()) : undefined,\r\n throw: syncIterator.throw ? (error: any) => Promise.resolve(syncIterator.throw!(error)) : undefined\r\n };\r\n }\r\n \r\n throw new ValidationError('Input is not iterable');\r\n }\r\n\r\n let iterator: AsyncIterator<any>;\r\n \r\n if (isAsyncIterable(input) || isIterable(input)) {\r\n iterator = toAsyncIterator(input);\r\n } else if (typeof input === 'string') {\r\n if (format === 'ndjson') {\r\n const lines = input.split('\\n').filter(line => line.trim() !== '');\r\n iterator = toAsyncIterator(lines);\r\n } else {\r\n const parsed = JSON.parse(input);\r\n if (Array.isArray(parsed)) {\r\n iterator = toAsyncIterator(parsed);\r\n } else {\r\n iterator = toAsyncIterator([parsed]);\r\n }\r\n }\r\n } else if (Array.isArray(input)) {\r\n iterator = toAsyncIterator(input);\r\n } else {\r\n iterator = toAsyncIterator([input]);\r\n }\r\n\r\n while (true) {\r\n const { value, done } = await iterator.next();\r\n if (done) break;\r\n\r\n let jsonStr: string;\r\n \r\n if (typeof value === 'string') {\r\n try {\r\n // Проверяем, является ли строка валидным JSON\r\n JSON.parse(value);\r\n jsonStr = value;\r\n } catch {\r\n // Если нет, сериализуем как JSON\r\n jsonStr = JSON.stringify(value);\r\n }\r\n } else {\r\n jsonStr = JSON.stringify(value);\r\n }\r\n \r\n yield jsonStr + '\\n';\r\n }\r\n}\r\n\r\nasync function* csvToJsonChunkIterator(input: any, options: CsvToJsonOptions = {}): AsyncGenerator<any> {\r\n if (typeof input === 'string') {\r\n // Используем csvToJsonIterator из csv-to-json-browser\r\n yield* csvToJsonIterator(input, options);\r\n } else if (input instanceof File || input instanceof Blob) {\r\n const text = await input.text();\r\n yield* csvToJsonIterator(text, options);\r\n } else if (isReadableStream(input)) {\r\n const reader = input.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n \r\n try {\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n \r\n buffer += decoder.decode(value, { stream: true });\r\n \r\n // Обработка буфера по строкам\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n \r\n // TODO: Реализовать парсинг CSV из чанков\r\n // Пока просто возвращаем сырые строки\r\n for (const line of lines) {\r\n if (line.trim()) {\r\n yield { raw: line };\r\n }\r\n }\r\n }\r\n \r\n // Обработка остатка буфера\r\n if (buffer.trim()) {\r\n yield { raw: buffer };\r\n }\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n } else {\r\n throw new ValidationError('Unsupported input type for CSV streaming');\r\n }\r\n}\r\n\r\nexport function jsonToCsvStream(input: any, options: JsonToCsvOptions = {}): ReadableStream<string> {\r\n const iterator = jsonToCsvChunkIterator(input, options);\r\n return createReadableStreamFromIterator(iterator);\r\n}\r\n\r\nexport function jsonToNdjsonStream(input: any, options: any = {}): ReadableStream<string> {\r\n const iterator = jsonToNdjsonChunkIterator(input, options);\r\n return createReadableStreamFromIterator(iterator);\r\n}\r\n\r\nexport function csvToJsonStream(input: any, options: CsvToJsonOptions = {}): ReadableStream<any> {\r\n const iterator = csvToJsonChunkIterator(input, options);\r\n return createReadableStreamFromIterator(iterator);\r\n}\r\n\r\n/**\r\n * Асинхронная версия jsonToCsvStream\r\n */\r\nexport async function jsonToCsvStreamAsync(input: any, options: JsonToCsvOptions = {}): Promise<ReadableStream<string>> {\r\n return jsonToCsvStream(input, options);\r\n}\r\n\r\n/**\r\n * Асинхронная версия jsonToNdjsonStream\r\n */\r\nexport async function jsonToNdjsonStreamAsync(input: any, options: any = {}): Promise<ReadableStream<string>> {\r\n return jsonToNdjsonStream(input, options);\r\n}\r\n\r\n/**\r\n * Асинхронная версия csvToJsonStream\r\n */\r\nexport async function csvToJsonStreamAsync(input: any, options: CsvToJsonOptions = {}): Promise<ReadableStream<any>> {\r\n return csvToJsonStream(input, options);\r\n}\r\n\r\n// Экспорт для Node.js совместимости\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = {\r\n jsonToCsvStream,\r\n jsonToCsvStreamAsync,\r\n jsonToNdjsonStream,\r\n jsonToNdjsonStreamAsync,\r\n csvToJsonStream,\r\n csvToJsonStreamAsync,\r\n createReadableStreamFromIterator\r\n };\r\n}\r\n"]}