jtcsv 3.0.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +205 -146
  2. package/bin/jtcsv.ts +280 -202
  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 +1261 -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 +336 -7
  23. package/dist/jtcsv-core.cjs.js.map +1 -1
  24. package/dist/jtcsv-core.esm.js +336 -7
  25. package/dist/jtcsv-core.esm.js.map +1 -1
  26. package/dist/jtcsv-core.umd.js +336 -7
  27. package/dist/jtcsv-core.umd.js.map +1 -1
  28. package/dist/jtcsv-full.cjs.js +336 -7
  29. package/dist/jtcsv-full.cjs.js.map +1 -1
  30. package/dist/jtcsv-full.esm.js +336 -7
  31. package/dist/jtcsv-full.esm.js.map +1 -1
  32. package/dist/jtcsv-full.umd.js +336 -7
  33. package/dist/jtcsv-full.umd.js.map +1 -1
  34. package/dist/jtcsv-workers.esm.js +9 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -1
  36. package/dist/jtcsv-workers.umd.js +9 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -1
  38. package/dist/jtcsv.cjs.js +1998 -2092
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1994 -2092
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2251
  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 +192 -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/{src → dist/src}/web-server/index.js +251 -286
  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 +664 -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 +2 -2
  131. package/examples/advanced/performance-optimization.ts +2 -2
  132. package/examples/cli-advanced-usage.md +2 -0
  133. package/examples/cli-tool.ts +1 -1
  134. package/examples/large-dataset-example.ts +2 -2
  135. package/examples/simple-usage.ts +2 -2
  136. package/examples/streaming-example.ts +1 -1
  137. package/index.d.ts +186 -15
  138. package/package.json +243 -305
  139. package/plugins.d.ts +37 -0
  140. package/schema.d.ts +103 -0
  141. package/src/browser/csv-to-json-browser.ts +233 -3
  142. package/src/browser/errors-browser.ts +45 -28
  143. package/src/browser/json-to-csv-browser.ts +81 -5
  144. package/src/browser/streams.ts +73 -6
  145. package/src/core/delimiter-cache.ts +21 -11
  146. package/src/core/plugin-system.ts +343 -155
  147. package/src/core/transform-hooks.ts +20 -12
  148. package/src/engines/fast-path-engine.ts +48 -32
  149. package/src/errors.ts +1 -72
  150. package/src/formats/ndjson-parser.ts +6 -0
  151. package/src/formats/tsv-parser.ts +6 -0
  152. package/src/types/index.ts +21 -1
  153. package/src/utils/validators.ts +35 -0
  154. package/src/web-server/index.ts +1 -1
  155. package/bin/jtcsv.js +0 -2532
  156. package/csv-to-json.js +0 -711
  157. package/errors.js +0 -394
  158. package/examples/advanced/conditional-transformations.js +0 -446
  159. package/examples/advanced/csv-parser.worker.js +0 -89
  160. package/examples/advanced/nested-objects-example.js +0 -306
  161. package/examples/advanced/performance-optimization.js +0 -504
  162. package/examples/advanced/run-demo-server.js +0 -116
  163. package/examples/cli-batch-processing.js +0 -38
  164. package/examples/cli-tool.js +0 -183
  165. package/examples/error-handling.js +0 -338
  166. package/examples/express-api.js +0 -164
  167. package/examples/large-dataset-example.js +0 -182
  168. package/examples/ndjson-processing.js +0 -434
  169. package/examples/plugin-excel-exporter.js +0 -406
  170. package/examples/schema-validation.js +0 -640
  171. package/examples/simple-usage.js +0 -282
  172. package/examples/streaming-example.js +0 -418
  173. package/examples/web-workers-advanced.js +0 -28
  174. package/index.js +0 -82
  175. package/json-save.js +0 -255
  176. package/json-to-csv.js +0 -668
  177. package/plugins/README.md +0 -91
  178. package/plugins/express-middleware/README.md +0 -83
  179. package/plugins/express-middleware/example.js +0 -135
  180. package/plugins/express-middleware/example.ts +0 -135
  181. package/plugins/express-middleware/index.d.ts +0 -114
  182. package/plugins/express-middleware/index.js +0 -512
  183. package/plugins/express-middleware/index.ts +0 -557
  184. package/plugins/express-middleware/package.json +0 -52
  185. package/plugins/fastify-plugin/index.js +0 -404
  186. package/plugins/fastify-plugin/index.ts +0 -443
  187. package/plugins/fastify-plugin/package.json +0 -55
  188. package/plugins/hono/README.md +0 -28
  189. package/plugins/hono/index.d.ts +0 -12
  190. package/plugins/hono/index.js +0 -36
  191. package/plugins/hono/index.ts +0 -226
  192. package/plugins/hono/package.json +0 -35
  193. package/plugins/nestjs/README.md +0 -35
  194. package/plugins/nestjs/index.d.ts +0 -25
  195. package/plugins/nestjs/index.js +0 -77
  196. package/plugins/nestjs/index.ts +0 -201
  197. package/plugins/nestjs/package.json +0 -37
  198. package/plugins/nextjs-api/README.md +0 -57
  199. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  200. package/plugins/nextjs-api/examples/ConverterComponent.tsx +0 -386
  201. package/plugins/nextjs-api/examples/api-convert.js +0 -67
  202. package/plugins/nextjs-api/examples/api-convert.ts +0 -67
  203. package/plugins/nextjs-api/index.js +0 -387
  204. package/plugins/nextjs-api/index.tsx +0 -339
  205. package/plugins/nextjs-api/package.json +0 -63
  206. package/plugins/nextjs-api/route.js +0 -370
  207. package/plugins/nextjs-api/route.ts +0 -370
  208. package/plugins/nuxt/README.md +0 -24
  209. package/plugins/nuxt/index.js +0 -21
  210. package/plugins/nuxt/index.ts +0 -94
  211. package/plugins/nuxt/package.json +0 -35
  212. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  213. package/plugins/nuxt/runtime/composables/useJtcsv.ts +0 -100
  214. package/plugins/nuxt/runtime/plugin.js +0 -6
  215. package/plugins/nuxt/runtime/plugin.ts +0 -71
  216. package/plugins/remix/README.md +0 -26
  217. package/plugins/remix/index.d.ts +0 -16
  218. package/plugins/remix/index.js +0 -62
  219. package/plugins/remix/index.ts +0 -260
  220. package/plugins/remix/package.json +0 -35
  221. package/plugins/sveltekit/README.md +0 -28
  222. package/plugins/sveltekit/index.d.ts +0 -17
  223. package/plugins/sveltekit/index.js +0 -54
  224. package/plugins/sveltekit/index.ts +0 -301
  225. package/plugins/sveltekit/package.json +0 -33
  226. package/plugins/trpc/README.md +0 -25
  227. package/plugins/trpc/index.d.ts +0 -7
  228. package/plugins/trpc/index.js +0 -32
  229. package/plugins/trpc/index.ts +0 -267
  230. package/plugins/trpc/package.json +0 -34
  231. package/src/browser/browser-functions.js +0 -219
  232. package/src/browser/core.js +0 -92
  233. package/src/browser/csv-to-json-browser.js +0 -722
  234. package/src/browser/errors-browser.js +0 -212
  235. package/src/browser/extensions/plugins.js +0 -92
  236. package/src/browser/extensions/workers.js +0 -39
  237. package/src/browser/index.js +0 -113
  238. package/src/browser/json-to-csv-browser.js +0 -319
  239. package/src/browser/streams.js +0 -403
  240. package/src/browser/workers/csv-parser.worker.js +0 -377
  241. package/src/browser/workers/worker-pool.js +0 -527
  242. package/src/core/delimiter-cache.js +0 -200
  243. package/src/core/node-optimizations.js +0 -408
  244. package/src/core/plugin-system.js +0 -494
  245. package/src/core/transform-hooks.js +0 -350
  246. package/src/engines/fast-path-engine-new.js +0 -338
  247. package/src/engines/fast-path-engine.js +0 -844
  248. package/src/errors.js +0 -26
  249. package/src/formats/ndjson-parser.js +0 -467
  250. package/src/formats/tsv-parser.js +0 -339
  251. package/src/index-with-plugins.js +0 -378
  252. package/src/utils/bom-utils.js +0 -259
  253. package/src/utils/encoding-support.js +0 -124
  254. package/src/utils/schema-validator.js +0 -594
  255. package/src/utils/transform-loader.js +0 -205
  256. package/src/utils/zod-adapter.js +0 -170
  257. package/stream-csv-to-json.js +0 -560
  258. package/stream-json-to-csv.js +0 -465
