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
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
|
-
};
|
package/examples/simple-usage.js
DELETED
|
@@ -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
|
-
};
|