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":"worker-pool.js","sourceRoot":"","sources":["../../../../src/browser/workers/worker-pool.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Pool для параллельной обработки CSV\r\n// Использует Comlink для простой коммуникации с Web Workers\r\n\r\nimport { ValidationError, ConfigurationError } from '../errors-browser';\n\r\n// Проверка поддержки Web Workers\r\nconst WORKERS_SUPPORTED = typeof Worker !== 'undefined';\r\n\r\nfunction isTransferableBuffer(value) {\n if (!(value instanceof ArrayBuffer)) {\n return false;\n }\n if (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer) {\n return false;\n }\n return true;\n}\n\r\nfunction collectTransferables(args) {\r\n const transferables = [];\r\n\r\n const collectFromValue = (value) => {\r\n if (!value) {\r\n return;\r\n }\r\n if (isTransferableBuffer(value)) {\r\n transferables.push(value);\r\n return;\r\n }\r\n if (ArrayBuffer.isView(value) && isTransferableBuffer(value.buffer)) {\r\n transferables.push(value.buffer);\r\n return;\r\n }\r\n if (Array.isArray(value)) {\r\n value.forEach(collectFromValue);\r\n }\r\n };\r\n\r\n args.forEach(collectFromValue);\r\n return transferables.length ? transferables : null;\n}\n\ntype WorkerWithMeta = Worker & {\n id: string;\n status: 'idle' | 'busy' | 'error';\n lastUsed: number;\n taskId: string | null;\n};\n\r\n/**\r\n * Опции для Worker Pool\r\n * @typedef {Object} WorkerPoolOptions\r\n * @property {number} [workerCount=4] - Количество workers в pool\r\n * @property {number} [maxQueueSize=100] - Максимальный размер очереди задач\r\n * @property {boolean} [autoScale=true] - Автоматическое масштабирование pool\r\n * @property {number} [idleTimeout=60000] - Таймаут простоя worker (мс)\r\n */\r\n\r\n/**\r\n * Статистика Worker Pool\r\n * @typedef {Object} WorkerPoolStats\r\n * @property {number} totalWorkers - Всего workers\r\n * @property {number} activeWorkers - Активные workers\r\n * @property {number} idleWorkers - Простаивающие workers\r\n * @property {number} queueSize - Размер очереди\r\n * @property {number} tasksCompleted - Завершенные задачи\r\n * @property {number} tasksFailed - Неудачные задачи\r\n */\r\n\r\n/**\r\n * Прогресс обработки задачи\r\n * @typedef {Object} TaskProgress\r\n * @property {number} processed - Обработано элементов\r\n * @property {number} total - Всего элементов\r\n * @property {number} percentage - Процент выполнения\r\n * @property {number} speed - Скорость обработки (элементов/сек)\r\n */\r\n\r\n/**\r\n * Worker Pool для параллельной обработки CSV\r\n */\r\nexport class WorkerPool {\n workerScript: string;\n options: any;\n workers: WorkerWithMeta[];\n taskQueue: any[];\n activeTasks: Map<any, any>;\n stats: any;\n /**\n * Создает новый Worker Pool\r\n * @param {string} workerScript - URL скрипта worker\r\n * @param {WorkerPoolOptions} [options] - Опции pool\r\n */\r\n constructor(workerScript, options = {}) {\r\n if (!WORKERS_SUPPORTED) {\r\n throw new ValidationError('Web Workers не поддерживаются в этом браузере');\r\n }\r\n \r\n this.workerScript = workerScript;\r\n this.options = {\r\n workerCount: 4,\r\n maxQueueSize: 100,\r\n autoScale: true,\r\n idleTimeout: 60000,\r\n ...options\r\n };\r\n \r\n this.workers = [];\r\n this.taskQueue = [];\r\n this.activeTasks = new Map();\r\n this.stats = {\r\n totalWorkers: 0,\r\n activeWorkers: 0,\r\n idleWorkers: 0,\r\n queueSize: 0,\r\n tasksCompleted: 0,\r\n tasksFailed: 0\r\n };\r\n \r\n this.initializeWorkers();\r\n }\r\n \r\n /**\r\n * Инициализация workers\r\n * @private\r\n */\r\n initializeWorkers() {\r\n const { workerCount } = this.options;\r\n \r\n for (let i = 0; i < workerCount; i++) {\r\n this.createWorker();\r\n }\r\n \r\n this.updateStats();\r\n }\r\n \r\n /**\r\n * Создает нового worker\r\n * @private\r\n */\r\n createWorker() {\r\n try {\r\n const worker = new Worker(this.workerScript, { type: 'module' }) as WorkerWithMeta;\n \r\n worker.id = `worker-${this.workers.length}`;\r\n worker.status = 'idle';\r\n worker.lastUsed = Date.now();\r\n worker.taskId = null;\r\n \r\n // Обработчики событий\r\n worker.onmessage = (event) => this.handleWorkerMessage(worker, event);\r\n worker.onerror = (error) => this.handleWorkerError(worker, error);\r\n worker.onmessageerror = (error) => this.handleWorkerMessageError(worker, error);\r\n \r\n this.workers.push(worker);\r\n this.stats.totalWorkers++;\r\n this.stats.idleWorkers++;\r\n \r\n return worker;\r\n } catch (error) {\r\n throw new ConfigurationError(`Не удалось создать worker: ${error.message}`);\r\n }\r\n }\r\n \r\n /**\r\n * Обработка сообщений от worker\r\n * @private\r\n */\r\n handleWorkerMessage(worker, event) {\r\n const { data } = event;\r\n \r\n if (data.type === 'PROGRESS') {\r\n this.handleProgress(worker, data);\r\n } else if (data.type === 'RESULT') {\r\n this.handleResult(worker, data);\r\n } else if (data.type === 'ERROR') {\r\n this.handleWorkerTaskError(worker, data);\r\n }\r\n }\r\n \r\n /**\r\n * Обработка прогресса задачи\r\n * @private\r\n */\r\n handleProgress(worker, progressData) {\r\n const taskId = worker.taskId;\r\n if (taskId && this.activeTasks.has(taskId)) {\r\n const task = this.activeTasks.get(taskId);\r\n if (task.onProgress) {\r\n task.onProgress({\r\n processed: progressData.processed,\r\n total: progressData.total,\r\n percentage: (progressData.processed / progressData.total) * 100,\r\n speed: progressData.speed || 0\r\n });\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Обработка результата задачи\r\n * @private\r\n */\r\n handleResult(worker, resultData) {\r\n const taskId = worker.taskId;\r\n if (taskId && this.activeTasks.has(taskId)) {\r\n const task = this.activeTasks.get(taskId);\r\n \r\n // Освобождение worker\r\n worker.status = 'idle';\r\n worker.lastUsed = Date.now();\r\n worker.taskId = null;\r\n this.stats.activeWorkers--;\r\n this.stats.idleWorkers++;\r\n \r\n // Завершение задачи\r\n task.resolve(resultData.data);\r\n this.activeTasks.delete(taskId);\r\n this.stats.tasksCompleted++;\r\n \r\n // Обработка следующей задачи в очереди\r\n this.processQueue();\r\n this.updateStats();\r\n }\r\n }\r\n \r\n /**\r\n * Обработка ошибки задачи\r\n * @private\r\n */\r\n handleWorkerTaskError(worker, errorData) {\r\n const taskId = worker.taskId;\r\n if (taskId && this.activeTasks.has(taskId)) {\r\n const task = this.activeTasks.get(taskId);\r\n \r\n // Освобождение worker\r\n worker.status = 'idle';\r\n worker.lastUsed = Date.now();\r\n worker.taskId = null;\r\n this.stats.activeWorkers--;\r\n this.stats.idleWorkers++;\r\n \r\n // Завершение с ошибкой\r\n const workerError = new Error(errorData.message || 'Ошибка в worker');\r\n if ((errorData as any).code) {\r\n (workerError as any).code = (errorData as any).code;\r\n }\r\n if ((errorData as any).details) {\r\n (workerError as any).details = (errorData as any).details;\r\n }\r\n task.reject(workerError);\r\n this.activeTasks.delete(taskId);\r\n this.stats.tasksFailed++;\r\n \r\n // Обработка следующей задачи\r\n this.processQueue();\r\n this.updateStats();\r\n }\r\n }\r\n \r\n /**\r\n * Обработка ошибок worker\r\n * @private\r\n */\r\n handleWorkerError(worker, error) {\r\n console.error(`Worker ${worker.id} error:`, error);\r\n \r\n // Перезапуск worker\r\n this.restartWorker(worker);\r\n }\r\n \r\n /**\r\n * Обработка ошибок сообщений\r\n * @private\r\n */\r\n handleWorkerMessageError(worker, error) {\r\n console.error(`Worker ${worker.id} message error:`, error);\r\n }\r\n \r\n /**\r\n * Перезапуск worker\r\n * @private\r\n */\r\n restartWorker(worker) {\r\n const index = this.workers.indexOf(worker);\r\n if (index !== -1) {\r\n // Завершение старого worker\r\n worker.terminate();\r\n \r\n // Удаление из статистики\r\n if (worker.status === 'active') {\r\n this.stats.activeWorkers--;\r\n } else {\r\n this.stats.idleWorkers--;\r\n }\r\n this.stats.totalWorkers--;\r\n \r\n // Создание нового worker\r\n const newWorker = this.createWorker();\r\n this.workers[index] = newWorker;\r\n \r\n // Перезапуск задачи если была активна\r\n if (worker.taskId && this.activeTasks.has(worker.taskId)) {\r\n const task = this.activeTasks.get(worker.taskId);\r\n this.executeTask(newWorker, task);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Выполнение задачи на worker\r\n * @private\r\n */\r\n executeTask(worker, task) {\r\n worker.status = 'active';\r\n worker.lastUsed = Date.now();\r\n worker.taskId = task.id;\r\n \r\n this.stats.idleWorkers--;\r\n this.stats.activeWorkers++;\r\n \r\n // Отправка задачи в worker\r\n const payload = {\r\n type: 'EXECUTE',\r\n taskId: task.id,\r\n method: task.method,\r\n args: task.args,\r\n options: task.options\r\n };\r\n\r\n if (task.transferList && task.transferList.length) {\r\n worker.postMessage(payload, task.transferList);\r\n } else {\r\n worker.postMessage(payload);\r\n }\r\n }\r\n \r\n /**\r\n * Обработка очереди задач\r\n * @private\r\n */\r\n processQueue() {\n if (this.taskQueue.length === 0) {\n return;\n }\n \n while (this.taskQueue.length > 0) {\n const idleWorker = this.workers.find(w => w.status === 'idle');\n if (!idleWorker) {\n if (this.options.autoScale && this.workers.length < this.options.maxQueueSize) {\n this.createWorker();\n continue;\n }\n break;\n }\n \n const task = this.taskQueue.shift();\n this.stats.queueSize--;\n this.executeTask(idleWorker, task);\n }\n \n this.updateStats();\n }\n \r\n /**\r\n * Обновление статистики\r\n * @private\r\n */\r\n updateStats() {\r\n this.stats.queueSize = this.taskQueue.length;\r\n }\r\n \r\n /**\r\n * Выполнение задачи через pool\r\n * @param {string} method - Метод для вызова в worker\r\n * @param {Array} args - Аргументы метода\r\n * @param {Object} [options] - Опции задачи\r\n * @param {Function} [onProgress] - Callback прогресса\r\n * @returns {Promise<unknown>} Результат выполнения\r\n */\r\n async exec(method, args = [], options: any = {}, onProgress = null) {\n return new Promise((resolve, reject) => {\r\n // Проверка размера очереди\r\n if (this.taskQueue.length >= this.options.maxQueueSize) {\r\n reject(new Error('Очередь задач переполнена'));\r\n return;\r\n }\r\n \r\n // Создание задачи\r\n const taskId = `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const { transfer, ...taskOptions } = options || {};\r\n const transferList = transfer || collectTransferables(args);\r\n const task = {\r\n id: taskId,\r\n method,\r\n args,\r\n options: taskOptions,\r\n transferList,\r\n onProgress,\r\n resolve,\r\n reject,\r\n createdAt: Date.now()\r\n };\r\n \r\n // Добавление в очередь\r\n this.taskQueue.push(task);\r\n this.stats.queueSize++;\r\n \r\n // Запуск обработки очереди\r\n this.processQueue();\r\n this.updateStats();\r\n });\r\n }\r\n \r\n /**\r\n * Получение статистики pool\r\n * @returns {WorkerPoolStats} Статистика\r\n */\r\n getStats() {\r\n return { ...this.stats };\r\n }\r\n \r\n /**\r\n * Очистка простаивающих workers\r\n */\r\n cleanupIdleWorkers() {\r\n const now = Date.now();\r\n const { idleTimeout } = this.options;\r\n \r\n for (let i = this.workers.length - 1; i >= 0; i--) {\r\n const worker = this.workers[i];\r\n if (worker.status === 'idle' && (now - worker.lastUsed) > idleTimeout) {\r\n // Сохранение минимального количества workers\r\n if (this.workers.length > 1) {\r\n worker.terminate();\r\n this.workers.splice(i, 1);\r\n this.stats.totalWorkers--;\r\n this.stats.idleWorkers--;\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Завершение всех workers\r\n */\r\n terminate() {\r\n this.workers.forEach(worker => {\r\n worker.terminate();\r\n });\r\n \r\n this.workers = [];\r\n this.taskQueue = [];\r\n this.activeTasks.clear();\r\n \r\n // Сброс статистики\r\n this.stats = {\r\n totalWorkers: 0,\r\n activeWorkers: 0,\r\n idleWorkers: 0,\r\n queueSize: 0,\r\n tasksCompleted: 0,\r\n tasksFailed: 0\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Создает Worker Pool для обработки CSV\r\n * @param {WorkerPoolOptions} [options] - Опции pool\r\n * @returns {WorkerPool} Worker Pool\r\n */\r\nexport function createWorkerPool(options: any = {}): any {\n // Используем встроенный worker скрипт\r\n const baseUrl =\n typeof document !== 'undefined'\n ? document.baseURI\n : (typeof self !== 'undefined' && (self as any).location\n ? (self as any).location.href\n : '');\n const workerScript = new URL('./csv-parser.worker.js', baseUrl).href;\n return new WorkerPool(workerScript, options);\n}\r\n\r\n/**\r\n * Парсит CSV с использованием Web Workers\r\n * @param {string|File} csvInput - CSV строка или File объект\r\n * @param {Object} [options] - Опции парсинга\r\n * @param {Function} [onProgress] - Callback прогресса\r\n * @returns {Promise<Array<Object>>} JSON данные\r\n */\r\nexport async function parseCSVWithWorker(csvInput, options: any = {}, onProgress = null) {\n // Создание pool если нужно\r\n const poolHolder = parseCSVWithWorker as any;\n if (!poolHolder.pool) {\n poolHolder.pool = createWorkerPool();\n }\n \n const pool = poolHolder.pool;\n \r\n // Подготовка CSV строки\r\n // ?????????? CSV ??????\r\n let csvPayload = csvInput;\r\n let transfer = null;\r\n\r\n if (csvInput instanceof File) {\r\n const buffer = await readFileAsArrayBuffer(csvInput);\r\n csvPayload = new Uint8Array(buffer);\r\n transfer = [buffer];\r\n } else if (csvInput instanceof ArrayBuffer) {\r\n csvPayload = csvInput;\r\n transfer = [csvInput];\r\n } else if (ArrayBuffer.isView(csvInput)) {\r\n csvPayload = csvInput;\r\n if (csvInput.buffer instanceof ArrayBuffer) {\r\n transfer = [csvInput.buffer];\r\n }\r\n } else if (typeof csvInput !== 'string') {\r\n throw new ValidationError('Input must be a CSV string, File, or ArrayBuffer');\r\n }\r\n\r\n // ????????? ?????? ????? pool\r\n const execOptions = transfer ? { transfer } : {};\r\n return pool.exec('parseCSV', [csvPayload, options], execOptions, onProgress);\r\n}\r\n\r\n/**\r\n * Чтение файла как текст\r\n * @private\r\n */\r\nasync function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) =>\n resolve((event.target as FileReader).result as ArrayBuffer);\n reader.onerror = (error) => reject(error);\n reader.readAsArrayBuffer(file);\n });\n}\n\n// Экспорт для Node.js совместимости\r\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = {\n WorkerPool,\n createWorkerPool,\n parseCSVWithWorker\n };\n}\n"]}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DelimiterCache = void 0;
4
+ exports.getGlobalDelimiterCache = getGlobalDelimiterCache;
5
+ exports.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;
6
+ class DelimiterCache {
7
+ constructor(maxSize = 100) {
8
+ this.weakMap = new WeakMap();
9
+ this.lruCache = new Map();
10
+ this.maxSize = maxSize;
11
+ this.stats = {
12
+ hits: 0,
13
+ misses: 0,
14
+ evictions: 0,
15
+ size: 0
16
+ };
17
+ }
18
+ _generateKey(csv, candidates) {
19
+ const sample = csv.substring(0, Math.min(1000, csv.length));
20
+ const candidatesKey = candidates.join(',');
21
+ return `${this._hashString(sample)}:${candidatesKey}`;
22
+ }
23
+ _hashString(str) {
24
+ let hash = 0;
25
+ for (let i = 0; i < str.length; i++) {
26
+ const char = str.charCodeAt(i);
27
+ hash = ((hash << 5) - hash) + char;
28
+ hash = hash & hash;
29
+ }
30
+ return hash.toString(36);
31
+ }
32
+ get(csv, candidates) {
33
+ if (typeof csv === 'object' && csv !== null) {
34
+ const result = this.weakMap.get(csv);
35
+ if (result !== undefined) {
36
+ this.stats.hits++;
37
+ return result;
38
+ }
39
+ }
40
+ const key = this._generateKey(csv, candidates);
41
+ const result = this.lruCache.get(key);
42
+ if (result !== undefined) {
43
+ this.lruCache.delete(key);
44
+ this.lruCache.set(key, result);
45
+ this.stats.hits++;
46
+ return result;
47
+ }
48
+ this.stats.misses++;
49
+ return null;
50
+ }
51
+ set(csv, candidates, delimiter) {
52
+ if (typeof csv === 'object' && csv !== null) {
53
+ this.weakMap.set(csv, delimiter);
54
+ }
55
+ const key = this._generateKey(csv, candidates);
56
+ if (this.lruCache.size >= this.maxSize) {
57
+ const firstKey = this.lruCache.keys().next().value;
58
+ if (firstKey) {
59
+ this.lruCache.delete(firstKey);
60
+ this.stats.evictions++;
61
+ }
62
+ }
63
+ this.lruCache.set(key, delimiter);
64
+ this.stats.size = this.lruCache.size;
65
+ }
66
+ clear() {
67
+ this.weakMap = new WeakMap();
68
+ this.lruCache.clear();
69
+ this.stats = {
70
+ hits: 0,
71
+ misses: 0,
72
+ evictions: 0,
73
+ size: 0
74
+ };
75
+ }
76
+ getStats() {
77
+ const totalRequests = this.stats.hits + this.stats.misses;
78
+ return {
79
+ ...this.stats,
80
+ totalRequests,
81
+ hitRate: totalRequests > 0 ? (this.stats.hits / totalRequests) * 100 : 0
82
+ };
83
+ }
84
+ has(csv, candidates) {
85
+ if (typeof csv === 'object' && csv !== null) {
86
+ return this.weakMap.has(csv);
87
+ }
88
+ const key = this._generateKey(csv, candidates);
89
+ return this.lruCache.has(key);
90
+ }
91
+ delete(csv, candidates) {
92
+ let deleted = false;
93
+ if (typeof csv === 'object' && csv !== null) {
94
+ deleted = this.weakMap.delete(csv);
95
+ }
96
+ const key = this._generateKey(csv, candidates);
97
+ if (this.lruCache.delete(key)) {
98
+ deleted = true;
99
+ this.stats.size = this.lruCache.size;
100
+ }
101
+ return deleted;
102
+ }
103
+ get size() {
104
+ return this.lruCache.size;
105
+ }
106
+ async getAsync(csv, candidates) {
107
+ return this.get(csv, candidates);
108
+ }
109
+ async setAsync(csv, candidates, delimiter) {
110
+ return this.set(csv, candidates, delimiter);
111
+ }
112
+ async clearAsync() {
113
+ return this.clear();
114
+ }
115
+ static autoDetectDelimiter(csv, candidates = [';', ',', '\t', '|'], cache = null) {
116
+ if (!csv || typeof csv !== 'string') {
117
+ return ';';
118
+ }
119
+ if (cache) {
120
+ const cached = cache.get(csv, candidates);
121
+ if (cached !== null) {
122
+ return cached;
123
+ }
124
+ }
125
+ const lines = csv.split('\n').filter(line => line.trim().length > 0);
126
+ if (lines.length === 0) {
127
+ return ';';
128
+ }
129
+ const firstLine = lines[0];
130
+ const counts = {};
131
+ const candidateSet = new Set(candidates);
132
+ for (let i = 0; i < firstLine.length; i++) {
133
+ const char = firstLine[i];
134
+ if (candidateSet.has(char)) {
135
+ counts[char] = (counts[char] || 0) + 1;
136
+ }
137
+ }
138
+ for (const delim of candidates) {
139
+ if (!(delim in counts)) {
140
+ counts[delim] = 0;
141
+ }
142
+ }
143
+ let maxCount = -1;
144
+ let detectedDelimiter = ';';
145
+ const maxDelimiters = [];
146
+ for (const [delim, count] of Object.entries(counts)) {
147
+ if (count > maxCount) {
148
+ maxCount = count;
149
+ maxDelimiters.length = 0;
150
+ maxDelimiters.push(delim);
151
+ }
152
+ else if (count === maxCount) {
153
+ maxDelimiters.push(delim);
154
+ }
155
+ }
156
+ if (maxCount === 0 || maxDelimiters.length > 1) {
157
+ detectedDelimiter = ';';
158
+ }
159
+ else {
160
+ detectedDelimiter = maxDelimiters[0];
161
+ }
162
+ if (cache) {
163
+ cache.set(csv, candidates, detectedDelimiter);
164
+ }
165
+ return detectedDelimiter;
166
+ }
167
+ }
168
+ exports.DelimiterCache = DelimiterCache;
169
+ let globalCache = null;
170
+ function getGlobalDelimiterCache(maxSize = 100) {
171
+ if (!globalCache) {
172
+ globalCache = new DelimiterCache(maxSize);
173
+ }
174
+ return globalCache;
175
+ }
176
+ async function getGlobalDelimiterCacheAsync(maxSize = 100) {
177
+ return getGlobalDelimiterCache(maxSize);
178
+ }
179
+ exports.default = DelimiterCache;
180
+ if (typeof module !== 'undefined' && module.exports) {
181
+ const current = module.exports;
182
+ if (current && current.__esModule) {
183
+ current.DelimiterCache = DelimiterCache;
184
+ current.getGlobalDelimiterCache = getGlobalDelimiterCache;
185
+ current.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;
186
+ current.default = DelimiterCache;
187
+ }
188
+ else {
189
+ module.exports = DelimiterCache;
190
+ module.exports.DelimiterCache = DelimiterCache;
191
+ module.exports.getGlobalDelimiterCache = getGlobalDelimiterCache;
192
+ module.exports.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;
193
+ module.exports.default = DelimiterCache;
194
+ }
195
+ }
196
+ //# sourceMappingURL=delimiter-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delimiter-cache.js","sourceRoot":"","sources":["../../../src/core/delimiter-cache.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Кэширование результатов авто-детектирования разделителя\r\n * Использует WeakMap и LRU кэш для оптимизации производительности\r\n * \r\n * @version 1.0.0\r\n * @date 2026-01-23\r\n */\r\n\r\ninterface CacheStats {\n hits: number;\n misses: number;\n evictions: number;\n size: number;\n}\n\ninterface CacheStatsWithRates extends CacheStats {\n hitRate: number;\n totalRequests: number;\n}\n\nexport class DelimiterCache {\n private weakMap: WeakMap<object, string>;\r\n private lruCache: Map<string, string>;\r\n private maxSize: number;\r\n private stats: CacheStats;\r\n\r\n constructor(maxSize: number = 100) {\r\n this.weakMap = new WeakMap();\r\n this.lruCache = new Map();\r\n this.maxSize = maxSize;\r\n this.stats = {\r\n hits: 0,\r\n misses: 0,\r\n evictions: 0,\r\n size: 0\r\n };\r\n }\r\n\r\n /**\r\n * Генерирует ключ кэша на основе строки и кандидатов\r\n * @private\r\n */\r\n private _generateKey(csv: string, candidates: string[]): string {\r\n // Используем хэш первых 1000 символов для производительности\r\n const sample = csv.substring(0, Math.min(1000, csv.length));\r\n const candidatesKey = candidates.join(',');\r\n return `${this._hashString(sample)}:${candidatesKey}`;\r\n }\r\n\r\n /**\r\n * Простая хэш-функция для строк\r\n * @private\r\n */\r\n private _hashString(str: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32bit integer\r\n }\r\n return hash.toString(36);\r\n }\r\n\r\n /**\r\n * Получает значение из кэша\r\n * @param csv - CSV строка\r\n * @param candidates - Кандидаты разделителей\r\n * @returns Найденный разделитель или undefined\r\n */\r\n get(csv: string, candidates: string[]): string | null {\n // Сначала проверяем WeakMap (для объектов)\r\n if (typeof csv === 'object' && csv !== null) {\r\n const result = this.weakMap.get(csv as any);\r\n if (result !== undefined) {\r\n this.stats.hits++;\r\n return result;\r\n }\r\n }\r\n\r\n // Проверяем LRU кэш\r\n const key = this._generateKey(csv, candidates);\r\n const result = this.lruCache.get(key);\r\n \r\n if (result !== undefined) {\r\n // Обновляем позицию в LRU (перемещаем в конец)\r\n this.lruCache.delete(key);\r\n this.lruCache.set(key, result);\r\n this.stats.hits++;\r\n return result;\r\n }\r\n\r\n this.stats.misses++;\n return null;\n }\n\r\n /**\r\n * Сохраняет значение в кэш\r\n * @param csv - CSV строка\r\n * @param candidates - Кандидаты разделителей\r\n * @param delimiter - Найденный разделитель\r\n */\r\n set(csv: string, candidates: string[], delimiter: string): void {\r\n // Сохраняем в WeakMap для объектов\r\n if (typeof csv === 'object' && csv !== null) {\r\n this.weakMap.set(csv as any, delimiter);\r\n }\r\n\r\n // Сохраняем в LRU кэш\r\n const key = this._generateKey(csv, candidates);\r\n \r\n // Проверяем размер кэша\r\n if (this.lruCache.size >= this.maxSize) {\r\n // Удаляем самый старый элемент (первый в Map)\r\n const firstKey = this.lruCache.keys().next().value;\r\n if (firstKey) {\r\n this.lruCache.delete(firstKey);\r\n this.stats.evictions++;\r\n }\r\n }\r\n\r\n this.lruCache.set(key, delimiter);\r\n this.stats.size = this.lruCache.size;\r\n }\r\n\r\n /**\r\n * Очищает кэш\r\n */\r\n clear(): void {\r\n this.weakMap = new WeakMap();\r\n this.lruCache.clear();\r\n this.stats = {\r\n hits: 0,\r\n misses: 0,\r\n evictions: 0,\r\n size: 0\r\n };\r\n }\r\n\r\n /**\r\n * Возвращает статистику кэша\r\n */\r\n getStats(): CacheStatsWithRates {\n const totalRequests = this.stats.hits + this.stats.misses;\n return {\n ...this.stats,\n totalRequests,\n hitRate: totalRequests > 0 ? (this.stats.hits / totalRequests) * 100 : 0\n };\n }\n\r\n /**\r\n * Проверяет наличие значения в кэше\r\n */\r\n has(csv: string, candidates: string[]): boolean {\r\n if (typeof csv === 'object' && csv !== null) {\r\n return this.weakMap.has(csv as any);\r\n }\r\n\r\n const key = this._generateKey(csv, candidates);\r\n return this.lruCache.has(key);\r\n }\r\n\r\n /**\r\n * Удаляет значение из кэша\r\n */\r\n delete(csv: string, candidates: string[]): boolean {\r\n let deleted = false;\r\n\r\n if (typeof csv === 'object' && csv !== null) {\r\n deleted = this.weakMap.delete(csv as any);\r\n }\r\n\r\n const key = this._generateKey(csv, candidates);\r\n if (this.lruCache.delete(key)) {\r\n deleted = true;\r\n this.stats.size = this.lruCache.size;\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Возвращает размер кэша\r\n */\r\n get size(): number {\r\n return this.lruCache.size;\r\n }\r\n\r\n /**\r\n * Асинхронная версия get\r\n */\r\n async getAsync(csv: string, candidates: string[]): Promise<string | null> {\n return this.get(csv, candidates);\n }\n\r\n /**\r\n * Асинхронная версия set\r\n */\r\n async setAsync(csv: string, candidates: string[], delimiter: string): Promise<void> {\r\n return this.set(csv, candidates, delimiter);\r\n }\r\n\r\n /**\r\n * Асинхронная версия clear\r\n */\r\n async clearAsync(): Promise<void> {\n return this.clear();\n }\n\n /**\n * Оптимизированная версия autoDetectDelimiter СЃ кэшированием\n */\n static autoDetectDelimiter(\n csv: string,\n candidates: string[] = [';', ',', '\\t', '|'],\n cache: DelimiterCache | null = null\n ): string {\n if (!csv || typeof csv !== 'string') {\n return ';';\n }\n\n // Проверяем РєСЌС€ если РѕРЅ предоставлен\n if (cache) {\n const cached = cache.get(csv, candidates);\n if (cached !== null) {\n return cached;\n }\n }\n\n const lines = csv.split('\\n').filter(line => line.trim().length > 0);\n\n if (lines.length === 0) {\n return ';';\n }\n\n // Используем первую непустую строку для детектирования\n const firstLine = lines[0];\n\n // Быстрый подсчёт вхождений кандидатов Р·Р° РѕРґРёРЅ РїСЂРѕС…РѕРґ\n const counts: Record<string, number> = {};\n const candidateSet = new Set(candidates);\n for (let i = 0; i < firstLine.length; i++) {\n const char = firstLine[i];\n if (candidateSet.has(char)) {\n counts[char] = (counts[char] || 0) + 1;\n }\n }\n\n for (const delim of candidates) {\n if (!(delim in counts)) {\n counts[delim] = 0;\n }\n }\n\n let maxCount = -1;\n let detectedDelimiter = ';';\n const maxDelimiters: string[] = [];\n\n for (const [delim, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n maxDelimiters.length = 0;\n maxDelimiters.push(delim);\n } else if (count === maxCount) {\n maxDelimiters.push(delim);\n }\n }\n\n if (maxCount === 0 || maxDelimiters.length > 1) {\n detectedDelimiter = ';';\n } else {\n detectedDelimiter = maxDelimiters[0];\n }\n\n if (cache) {\n cache.set(csv, candidates, detectedDelimiter);\n }\n\n return detectedDelimiter;\n }\n}\n\r\n// Создание глобального экземпляра кэша\r\nlet globalCache: DelimiterCache | null = null;\r\n\r\n/**\r\n * Возвращает глобальный экземпляр кэша разделителей\r\n */\r\nexport function getGlobalDelimiterCache(maxSize: number = 100): DelimiterCache {\r\n if (!globalCache) {\r\n globalCache = new DelimiterCache(maxSize);\r\n }\r\n return globalCache;\r\n}\r\n\r\n/**\r\n * Асинхронная версия getGlobalDelimiterCache\r\n */\r\nexport async function getGlobalDelimiterCacheAsync(maxSize: number = 100): Promise<DelimiterCache> {\n return getGlobalDelimiterCache(maxSize);\n}\n\nexport default DelimiterCache;\n\n// Экспорт для CommonJS\nif (typeof module !== 'undefined' && module.exports) {\n const current = module.exports;\n if (current && current.__esModule) {\n current.DelimiterCache = DelimiterCache;\n current.getGlobalDelimiterCache = getGlobalDelimiterCache;\n current.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;\n current.default = DelimiterCache;\n } else {\n module.exports = DelimiterCache;\n module.exports.DelimiterCache = DelimiterCache;\n module.exports.getGlobalDelimiterCache = getGlobalDelimiterCache;\n module.exports.getGlobalDelimiterCacheAsync = getGlobalDelimiterCacheAsync;\n module.exports.default = DelimiterCache;\n }\n}\n"]}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nodeVersionInfo = exports.asyncIterUtils = exports.ObjectPool = exports.CHAR_CODES = exports.RowBuffer = exports.StringBuilderOptimized = exports.arrayAt = exports.deepClone = exports.hasOwn = exports.features = void 0;
4
+ exports.fastDetectDelimiter = fastDetectDelimiter;
5
+ exports.createBatchProcessor = createBatchProcessor;
6
+ exports.fastEscapeValue = fastEscapeValue;
7
+ exports.getOptimizationHints = getOptimizationHints;
8
+ const nodeVersionStr = process.versions?.node || '12.0.0';
9
+ const [major, minor] = nodeVersionStr.split('.').map(Number);
10
+ exports.features = {
11
+ hasAbortController: typeof AbortController !== 'undefined',
12
+ hasPromiseAny: typeof Promise.any === 'function',
13
+ hasArrayAt: typeof Array.prototype.at === 'function',
14
+ hasObjectHasOwn: typeof Object.hasOwn === 'function',
15
+ hasStructuredClone: typeof globalThis.structuredClone === 'function',
16
+ hasFetch: typeof globalThis.fetch === 'function',
17
+ hasWebStreams: typeof globalThis.ReadableStream !== 'undefined' && major >= 20,
18
+ hasArrayGroup: typeof Array.prototype.group === 'function',
19
+ hasSetMethods: typeof Set.prototype.union === 'function',
20
+ hasImportMeta: major >= 22,
21
+ hasExplicitResourceManagement: major >= 22,
22
+ isNode20Plus: major >= 20,
23
+ isNode22Plus: major >= 22,
24
+ isNode24Plus: major >= 24
25
+ };
26
+ exports.hasOwn = exports.features.hasObjectHasOwn
27
+ ? Object.hasOwn
28
+ : (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
29
+ exports.deepClone = exports.features.hasStructuredClone
30
+ ? (obj) => structuredClone(obj)
31
+ : (obj) => JSON.parse(JSON.stringify(obj));
32
+ exports.arrayAt = exports.features.hasArrayAt
33
+ ? (arr, index) => arr.at(index)
34
+ : (arr, index) => {
35
+ const len = arr.length;
36
+ const normalizedIndex = index < 0 ? len + index : index;
37
+ return normalizedIndex >= 0 && normalizedIndex < len ? arr[normalizedIndex] : undefined;
38
+ };
39
+ class StringBuilderOptimized {
40
+ constructor(initialCapacity = 1024) {
41
+ this.parts = [];
42
+ this.length = 0;
43
+ this.initialCapacity = initialCapacity;
44
+ this.chunkSize = exports.features.isNode20Plus ? 65536 : 16384;
45
+ }
46
+ append(str) {
47
+ if (str) {
48
+ this.parts.push(str);
49
+ this.length += str.length;
50
+ }
51
+ return this;
52
+ }
53
+ toString() {
54
+ return this.parts.join('');
55
+ }
56
+ clear() {
57
+ this.parts = [];
58
+ this.length = 0;
59
+ }
60
+ getLength() {
61
+ return this.length;
62
+ }
63
+ }
64
+ exports.StringBuilderOptimized = StringBuilderOptimized;
65
+ class RowBuffer {
66
+ constructor(initialSize = 100) {
67
+ this.rows = [];
68
+ this.currentRow = [];
69
+ this.rowCount = 0;
70
+ if (exports.features.isNode20Plus) {
71
+ this.rows = new Array(initialSize);
72
+ this.rows.length = 0;
73
+ }
74
+ }
75
+ addField(field) {
76
+ this.currentRow.push(field);
77
+ }
78
+ commitRow() {
79
+ if (this.currentRow.length > 0) {
80
+ this.rows.push(this.currentRow);
81
+ this.rowCount++;
82
+ this.currentRow = [];
83
+ }
84
+ }
85
+ getRows() {
86
+ return this.rows;
87
+ }
88
+ clear() {
89
+ this.rows = exports.features.isNode20Plus ? new Array(100) : [];
90
+ this.rows.length = 0;
91
+ this.currentRow = [];
92
+ this.rowCount = 0;
93
+ }
94
+ getRowCount() {
95
+ return this.rowCount;
96
+ }
97
+ }
98
+ exports.RowBuffer = RowBuffer;
99
+ exports.CHAR_CODES = {
100
+ QUOTE: 34,
101
+ COMMA: 44,
102
+ SEMICOLON: 59,
103
+ TAB: 9,
104
+ PIPE: 124,
105
+ NEWLINE: 10,
106
+ CARRIAGE: 13,
107
+ SPACE: 32,
108
+ EQUALS: 61,
109
+ PLUS: 43,
110
+ MINUS: 45,
111
+ AT: 64,
112
+ BACKSLASH: 92,
113
+ APOSTROPHE: 39
114
+ };
115
+ function fastDetectDelimiter(sample, candidates = [';', ',', '\t', '|']) {
116
+ const firstLineEnd = sample.indexOf('\n');
117
+ const firstLine = firstLineEnd > -1 ? sample.slice(0, firstLineEnd) : sample;
118
+ const candidateCodes = candidates.map(c => c.charCodeAt(0));
119
+ const counts = new Array(candidateCodes.length).fill(0);
120
+ const len = Math.min(firstLine.length, 10000);
121
+ for (let i = 0; i < len; i++) {
122
+ const code = firstLine.charCodeAt(i);
123
+ for (let j = 0; j < candidateCodes.length; j++) {
124
+ if (code === candidateCodes[j]) {
125
+ counts[j]++;
126
+ }
127
+ }
128
+ }
129
+ let maxCount = 0;
130
+ let maxIndex = 0;
131
+ for (let i = 0; i < counts.length; i++) {
132
+ if (counts[i] > maxCount) {
133
+ maxCount = counts[i];
134
+ maxIndex = i;
135
+ }
136
+ }
137
+ return candidates[maxIndex];
138
+ }
139
+ function createBatchProcessor(processor, options = {}) {
140
+ const batchSize = options.batchSize || (exports.features.isNode20Plus ? 10000 : 5000);
141
+ const parallelism = options.parallelism || (exports.features.isNode22Plus ? 4 : 2);
142
+ return async function* processBatches(items) {
143
+ const batches = [];
144
+ for (let i = 0; i < items.length; i += batchSize) {
145
+ batches.push(items.slice(i, i + batchSize));
146
+ }
147
+ for (let i = 0; i < batches.length; i += parallelism) {
148
+ const chunk = batches.slice(i, i + parallelism);
149
+ const results = await Promise.all(chunk.map(batch => processor(batch)));
150
+ for (const result of results) {
151
+ yield* result;
152
+ }
153
+ }
154
+ };
155
+ }
156
+ class ObjectPool {
157
+ constructor(factory, initialSize = 100) {
158
+ this.factory = factory;
159
+ this.pool = [];
160
+ this.inUse = 0;
161
+ if (exports.features.isNode20Plus) {
162
+ for (let i = 0; i < initialSize; i++) {
163
+ this.pool.push(factory());
164
+ }
165
+ }
166
+ }
167
+ acquire() {
168
+ this.inUse++;
169
+ if (this.pool.length > 0) {
170
+ return this.pool.pop();
171
+ }
172
+ return this.factory();
173
+ }
174
+ release(obj) {
175
+ this.inUse--;
176
+ for (const key in obj) {
177
+ if ((0, exports.hasOwn)(obj, key)) {
178
+ delete obj[key];
179
+ }
180
+ }
181
+ this.pool.push(obj);
182
+ }
183
+ getStats() {
184
+ return {
185
+ poolSize: this.pool.length,
186
+ inUse: this.inUse
187
+ };
188
+ }
189
+ }
190
+ exports.ObjectPool = ObjectPool;
191
+ const QUOTE_REGEX = /"/g;
192
+ function fastEscapeValue(value, delimiterCode) {
193
+ if (value === null || value === undefined || value === '') {
194
+ return '';
195
+ }
196
+ const str = typeof value === 'string' ? value : String(value);
197
+ const len = str.length;
198
+ let needsQuoting = false;
199
+ let hasQuote = false;
200
+ for (let i = 0; i < len; i++) {
201
+ const code = str.charCodeAt(i);
202
+ if (code === exports.CHAR_CODES.QUOTE) {
203
+ hasQuote = true;
204
+ needsQuoting = true;
205
+ }
206
+ else if (code === delimiterCode || code === exports.CHAR_CODES.NEWLINE || code === exports.CHAR_CODES.CARRIAGE) {
207
+ needsQuoting = true;
208
+ }
209
+ }
210
+ if (!needsQuoting) {
211
+ return str;
212
+ }
213
+ const escaped = hasQuote ? str.replace(QUOTE_REGEX, '""') : str;
214
+ return `"${escaped}"`;
215
+ }
216
+ exports.asyncIterUtils = {
217
+ async *mapConcurrent(iterator, mapper, concurrency = 4) {
218
+ const pending = [];
219
+ for await (const item of iterator) {
220
+ pending.push(Promise.resolve(mapper(item)));
221
+ if (pending.length >= concurrency) {
222
+ const results = await Promise.all(pending.splice(0, concurrency));
223
+ for (const result of results) {
224
+ yield result;
225
+ }
226
+ }
227
+ }
228
+ if (pending.length > 0) {
229
+ const results = await Promise.all(pending);
230
+ for (const result of results) {
231
+ yield result;
232
+ }
233
+ }
234
+ },
235
+ async *batch(iterator, size = 1000) {
236
+ let batch = [];
237
+ for await (const item of iterator) {
238
+ batch.push(item);
239
+ if (batch.length >= size) {
240
+ yield batch;
241
+ batch = [];
242
+ }
243
+ }
244
+ if (batch.length > 0) {
245
+ yield batch;
246
+ }
247
+ }
248
+ };
249
+ function getOptimizationHints() {
250
+ return {
251
+ nodeVersion: `${major}.${minor}`,
252
+ features: exports.features,
253
+ recommendations: {
254
+ useWebStreams: exports.features.hasWebStreams,
255
+ useStructuredClone: exports.features.hasStructuredClone,
256
+ useLargerBatches: exports.features.isNode20Plus,
257
+ useHigherParallelism: exports.features.isNode22Plus,
258
+ preferredChunkSize: exports.features.isNode24Plus ? 131072 : (exports.features.isNode20Plus ? 65536 : 16384)
259
+ }
260
+ };
261
+ }
262
+ exports.nodeVersionInfo = { major, minor };
263
+ exports.default = {
264
+ features: exports.features,
265
+ nodeVersion: { major, minor },
266
+ hasOwn: exports.hasOwn,
267
+ deepClone: exports.deepClone,
268
+ arrayAt: exports.arrayAt,
269
+ StringBuilderOptimized,
270
+ RowBuffer,
271
+ ObjectPool,
272
+ CHAR_CODES: exports.CHAR_CODES,
273
+ fastDetectDelimiter,
274
+ fastEscapeValue,
275
+ createBatchProcessor,
276
+ asyncIterUtils: exports.asyncIterUtils,
277
+ getOptimizationHints
278
+ };
279
+ //# sourceMappingURL=node-optimizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-optimizations.js","sourceRoot":"","sources":["../../../src/core/node-optimizations.ts"],"names":[],"mappings":";;;AA8LA,kDA8BC;AAMD,oDAwBC;AAyDD,0CA4BC;AA2DD,oDAsBC;AArZD,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC;AAC1D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAGhD,QAAA,QAAQ,GAAG;IAEtB,kBAAkB,EAAE,OAAO,eAAe,KAAK,WAAW;IAG1D,aAAa,EAAE,OAAQ,OAAe,CAAC,GAAG,KAAK,UAAU;IAGzD,UAAU,EAAE,OAAO,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,UAAU;IACpD,eAAe,EAAE,OAAQ,MAAc,CAAC,MAAM,KAAK,UAAU;IAG7D,kBAAkB,EAAE,OAAO,UAAU,CAAC,eAAe,KAAK,UAAU;IAGpE,QAAQ,EAAE,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;IAGhD,aAAa,EAAE,OAAO,UAAU,CAAC,cAAc,KAAK,WAAW,IAAI,KAAK,IAAI,EAAE;IAC9E,aAAa,EAAE,OAAQ,KAAK,CAAC,SAAiB,CAAC,KAAK,KAAK,UAAU;IAGnE,aAAa,EAAE,OAAQ,GAAG,CAAC,SAAiB,CAAC,KAAK,KAAK,UAAU;IAGjE,aAAa,EAAE,KAAK,IAAI,EAAE;IAC1B,6BAA6B,EAAE,KAAK,IAAI,EAAE;IAG1C,YAAY,EAAE,KAAK,IAAI,EAAE;IACzB,YAAY,EAAE,KAAK,IAAI,EAAE;IACzB,YAAY,EAAE,KAAK,IAAI,EAAE;CAC1B,CAAC;AAKW,QAAA,MAAM,GAAG,gBAAQ,CAAC,eAAe;IAC5C,CAAC,CAAE,MAAc,CAAC,MAAM;IACxB,CAAC,CAAC,CAAC,GAAW,EAAE,IAA8B,EAAW,EAAE,CACvD,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAMzC,QAAA,SAAS,GAAG,gBAAQ,CAAC,kBAAkB;IAClD,CAAC,CAAC,CAAI,GAAM,EAAK,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;IACxC,CAAC,CAAC,CAAI,GAAM,EAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAKzC,QAAA,OAAO,GAAG,gBAAQ,CAAC,UAAU;IACxC,CAAC,CAAC,CAAI,GAAQ,EAAE,KAAa,EAAiB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;IAC9D,CAAC,CAAC,CAAI,GAAQ,EAAE,KAAa,EAAiB,EAAE;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACvB,MAAM,eAAe,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,OAAO,eAAe,IAAI,CAAC,IAAI,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,CAAC,CAAC;AAMJ,MAAa,sBAAsB;IAMjC,YAAY,eAAe,GAAG,IAAI;QAChC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QAGvC,IAAI,CAAC,SAAS,GAAG,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAnCD,wDAmCC;AAMD,MAAa,SAAS;IAKpB,YAAY,WAAW,GAAG,GAAG;QAC3B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAGlB,IAAI,gBAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAQ;QACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AA3CD,8BA2CC;AAMY,QAAA,UAAU,GAAG;IACxB,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,EAAE;IACb,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;IACT,EAAE,EAAE,EAAE;IACN,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;CACN,CAAC;AAKX,SAAgB,mBAAmB,CAAC,MAAc,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;IACpF,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7E,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAGxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;YACzB,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAMD,SAAgB,oBAAoB,CAClC,SAA6C,EAC7C,UAAwD,EAAE;IAE1D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,OAAO,KAAK,SAAS,CAAC,CAAC,cAAc,CAAC,KAAU;QAC9C,MAAM,OAAO,GAAU,EAAE,CAAC;QAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC;QAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAExE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,KAAK,CAAC,CAAC,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAMD,MAAa,UAAU;IAKrB,YAAY,OAAgB,EAAE,WAAW,GAAG,GAAG;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAGf,IAAI,gBAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAG,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,GAAM;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,IAAA,cAAM,EAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAQ,GAAW,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;CACF;AA3CD,gCA2CC;AAMD,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,SAAgB,eAAe,CAAC,KAAU,EAAE,aAAqB;IAC/D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IAGvB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,kBAAU,CAAC,KAAK,EAAE,CAAC;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,kBAAU,CAAC,OAAO,IAAI,IAAI,KAAK,kBAAU,CAAC,QAAQ,EAAE,CAAC;YACjG,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC;AAKY,QAAA,cAAc,GAAG;IAI5B,KAAK,CAAC,CAAC,aAAa,CAClB,QAA0B,EAC1B,MAAmC,EACnC,WAAW,GAAG,CAAC;QAEf,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE5C,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,MAAM,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,CAAC,KAAK,CAAI,QAA0B,EAAE,IAAI,GAAG,IAAI;QACrD,IAAI,KAAK,GAAQ,EAAE,CAAC;QAEpB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjB,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC;gBACZ,KAAK,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC;AAKF,SAAgB,oBAAoB;IAWlC,OAAO;QACL,WAAW,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;QAChC,QAAQ,EAAR,gBAAQ;QACR,eAAe,EAAE;YACf,aAAa,EAAE,gBAAQ,CAAC,aAAa;YACrC,kBAAkB,EAAE,gBAAQ,CAAC,kBAAkB;YAC/C,gBAAgB,EAAE,gBAAQ,CAAC,YAAY;YACvC,oBAAoB,EAAE,gBAAQ,CAAC,YAAY;YAC3C,kBAAkB,EAAE,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;SAC7F;KACF,CAAC;AACJ,CAAC;AAEY,QAAA,eAAe,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAEhD,kBAAe;IAEb,QAAQ,EAAR,gBAAQ;IACR,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;IAG7B,MAAM,EAAN,cAAM;IACN,SAAS,EAAT,iBAAS;IACT,OAAO,EAAP,eAAO;IAGP,sBAAsB;IACtB,SAAS;IACT,UAAU;IAGV,UAAU,EAAV,kBAAU;IAGV,mBAAmB;IACnB,eAAe;IACf,oBAAoB;IAGpB,cAAc,EAAd,sBAAc;IAGd,oBAAoB;CACrB,CAAC","sourcesContent":["/**\r\n * Node.js Runtime Optimizations\r\n *\r\n * Detects Node.js version and provides optimized implementations\r\n * for modern runtimes while maintaining backward compatibility.\r\n *\r\n * Optimized for: Node 20, 22, 24\r\n * Compatible with: Node 12+\r\n */\r\n\r\n// Parse Node.js version\r\nconst nodeVersionStr = process.versions?.node || '12.0.0';\r\nconst [major, minor] = nodeVersionStr.split('.').map(Number);\r\n\r\n// Feature detection flags\r\nexport const features = {\r\n // Node 14.17+ / 16+\r\n hasAbortController: typeof AbortController !== 'undefined',\r\n\r\n // Node 15+\r\n hasPromiseAny: typeof (Promise as any).any === 'function',\n\r\n // Node 16+\r\n hasArrayAt: typeof Array.prototype.at === 'function',\r\n hasObjectHasOwn: typeof (Object as any).hasOwn === 'function',\n\r\n // Node 17+\r\n hasStructuredClone: typeof globalThis.structuredClone === 'function',\r\n\r\n // Node 18+\r\n hasFetch: typeof globalThis.fetch === 'function',\r\n\r\n // Node 20+\r\n hasWebStreams: typeof globalThis.ReadableStream !== 'undefined' && major >= 20,\r\n hasArrayGroup: typeof (Array.prototype as any).group === 'function',\n\r\n // Node 21+\r\n hasSetMethods: typeof (Set.prototype as any).union === 'function',\n\r\n // Node 22+\r\n hasImportMeta: major >= 22,\r\n hasExplicitResourceManagement: major >= 22,\r\n\r\n // Version checks\r\n isNode20Plus: major >= 20,\r\n isNode22Plus: major >= 22,\r\n isNode24Plus: major >= 24\r\n};\r\n\r\n/**\r\n * Optimized Object.hasOwn polyfill for older Node versions\r\n */\r\nexport const hasOwn = features.hasObjectHasOwn\n ? (Object as any).hasOwn\n : (obj: object, prop: string | number | symbol): boolean => \r\n Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Optimized deep clone function\r\n * Uses structuredClone on Node 17+ for best performance\r\n */\r\nexport const deepClone = features.hasStructuredClone\r\n ? <T>(obj: T): T => structuredClone(obj)\r\n : <T>(obj: T): T => JSON.parse(JSON.stringify(obj));\r\n\r\n/**\r\n * Optimized array access with at() method\r\n */\r\nexport const arrayAt = features.hasArrayAt\r\n ? <T>(arr: T[], index: number): T | undefined => arr.at(index)\r\n : <T>(arr: T[], index: number): T | undefined => {\r\n const len = arr.length;\r\n const normalizedIndex = index < 0 ? len + index : index;\r\n return normalizedIndex >= 0 && normalizedIndex < len ? arr[normalizedIndex] : undefined;\r\n };\r\n\r\n/**\r\n * High-performance string builder for large CSV generation\r\n * Uses different strategies based on Node version\r\n */\r\nexport class StringBuilderOptimized {\r\n private parts: string[];\r\n private length: number;\r\n private initialCapacity: number;\r\n private chunkSize: number;\r\n\r\n constructor(initialCapacity = 1024) {\r\n this.parts = [];\r\n this.length = 0;\r\n this.initialCapacity = initialCapacity;\r\n\r\n // Node 20+ uses more aggressive chunking\r\n this.chunkSize = features.isNode20Plus ? 65536 : 16384;\r\n }\r\n\r\n append(str: string): this {\r\n if (str) {\r\n this.parts.push(str);\r\n this.length += str.length;\r\n }\r\n return this;\r\n }\r\n\r\n toString(): string {\r\n return this.parts.join('');\r\n }\r\n\r\n clear(): void {\r\n this.parts = [];\r\n this.length = 0;\r\n }\r\n\r\n getLength(): number {\r\n return this.length;\r\n }\r\n}\r\n\r\n/**\r\n * Optimized row buffer for streaming CSV parsing\r\n * Minimizes allocations on modern Node versions\r\n */\r\nexport class RowBuffer<T = any> {\r\n private rows: T[][];\r\n private currentRow: T[];\r\n private rowCount: number;\r\n\r\n constructor(initialSize = 100) {\r\n this.rows = [];\r\n this.currentRow = [];\r\n this.rowCount = 0;\r\n\r\n // Pre-allocate on Node 20+\r\n if (features.isNode20Plus) {\r\n this.rows = new Array(initialSize);\r\n this.rows.length = 0;\r\n }\r\n }\r\n\r\n addField(field: T): void {\r\n this.currentRow.push(field);\r\n }\r\n\r\n commitRow(): void {\r\n if (this.currentRow.length > 0) {\r\n this.rows.push(this.currentRow);\r\n this.rowCount++;\r\n this.currentRow = [];\r\n }\r\n }\r\n\r\n getRows(): T[][] {\r\n return this.rows;\r\n }\r\n\r\n clear(): void {\r\n this.rows = features.isNode20Plus ? new Array(100) : [];\r\n this.rows.length = 0;\r\n this.currentRow = [];\r\n this.rowCount = 0;\r\n }\r\n\r\n getRowCount(): number {\r\n return this.rowCount;\r\n }\r\n}\r\n\r\n/**\r\n * Optimized field parser with char code comparisons\r\n * Faster than string comparisons on all Node versions\r\n */\r\nexport const CHAR_CODES = {\r\n QUOTE: 34, // \"\r\n COMMA: 44, // ,\r\n SEMICOLON: 59, // ;\r\n TAB: 9, // \\t\r\n PIPE: 124, // |\r\n NEWLINE: 10, // \\n\r\n CARRIAGE: 13, // \\r\r\n SPACE: 32, // space\r\n EQUALS: 61, // =\r\n PLUS: 43, // +\r\n MINUS: 45, // -\r\n AT: 64, // @\r\n BACKSLASH: 92, // \\\r\n APOSTROPHE: 39 // '\r\n} as const;\r\n\r\n/**\r\n * Fast delimiter detection using char codes\r\n */\r\nexport function fastDetectDelimiter(sample: string, candidates = [';', ',', '\\t', '|']): string {\r\n const firstLineEnd = sample.indexOf('\\n');\r\n const firstLine = firstLineEnd > -1 ? sample.slice(0, firstLineEnd) : sample;\r\n\r\n const candidateCodes = candidates.map(c => c.charCodeAt(0));\r\n const counts = new Array(candidateCodes.length).fill(0);\r\n\r\n // Use fast char code iteration on Node 20+\r\n const len = Math.min(firstLine.length, 10000);\r\n\r\n for (let i = 0; i < len; i++) {\r\n const code = firstLine.charCodeAt(i);\r\n for (let j = 0; j < candidateCodes.length; j++) {\r\n if (code === candidateCodes[j]) {\r\n counts[j]++;\r\n }\r\n }\r\n }\r\n\r\n let maxCount = 0;\r\n let maxIndex = 0;\r\n\r\n for (let i = 0; i < counts.length; i++) {\r\n if (counts[i] > maxCount) {\r\n maxCount = counts[i];\r\n maxIndex = i;\r\n }\r\n }\r\n\r\n return candidates[maxIndex];\r\n}\r\n\r\n/**\r\n * Optimized batch processor for large datasets\r\n * Uses different chunk sizes based on Node version\r\n */\r\nexport function createBatchProcessor<T, R>(\r\n processor: (batch: T[]) => Promise<R[]> | R[],\r\n options: { batchSize?: number; parallelism?: number } = {}\r\n): (items: T[]) => AsyncGenerator<R> {\r\n const batchSize = options.batchSize || (features.isNode20Plus ? 10000 : 5000);\r\n const parallelism = options.parallelism || (features.isNode22Plus ? 4 : 2);\r\n\r\n return async function* processBatches(items: T[]): AsyncGenerator<R> {\r\n const batches: T[][] = [];\r\n\r\n for (let i = 0; i < items.length; i += batchSize) {\r\n batches.push(items.slice(i, i + batchSize));\r\n }\r\n\r\n // Process batches with limited parallelism\r\n for (let i = 0; i < batches.length; i += parallelism) {\r\n const chunk = batches.slice(i, i + parallelism);\r\n const results = await Promise.all(chunk.map(batch => processor(batch)));\r\n\r\n for (const result of results) {\r\n yield* result;\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Memory-efficient object pool for row objects\r\n * Reduces GC pressure on large CSV files\r\n */\r\nexport class ObjectPool<T> {\r\n private factory: () => T;\r\n private pool: T[];\r\n private inUse: number;\r\n\r\n constructor(factory: () => T, initialSize = 100) {\r\n this.factory = factory;\r\n this.pool = [];\r\n this.inUse = 0;\r\n\r\n // Pre-warm pool on Node 20+\r\n if (features.isNode20Plus) {\r\n for (let i = 0; i < initialSize; i++) {\r\n this.pool.push(factory());\r\n }\r\n }\r\n }\r\n\r\n acquire(): T {\r\n this.inUse++;\r\n if (this.pool.length > 0) {\r\n return this.pool.pop()!;\r\n }\r\n return this.factory();\r\n }\r\n\r\n release(obj: T): void {\r\n this.inUse--;\r\n // Clear object properties before returning to pool\r\n for (const key in obj) {\r\n if (hasOwn(obj, key)) {\r\n delete (obj as any)[key];\r\n }\r\n }\r\n this.pool.push(obj);\r\n }\r\n\r\n getStats(): { poolSize: number; inUse: number } {\r\n return {\r\n poolSize: this.pool.length,\r\n inUse: this.inUse\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Fast string escape for CSV values\r\n * Uses pre-computed regex on all versions\r\n */\r\nconst QUOTE_REGEX = /\"/g;\r\n\r\nexport function fastEscapeValue(value: any, delimiterCode: number): string {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n\r\n const str = typeof value === 'string' ? value : String(value);\r\n const len = str.length;\r\n\r\n // Quick scan for special characters using char codes\r\n let needsQuoting = false;\r\n let hasQuote = false;\r\n\r\n for (let i = 0; i < len; i++) {\r\n const code = str.charCodeAt(i);\r\n if (code === CHAR_CODES.QUOTE) {\r\n hasQuote = true;\r\n needsQuoting = true;\r\n } else if (code === delimiterCode || code === CHAR_CODES.NEWLINE || code === CHAR_CODES.CARRIAGE) {\r\n needsQuoting = true;\r\n }\r\n }\r\n\r\n if (!needsQuoting) {\r\n return str;\r\n }\r\n\r\n const escaped = hasQuote ? str.replace(QUOTE_REGEX, '\"\"') : str;\r\n return `\"${escaped}\"`;\r\n}\r\n\r\n/**\r\n * Async iterator utilities for streaming\r\n */\r\nexport const asyncIterUtils = {\r\n /**\r\n * Map over async iterator with concurrency control (Node 20+)\r\n */\r\n async *mapConcurrent<T, R>(\r\n iterator: AsyncIterable<T>,\r\n mapper: (item: T) => Promise<R> | R,\r\n concurrency = 4\r\n ): AsyncGenerator<R> {\r\n const pending: Promise<R>[] = [];\r\n\r\n for await (const item of iterator) {\r\n pending.push(Promise.resolve(mapper(item)));\r\n\r\n if (pending.length >= concurrency) {\r\n const results = await Promise.all(pending.splice(0, concurrency));\r\n for (const result of results) {\r\n yield result;\r\n }\r\n }\r\n }\r\n\r\n if (pending.length > 0) {\r\n const results = await Promise.all(pending);\r\n for (const result of results) {\r\n yield result;\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Batch items from async iterator\r\n */\r\n async *batch<T>(iterator: AsyncIterable<T>, size = 1000): AsyncGenerator<T[]> {\r\n let batch: T[] = [];\r\n\r\n for await (const item of iterator) {\r\n batch.push(item);\r\n\r\n if (batch.length >= size) {\r\n yield batch;\r\n batch = [];\r\n }\r\n }\r\n\r\n if (batch.length > 0) {\r\n yield batch;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Get runtime optimization hints\r\n */\r\nexport function getOptimizationHints(): {\r\n nodeVersion: string;\r\n features: typeof features;\r\n recommendations: {\r\n useWebStreams: boolean;\r\n useStructuredClone: boolean;\r\n useLargerBatches: boolean;\r\n useHigherParallelism: boolean;\r\n preferredChunkSize: number;\r\n };\r\n} {\r\n return {\r\n nodeVersion: `${major}.${minor}`,\r\n features,\r\n recommendations: {\r\n useWebStreams: features.hasWebStreams,\r\n useStructuredClone: features.hasStructuredClone,\r\n useLargerBatches: features.isNode20Plus,\r\n useHigherParallelism: features.isNode22Plus,\r\n preferredChunkSize: features.isNode24Plus ? 131072 : (features.isNode20Plus ? 65536 : 16384)\r\n }\r\n };\r\n}\r\n\r\nexport const nodeVersionInfo = { major, minor };\r\n\r\nexport default {\r\n // Feature detection\r\n features,\r\n nodeVersion: { major, minor },\r\n\r\n // Polyfills and optimized functions\r\n hasOwn,\r\n deepClone,\r\n arrayAt,\r\n\r\n // Classes\r\n StringBuilderOptimized,\r\n RowBuffer,\r\n ObjectPool,\r\n\r\n // Constants\r\n CHAR_CODES,\r\n\r\n // Functions\r\n fastDetectDelimiter,\r\n fastEscapeValue,\r\n createBatchProcessor,\r\n\r\n // Async utilities\r\n asyncIterUtils,\r\n\r\n // Diagnostics\r\n getOptimizationHints\r\n};\n"]}