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,282 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Простой пример использования новых возможностей JTCSV 2.1.0
5
- * Демонстрация Fast-Path Engine, NDJSON и Plugin System
6
- *
7
- * @version 1.0.0
8
- * @date 2026-01-22
9
- */
10
-
11
- ;(async () => {
12
- console.log('🚀 JTCSV 2.1.0 - Демонстрация новых возможностей\n');
13
-
14
- // ============================================================================
15
- // 1. Базовое использование (обратная совместимость)
16
- // ============================================================================
17
-
18
- console.log('1. 📦 Базовое использование (обратная совместимость)');
19
- console.log('='.repeat(60));
20
-
21
- const { jsonToCsv, csvToJson } = require('jtcsv');
22
-
23
- const sampleData = [
24
- { id: 1, name: 'John Doe', age: 30, city: 'New York' },
25
- { id: 2, name: 'Jane Smith', age: 25, city: 'London' },
26
- { id: 3, name: 'Bob Johnson', age: 35, city: 'Tokyo' }
27
- ];
28
-
29
- // Конвертация JSON → CSV
30
- const csv = jsonToCsv(sampleData, { delimiter: ',' });
31
- console.log('📄 CSV результат:');
32
- console.log(csv);
33
- console.log();
34
-
35
- // Конвертация CSV → JSON
36
- const json = csvToJson(csv, { delimiter: ',' });
37
- console.log('📊 JSON результат:');
38
- console.log(JSON.stringify(json, null, 2));
39
- console.log();
40
-
41
- // ============================================================================
42
- // 2. Fast-Path Engine (оптимизированный парсинг)
43
- // ============================================================================
44
-
45
- console.log('\n2. ⚡ Fast-Path Engine (оптимизированный парсинг)');
46
- console.log('='.repeat(60));
47
-
48
- const FastPathEngine = require('../src/engines/fast-path-engine');
49
- const engine = new FastPathEngine();
50
-
51
- // Создаем тестовый CSV
52
- let testCsv = 'id,name,description\n';
53
- for (let i = 1; i <= 1000; i++) {
54
- testCsv += `${i},User${i},"Description for user ${i}"\n`;
55
- }
56
-
57
- console.log('📊 Анализ структуры CSV...');
58
- const sample = testCsv.substring(0, 500);
59
- const structure = engine.analyzeStructure(sample);
60
- console.log('Структура:', {
61
- delimiter: structure.delimiter,
62
- hasQuotes: structure.hasQuotes,
63
- recommendedEngine: structure.recommendedEngine,
64
- complexity: structure.complexity
65
- });
66
-
67
- console.log('\n⚡ Парсинг 1000 строк с оптимизацией...');
68
- const startTime = Date.now();
69
- const parsed = engine.parse(testCsv);
70
- const duration = Date.now() - startTime;
71
-
72
- console.log(`✅ Парсинг завершен за ${duration}ms`);
73
- console.log(`📈 Скорость: ${Math.round(1000 / (duration / 1000))} строк/сек`);
74
- console.log(`📊 Результат: ${parsed.length} строк (${parsed[0].length} колонок)`);
75
-
76
- const stats = engine.getStats();
77
- console.log('\n📊 Статистика Fast-Path Engine:');
78
- console.log(` Simple парсеры: ${stats.simpleParserCount}`);
79
- console.log(` Quote-aware парсеры: ${stats.quoteAwareParserCount}`);
80
- console.log(` Cache hits: ${stats.cacheHits}`);
81
- console.log(` Cache miss: ${stats.cacheMisses}`);
82
- console.log(` Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);
83
-
84
- // ============================================================================
85
- // 3. NDJSON поддержка (потоковая обработка)
86
- // ============================================================================
87
-
88
- console.log('\n3. 📝 NDJSON поддержка (потоковая обработка)');
89
- console.log('='.repeat(60));
90
-
91
- const NdjsonParser = require('../src/formats/ndjson-parser');
92
-
93
- // Конвертация в NDJSON
94
- const ndjson = NdjsonParser.toNdjson(sampleData, { space: 2 });
95
- console.log('📄 NDJSON результат:');
96
- console.log(ndjson);
97
- console.log();
98
-
99
- // Обратная конвертация
100
- const fromNdjson = NdjsonParser.fromNdjson(ndjson);
101
- console.log('🔁 Обратная конвертация:');
102
- console.log(JSON.stringify(fromNdjson, null, 2));
103
- console.log();
104
-
105
- // Статистика
106
- const ndjsonStats = NdjsonParser.getStats(ndjson);
107
- console.log('📊 Статистика NDJSON:');
108
- console.log(` Строк: ${ndjsonStats.totalLines}`);
109
- console.log(` Валидных: ${ndjsonStats.validLines}`);
110
- console.log(` Успешность: ${ndjsonStats.successRate}%`);
111
-
112
- // ============================================================================
113
- // 4. Plugin System (расширяемость)
114
- // ============================================================================
115
-
116
- console.log('\n4. 🔌 Plugin System (расширяемость)');
117
- console.log('='.repeat(60));
118
-
119
- const PluginManager = require('../src/core/plugin-system');
120
-
121
- // Создаем простой плагин для логирования
122
- const loggingPlugin = {
123
- name: 'Logging Plugin',
124
- version: '1.0.0',
125
- description: 'Логирование операций конвертации',
126
-
127
- hooks: {
128
- 'before:csvToJson': (csv, context) => {
129
- console.log(` 📥 Начало csvToJson (${csv.length} байт)`);
130
- return csv;
131
- },
132
-
133
- 'after:csvToJson': (result, context) => {
134
- console.log(` 📤 Завершение csvToJson (${result.length} записей)`);
135
- return result;
136
- },
137
-
138
- 'before:jsonToCsv': (json, context) => {
139
- console.log(` 📥 Начало jsonToCsv (${json.length} записей)`);
140
- return json;
141
- },
142
-
143
- 'after:jsonToCsv': (csv, context) => {
144
- console.log(` 📤 Завершение jsonToCsv (${csv.length} байт)`);
145
- return csv;
146
- }
147
- },
148
-
149
- middlewares: [
150
- async (ctx, next) => {
151
- console.log(` 🔄 Middleware: ${ctx.operation} начат`);
152
- const start = Date.now();
153
- await next();
154
- const duration = Date.now() - start;
155
- console.log(` ✅ Middleware: ${ctx.operation} завершен за ${duration}ms`);
156
- }
157
- ]
158
- };
159
-
160
- // Создаем плагин для трансформации данных
161
- const transformPlugin = {
162
- name: 'Transform Plugin',
163
- version: '1.0.0',
164
- description: 'Трансформация данных перед обработкой',
165
-
166
- hooks: {
167
- 'before:jsonToCsv': (json, context) => {
168
- // Добавляем timestamp к каждой записи
169
- return json.map(item => ({
170
- ...item,
171
- processedAt: new Date().toISOString(),
172
- processedBy: 'transform-plugin'
173
- }));
174
- }
175
- }
176
- };
177
-
178
- // Инициализируем менеджер плагинов
179
- const pluginManager = new PluginManager();
180
- pluginManager.use('logging', loggingPlugin);
181
- pluginManager.use('transform', transformPlugin);
182
-
183
- console.log('📋 Зарегистрированные плагины:');
184
- pluginManager.listPlugins().forEach(plugin => {
185
- console.log(` • ${plugin.name} v${plugin.version} - ${plugin.description}`);
186
- });
187
-
188
- console.log('\n🔄 Выполнение с плагинами...');
189
-
190
- // Основная функция для демонстрации
191
- const processData = async () => {
192
- const testJson = [
193
- { id: 1, value: 'test1' },
194
- { id: 2, value: 'test2' }
195
- ];
196
-
197
- // Выполняем с плагинами
198
- const result = await pluginManager.executeWithPlugins(
199
- 'jsonToCsv',
200
- testJson,
201
- { delimiter: '|' },
202
- (data, options) => {
203
- // Имитация основной функции
204
- const headers = Object.keys(data[0]);
205
- const rows = data.map(item => headers.map(h => item[h]).join(options.delimiter));
206
- return [headers.join(options.delimiter), ...rows].join('\n');
207
- }
208
- );
209
-
210
- console.log('\n📄 Результат с плагинами:');
211
- console.log(result);
212
- };
213
-
214
- await processData();
215
-
216
- // Статистика плагинов
217
- const pluginStats = pluginManager.getStats();
218
- console.log('\n📊 Статистика Plugin System:');
219
- console.log(` Плагинов: ${pluginStats.plugins}`);
220
- console.log(` Hooks выполнено: ${pluginStats.hookExecutions}`);
221
- console.log(` Middleware выполнено: ${pluginStats.middlewareExecutions}`);
222
- console.log(` Уникальных hooks: ${pluginStats.uniqueHooks}`);
223
-
224
- // ============================================================================
225
- // 5. JTCSV с плагинами (полная интеграция)
226
- // ============================================================================
227
-
228
- console.log('\n5. 🎯 JTCSV с плагинами (полная интеграция)');
229
- console.log('='.repeat(60));
230
-
231
- // Проверяем доступность полной интеграции
232
- try {
233
- const JtcsvWithPlugins = require('../src/index-with-plugins');
234
-
235
- console.log('✅ Полная интеграция доступна');
236
- console.log('Запустите для полной демонстрации:');
237
- console.log(' npm run example:plugins');
238
- console.log('\nИли посмотрите пример:');
239
- console.log(' examples/plugin-excel-exporter.js');
240
- } catch (error) {
241
- console.log('⚠️ Полная интеграция требует дополнительных зависимостей');
242
- console.log('Установите @jtcsv/excel и exceljs для демонстрации Excel плагина:');
243
- console.log(' npm install @jtcsv/excel exceljs');
244
- }
245
-
246
- // ============================================================================
247
- // Итоги
248
- // ============================================================================
249
-
250
- console.log('\n' + '='.repeat(60));
251
- console.log('🎉 ДЕМОНСТРАЦИЯ ЗАВЕРШЕНА!');
252
- console.log('='.repeat(60));
253
-
254
- console.log('\n📈 ИТОГИ JTCSV 2.1.0:');
255
- console.log('✅ Обратная совместимость с 2.0.0');
256
- console.log('✅ Fast-Path Engine (до 3-4x быстрее)');
257
- console.log('✅ NDJSON поддержка для потоковой обработки');
258
- console.log('✅ Plugin System для расширяемости');
259
- console.log('✅ Excel интеграция (через плагины)');
260
- console.log('✅ Детальная статистика и мониторинг');
261
-
262
- console.log('\n🚀 Следующие шаги:');
263
- console.log('1. Изучите README-PLUGINS.md для подробной документации');
264
- console.log('2. Запустите тесты: npm test');
265
- console.log('3. Попробуйте примеры: npm run example:plugins');
266
- console.log('4. Создайте свой плагин!');
267
-
268
- console.log('\n💡 Совет: Для production используйте:');
269
- console.log(' const jtcsv = require("jtcsv/plugins").create();');
270
- console.log(' jtcsv.use("your-plugin", yourPluginConfig);');
271
-
272
- console.log('\n📚 Документация: https://github.com/Linol-Hamelton/jtcsv');
273
- console.log('🐛 Issues: https://github.com/Linol-Hamelton/jtcsv/issues');
274
- console.log('⭐ Star на GitHub если понравилось!');
275
-
276
- console.log('\n' + '✨'.repeat(30));
277
- console.log('✨ JTCSV 2.1.0 - Next Generation JSON/CSV Converter ✨');
278
- console.log('✨'.repeat(30));
279
- })().catch((error) => {
280
- console.error('Demo failed:', error);
281
- process.exitCode = 1;
282
- });
@@ -1,418 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Streaming Example for jtcsv
5
- *
6
- * Demonstrates bidirectional streaming with large datasets
7
- * and real-time progress monitoring.
8
- */
9
-
10
- const fs = require('fs');
11
- const path = require('path');
12
- const { pipeline } = require('stream/promises');
13
- const jtcsv = require('../index.js');
14
-
15
- async function generateLargeJsonFile(filePath, recordCount) {
16
- console.log(`Generating ${recordCount} records...`);
17
-
18
- const writeStream = fs.createWriteStream(filePath, 'utf8');
19
-
20
- // Write opening bracket for JSON array
21
- writeStream.write('[');
22
-
23
- for (let i = 1; i <= recordCount; i++) {
24
- const record = {
25
- id: i,
26
- name: `User ${i}`,
27
- email: `user${i}@example.com`,
28
- age: Math.floor(Math.random() * 50) + 18,
29
- active: Math.random() > 0.5,
30
- score: Math.random() * 100,
31
- tags: ['customer', `tier${Math.floor(Math.random() * 3) + 1}`],
32
- metadata: {
33
- created: new Date().toISOString(),
34
- updated: new Date().toISOString(),
35
- version: '1.0.0'
36
- }
37
- };
38
-
39
- const jsonRecord = JSON.stringify(record);
40
- writeStream.write(jsonRecord);
41
-
42
- if (i < recordCount) {
43
- writeStream.write(',');
44
- }
45
-
46
- // Show progress every 10,000 records
47
- if (i % 10000 === 0) {
48
- process.stdout.write(` Generated ${i} records\r`);
49
- }
50
- }
51
-
52
- // Write closing bracket
53
- writeStream.write(']');
54
-
55
- await new Promise((resolve) => {
56
- writeStream.end(() => {
57
- console.log(`\nGenerated ${recordCount} records in ${filePath}`);
58
- resolve();
59
- });
60
- });
61
- }
62
-
63
- async function exampleJsonToCsvStreaming() {
64
- console.log('\n=== Example 1: JSON to CSV Streaming ===');
65
-
66
- const inputFile = './examples/large-data.json';
67
- const outputFile = './examples/large-data.csv';
68
-
69
- // Generate test data if needed
70
- if (!fs.existsSync(inputFile)) {
71
- await generateLargeJsonFile(inputFile, 100000);
72
- }
73
-
74
- console.log('Converting JSON to CSV using streaming...');
75
-
76
- const startTime = Date.now();
77
-
78
- try {
79
- // Create readable stream from file
80
- const readStream = fs.createReadStream(inputFile, 'utf8');
81
-
82
- // Parse JSON stream (simplified - in real app use proper JSON stream parser)
83
- let buffer = '';
84
- let recordCount = 0;
85
-
86
- const jsonStream = new (require('stream').Transform)({
87
- objectMode: true,
88
- transform(chunk, encoding, callback) {
89
- buffer += chunk;
90
-
91
- // Simple JSON parsing for demonstration
92
- // In production, use a proper JSON stream parser
93
- try {
94
- const data = JSON.parse(buffer);
95
- if (Array.isArray(data)) {
96
- data.forEach(item => {
97
- this.push(item);
98
- recordCount++;
99
-
100
- if (recordCount % 10000 === 0) {
101
- console.log(` Processed ${recordCount} records`);
102
- }
103
- });
104
- }
105
- buffer = '';
106
- } catch (error) {
107
- // Incomplete JSON, wait for more data
108
- }
109
-
110
- callback();
111
- },
112
-
113
- flush(callback) {
114
- // Process any remaining data
115
- if (buffer.trim()) {
116
- try {
117
- const data = JSON.parse(buffer);
118
- if (Array.isArray(data)) {
119
- data.forEach(item => {
120
- this.push(item);
121
- recordCount++;
122
- });
123
- }
124
- } catch (error) {
125
- console.error('Error parsing final JSON:', error.message);
126
- }
127
- }
128
- callback();
129
- }
130
- });
131
-
132
- // Create CSV transform stream
133
- const csvStream = jtcsv.createJsonToCsvStream({
134
- delimiter: ',',
135
- includeHeaders: true,
136
- renameMap: {
137
- id: 'ID',
138
- name: 'Full Name',
139
- email: 'Email Address',
140
- age: 'Age',
141
- active: 'Active Status',
142
- score: 'Score',
143
- 'metadata.created': 'Created Date',
144
- 'metadata.updated': 'Updated Date'
145
- },
146
- preventCsvInjection: true,
147
- rfc4180Compliant: true
148
- });
149
-
150
- // Create write stream
151
- const writeStream = fs.createWriteStream(outputFile, 'utf8');
152
-
153
- // Add UTF-8 BOM for Excel compatibility
154
- writeStream.write('\uFEFF');
155
-
156
- // Pipe streams together
157
- await pipeline(
158
- readStream,
159
- jsonStream,
160
- csvStream,
161
- writeStream
162
- );
163
-
164
- const elapsed = Date.now() - startTime;
165
- console.log(`✓ Converted ${recordCount} records in ${elapsed}ms`);
166
-
167
- // Show file sizes
168
- const inputStats = fs.statSync(inputFile);
169
- const outputStats = fs.statSync(outputFile);
170
-
171
- console.log(` Input: ${(inputStats.size / 1024 / 1024).toFixed(2)} MB`);
172
- console.log(` Output: ${(outputStats.size / 1024 / 1024).toFixed(2)} MB`);
173
-
174
- } catch (error) {
175
- console.error('Error:', error.message);
176
- }
177
- }
178
-
179
- async function exampleCsvToJsonStreaming() {
180
- console.log('\n=== Example 2: CSV to JSON Streaming ===');
181
-
182
- const inputFile = './examples/large-data.csv';
183
- const outputFile = './examples/streamed-output.json';
184
-
185
- if (!fs.existsSync(inputFile)) {
186
- console.log('CSV file not found. Run Example 1 first.');
187
- return;
188
- }
189
-
190
- console.log('Converting CSV to JSON using streaming...');
191
-
192
- const startTime = Date.now();
193
-
194
- try {
195
- // Create CSV read stream
196
- const readStream = fs.createReadStream(inputFile, 'utf8');
197
-
198
- // Create CSV to JSON transform stream
199
- const jsonStream = jtcsv.createCsvToJsonStream({
200
- delimiter: ',',
201
- hasHeaders: true,
202
- parseNumbers: true,
203
- parseBooleans: true,
204
- renameMap: {
205
- 'ID': 'id',
206
- 'Full Name': 'name',
207
- 'Email Address': 'email',
208
- 'Age': 'age',
209
- 'Active Status': 'active',
210
- 'Score': 'score',
211
- 'Created Date': 'created',
212
- 'Updated Date': 'updated'
213
- }
214
- });
215
-
216
- // Create JSON write stream
217
- const writeStream = fs.createWriteStream(outputFile, 'utf8');
218
-
219
- // Write opening bracket
220
- writeStream.write('[');
221
-
222
- let recordCount = 0;
223
- let firstRecord = true;
224
-
225
- // Custom transform to format JSON array
226
- const arrayFormatter = new (require('stream').Transform)({
227
- objectMode: true,
228
- transform(chunk, encoding, callback) {
229
- const jsonRecord = JSON.stringify(chunk);
230
-
231
- if (!firstRecord) {
232
- writeStream.write(',');
233
- } else {
234
- firstRecord = false;
235
- }
236
-
237
- writeStream.write(jsonRecord);
238
-
239
- recordCount++;
240
- if (recordCount % 10000 === 0) {
241
- console.log(` Processed ${recordCount} records`);
242
- }
243
-
244
- callback();
245
- },
246
-
247
- flush(callback) {
248
- // Write closing bracket
249
- writeStream.write(']');
250
- callback();
251
- }
252
- });
253
-
254
- // Pipe streams together
255
- await pipeline(
256
- readStream,
257
- jsonStream,
258
- arrayFormatter
259
- );
260
-
261
- // Close write stream
262
- await new Promise((resolve) => {
263
- writeStream.end(() => resolve());
264
- });
265
-
266
- const elapsed = Date.now() - startTime;
267
- console.log(`✓ Converted ${recordCount} records in ${elapsed}ms`);
268
-
269
- // Verify roundtrip
270
- const inputStats = fs.statSync(inputFile);
271
- const outputStats = fs.statSync(outputFile);
272
-
273
- console.log(` Input: ${(inputStats.size / 1024 / 1024).toFixed(2)} MB`);
274
- console.log(` Output: ${(outputStats.size / 1024 / 1024).toFixed(2)} MB`);
275
-
276
- // Sample verification
277
- const sampleData = require(outputFile).slice(0, 3);
278
- console.log('\nSample of converted data (first 3 records):');
279
- console.log(JSON.stringify(sampleData, null, 2));
280
-
281
- } catch (error) {
282
- console.error('Error:', error.message);
283
- }
284
- }
285
-
286
- async function exampleBidirectionalStreaming() {
287
- console.log('\n=== Example 3: Bidirectional Streaming Pipeline ===');
288
-
289
- const inputFile = './examples/large-data.json';
290
- const tempFile = './examples/temp-stream.csv';
291
- const outputFile = './examples/final-stream.json';
292
-
293
- if (!fs.existsSync(inputFile)) {
294
- await generateLargeJsonFile(inputFile, 50000);
295
- }
296
-
297
- console.log('Running bidirectional streaming pipeline...');
298
- console.log('JSON → CSV → JSON roundtrip');
299
-
300
- const startTime = Date.now();
301
-
302
- try {
303
- // Step 1: JSON to CSV
304
- console.log('\nStep 1: Converting JSON to CSV...');
305
-
306
- const jsonToCsvOptions = {
307
- delimiter: ',',
308
- includeHeaders: true,
309
- preventCsvInjection: true
310
- };
311
-
312
- // For simplicity, we'll use the regular conversion
313
- // In production, you would use proper streaming
314
- const jsonData = require(inputFile);
315
- const csvData = jtcsv.jsonToCsv(jsonData, jsonToCsvOptions);
316
-
317
- await fs.promises.writeFile(tempFile, csvData, 'utf8');
318
-
319
- const step1Time = Date.now() - startTime;
320
- console.log(` ✓ Step 1 completed in ${step1Time}ms`);
321
-
322
- // Step 2: CSV to JSON
323
- console.log('\nStep 2: Converting CSV to JSON...');
324
-
325
- const csvToJsonOptions = {
326
- delimiter: ',',
327
- hasHeaders: true,
328
- parseNumbers: true,
329
- parseBooleans: true
330
- };
331
-
332
- const finalData = await jtcsv.readCsvAsJson(tempFile, csvToJsonOptions);
333
-
334
- await fs.promises.writeFile(
335
- outputFile,
336
- JSON.stringify(finalData, null, 2),
337
- 'utf8'
338
- );
339
-
340
- const totalTime = Date.now() - startTime;
341
- console.log(` ✓ Step 2 completed in ${totalTime - step1Time}ms`);
342
-
343
- // Verification
344
- console.log('\nVerification:');
345
- console.log(` Original records: ${jsonData.length}`);
346
- console.log(` Final records: ${finalData.length}`);
347
-
348
- // Check if data survived roundtrip
349
- const sampleOriginal = jsonData[0];
350
- const sampleFinal = finalData[0];
351
-
352
- console.log('\nSample comparison (first record):');
353
- console.log(' Original:', JSON.stringify(sampleOriginal).substring(0, 100) + '...');
354
- console.log(' Final: ', JSON.stringify(sampleFinal).substring(0, 100) + '...');
355
-
356
- // Cleanup temp file
357
- await fs.promises.unlink(tempFile).catch(() => {});
358
-
359
- console.log(`\n✓ Bidirectional streaming completed in ${totalTime}ms`);
360
-
361
- } catch (error) {
362
- console.error('Error:', error.message);
363
-
364
- // Cleanup on error
365
- try {
366
- await fs.promises.unlink(tempFile);
367
- } catch (_e) {
368
- // Ignore cleanup errors
369
- }
370
- }
371
- }
372
-
373
- async function main() {
374
- console.log('='.repeat(60));
375
- console.log('jtcsv Streaming Examples');
376
- console.log('='.repeat(60));
377
-
378
- // Create examples directory
379
- const examplesDir = './examples';
380
- if (!fs.existsSync(examplesDir)) {
381
- fs.mkdirSync(examplesDir, { recursive: true });
382
- }
383
-
384
- try {
385
- await exampleJsonToCsvStreaming();
386
- await exampleCsvToJsonStreaming();
387
- await exampleBidirectionalStreaming();
388
-
389
- console.log('\n' + '='.repeat(60));
390
- console.log('All examples completed successfully!');
391
- console.log('='.repeat(60));
392
-
393
- console.log('\nTry these commands:');
394
- console.log(' • Launch TUI: npx jtcsv tui');
395
- console.log(' • Convert JSON: npx jtcsv json2csv examples/large-data.json output.csv');
396
- console.log(' • Convert CSV: npx jtcsv csv2json examples/large-data.csv output.json');
397
- console.log(' • Streaming mode: npx jtcsv stream json2csv examples/large-data.json streamed.csv');
398
-
399
- } catch (error) {
400
- console.error('\nError running examples:', error.message);
401
- process.exit(1);
402
- }
403
- }
404
-
405
- // Run examples
406
- if (require.main === module) {
407
- main().catch((error) => {
408
- console.error('Fatal error:', error);
409
- process.exit(1);
410
- });
411
- }
412
-
413
- module.exports = {
414
- generateLargeJsonFile,
415
- exampleJsonToCsvStreaming,
416
- exampleCsvToJsonStreaming,
417
- exampleBidirectionalStreaming
418
- };