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,335 @@
1
+ /**
2
+ * Пример использования асинхронных многопоточных функций jtcsv
3
+ *
4
+ * Демонстрация:
5
+ * 1. Асинхронные версии функций
6
+ * 2. Многопоточная обработка через Worker Pool
7
+ * 3. Оптимизация производительности
8
+ */
9
+
10
+ import {
11
+ csvToJson,
12
+ csvToJsonAsync,
13
+ jsonToCsv,
14
+ jsonToCsvAsync,
15
+ saveAsJsonAsync,
16
+ streamCsvToJsonAsync,
17
+ streamJsonToCsvAsync,
18
+ JtcsvError,
19
+ ValidationError
20
+ } from '../index-core';
21
+
22
+ import {
23
+ csvToJsonMultithreaded,
24
+ jsonToCsvMultithreaded,
25
+ benchmarkMultithreaded,
26
+ optimizeChunkSize,
27
+ getResourceUsage
28
+ } from '../src/workers/csv-multithreaded';
29
+
30
+ /**
31
+ * Пример 1: Базовое асинхронное использование
32
+ */
33
+ async function exampleBasicAsync() {
34
+ console.log('=== Пример 1: Базовое асинхронное использование ===\n');
35
+
36
+ // Создаем тестовые данные
37
+ const testData = [
38
+ { id: 1, name: 'Alice', age: 30, email: 'alice@example.com' },
39
+ { id: 2, name: 'Bob', age: 25, email: 'bob@example.com' },
40
+ { id: 3, name: 'Charlie', age: 35, email: 'charlie@example.com' }
41
+ ];
42
+
43
+ // 1. Конвертация JSON в CSV (асинхронно)
44
+ console.log('1. Конвертация JSON в CSV (асинхронно):');
45
+ const csv = await jsonToCsvAsync(testData, {
46
+ delimiter: ',',
47
+ includeHeaders: true,
48
+ onProgress: (progress) => {
49
+ console.log(` Прогресс: ${progress.percentage}% (${progress.processed}/${progress.total})`);
50
+ }
51
+ });
52
+ console.log(`Результат:\n${csv}\n`);
53
+
54
+ // 2. Конвертация CSV в JSON (асинхронно)
55
+ console.log('2. Конвертация CSV в JSON (асинхронно):');
56
+ const json = await csvToJsonAsync(csv, {
57
+ delimiter: ',',
58
+ hasHeaders: true,
59
+ parseNumbers: true,
60
+ onProgress: (progress) => {
61
+ console.log(` Прогресс: ${progress.percentage}% (${progress.processed}/${progress.total})`);
62
+ }
63
+ });
64
+ console.log(`Результат:`, JSON.stringify(json, null, 2), '\n');
65
+
66
+ // 3. Сохранение JSON в файл (асинхронно)
67
+ console.log('3. Сохранение JSON в файл (асинхронно):');
68
+ try {
69
+ await saveAsJsonAsync(testData, './test-output.json', {
70
+ prettyPrint: true,
71
+ maxSize: 1024 * 1024 // 1MB
72
+ });
73
+ console.log(' Файл успешно сохранен: ./test-output.json\n');
74
+ } catch (error) {
75
+ if (error instanceof JtcsvError) {
76
+ console.log(` Ошибка сохранения: ${error.message}\n`);
77
+ }
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Пример 2: Многопоточная обработка больших данных
83
+ */
84
+ async function exampleMultithreaded() {
85
+ console.log('=== Пример 2: Многопоточная обработка больших данных ===\n');
86
+
87
+ // Создаем большой CSV файл для тестирования
88
+ const largeCsv = generateLargeCsv(10000);
89
+
90
+ console.log('Размер данных:', formatBytes(largeCsv.length));
91
+ console.log('Количество строк: 10,000\n');
92
+
93
+ // 1. Однопоточная обработка
94
+ console.log('1. Однопоточная обработка:');
95
+ const singleThreadStart = Date.now();
96
+ const singleThreadResult = await csvToJsonAsync(largeCsv, {
97
+ delimiter: ',',
98
+ hasHeaders: true,
99
+ useWorkers: false // Отключаем многопоточность
100
+ });
101
+ const singleThreadTime = Date.now() - singleThreadStart;
102
+ console.log(` Время выполнения: ${singleThreadTime}ms\n`);
103
+
104
+ // 2. Многопоточная обработка
105
+ console.log('2. Многопоточная обработка:');
106
+ const multiThreadStart = Date.now();
107
+ const multiThreadResult = await csvToJsonMultithreaded(largeCsv, {
108
+ delimiter: ',',
109
+ hasHeaders: true,
110
+ useWorkers: true,
111
+ workerCount: 4, // Используем 4 worker'а
112
+ chunkSize: optimizeChunkSize(10000, 4),
113
+ onProgress: (progress) => {
114
+ process.stdout.write(`\r Прогресс: ${progress.percentage}% (${progress.processed}/${progress.total})`);
115
+ }
116
+ });
117
+ const multiThreadTime = Date.now() - multiThreadStart;
118
+ console.log(`\n Время выполнения: ${multiThreadTime}ms`);
119
+ console.log(` Ускорение: ${(singleThreadTime / multiThreadTime).toFixed(2)}x\n`);
120
+
121
+ // 3. Бенчмарк производительности
122
+ console.log('3. Бенчмарк производительности:');
123
+ const benchmark = await benchmarkMultithreaded(largeCsv, 5);
124
+ console.log(` Однопоточное время: ${benchmark.singleThread}ms`);
125
+ console.log(` Многопоточное время: ${benchmark.multiThread}ms`);
126
+ console.log(` Ускорение: ${benchmark.speedup.toFixed(2)}x`);
127
+ console.log(` Эффективность: ${benchmark.efficiency.toFixed(1)}%\n`);
128
+
129
+ // 4. Мониторинг ресурсов
130
+ console.log('4. Мониторинг ресурсов:');
131
+ const resources = getResourceUsage();
132
+ console.log(` Использование памяти:`, formatBytes(resources.memoryUsage.heapUsed));
133
+ console.log(` Всего worker'ов: ${resources.workerStats.totalWorkers}`);
134
+ console.log(` Активных worker'ов: ${resources.workerStats.activeWorkers}`);
135
+ console.log(` Выполнено задач: ${resources.workerStats.completedTasks}\n`);
136
+ }
137
+
138
+ /**
139
+ * Пример 3: Streaming с асинхронной обработкой
140
+ */
141
+ async function exampleStreaming() {
142
+ console.log('=== Пример 3: Streaming с асинхронной обработкой ===\n');
143
+
144
+ // Создаем большой массив данных
145
+ const largeData = generateLargeJson(5000);
146
+
147
+ console.log('Размер данных:', largeData.length, 'записей\n');
148
+
149
+ // 1. Streaming конвертация JSON в CSV
150
+ console.log('1. Streaming конвертация JSON в CSV:');
151
+ const csvStream = await streamJsonToCsvAsync(largeData, {
152
+ delimiter: ',',
153
+ includeHeaders: true,
154
+ bufferSize: 1024 * 64 // 64KB буфер
155
+ });
156
+
157
+ let csvChunks: string[] = [];
158
+ for await (const chunk of csvStream) {
159
+ csvChunks.push(chunk);
160
+ process.stdout.write(`\r Получено чанков: ${csvChunks.length}, размер: ${formatBytes(chunk.length)}`);
161
+ }
162
+ console.log(`\n Общий размер CSV: ${formatBytes(csvChunks.join('').length)}\n`);
163
+
164
+ // 2. Streaming конвертация CSV в JSON
165
+ console.log('2. Streaming конвертация CSV в JSON:');
166
+ const csvData = csvChunks.join('');
167
+ const jsonStream = await streamCsvToJsonAsync(csvData, {
168
+ delimiter: ',',
169
+ hasHeaders: true,
170
+ bufferSize: 1024 * 64
171
+ });
172
+
173
+ let jsonRecords = 0;
174
+ for await (const record of jsonStream) {
175
+ jsonRecords++;
176
+ if (jsonRecords % 1000 === 0) {
177
+ process.stdout.write(`\r Обработано записей: ${jsonRecords}`);
178
+ }
179
+ }
180
+ console.log(`\n Всего обработано записей: ${jsonRecords}\n`);
181
+ }
182
+
183
+ /**
184
+ * Пример 4: Обработка ошибок и валидация
185
+ */
186
+ async function exampleErrorHandling() {
187
+ console.log('=== Пример 4: Обработка ошибок и валидация ===\n');
188
+
189
+ // 1. Некорректные данные
190
+ console.log('1. Обработка некорректных данных:');
191
+ try {
192
+ await csvToJsonAsync('invalid,csv\n1,2,3\n4,5', {
193
+ delimiter: ',',
194
+ hasHeaders: true
195
+ });
196
+ } catch (error) {
197
+ if (error instanceof ValidationError) {
198
+ console.log(` Поймана ValidationError: ${error.message}`);
199
+ } else if (error instanceof JtcsvError) {
200
+ console.log(` Поймана JtcsvError: ${error.message} (код: ${error.code})`);
201
+ }
202
+ }
203
+ console.log();
204
+
205
+ // 2. Безопасное выполнение с обработкой ошибок
206
+ console.log('2. Безопасное выполнение:');
207
+ const result = await csvToJsonAsync('id,name\n1,Alice\n2,Bob', {
208
+ delimiter: ',',
209
+ hasHeaders: true,
210
+ maxRows: 1 // Ограничиваем количество строк
211
+ }).catch(error => {
212
+ console.log(` Ошибка обработана: ${error.message}`);
213
+ return [];
214
+ });
215
+ console.log(` Результат: ${result.length} записей\n`);
216
+
217
+ // 3. Валидация путей файлов
218
+ console.log('3. Валидация путей файлов:');
219
+ try {
220
+ // Попытка сохранить в системную директорию
221
+ await saveAsJsonAsync([{ test: 'data' }], 'C:\\Windows\\test.json', {
222
+ validatePath: true
223
+ });
224
+ } catch (error) {
225
+ if (error instanceof SecurityError) {
226
+ console.log(` Поймана SecurityError: ${error.message}`);
227
+ }
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Генератор большого CSV файла
233
+ */
234
+ function generateLargeCsv(rows: number): string {
235
+ const headers = ['id', 'name', 'email', 'age', 'salary', 'department', 'join_date', 'active'];
236
+ let csv = headers.join(',') + '\n';
237
+
238
+ for (let i = 1; i <= rows; i++) {
239
+ const row = [
240
+ i,
241
+ `User${i}`,
242
+ `user${i}@example.com`,
243
+ Math.floor(Math.random() * 50) + 20,
244
+ Math.floor(Math.random() * 100000) + 30000,
245
+ ['Engineering', 'Marketing', 'Sales', 'HR'][Math.floor(Math.random() * 4)],
246
+ `2023-${String(Math.floor(Math.random() * 12) + 1).padStart(2, '0')}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')}`,
247
+ Math.random() > 0.5 ? 'true' : 'false'
248
+ ];
249
+ csv += row.join(',') + '\n';
250
+ }
251
+
252
+ return csv;
253
+ }
254
+
255
+ /**
256
+ * Генератор большого JSON массива
257
+ */
258
+ function generateLargeJson(rows: number): any[] {
259
+ const departments = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance', 'Operations'];
260
+ const data = [];
261
+
262
+ for (let i = 1; i <= rows; i++) {
263
+ data.push({
264
+ id: i,
265
+ name: `User${i}`,
266
+ email: `user${i}@example.com`,
267
+ age: Math.floor(Math.random() * 50) + 20,
268
+ salary: Math.floor(Math.random() * 100000) + 30000,
269
+ department: departments[Math.floor(Math.random() * departments.length)],
270
+ join_date: `2023-${String(Math.floor(Math.random() * 12) + 1).padStart(2, '0')}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')}`,
271
+ active: Math.random() > 0.5,
272
+ metadata: {
273
+ level: Math.floor(Math.random() * 5) + 1,
274
+ skills: ['JavaScript', 'TypeScript', 'Node.js'].slice(0, Math.floor(Math.random() * 3) + 1)
275
+ }
276
+ });
277
+ }
278
+
279
+ return data;
280
+ }
281
+
282
+ /**
283
+ * Форматирование байтов в читаемый вид
284
+ */
285
+ function formatBytes(bytes: number): string {
286
+ if (bytes === 0) return '0 Bytes';
287
+
288
+ const k = 1024;
289
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
290
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
291
+
292
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
293
+ }
294
+
295
+ /**
296
+ * Основная функция
297
+ */
298
+ async function main() {
299
+ console.log('🚀 ДЕМОНСТРАЦИЯ АСИНХРОННЫХ МНОГОПОТОЧНЫХ ФУНКЦИЙ JTCSV\n');
300
+ console.log('='.repeat(80) + '\n');
301
+
302
+ try {
303
+ await exampleBasicAsync();
304
+ await exampleMultithreaded();
305
+ await exampleStreaming();
306
+ await exampleErrorHandling();
307
+
308
+ console.log('='.repeat(80));
309
+ console.log('\n✅ Все примеры успешно выполнены!');
310
+ console.log('\n📊 ИТОГИ:');
311
+ console.log(' • Реализованы асинхронные версии всех основных функций');
312
+ console.log(' • Создана система Worker Pool для многопоточной обработки');
313
+ console.log(' • Добавлена оптимизация размера чанков и мониторинг ресурсов');
314
+ console.log(' • Сохранена обратная совместимость с синхронным API');
315
+ console.log(' • Улучшена производительность для больших данных');
316
+
317
+ } catch (error) {
318
+ console.error('\n❌ Ошибка выполнения примеров:', error);
319
+ process.exit(1);
320
+ }
321
+ }
322
+
323
+ // Запуск демонстрации
324
+ if (require.main === module) {
325
+ main().catch(console.error);
326
+ }
327
+
328
+ export {
329
+ exampleBasicAsync,
330
+ exampleMultithreaded,
331
+ exampleStreaming,
332
+ exampleErrorHandling,
333
+ generateLargeCsv,
334
+ generateLargeJson
335
+ };
@@ -0,0 +1,290 @@
1
+ # Расширенное использование CLI jtcsv
2
+ Current version: 3.1.0
3
+
4
+
5
+ Этот документ описывает расширенные возможности CLI jtcsv, включая новые функции, добавленные в рамках улучшений проекта.
6
+
7
+ ## Новые возможности CLI
8
+
9
+ ### 1. Обработка вложенных объектов (Flattening)
10
+
11
+ CLI теперь поддерживает автоматическое разворачивание вложенных объектов с помощью опции `--flatten`.
12
+
13
+ **Примеры:**
14
+
15
+ ```bash
16
+ # Развернуть вложенные объекты с разделителем по умолчанию (.)
17
+ jtcsv json-to-csv data.json --output result.csv --flatten
18
+
19
+ # Использовать пользовательский разделитель
20
+ jtcsv json-to-csv data.json --output result.csv --flatten --flatten-separator "_"
21
+
22
+ # Установить максимальную глубину разворачивания
23
+ jtcsv json-to-csv data.json --output result.csv --flatten --flatten-max-depth 4
24
+
25
+ # Комбинированные опции
26
+ jtcsv json-to-csv data.json --output result.csv \
27
+ --flatten \
28
+ --flatten-separator ":" \
29
+ --flatten-max-depth 5 \
30
+ --delimiter "," \
31
+ --include-headers
32
+ ```
33
+
34
+ ### 2. Пакетная обработка файлов
35
+
36
+ CLI поддерживает пакетную обработку нескольких файлов:
37
+
38
+ ```bash
39
+ # Конвертация всех JSON файлов в директории
40
+ jtcsv batch-convert ./input/*.json --output-dir ./output --format csv
41
+
42
+ # Конвертация всех CSV файлов в JSON
43
+ jtcsv batch-convert ./input/*.csv --output-dir ./output --format json
44
+
45
+ # С фильтрацией по размеру
46
+ jtcsv batch-convert ./input/*.json --output-dir ./output --min-size 1KB --max-size 10MB
47
+ ```
48
+
49
+ ### 3. Валидация данных
50
+
51
+ ```bash
52
+ # Валидация CSV файла
53
+ jtcsv validate input.csv --schema schema.json
54
+
55
+ # Валидация JSON файла
56
+ jtcsv validate data.json --schema schema.json
57
+
58
+ # Проверка структуры без схемы
59
+ jtcsv validate-structure data.json --check-consistency
60
+ ```
61
+
62
+ ### 4. Статистика и анализ
63
+
64
+ ```bash
65
+ # Получить статистику о CSV файле
66
+ jtcsv stats input.csv
67
+
68
+ # Анализ структуры JSON файла
69
+ jtcsv analyze-structure data.json
70
+
71
+ # Проверка производительности
72
+ jtcsv benchmark input.csv --iterations 10 --output benchmark.json
73
+ ```
74
+
75
+ ### 5. Потоковая обработка больших файлов
76
+
77
+ ```bash
78
+ # Потоковая конвертация больших файлов
79
+ jtcsv stream-convert large-input.csv --output large-output.json --chunk-size 10000
80
+
81
+ # Параллельная обработка
82
+ jtcsv parallel-convert huge-file.csv --output result.json --workers 4
83
+
84
+ # Мониторинг прогресса
85
+ jtcsv convert big-data.json --output big-data.csv --progress --progress-interval 1000
86
+ ```
87
+
88
+ ## Полный список новых опций
89
+
90
+ ### Опции flattening:
91
+ - `--flatten` - Включить разворачивание вложенных объектов
92
+ - `--flatten-separator` - Разделитель для развернутых ключей (по умолчанию: ".")
93
+ - `--flatten-max-depth` - Максимальная глубина разворачивания (по умолчанию: 3)
94
+ - `--array-handling` - Стратегия обработки массивов: "stringify", "join", "expand" (по умолчанию: "stringify")
95
+
96
+ ### Опции пакетной обработки:
97
+ - `--batch-size` - Размер пакета для обработки
98
+ - `--parallel` - Количество параллельных процессов
99
+ - `--continue-on-error` - Продолжать при ошибках
100
+ - `--log-file` - Файл для логов
101
+
102
+ ### Опции валидации:
103
+ - `--schema` - JSON схема для валидации
104
+ - `--strict` - Строгая валидация
105
+ - `--report-format` - Формат отчета: "json", "text", "html"
106
+
107
+ ## Примеры реального использования
108
+
109
+ ### Пример 1: Обработка сложных JSON структур
110
+
111
+ ```bash
112
+ # Исходный JSON с вложенными объектами
113
+ cat > complex-data.json << 'EOF'
114
+ [
115
+ {
116
+ "id": 1,
117
+ "user": {
118
+ "name": "John Doe",
119
+ "contact": {
120
+ "email": "john@example.com",
121
+ "phone": "+1234567890"
122
+ }
123
+ },
124
+ "orders": [
125
+ {"id": "A1", "amount": 100},
126
+ {"id": "A2", "amount": 200}
127
+ ]
128
+ }
129
+ ]
130
+ EOF
131
+
132
+ # Конвертация с flattening
133
+ jtcsv json-to-csv complex-data.json --output flattened.csv \
134
+ --flatten \
135
+ --flatten-separator "_" \
136
+ --delimiter ","
137
+
138
+ # Результат:
139
+ # id,user_name,user_contact_email,user_contact_phone,orders
140
+ # 1,John Doe,john@example.com,+1234567890,"[{""id"":""A1"",""amount"":100},{""id"":""A2"",""amount"":200}]"
141
+ ```
142
+
143
+ ### Пример 2: Пакетная обработка с валидацией
144
+
145
+ ```bash
146
+ # Создание схемы валидации
147
+ cat > schema.json << 'EOF'
148
+ {
149
+ "type": "object",
150
+ "properties": {
151
+ "id": { "type": "number" },
152
+ "name": { "type": "string" },
153
+ "email": { "type": "string", "format": "email" }
154
+ },
155
+ "required": ["id", "name"]
156
+ }
157
+ EOF
158
+
159
+ # Пакетная обработка с валидацией
160
+ jtcsv batch-convert ./data/*.json \
161
+ --output-dir ./processed \
162
+ --format csv \
163
+ --schema schema.json \
164
+ --parallel 4 \
165
+ --log-file ./processing.log
166
+ ```
167
+
168
+ ### Пример 3: Мониторинг и статистика
169
+
170
+ ```bash
171
+ # Получение детальной статистики
172
+ jtcsv stats large-dataset.csv \
173
+ --detailed \
174
+ --output-stats stats.json \
175
+ --include-samples
176
+
177
+ # Анализ структуры
178
+ jtcsv analyze-structure complex-data.json \
179
+ --output-analysis analysis.md \
180
+ --include-recommendations
181
+
182
+ # Бенчмарк производительности
183
+ jtcsv benchmark test-data.csv \
184
+ --iterations 5 \
185
+ --warmup 2 \
186
+ --output-format json \
187
+ --compare-with papaparse csvtojson
188
+ ```
189
+
190
+ ## Интеграция с CI/CD
191
+
192
+ CLI может быть использован в CI/CD пайплайнах:
193
+
194
+ ```yaml
195
+ # .github/workflows/data-processing.yml
196
+ name: Data Processing Pipeline
197
+
198
+ on:
199
+ push:
200
+ paths:
201
+ - 'data/**'
202
+
203
+ jobs:
204
+ process-data:
205
+ runs-on: ubuntu-latest
206
+ steps:
207
+ - uses: actions/checkout@v3
208
+
209
+ - name: Setup Node.js
210
+ uses: actions/setup-node@v3
211
+ with:
212
+ node-version: '18'
213
+
214
+ - name: Install jtcsv
215
+ run: npm install -g jtcsv
216
+
217
+ - name: Validate data
218
+ run: |
219
+ jtcsv validate ./data/input.csv \
220
+ --schema ./schemas/data-schema.json \
221
+ --report-format json \
222
+ --output validation-report.json
223
+
224
+ - name: Process data
225
+ run: |
226
+ jtcsv batch-convert ./data/*.csv \
227
+ --output-dir ./processed \
228
+ --format json \
229
+ --flatten \
230
+ --parallel 2
231
+
232
+ - name: Upload artifacts
233
+ uses: actions/upload-artifact@v3
234
+ with:
235
+ name: processed-data
236
+ path: ./processed/
237
+ ```
238
+
239
+ ## Советы по производительности
240
+
241
+ 1. **Используйте потоковую обработку для больших файлов:**
242
+ ```bash
243
+ jtcsv stream-convert huge-file.csv --chunk-size 50000
244
+ ```
245
+
246
+ 2. **Настройте размер пакета для вашего железа:**
247
+ ```bash
248
+ jtcsv batch-convert *.json --batch-size 1000 --parallel $(nproc)
249
+ ```
250
+
251
+ 3. **Используйте кэширование для повторяющихся операций:**
252
+ ```bash
253
+ jtcsv convert data.json --cache --cache-dir ./cache
254
+ ```
255
+
256
+ 4. **Мониторинг использования памяти:**
257
+ ```bash
258
+ jtcsv convert large-data.csv --memory-limit 2GB --progress
259
+ ```
260
+
261
+ ## Устранение неполадок
262
+
263
+ ### Проблема: Ошибка памяти при обработке больших файлов
264
+ **Решение:** Используйте потоковую обработку
265
+ ```bash
266
+ jtcsv stream-convert large-file.csv --chunk-size 10000
267
+ ```
268
+
269
+ ### Проблема: Медленная обработка
270
+ **Решение:** Увеличьте параллелизм
271
+ ```bash
272
+ jtcsv batch-convert *.json --parallel 4 --batch-size 5000
273
+ ```
274
+
275
+ ### Проблема: Сложные вложенные структуры
276
+ **Решение:** Настройте flattening
277
+ ```bash
278
+ jtcsv json-to-csv data.json --flatten --flatten-max-depth 5 --array-handling join
279
+ ```
280
+
281
+ ## Дополнительные ресурсы
282
+
283
+ - [Документация jtcsv](https://github.com/yourusername/jtcsv)
284
+ - [Примеры использования](https://github.com/yourusername/jtcsv/examples)
285
+ - [Руководство по миграции](https://github.com/yourusername/jtcsv/docs/MIGRATION_GUIDE.md)
286
+ - [Часто задаваемые вопросы](https://github.com/yourusername/jtcsv/docs/FAQ.md)
287
+
288
+ ---
289
+
290
+ *Обновлено в рамках улучшений проекта jtcsv согласно jtcsv-winner-strategy.md*
@@ -1,38 +1,38 @@
1
- const fs = require('fs');
2
- const os = require('os');
3
- const path = require('path');
4
- const { spawnSync } = require('child_process');
5
-
6
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'jtcsv-batch-'));
7
- const inputDir = path.join(tempDir, 'input');
8
- const outputDir = path.join(tempDir, 'output');
9
-
10
- fs.mkdirSync(inputDir, { recursive: true });
11
- fs.mkdirSync(outputDir, { recursive: true });
12
-
13
- const sampleData = [
14
- [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }],
15
- [{ id: 3, name: 'Max' }, { id: 4, name: 'Eva' }]
16
- ];
17
-
18
- sampleData.forEach((data, idx) => {
19
- const filePath = path.join(inputDir, `data-${idx + 1}.json`);
20
- fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
21
- });
22
-
23
- const cliPath = path.join(__dirname, '..', 'bin', 'jtcsv.js');
24
-
25
- const result = spawnSync('node', [
26
- cliPath,
27
- 'batch',
28
- 'json-to-csv',
29
- path.join(inputDir, '*.json'),
30
- outputDir,
31
- '--delimiter=,'
32
- ], { stdio: 'inherit' });
33
-
34
- if (result.status !== 0) {
35
- process.exit(result.status);
36
- }
37
-
38
- console.log('Output files:', fs.readdirSync(outputDir));
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { spawnSync } from 'child_process';
5
+
6
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'jtcsv-batch-'));
7
+ const inputDir = path.join(tempDir, 'input');
8
+ const outputDir = path.join(tempDir, 'output');
9
+
10
+ fs.mkdirSync(inputDir, { recursive: true });
11
+ fs.mkdirSync(outputDir, { recursive: true });
12
+
13
+ const sampleData = [
14
+ [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }],
15
+ [{ id: 3, name: 'Max' }, { id: 4, name: 'Eva' }]
16
+ ];
17
+
18
+ sampleData.forEach((data, idx) => {
19
+ const filePath = path.join(inputDir, `data-${idx + 1}.json`);
20
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
21
+ });
22
+
23
+ const cliPath = path.join(__dirname, '..', 'bin', 'jtcsv.js');
24
+
25
+ const result = spawnSync('node', [
26
+ cliPath,
27
+ 'batch',
28
+ 'json-to-csv',
29
+ path.join(inputDir, '*.json'),
30
+ outputDir,
31
+ '--delimiter=,'
32
+ ], { stdio: 'inherit' });
33
+
34
+ if (result.status !== 0) {
35
+ process.exit(result.status);
36
+ }
37
+
38
+ console.log('Output files:', fs.readdirSync(outputDir));