@@ -1,377 +0,0 @@
1
- // Web Worker для обработки CSV
2
- // Работает в отдельном потоке, не блокируя основной
3
-
4
- // Импорт функций парсинга (они будут bundled вместе с worker)
5
- import { csvToJson } from '../csv-to-json-browser.js';
6
- import { jsonToCsv } from '../json-to-csv-browser.js';
7
-
8
- const textDecoder = new TextDecoder('utf-8');
9
-
10
- // Кеш для повторного использования результатов
11
- const cache = new Map();
12
- const CACHE_MAX_SIZE = 50;
13
- const CACHE_TTL = 5 * 60 * 1000; // 5 минут
14
-
15
- // Статистика worker
16
- const stats = {
17
- tasksProcessed: 0,
18
- cacheHits: 0,
19
- cacheMisses: 0,
20
- totalProcessingTime: 0,
21
- averageProcessingTime: 0
22
- };
23
-
24
- /**
25
- * Генерация ключа кеша для CSV строки
26
- * @param {string} csv - CSV строка
27
- * @param {Object} options - Опции парсинга
28
- * @returns {string} Ключ кеша
29
- */
30
- function generateCacheKey(csv, options) {
31
- // Простой хэш для CSV строки
32
- let hash = 0;
33
- for (let i = 0; i < csv.length; i++) {
34
- const char = csv.charCodeAt(i);
35
- hash = ((hash << 5) - hash) + char;
36
- hash = hash & hash; // Convert to 32bit integer
37
- }
38
-
39
- // Добавление опций в хэш
40
- const optionsStr = JSON.stringify(options);
41
- for (let i = 0; i < optionsStr.length; i++) {
42
- const char = optionsStr.charCodeAt(i);
43
- hash = ((hash << 5) - hash) + char;
44
- hash = hash & hash;
45
- }
46
-
47
- return `csv-${hash.toString(36)}-${optionsStr.length}`;
48
- }
49
-
50
- /**
51
- * Очистка устаревших записей кеша
52
- */
53
- function cleanupCache() {
54
- const now = Date.now();
55
- for (const [key, entry] of cache.entries()) {
56
- if (now - entry.timestamp > CACHE_TTL) {
57
- cache.delete(key);
58
- }
59
- }
60
-
61
- // Ограничение размера кеша
62
- if (cache.size > CACHE_MAX_SIZE) {
63
- const oldestKey = Array.from(cache.entries())
64
- .sort((a, b) => a[1].timestamp - b[1].timestamp)[0][0];
65
- cache.delete(oldestKey);
66
- }
67
- }
68
-
69
- /**
70
- * Парсинг CSV с кешированием и прогрессом
71
- * @param {string} csv - CSV строка
72
- * @param {Object} options - Опции парсинга
73
- * @param {Function} sendProgress - Функция отправки прогресса
74
- * @returns {Array<Object>} JSON данные
75
- */
76
- function parseCSVWithProgress(csv, options, sendProgress) {
77
- const startTime = performance.now();
78
-
79
- // Проверка кеша
80
- const cacheKey = generateCacheKey(csv, options);
81
- if (cache.has(cacheKey)) {
82
- const cached = cache.get(cacheKey);
83
- stats.cacheHits++;
84
-
85
- // Отправка мгновенного прогресса для кешированных данных
86
- if (sendProgress) {
87
- sendProgress({
88
- processed: cached.data.length,
89
- total: cached.data.length,
90
- percentage: 100,
91
- fromCache: true
92
- });
93
- }
94
-
95
- return cached.data;
96
- }
97
-
98
- stats.cacheMisses++;
99
-
100
- // Разделение на chunks для прогресса
101
- const CHUNK_SIZE = 10000; // строк в chunk
102
- const lines = csv.split('\n');
103
- const totalLines = lines.length;
104
-
105
- let result = [];
106
- let processedLines = 0;
107
-
108
- // Обработка по chunks
109
- for (let i = 0; i < lines.length; i += CHUNK_SIZE) {
110
- const chunk = lines.slice(i, i + CHUNK_SIZE).join('\n');
111
- const chunkResult = csvToJson(chunk, options);
112
- result = result.concat(chunkResult);
113
-
114
- processedLines = Math.min(i + CHUNK_SIZE, totalLines);
115
-
116
- // Отправка прогресса
117
- if (sendProgress) {
118
- const percentage = (processedLines / totalLines) * 100;
119
- const elapsed = (performance.now() - startTime) / 1000;
120
- const speed = processedLines / elapsed;
121
-
122
- sendProgress({
123
- processed: processedLines,
124
- total: totalLines,
125
- percentage: percentage,
126
- speed: speed,
127
- elapsed: elapsed
128
- });
129
- }
130
-
131
- // Даем возможность обработать другие задачи
132
- if (i % (CHUNK_SIZE * 10) === 0) {
133
- // Небольшая пауза для неблокирующей обработки
134
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1);
135
- }
136
- }
137
-
138
- // Сохранение в кеш
139
- cache.set(cacheKey, {
140
- data: result,
141
- timestamp: Date.now(),
142
- size: csv.length
143
- });
144
-
145
- // Очистка кеша если нужно
146
- cleanupCache();
147
-
148
- // Обновление статистики
149
- const processingTime = performance.now() - startTime;
150
- stats.tasksProcessed++;
151
- stats.totalProcessingTime += processingTime;
152
- stats.averageProcessingTime = stats.totalProcessingTime / stats.tasksProcessed;
153
-
154
- return result;
155
- }
156
-
157
- /**
158
- * Конвертация JSON в CSV
159
- * @param {Array<Object>} jsonData - JSON данные
160
- * @param {Object} options - Опции конвертации
161
- * @returns {string} CSV строка
162
- */
163
- function convertJSONToCSV(jsonData, options) {
164
- return jsonToCsv(jsonData, options);
165
- }
166
-
167
- /**
168
- * Валидация CSV строки
169
- * @param {string} csv - CSV строка
170
- * @param {Object} options - Опции валидации
171
- * @returns {Object} Результат валидации
172
- */
173
- function validateCSV(csv, options) {
174
- const startTime = performance.now();
175
-
176
- try {
177
- // Быстрый парсинг для валидации
178
- const sampleSize = Math.min(1000, csv.split('\n').length);
179
- const sample = csv.split('\n').slice(0, sampleSize).join('\n');
180
-
181
- const result = csvToJson(sample, options);
182
-
183
- const processingTime = performance.now() - startTime;
184
-
185
- return {
186
- valid: true,
187
- sampleSize: result.length,
188
- estimatedTotalRows: csv.split('\n').length,
189
- processingTime: processingTime,
190
- estimatedFullProcessingTime: (processingTime / sampleSize) * csv.split('\n').length
191
- };
192
- } catch (error) {
193
- return {
194
- valid: false,
195
- error: error.message,
196
- processingTime: performance.now() - startTime
197
- };
198
- }
199
- }
200
-
201
- /**
202
- * Получение статистики worker
203
- * @returns {Object} Статистика
204
- */
205
- function getStats() {
206
- return {
207
- ...stats,
208
- cacheSize: cache.size,
209
- cacheKeys: Array.from(cache.keys())
210
- };
211
- }
212
-
213
- /**
214
- * Очистка кеша worker
215
- */
216
- function clearCache() {
217
- cache.clear();
218
- stats.cacheHits = 0;
219
- stats.cacheMisses = 0;
220
- }
221
-
222
- function decodeCsvInput(input) {
223
- if (typeof input === 'string') {
224
- return input;
225
- }
226
- if (input instanceof ArrayBuffer) {
227
- return textDecoder.decode(new Uint8Array(input));
228
- }
229
- if (ArrayBuffer.isView(input)) {
230
- return textDecoder.decode(input);
231
- }
232
- throw new Error('Invalid CSV input type');
233
- }
234
-
235
- // Обработчик сообщений от основного потока
236
- self.onmessage = function (event) {
237
- const { data } = event;
238
-
239
- switch (data.type) {
240
- case 'EXECUTE':
241
- handleExecute(data);
242
- break;
243
-
244
- case 'GET_STATS':
245
- self.postMessage({
246
- type: 'STATS',
247
- taskId: data.taskId,
248
- data: getStats()
249
- });
250
- break;
251
-
252
- case 'CLEAR_CACHE':
253
- clearCache();
254
- self.postMessage({
255
- type: 'CACHE_CLEARED',
256
- taskId: data.taskId
257
- });
258
- break;
259
-
260
- default:
261
- self.postMessage({
262
- type: 'ERROR',
263
- taskId: data.taskId,
264
- message: `Unknown command: ${data.type}`
265
- });
266
- }
267
- };
268
-
269
- /**
270
- * Обработка команды EXECUTE
271
- * @param {Object} commandData - Данные команды
272
- */
273
- function handleExecute(commandData) {
274
- const { taskId, method, args = [], options = {} } = commandData;
275
-
276
- try {
277
- switch (method) {
278
- case 'parseCSV': {
279
- const [csvInput, parseOptions] = args;
280
- const csv = decodeCsvInput(csvInput);
281
-
282
- // Функция отправки прогресса
283
- const sendProgress = (progress) => {
284
- self.postMessage({
285
- type: 'PROGRESS',
286
- taskId,
287
- ...progress
288
- });
289
- };
290
-
291
- const result = parseCSVWithProgress(csv, { ...options, ...parseOptions }, sendProgress);
292
-
293
- self.postMessage({
294
- type: 'RESULT',
295
- taskId,
296
- data: result
297
- });
298
- break;
299
- }
300
-
301
- case 'jsonToCSV': {
302
- const [jsonData, csvOptions] = args;
303
- const result = convertJSONToCSV(jsonData, { ...options, ...csvOptions });
304
-
305
- self.postMessage({
306
- type: 'RESULT',
307
- taskId,
308
- data: result
309
- });
310
- break;
311
- }
312
-
313
- case 'validateCSV': {
314
- const [csv, validateOptions] = args;
315
- const result = validateCSV(csv, { ...options, ...validateOptions });
316
-
317
- self.postMessage({
318
- type: 'RESULT',
319
- taskId,
320
- data: result
321
- });
322
- break;
323
- }
324
-
325
- case 'autoDetectDelimiter': {
326
- const [csv] = args;
327
- // Простая реализация автоопределения
328
- const delimiters = [';', ',', '\t', '|'];
329
- let bestDelimiter = ';';
330
- let maxCount = 0;
331
-
332
- const firstLine = csv.split('\n')[0] || '';
333
-
334
- for (const delim of delimiters) {
335
- const count = (firstLine.match(new RegExp(`[${delim}]`, 'g')) || []).length;
336
- if (count > maxCount) {
337
- maxCount = count;
338
- bestDelimiter = delim;
339
- }
340
- }
341
-
342
- self.postMessage({
343
- type: 'RESULT',
344
- taskId,
345
- data: bestDelimiter
346
- });
347
- break;
348
- }
349
-
350
- default:
351
- throw new Error(`Unknown method: ${method}`);
352
- }
353
- } catch (error) {
354
- self.postMessage({
355
- type: 'ERROR',
356
- taskId,
357
- message: error.message,
358
- stack: error.stack,
359
- code: error.code,
360
- details: error.details
361
- });
362
- }
363
- }
364
-
365
- // Инициализация worker
366
- self.postMessage({ type: 'READY' });
367
-
368
- // Экспорт для тестирования
369
- if (typeof module !== 'undefined' && module.exports) {
370
- module.exports = {
371
- parseCSVWithProgress,
372
- convertJSONToCSV,
373
- validateCSV,
374
- getStats,
375
- clearCache
376
- };
377
- }