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
@@ -1,371 +1,395 @@
1
- /**
2
- * JTCSV с поддержкой плагинов
3
- * Расширяемая версия основного API с plugin system
4
- *
5
- * @version 1.0.0
6
- * @date 2026-01-22
7
- */
8
-
9
- const PluginManager = require('./core/plugin-system');
10
- const FastPathEngine = require('./engines/fast-path-engine');
11
- const NdjsonParser = require('./formats/ndjson-parser');
12
-
13
- // Импортируем основные функции
14
- const coreJsonToCsv = require('../json-to-csv').jsonToCsv;
15
- const coreCsvToJson = require('../csv-to-json').csvToJson;
16
- const coreCsvToJsonIterator = require('../csv-to-json').csvToJsonIterator;
17
- const coreSaveAsCsv = require('../json-to-csv').saveAsCsv;
18
- const coreReadCsvAsJson = require('../csv-to-json').readCsvAsJson;
19
-
20
- class JtcsvWithPlugins {
21
- constructor(options = {}) {
22
- this.pluginManager = new PluginManager();
23
- this.fastPathEngine = new FastPathEngine();
24
- this.options = {
25
- enableFastPath: true,
26
- enablePlugins: true,
27
- ...options
28
- };
29
-
30
- // Регистрируем встроенные плагины
31
- this._registerBuiltinPlugins();
32
- }
33
-
34
- /**
35
- * Регистрирует встроенные плагины
36
- */
37
- _registerBuiltinPlugins() {
38
- // Fast Path Engine плагин
39
- this.pluginManager.use('fast-path-engine', {
40
- name: 'Fast Path Engine',
41
- version: '1.0.0',
42
- description: 'Оптимизированный парсер CSV с автоматическим выбором стратегии',
43
- hooks: {
44
- 'before:csvToJson': (csv, context) => {
45
- if (this.options.enableFastPath && context.options?.useFastPath !== false) {
46
- // Используем fast path engine для анализа
47
- const sample = csv.substring(0, Math.min(1000, csv.length));
48
- const structure = this.fastPathEngine.analyzeStructure(sample, context.options);
49
-
50
- context.metadata.fastPathStructure = structure;
51
- console.log(`🚀 Используется ${structure.recommendedEngine} парсер`);
52
- }
53
- return csv;
54
- },
55
- 'after:csvToJson': (result, context) => {
56
- if (context.metadata?.fastPathStructure) {
57
- context.metadata.fastPathStats = this.fastPathEngine.getStats();
58
- }
59
- return result;
60
- }
61
- }
62
- });
63
-
64
- // NDJSON плагин
65
- this.pluginManager.use('ndjson-support', {
66
- name: 'NDJSON Support',
67
- version: '1.0.0',
68
- description: 'Поддержка Newline Delimited JSON формата',
69
- hooks: {
70
- 'before:parse': (input, context) => {
71
- if (context.options?.format === 'ndjson') {
72
- // Парсим NDJSON
73
- return NdjsonParser.fromNdjson(input, context.options);
74
- }
75
- return input;
76
- },
77
- 'after:serialize': (output, context) => {
78
- if (context.options?.format === 'ndjson') {
79
- // Сериализуем в NDJSON
80
- return NdjsonParser.toNdjson(output, context.options);
81
- }
82
- return output;
83
- }
84
- }
85
- });
86
-
87
- // Валидация данных плагин
88
- this.pluginManager.use('data-validation', {
89
- name: 'Data Validation',
90
- version: '1.0.0',
91
- description: 'Валидация входных и выходных данных',
92
- hooks: {
93
- 'validation': (data, context) => {
94
- if (!data) {
95
- throw new Error('Данные не могут быть пустыми');
96
- }
97
-
98
- if (context.operation === 'jsonToCsv' && !Array.isArray(data)) {
99
- throw new Error('Для конвертации в CSV данные должны быть массивом');
100
- }
101
-
102
- return data;
103
- }
104
- },
105
- middlewares: [
106
- async (ctx, next) => {
107
- // Валидация перед выполнением
108
- await this.pluginManager.executeHooks('validation', ctx.input, ctx);
109
- await next();
110
- // Валидация после выполнения
111
- await this.pluginManager.executeHooks('validation', ctx.result, ctx);
112
- }
113
- ]
114
- });
115
-
116
- // Логирование плагин
117
- this.pluginManager.use('logging', {
118
- name: 'Logging',
119
- version: '1.0.0',
120
- description: 'Логирование операций',
121
- hooks: {
122
- 'before:csvToJson': (csv, context) => {
123
- console.log(`📥 Начало csvToJson, размер: ${csv.length} байт`);
124
- return csv;
125
- },
126
- 'after:csvToJson': (result, context) => {
127
- console.log(`📤 Завершение csvToJson, результат: ${result.length} записей`);
128
- return result;
129
- },
130
- 'before:jsonToCsv': (json, context) => {
131
- console.log(`📥 Начало jsonToCsv, записей: ${json.length}`);
132
- return json;
133
- },
134
- 'after:jsonToCsv': (csv, context) => {
135
- console.log(`📤 Завершение jsonToCsv, размер: ${csv.length} байт`);
136
- return csv;
137
- }
138
- }
139
- });
140
- }
141
-
142
- /**
143
- * Конвертирует CSV в JSON с поддержкой плагинов
144
- * @param {string} csv - CSV данные
145
- * @param {Object} options - Опции парсинга
146
- * @returns {Promise<Array>} JSON данные
147
- */
148
- async csvToJson(csv, options = {}) {
149
- if (!this.options.enablePlugins) {
150
- return coreCsvToJson(csv, options);
151
- }
152
-
153
- return this.pluginManager.executeWithPlugins(
154
- 'csvToJson',
155
- csv,
156
- options,
157
- (input, opts) => {
158
- if (this.options.enableFastPath && opts?.useFastPath !== false) {
159
- return coreCsvToJson(input, { ...opts, useFastPath: true });
160
- }
161
-
162
- return coreCsvToJson(input, opts);
163
- }
164
- );
165
- }
166
-
167
- /**
168
- * Convert CSV to JSON rows as async iterator with plugin hooks.
169
- * @param {string} csv - CSV input
170
- * @param {Object} options - Conversion options
171
- * @returns {AsyncGenerator} Async iterator of rows
172
- */
173
- async *csvToJsonIterator(csv, options = {}) {
1
+ /**
2
+ * JTCSV с поддержкой плагинов
3
+ * Расширяемая версия основного API с plugin system
4
+ *
5
+ * @version 1.0.0
6
+ * @date 2026-01-22
7
+ */
8
+
9
+ import { PluginManager } from './core/plugin-system';
10
+ import FastPathEngine from './engines/fast-path-engine';
11
+ import NdjsonParser from './formats/ndjson-parser';
12
+
13
+ // Импортируем основные функции
14
+ import { jsonToCsv as coreJsonToCsv } from '../json-to-csv';
15
+ import { csvToJson as coreCsvToJson, csvToJsonIterator as coreCsvToJsonIterator } from '../csv-to-json';
16
+ import { saveAsCsv as coreSaveAsCsv } from '../json-to-csv';
17
+ import { readCsvAsJson as coreReadCsvAsJson } from '../csv-to-json';
18
+
19
+ import type { CsvToJsonOptions, JsonToCsvOptions, SaveAsCsvOptions } from './types';
20
+
21
+ export interface JtcsvWithPluginsOptions {
22
+ enableFastPath?: boolean;
23
+ enablePlugins?: boolean;
24
+ [key: string]: any;
25
+ }
26
+
27
+ export interface PluginHookContext {
28
+ operation: string;
29
+ options?: any;
30
+ metadata?: Record<string, any>;
31
+ }
32
+
33
+ export class JtcsvWithPlugins {
34
+ private pluginManager: PluginManager;
35
+ private fastPathEngine: FastPathEngine;
36
+ private options: JtcsvWithPluginsOptions;
37
+
38
+ constructor(options: JtcsvWithPluginsOptions = {}) {
39
+ this.pluginManager = new PluginManager();
40
+ this.fastPathEngine = new FastPathEngine();
41
+ this.options = {
42
+ enableFastPath: true,
43
+ enablePlugins: true,
44
+ ...options
45
+ };
46
+
47
+ // Регистрируем встроенные плагины
48
+ this._registerBuiltinPlugins();
49
+ }
50
+
51
+ /**
52
+ * Регистрирует встроенные плагины
53
+ */
54
+ private _registerBuiltinPlugins(): void {
55
+ // Fast Path Engine плагин
56
+ this.pluginManager.use('fast-path-engine', {
57
+ name: 'Fast Path Engine',
58
+ version: '1.0.0',
59
+ description: 'Оптимизированный парсер CSV с автоматическим выбором стратегии',
60
+ hooks: {
61
+ 'before:csvToJson': (csv: string, context: PluginHookContext) => {
62
+ if (this.options.enableFastPath && context.options?.useFastPath !== false) {
63
+ // Используем fast path engine для анализа
64
+ const sample = csv.substring(0, Math.min(1000, csv.length));
65
+ const structure = this.fastPathEngine.analyzeStructure(sample, context.options);
66
+
67
+ context.metadata = context.metadata || {};
68
+ context.metadata.fastPathStructure = structure;
69
+ if (process.env.NODE_ENV === 'development') {
70
+ console.log(`🚀 Используется ${structure.recommendedEngine} парсер`);
71
+ }
72
+ }
73
+ return csv;
74
+ },
75
+ 'after:csvToJson': (result: any[], context: PluginHookContext) => {
76
+ if (context.metadata?.fastPathStructure) {
77
+ context.metadata.fastPathStats = this.fastPathEngine.getStats();
78
+ }
79
+ return result;
80
+ }
81
+ }
82
+ });
83
+
84
+ // NDJSON плагин
85
+ this.pluginManager.use('ndjson-support', {
86
+ name: 'NDJSON Support',
87
+ version: '1.0.0',
88
+ description: 'Поддержка Newline Delimited JSON формата',
89
+ hooks: {
90
+ 'before:parse': (input: any, context: PluginHookContext) => {
91
+ if (context.options?.format === 'ndjson') {
92
+ // Парсим NDJSON
93
+ return NdjsonParser.fromNdjson(input as string, context.options);
94
+ }
95
+ return input;
96
+ },
97
+ 'after:serialize': (output: any, context: PluginHookContext) => {
98
+ if (context.options?.format === 'ndjson') {
99
+ // Сериализуем в NDJSON
100
+ return NdjsonParser.toNdjson(output, context.options);
101
+ }
102
+ return output;
103
+ }
104
+ }
105
+ });
106
+
107
+ // Валидация данных плагин
108
+ this.pluginManager.use('data-validation', {
109
+ name: 'Data Validation',
110
+ version: '1.0.0',
111
+ description: 'Валидация входных и выходных данных',
112
+ hooks: {
113
+ 'validation': (data: any, context: PluginHookContext) => {
114
+ if (!data) {
115
+ throw new Error('Данные не могут быть пустыми');
116
+ }
117
+
118
+ if (context.operation === 'jsonToCsv' && !Array.isArray(data)) {
119
+ throw new Error('Для конвертации в CSV данные должны быть массивом');
120
+ }
121
+
122
+ return data;
123
+ }
124
+ },
125
+ middlewares: [
126
+ async (ctx: any, next: () => Promise<void>) => {
127
+ // Валидация перед выполнением
128
+ await this.pluginManager.executeHooks('validation', ctx.input, ctx);
129
+ await next();
130
+ // Валидация после выполнения
131
+ await this.pluginManager.executeHooks('validation', ctx.result, ctx);
132
+ }
133
+ ]
134
+ });
135
+
136
+ // Логирование плагин
137
+ this.pluginManager.use('logging', {
138
+ name: 'Logging',
139
+ version: '1.0.0',
140
+ description: 'Логирование операций',
141
+ hooks: {
142
+ 'before:csvToJson': (csv: string, context: PluginHookContext) => {
143
+ if (process.env.NODE_ENV === 'development') {
144
+ console.log(`📥 Начало csvToJson, размер: ${csv.length} байт`);
145
+ }
146
+ return csv;
147
+ },
148
+ 'after:csvToJson': (result: any[], context: PluginHookContext) => {
149
+ if (process.env.NODE_ENV === 'development') {
150
+ console.log(`📤 Завершение csvToJson, результат: ${result.length} записей`);
151
+ }
152
+ return result;
153
+ },
154
+ 'before:jsonToCsv': (json: any[], context: PluginHookContext) => {
155
+ if (process.env.NODE_ENV === 'development') {
156
+ console.log(`📥 Начало jsonToCsv, записей: ${json.length}`);
157
+ }
158
+ return json;
159
+ },
160
+ 'after:jsonToCsv': (csv: string, context: PluginHookContext) => {
161
+ if (process.env.NODE_ENV === 'development') {
162
+ console.log(`📤 Завершение jsonToCsv, размер: ${csv.length} байт`);
163
+ }
164
+ return csv;
165
+ }
166
+ }
167
+ });
168
+ }
169
+
170
+ /**
171
+ * Конвертирует CSV в JSON с поддержкой плагинов
172
+ * @param csv - CSV данные
173
+ * @param options - Опции парсинга
174
+ * @returns JSON данные
175
+ */
176
+ async csvToJson(csv: string, options: CsvToJsonOptions = {}): Promise<any[]> {
177
+ if (!this.options.enablePlugins) {
178
+ return coreCsvToJson(csv, options);
179
+ }
180
+
181
+ return this.pluginManager.executeWithPlugins(
182
+ 'csvToJson',
183
+ csv,
184
+ options,
185
+ (input: string, opts: CsvToJsonOptions) => {
186
+ if (this.options.enableFastPath && opts?.useFastPath !== false) {
187
+ return coreCsvToJson(input, { ...opts, useFastPath: true });
188
+ }
189
+
190
+ return coreCsvToJson(input, opts);
191
+ }
192
+ );
193
+ }
194
+
195
+ /**
196
+ * Convert CSV to JSON rows as async iterator with plugin hooks.
197
+ * @param csv - CSV input
198
+ * @param options - Conversion options
199
+ * @returns Async iterator of rows
200
+ */
201
+ async *csvToJsonIterator(csv: string, options: CsvToJsonOptions = {}): AsyncGenerator<any, void, unknown> {
202
+ if (!this.options.enablePlugins) {
203
+ for await (const row of coreCsvToJsonIterator(csv, options)) {
204
+ yield row;
205
+ }
206
+ return;
207
+ }
208
+
209
+ const iterator = await this.pluginManager.executeWithPlugins(
210
+ 'csvToJson',
211
+ csv,
212
+ options,
213
+ (input: string, opts: CsvToJsonOptions) => {
214
+ if (this.options.enableFastPath && opts?.useFastPath !== false) {
215
+ return coreCsvToJsonIterator(input, { ...opts, useFastPath: true });
216
+ }
217
+
218
+ return coreCsvToJsonIterator(input, opts);
219
+ }
220
+ );
221
+
222
+ for await (const row of iterator) {
223
+ yield row;
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Конвертирует JSON в CSV с поддержкой плагинов
229
+ * @param json - JSON данные
230
+ * @param options - Опции сериализации
231
+ * @returns CSV данные
232
+ */
233
+ async jsonToCsv(json: any[], options: JsonToCsvOptions = {}): Promise<string> {
234
+ if (!this.options.enablePlugins) {
235
+ return coreJsonToCsv(json, options);
236
+ }
237
+
238
+ return this.pluginManager.executeWithPlugins(
239
+ 'jsonToCsv',
240
+ json,
241
+ options,
242
+ coreJsonToCsv
243
+ );
244
+ }
245
+
246
+ /**
247
+ * Сохраняет JSON как CSV файл
248
+ * @param data - JSON данные
249
+ * @param filePath - Путь к файлу
250
+ * @param options - Опции
251
+ * @returns Promise<void>
252
+ */
253
+ async saveAsCsv(data: any[], filePath: string, options: SaveAsCsvOptions = {}): Promise<void> {
174
254
  if (!this.options.enablePlugins) {
175
- for await (const row of coreCsvToJsonIterator(csv, options)) {
176
- yield row;
177
- }
255
+ coreSaveAsCsv(data, filePath, options);
178
256
  return;
179
257
  }
180
-
181
- const iterator = await this.pluginManager.executeWithPlugins(
182
- 'csvToJson',
183
- csv,
184
- options,
185
- (input, opts) => {
186
- if (this.options.enableFastPath && opts?.useFastPath !== false) {
187
- return coreCsvToJsonIterator(input, { ...opts, useFastPath: true });
188
- }
189
-
190
- return coreCsvToJsonIterator(input, opts);
191
- }
192
- );
193
-
194
- for await (const row of iterator) {
195
- yield row;
196
- }
197
- }
198
-
199
- /**
200
- * Конвертирует JSON в CSV с поддержкой плагинов
201
- * @param {Array} json - JSON данные
202
- * @param {Object} options - Опции сериализации
203
- * @returns {Promise<string>} CSV данные
204
- */
205
- async jsonToCsv(json, options = {}) {
206
- if (!this.options.enablePlugins) {
207
- return coreJsonToCsv(json, options);
208
- }
209
-
210
- return this.pluginManager.executeWithPlugins(
211
- 'jsonToCsv',
212
- json,
213
- options,
214
- coreJsonToCsv
215
- );
216
- }
217
-
218
- /**
219
- * Сохраняет JSON как CSV файл
220
- * @param {Array} data - JSON данные
221
- * @param {string} filePath - Путь к файлу
222
- * @param {Object} options - Опции
223
- * @returns {Promise<void>}
224
- */
225
- async saveAsCsv(data, filePath, options = {}) {
226
- if (!this.options.enablePlugins) {
227
- return coreSaveAsCsv(data, filePath, options);
228
- }
229
-
230
- const csv = await this.jsonToCsv(data, options);
231
-
232
- // Используем плагины для сохранения
233
- return this.pluginManager.executeWithPlugins(
258
+
259
+ const csv = await this.jsonToCsv(data, options);
260
+
261
+ // Используем плагины для сохранения
262
+ await this.pluginManager.executeWithPlugins(
234
263
  'saveAsCsv',
235
264
  { data: csv, filePath },
236
265
  options,
237
- async (input) => {
238
- const fs = require('fs').promises;
266
+ async (input: { data: string; filePath: string }) => {
267
+ const fs = await import('fs/promises');
239
268
  await fs.writeFile(input.filePath, input.data, 'utf8');
240
269
  return input.filePath;
241
270
  }
242
271
  );
243
272
  }
244
-
245
- /**
246
- * Читает CSV файл и конвертирует в JSON
247
- * @param {string} filePath - Путь к файлу
248
- * @param {Object} options - Опции
249
- * @returns {Promise<Array>} JSON данные
250
- */
251
- async readCsvAsJson(filePath, options = {}) {
252
- if (!this.options.enablePlugins) {
253
- return coreReadCsvAsJson(filePath, options);
254
- }
255
-
256
- // Читаем файл
257
- const fs = require('fs').promises;
258
- const csv = await fs.readFile(filePath, 'utf8');
259
-
260
- // Конвертируем с использованием плагинов
261
- return this.csvToJson(csv, options);
262
- }
263
-
264
- /**
265
- * Парсит NDJSON данные
266
- * @param {string|ReadableStream} input - NDJSON данные
267
- * @param {Object} options - Опции
268
- * @returns {Promise<Array>} JSON данные
269
- */
270
- async parseNdjson(input, options = {}) {
271
- if (typeof input === 'string') {
272
- return NdjsonParser.fromNdjson(input, options);
273
- }
274
-
275
- // Для потоков
276
- const result = [];
277
- for await (const obj of NdjsonParser.parseStream(input, options)) {
278
- result.push(obj);
279
- }
280
- return result;
281
- }
282
-
283
- /**
284
- * Конвертирует JSON в NDJSON
285
- * @param {Array} data - JSON данные
286
- * @param {Object} options - Опции
287
- * @returns {string} NDJSON строка
288
- */
289
- toNdjson(data, options = {}) {
290
- return NdjsonParser.toNdjson(data, options);
291
- }
292
-
293
- /**
294
- * Регистрирует плагин
295
- * @param {string} name - Имя плагина
296
- * @param {Object} plugin - Конфигурация плагина
297
- * @returns {JtcsvWithPlugins} this для chaining
298
- */
299
- use(name, plugin) {
300
- this.pluginManager.use(name, plugin);
301
- return this;
302
- }
303
-
304
- /**
305
- * Возвращает менеджер плагинов
306
- * @returns {PluginManager}
307
- */
308
- getPluginManager() {
309
- return this.pluginManager;
310
- }
311
-
312
- /**
313
- * Возвращает fast path engine
314
- * @returns {FastPathEngine}
315
- */
316
- getFastPathEngine() {
317
- return this.fastPathEngine;
318
- }
319
-
320
- /**
321
- * Возвращает список плагинов
322
- * @returns {Array}
323
- */
324
- listPlugins() {
325
- return this.pluginManager.listPlugins();
326
- }
327
-
328
- /**
329
- * Возвращает статистику
330
- * @returns {Object}
331
- */
332
- getStats() {
333
- return {
334
- plugins: this.pluginManager.getStats(),
335
- fastPath: this.fastPathEngine.getStats(),
336
- options: this.options
337
- };
338
- }
339
-
340
- /**
341
- * Настраивает опции
342
- * @param {Object} newOptions - Новые опции
343
- */
344
- configure(newOptions) {
345
- this.options = { ...this.options, ...newOptions };
346
- return this;
347
- }
348
-
349
- /**
350
- * Создает экземпляр с настройками по умолчанию
351
- * @param {Object} options - Опции
352
- * @returns {JtcsvWithPlugins}
353
- */
354
- static create(options = {}) {
355
- return new JtcsvWithPlugins(options);
356
- }
357
- }
358
-
359
- // Экспортируем основной класс
360
- module.exports = JtcsvWithPlugins;
361
-
362
- // Экспортируем утилиты
363
- module.exports.PluginManager = PluginManager;
364
- module.exports.FastPathEngine = FastPathEngine;
365
- module.exports.NdjsonParser = NdjsonParser;
366
-
367
- // Экспортируем фабричный метод
368
- module.exports.create = JtcsvWithPlugins.create;
369
273
 
274
+ /**
275
+ * Читает CSV файл и конвертирует в JSON
276
+ * @param filePath - Путь к файлу
277
+ * @param options - Опции
278
+ * @returns JSON данные
279
+ */
280
+ async readCsvAsJson(filePath: string, options: CsvToJsonOptions = {}): Promise<any[]> {
281
+ if (!this.options.enablePlugins) {
282
+ return coreReadCsvAsJson(filePath, options);
283
+ }
284
+
285
+ // Читаем файл
286
+ const fs = await import('fs/promises');
287
+ const csv = await fs.readFile(filePath, 'utf8');
288
+
289
+ // Конвертируем с использованием плагинов
290
+ return this.csvToJson(csv, options);
291
+ }
292
+
293
+ /**
294
+ * Парсит NDJSON данные
295
+ * @param input - NDJSON данные
296
+ * @param options - Опции
297
+ * @returns JSON данные
298
+ */
299
+ async parseNdjson(input: string | ReadableStream, options: any = {}): Promise<any[]> {
300
+ if (typeof input === 'string') {
301
+ return NdjsonParser.fromNdjson(input, options);
302
+ }
303
+
304
+ // Для потоков
305
+ const result: any[] = [];
306
+ for await (const obj of NdjsonParser.parseStream(input, options)) {
307
+ result.push(obj);
308
+ }
309
+ return result;
310
+ }
311
+
312
+ /**
313
+ * Конвертирует JSON в NDJSON
314
+ * @param data - JSON данные
315
+ * @param options - Опции
316
+ * @returns NDJSON строка
317
+ */
318
+ toNdjson(data: any[], options: any = {}): string {
319
+ return NdjsonParser.toNdjson(data, options);
320
+ }
321
+
322
+ /**
323
+ * Регистрирует плагин
324
+ * @param name - Имя плагина
325
+ * @param plugin - Конфигурация плагина
326
+ * @returns this для chaining
327
+ */
328
+ use(name: string, plugin: any): this {
329
+ this.pluginManager.use(name, plugin);
330
+ return this;
331
+ }
332
+
333
+ /**
334
+ * Возвращает менеджер плагинов
335
+ * @returns PluginManager
336
+ */
337
+ getPluginManager(): PluginManager {
338
+ return this.pluginManager;
339
+ }
340
+
341
+ /**
342
+ * Возвращает fast path engine
343
+ * @returns FastPathEngine
344
+ */
345
+ getFastPathEngine(): FastPathEngine {
346
+ return this.fastPathEngine;
347
+ }
348
+
349
+ /**
350
+ * Возвращает список плагинов
351
+ * @returns Array
352
+ */
353
+ listPlugins(): any[] {
354
+ return this.pluginManager.listPlugins();
355
+ }
356
+
357
+ /**
358
+ * Возвращает статистику
359
+ * @returns Object
360
+ */
361
+ getStats(): any {
362
+ return {
363
+ plugins: this.pluginManager.getStats(),
364
+ fastPath: this.fastPathEngine.getStats(),
365
+ options: this.options
366
+ };
367
+ }
368
+
369
+ /**
370
+ * Настраивает опции
371
+ * @param newOptions - Новые опции
372
+ */
373
+ configure(newOptions: JtcsvWithPluginsOptions): this {
374
+ this.options = { ...this.options, ...newOptions };
375
+ return this;
376
+ }
377
+
378
+ /**
379
+ * Создает экземпляр с настройками по умолчанию
380
+ * @param options - Опции
381
+ * @returns JtcsvWithPlugins
382
+ */
383
+ static create(options: JtcsvWithPluginsOptions = {}): JtcsvWithPlugins {
384
+ return new JtcsvWithPlugins(options);
385
+ }
386
+ }
387
+
388
+ // Экспортируем основной класс
389
+ export default JtcsvWithPlugins;
370
390
 
391
+ // Экспортируем утилиты
392
+ export { PluginManager, FastPathEngine, NdjsonParser };
371
393
 
394
+ // Экспортируем фабричный метод
395
+ export const create = JtcsvWithPlugins.create;