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
package/errors.js DELETED
@@ -1,208 +0,0 @@
1
- /**
2
- * Custom error classes for jtcsv
3
- */
4
-
5
- /**
6
- * Base error class for jtcsv
7
- */
8
- class JtcsvError extends Error {
9
- constructor(message, code = 'JTCSV_ERROR') {
10
- super(message);
11
- this.name = 'JtcsvError';
12
- this.code = code;
13
-
14
- // Maintains proper stack trace for where our error was thrown
15
- if (Error.captureStackTrace) {
16
- Error.captureStackTrace(this, JtcsvError);
17
- }
18
- }
19
- }
20
-
21
- /**
22
- * Error for invalid input data
23
- */
24
- class ValidationError extends JtcsvError {
25
- constructor(message) {
26
- super(message, 'VALIDATION_ERROR');
27
- this.name = 'ValidationError';
28
- }
29
- }
30
-
31
- /**
32
- * Error for security violations
33
- */
34
- class SecurityError extends JtcsvError {
35
- constructor(message) {
36
- super(message, 'SECURITY_ERROR');
37
- this.name = 'SecurityError';
38
- }
39
- }
40
-
41
- /**
42
- * Error for file system operations
43
- */
44
- class FileSystemError extends JtcsvError {
45
- constructor(message, originalError = null) {
46
- super(message, 'FILE_SYSTEM_ERROR');
47
- this.name = 'FileSystemError';
48
- this.originalError = originalError;
49
- }
50
- }
51
-
52
- /**
53
- * Error for parsing/formatting issues
54
- */
55
- class ParsingError extends JtcsvError {
56
- constructor(message, lineNumber = null, column = null) {
57
- super(message, 'PARSING_ERROR');
58
- this.name = 'ParsingError';
59
- this.lineNumber = lineNumber;
60
- this.column = column;
61
- }
62
- }
63
-
64
- /**
65
- * Error for size/limit violations
66
- */
67
- class LimitError extends JtcsvError {
68
- constructor(message, limit, actual) {
69
- super(message, 'LIMIT_ERROR');
70
- this.name = 'LimitError';
71
- this.limit = limit;
72
- this.actual = actual;
73
- }
74
- }
75
-
76
- /**
77
- * Error for configuration issues
78
- */
79
- class ConfigurationError extends JtcsvError {
80
- constructor(message) {
81
- super(message, 'CONFIGURATION_ERROR');
82
- this.name = 'ConfigurationError';
83
- }
84
- }
85
-
86
- const ERROR_CODES = {
87
- JTCSV_ERROR: 'JTCSV_ERROR',
88
- VALIDATION_ERROR: 'VALIDATION_ERROR',
89
- SECURITY_ERROR: 'SECURITY_ERROR',
90
- FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',
91
- PARSING_ERROR: 'PARSING_ERROR',
92
- LIMIT_ERROR: 'LIMIT_ERROR',
93
- CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
94
- INVALID_INPUT: 'INVALID_INPUT',
95
- SECURITY_VIOLATION: 'SECURITY_VIOLATION',
96
- FILE_NOT_FOUND: 'FILE_NOT_FOUND',
97
- PARSE_FAILED: 'PARSE_FAILED',
98
- SIZE_LIMIT: 'SIZE_LIMIT',
99
- INVALID_CONFIG: 'INVALID_CONFIG',
100
- UNKNOWN_ERROR: 'UNKNOWN_ERROR'
101
- };
102
-
103
- /**
104
- * Utility function to create standardized error messages
105
- */
106
- function createErrorMessage(type, details) {
107
- const messages = {
108
- INVALID_INPUT: `Invalid input: ${details}`,
109
- SECURITY_VIOLATION: `Security violation: ${details}`,
110
- FILE_NOT_FOUND: `File not found: ${details}`,
111
- PARSE_FAILED: `Parse failed: ${details}`,
112
- SIZE_LIMIT: `Size limit exceeded: ${details}`,
113
- INVALID_CONFIG: `Invalid configuration: ${details}`,
114
- UNKNOWN_ERROR: `Unknown error: ${details}`
115
- };
116
-
117
- return messages[type] || messages.UNKNOWN_ERROR;
118
- }
119
-
120
- /**
121
- * Error handler utility
122
- */
123
- /* istanbul ignore next */
124
- function handleError(error, context = {}) {
125
- // Log error in development
126
- if (process.env.NODE_ENV === 'development') {
127
- console.error(`[jtcsv] Error in ${context.function || 'unknown'}:`, {
128
- message: error.message,
129
- code: error.code,
130
- stack: error.stack,
131
- context
132
- });
133
- }
134
-
135
- // Re-throw the error
136
- throw error;
137
- }
138
-
139
- /**
140
- * Safe execution wrapper for async functions
141
- */
142
- /* istanbul ignore next */
143
- async function safeExecuteAsync(fn, errorType, context = {}) {
144
- try {
145
- return await fn();
146
- } catch (error) {
147
- if (error instanceof JtcsvError) {
148
- throw error;
149
- }
150
-
151
- // Wrap unknown errors
152
- const message = createErrorMessage(errorType, error.message);
153
- const wrappedError = new JtcsvError(message, errorType);
154
- wrappedError.originalError = error;
155
-
156
- handleError(wrappedError, context);
157
- }
158
- }
159
-
160
- /**
161
- * Safe execution wrapper for sync functions
162
- */
163
- function safeExecuteSync(fn, errorType, context = {}) {
164
- try {
165
- return fn();
166
- } catch (error) {
167
- if (error instanceof JtcsvError) {
168
- throw error;
169
- }
170
-
171
- // Wrap unknown errors
172
- const message = createErrorMessage(errorType, error.message);
173
- const wrappedError = new JtcsvError(message, errorType);
174
- wrappedError.originalError = error;
175
-
176
- handleError(wrappedError, context);
177
- }
178
- }
179
-
180
- /**
181
- * Safe execution wrapper (auto-detects async/sync)
182
- */
183
- function safeExecute(fn, errorType, context = {}) {
184
- const result = fn();
185
-
186
- // Check if function returns a promise
187
- if (result && typeof result.then === 'function') {
188
- return safeExecuteAsync(async () => result, errorType, context);
189
- }
190
-
191
- return safeExecuteSync(() => result, errorType, context);
192
- }
193
-
194
- module.exports = {
195
- JtcsvError,
196
- ValidationError,
197
- SecurityError,
198
- FileSystemError,
199
- ParsingError,
200
- LimitError,
201
- ConfigurationError,
202
- ERROR_CODES,
203
- createErrorMessage,
204
- handleError,
205
- safeExecute,
206
- safeExecuteAsync,
207
- safeExecuteSync
208
- };
@@ -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
- });
package/index.js DELETED
@@ -1,68 +0,0 @@
1
- // Main entry point for the jtcsv module
2
- // Exports both JSON→CSV and CSV→JSON functions
3
-
4
- const jsonToCsvModule = require('./json-to-csv');
5
- const csvToJsonModule = require('./csv-to-json');
6
- const errorsModule = require('./errors');
7
- const jsonSaveModule = require('./json-save');
8
- const streamJsonToCsvModule = require('./stream-json-to-csv');
9
- const streamCsvToJsonModule = require('./stream-csv-to-json');
10
- const ndjsonParser = require('./src/formats/ndjson-parser');
11
- const tsvParser = require('./src/formats/tsv-parser');
12
-
13
- // Combine all exports
14
- module.exports = {
15
- // JSON to CSV functions
16
- jsonToCsv: jsonToCsvModule.jsonToCsv,
17
- preprocessData: jsonToCsvModule.preprocessData,
18
- saveAsCsv: jsonToCsvModule.saveAsCsv,
19
- deepUnwrap: jsonToCsvModule.deepUnwrap,
20
- validateFilePath: jsonToCsvModule.validateFilePath,
21
-
22
- // CSV to JSON functions
23
- csvToJson: csvToJsonModule.csvToJson,
24
- csvToJsonIterator: csvToJsonModule.csvToJsonIterator,
25
- readCsvAsJson: csvToJsonModule.readCsvAsJson,
26
- readCsvAsJsonSync: csvToJsonModule.readCsvAsJsonSync,
27
- autoDetectDelimiter: csvToJsonModule.autoDetectDelimiter,
28
-
29
- // JSON save functions
30
- saveAsJson: jsonSaveModule.saveAsJson,
31
- saveAsJsonSync: jsonSaveModule.saveAsJsonSync,
32
-
33
- // Streaming JSON to CSV functions
34
- createJsonToCsvStream: streamJsonToCsvModule.createJsonToCsvStream,
35
- streamJsonToCsv: streamJsonToCsvModule.streamJsonToCsv,
36
- saveJsonStreamAsCsv: streamJsonToCsvModule.saveJsonStreamAsCsv,
37
- createJsonReadableStream: streamJsonToCsvModule.createJsonReadableStream,
38
- createCsvCollectorStream: streamJsonToCsvModule.createCsvCollectorStream,
39
-
40
- // Streaming CSV to JSON functions
41
- createCsvToJsonStream: streamCsvToJsonModule.createCsvToJsonStream,
42
- streamCsvToJson: streamCsvToJsonModule.streamCsvToJson,
43
- createCsvFileToJsonStream: streamCsvToJsonModule.createCsvFileToJsonStream,
44
- createJsonCollectorStream: streamCsvToJsonModule.createJsonCollectorStream,
45
-
46
- // NDJSON format support
47
- jsonToNdjson: ndjsonParser.toNdjson,
48
- ndjsonToJson: ndjsonParser.fromNdjson,
49
- parseNdjsonStream: ndjsonParser.parseStream,
50
- createNdjsonToCsvStream: ndjsonParser.createNdjsonToCsvStream,
51
- createCsvToNdjsonStream: ndjsonParser.createCsvToNdjsonStream,
52
- getNdjsonStats: ndjsonParser.getStats,
53
-
54
- // TSV format support
55
- jsonToTsv: tsvParser.jsonToTsv,
56
- tsvToJson: tsvParser.tsvToJson,
57
- isTsv: tsvParser.isTsv,
58
- validateTsv: tsvParser.validateTsv,
59
- readTsvAsJson: tsvParser.readTsvAsJson,
60
- readTsvAsJsonSync: tsvParser.readTsvAsJsonSync,
61
- saveAsTsv: tsvParser.saveAsTsv,
62
- saveAsTsvSync: tsvParser.saveAsTsvSync,
63
- createJsonToTsvStream: tsvParser.createJsonToTsvStream,
64
- createTsvToJsonStream: tsvParser.createTsvToJsonStream,
65
-
66
- // Error classes
67
- ...errorsModule
68
- };