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.
- package/README.md +204 -115
- package/bin/jtcsv.ts +2612 -0
- package/browser.d.ts +142 -0
- package/dist/benchmark.js +446 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/jtcsv.js +1940 -0
- package/dist/bin/jtcsv.js.map +1 -0
- package/dist/csv-to-json.js +1262 -0
- package/dist/csv-to-json.js.map +1 -0
- package/dist/errors.js +291 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint.config.js +147 -0
- package/dist/eslint.config.js.map +1 -0
- package/dist/index-core.js +95 -0
- package/dist/index-core.js.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/json-save.js +229 -0
- package/dist/json-save.js.map +1 -0
- package/dist/json-to-csv.js +576 -0
- package/dist/json-to-csv.js.map +1 -0
- package/dist/jtcsv-core.cjs.js +1736 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1708 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1742 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +2241 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +2209 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +2247 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +768 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +782 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +1996 -2048
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1992 -2048
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2209
- package/dist/jtcsv.umd.js.map +1 -1
- package/dist/plugins/express-middleware/index.js +350 -0
- package/dist/plugins/express-middleware/index.js.map +1 -0
- package/dist/plugins/fastify-plugin/index.js +315 -0
- package/dist/plugins/fastify-plugin/index.js.map +1 -0
- package/dist/plugins/hono/index.js +111 -0
- package/dist/plugins/hono/index.js.map +1 -0
- package/dist/plugins/nestjs/index.js +112 -0
- package/dist/plugins/nestjs/index.js.map +1 -0
- package/dist/plugins/nuxt/index.js +53 -0
- package/dist/plugins/nuxt/index.js.map +1 -0
- package/dist/plugins/remix/index.js +133 -0
- package/dist/plugins/remix/index.js.map +1 -0
- package/dist/plugins/sveltekit/index.js +155 -0
- package/dist/plugins/sveltekit/index.js.map +1 -0
- package/dist/plugins/trpc/index.js +136 -0
- package/dist/plugins/trpc/index.js.map +1 -0
- package/dist/run-demo.js +49 -0
- package/dist/run-demo.js.map +1 -0
- package/dist/src/browser/browser-functions.js +193 -0
- package/dist/src/browser/browser-functions.js.map +1 -0
- package/dist/src/browser/core.js +123 -0
- package/dist/src/browser/core.js.map +1 -0
- package/dist/src/browser/csv-to-json-browser.js +353 -0
- package/dist/src/browser/csv-to-json-browser.js.map +1 -0
- package/dist/src/browser/errors-browser.js +219 -0
- package/dist/src/browser/errors-browser.js.map +1 -0
- package/dist/src/browser/extensions/plugins.js +106 -0
- package/dist/src/browser/extensions/plugins.js.map +1 -0
- package/dist/src/browser/extensions/workers.js +66 -0
- package/dist/src/browser/extensions/workers.js.map +1 -0
- package/dist/src/browser/index.js +140 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/json-to-csv-browser.js +225 -0
- package/dist/src/browser/json-to-csv-browser.js.map +1 -0
- package/dist/src/browser/streams.js +340 -0
- package/dist/src/browser/streams.js.map +1 -0
- package/dist/src/browser/workers/csv-parser.worker.js +264 -0
- package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/browser/workers/worker-pool.js +338 -0
- package/dist/src/browser/workers/worker-pool.js.map +1 -0
- package/dist/src/core/delimiter-cache.js +196 -0
- package/dist/src/core/delimiter-cache.js.map +1 -0
- package/dist/src/core/node-optimizations.js +279 -0
- package/dist/src/core/node-optimizations.js.map +1 -0
- package/dist/src/core/plugin-system.js +399 -0
- package/dist/src/core/plugin-system.js.map +1 -0
- package/dist/src/core/transform-hooks.js +348 -0
- package/dist/src/core/transform-hooks.js.map +1 -0
- package/dist/src/engines/fast-path-engine-new.js +262 -0
- package/dist/src/engines/fast-path-engine-new.js.map +1 -0
- package/dist/src/engines/fast-path-engine.js +671 -0
- package/dist/src/engines/fast-path-engine.js.map +1 -0
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formats/ndjson-parser.js +332 -0
- package/dist/src/formats/ndjson-parser.js.map +1 -0
- package/dist/src/formats/tsv-parser.js +230 -0
- package/dist/src/formats/tsv-parser.js.map +1 -0
- package/dist/src/index-with-plugins.js +259 -0
- package/dist/src/index-with-plugins.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/bom-utils.js +267 -0
- package/dist/src/utils/bom-utils.js.map +1 -0
- package/dist/src/utils/encoding-support.js +77 -0
- package/dist/src/utils/encoding-support.js.map +1 -0
- package/dist/src/utils/schema-validator.js +609 -0
- package/dist/src/utils/schema-validator.js.map +1 -0
- package/dist/src/utils/transform-loader.js +281 -0
- package/dist/src/utils/transform-loader.js.map +1 -0
- package/dist/src/utils/validators.js +40 -0
- package/dist/src/utils/validators.js.map +1 -0
- package/dist/src/utils/zod-adapter.js +144 -0
- package/dist/src/utils/zod-adapter.js.map +1 -0
- package/dist/src/web-server/index.js +648 -0
- package/dist/src/web-server/index.js.map +1 -0
- package/dist/src/workers/csv-multithreaded.js +211 -0
- package/dist/src/workers/csv-multithreaded.js.map +1 -0
- package/dist/src/workers/csv-parser.worker.js +179 -0
- package/dist/src/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/workers/worker-pool.js +228 -0
- package/dist/src/workers/worker-pool.js.map +1 -0
- package/dist/stream-csv-to-json.js +665 -0
- package/dist/stream-csv-to-json.js.map +1 -0
- package/dist/stream-json-to-csv.js +389 -0
- package/dist/stream-json-to-csv.js.map +1 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +290 -0
- package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
- package/examples/{cli-tool.js → cli-tool.ts} +5 -8
- package/examples/{error-handling.js → error-handling.ts} +356 -324
- package/examples/{express-api.js → express-api.ts} +161 -164
- package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
- package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
- package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
- package/examples/react-integration.tsx +637 -0
- package/examples/{schema-validation.js → schema-validation.ts} +2 -2
- package/examples/simple-usage.ts +194 -0
- package/examples/{streaming-example.js → streaming-example.ts} +12 -12
- package/index.d.ts +187 -18
- package/package.json +75 -81
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.ts +494 -0
- package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.ts +338 -0
- package/src/browser/streams.ts +403 -0
- package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
- package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
- package/src/core/delimiter-cache.ts +320 -0
- package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
- package/src/core/plugin-system.ts +588 -0
- package/src/core/transform-hooks.ts +566 -0
- package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
- package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
- package/src/errors.ts +1 -0
- package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
- package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
- package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
- package/src/types/index.ts +275 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/validators.ts +35 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/{index.js → index.ts} +19 -19
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/bin/jtcsv.js +0 -2462
- package/csv-to-json.js +0 -688
- package/errors.js +0 -208
- package/examples/simple-usage.js +0 -282
- package/index.js +0 -68
- package/json-save.js +0 -254
- package/json-to-csv.js +0 -526
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -64
- package/plugins/express-middleware/example.js +0 -136
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -360
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -406
- package/plugins/fastify-plugin/package.json +0 -55
- package/plugins/hono/README.md +0 -28
- package/plugins/hono/index.d.ts +0 -12
- package/plugins/hono/index.js +0 -36
- package/plugins/hono/package.json +0 -35
- package/plugins/nestjs/README.md +0 -35
- package/plugins/nestjs/index.d.ts +0 -25
- package/plugins/nestjs/index.js +0 -77
- package/plugins/nestjs/package.json +0 -37
- package/plugins/nextjs-api/README.md +0 -57
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -69
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -371
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/remix/README.md +0 -26
- package/plugins/remix/index.d.ts +0 -16
- package/plugins/remix/index.js +0 -62
- package/plugins/remix/package.json +0 -35
- package/plugins/sveltekit/README.md +0 -28
- package/plugins/sveltekit/index.d.ts +0 -17
- package/plugins/sveltekit/index.js +0 -54
- package/plugins/sveltekit/package.json +0 -33
- package/plugins/trpc/README.md +0 -25
- package/plugins/trpc/index.d.ts +0 -7
- package/plugins/trpc/index.js +0 -32
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/csv-to-json-browser.js +0 -700
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -309
- package/src/browser/streams.js +0 -393
- package/src/core/delimiter-cache.js +0 -186
- package/src/core/plugin-system.js +0 -476
- package/src/core/transform-hooks.js +0 -350
- package/src/errors.js +0 -26
- package/src/utils/transform-loader.js +0 -205
- package/stream-csv-to-json.js +0 -542
- package/stream-json-to-csv.js +0 -464
- /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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// Импортируем основные функции
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.pluginManager
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (context.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
*
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
176
|
-
yield row;
|
|
177
|
-
}
|
|
255
|
+
coreSaveAsCsv(data, filePath, options);
|
|
178
256
|
return;
|
|
179
257
|
}
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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 =
|
|
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;
|