jtcsv 3.0.0 → 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 +205 -146
- package/bin/jtcsv.ts +280 -202
- 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 +336 -7
- package/dist/jtcsv-core.cjs.js.map +1 -1
- package/dist/jtcsv-core.esm.js +336 -7
- package/dist/jtcsv-core.esm.js.map +1 -1
- package/dist/jtcsv-core.umd.js +336 -7
- package/dist/jtcsv-core.umd.js.map +1 -1
- package/dist/jtcsv-full.cjs.js +336 -7
- package/dist/jtcsv-full.cjs.js.map +1 -1
- package/dist/jtcsv-full.esm.js +336 -7
- package/dist/jtcsv-full.esm.js.map +1 -1
- package/dist/jtcsv-full.umd.js +336 -7
- package/dist/jtcsv-full.umd.js.map +1 -1
- package/dist/jtcsv-workers.esm.js +9 -0
- package/dist/jtcsv-workers.esm.js.map +1 -1
- package/dist/jtcsv-workers.umd.js +9 -0
- package/dist/jtcsv-workers.umd.js.map +1 -1
- package/dist/jtcsv.cjs.js +1998 -2092
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1994 -2092
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2251
- 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/{src → dist/src}/web-server/index.js +251 -286
- 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 +2 -2
- package/examples/advanced/performance-optimization.ts +2 -2
- package/examples/cli-advanced-usage.md +2 -0
- package/examples/cli-tool.ts +1 -1
- package/examples/large-dataset-example.ts +2 -2
- package/examples/simple-usage.ts +2 -2
- package/examples/streaming-example.ts +1 -1
- package/index.d.ts +186 -15
- package/package.json +43 -108
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/csv-to-json-browser.ts +233 -3
- package/src/browser/errors-browser.ts +45 -28
- package/src/browser/json-to-csv-browser.ts +81 -5
- package/src/browser/streams.ts +73 -6
- package/src/core/delimiter-cache.ts +21 -11
- package/src/core/plugin-system.ts +343 -155
- package/src/core/transform-hooks.ts +20 -12
- package/src/engines/fast-path-engine.ts +48 -32
- package/src/errors.ts +1 -72
- package/src/formats/ndjson-parser.ts +6 -0
- package/src/formats/tsv-parser.ts +6 -0
- package/src/types/index.ts +21 -1
- package/src/utils/validators.ts +35 -0
- package/src/web-server/index.ts +1 -1
- package/bin/jtcsv.js +0 -2532
- package/csv-to-json.js +0 -711
- package/errors.js +0 -394
- package/examples/advanced/conditional-transformations.js +0 -446
- package/examples/advanced/csv-parser.worker.js +0 -89
- package/examples/advanced/nested-objects-example.js +0 -306
- package/examples/advanced/performance-optimization.js +0 -504
- package/examples/advanced/run-demo-server.js +0 -116
- package/examples/cli-batch-processing.js +0 -38
- package/examples/cli-tool.js +0 -183
- package/examples/error-handling.js +0 -338
- package/examples/express-api.js +0 -164
- package/examples/large-dataset-example.js +0 -182
- package/examples/ndjson-processing.js +0 -434
- package/examples/plugin-excel-exporter.js +0 -406
- package/examples/schema-validation.js +0 -640
- package/examples/simple-usage.js +0 -282
- package/examples/streaming-example.js +0 -418
- package/examples/web-workers-advanced.js +0 -28
- package/index.js +0 -82
- package/json-save.js +0 -255
- package/json-to-csv.js +0 -668
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -83
- package/plugins/express-middleware/example.js +0 -135
- package/plugins/express-middleware/example.ts +0 -135
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -512
- package/plugins/express-middleware/index.ts +0 -557
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -404
- package/plugins/fastify-plugin/index.ts +0 -443
- 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/index.ts +0 -226
- 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/index.ts +0 -201
- 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/ConverterComponent.tsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -67
- package/plugins/nextjs-api/examples/api-convert.ts +0 -67
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/index.tsx +0 -339
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -370
- package/plugins/nextjs-api/route.ts +0 -370
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/index.ts +0 -94
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/composables/useJtcsv.ts +0 -100
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/nuxt/runtime/plugin.ts +0 -71
- 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/index.ts +0 -260
- 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/index.ts +0 -301
- 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/index.ts +0 -267
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/core.js +0 -92
- package/src/browser/csv-to-json-browser.js +0 -722
- package/src/browser/errors-browser.js +0 -212
- package/src/browser/extensions/plugins.js +0 -92
- package/src/browser/extensions/workers.js +0 -39
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -319
- package/src/browser/streams.js +0 -403
- package/src/browser/workers/csv-parser.worker.js +0 -377
- package/src/browser/workers/worker-pool.js +0 -527
- package/src/core/delimiter-cache.js +0 -200
- package/src/core/node-optimizations.js +0 -408
- package/src/core/plugin-system.js +0 -494
- package/src/core/transform-hooks.js +0 -350
- package/src/engines/fast-path-engine-new.js +0 -338
- package/src/engines/fast-path-engine.js +0 -844
- package/src/errors.js +0 -26
- package/src/formats/ndjson-parser.js +0 -467
- package/src/formats/tsv-parser.js +0 -339
- package/src/index-with-plugins.js +0 -378
- package/src/utils/bom-utils.js +0 -259
- package/src/utils/encoding-support.js +0 -124
- package/src/utils/schema-validator.js +0 -594
- package/src/utils/transform-loader.js +0 -205
- package/src/utils/zod-adapter.js +0 -170
- package/stream-csv-to-json.js +0 -560
- package/stream-json-to-csv.js +0 -465
package/errors.js
DELETED
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
/**
|
|
3
|
-
* Custom error classes for jtcsv
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Base error class for jtcsv
|
|
8
|
-
*/
|
|
9
|
-
class JtcsvError extends Error {
|
|
10
|
-
constructor(message, code = 'JTCSV_ERROR') {
|
|
11
|
-
super(message);
|
|
12
|
-
this.name = 'JtcsvError';
|
|
13
|
-
this.code = code;
|
|
14
|
-
|
|
15
|
-
// Maintains proper stack trace for where our error was thrown
|
|
16
|
-
if (Error.captureStackTrace) {
|
|
17
|
-
Error.captureStackTrace(this, JtcsvError);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Error for invalid input data
|
|
24
|
-
*/
|
|
25
|
-
class ValidationError extends JtcsvError {
|
|
26
|
-
constructor(message) {
|
|
27
|
-
super(message, 'VALIDATION_ERROR');
|
|
28
|
-
this.name = 'ValidationError';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Error for security violations
|
|
34
|
-
*/
|
|
35
|
-
class SecurityError extends JtcsvError {
|
|
36
|
-
constructor(message) {
|
|
37
|
-
super(message, 'SECURITY_ERROR');
|
|
38
|
-
this.name = 'SecurityError';
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Error for file system operations
|
|
44
|
-
*/
|
|
45
|
-
class FileSystemError extends JtcsvError {
|
|
46
|
-
constructor(message, originalError = null) {
|
|
47
|
-
super(message, 'FILE_SYSTEM_ERROR');
|
|
48
|
-
this.name = 'FileSystemError';
|
|
49
|
-
this.originalError = originalError;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Error for parsing/formatting issues
|
|
55
|
-
*/
|
|
56
|
-
class ParsingError extends JtcsvError {
|
|
57
|
-
constructor(message, lineNumber = null, column = null, context = null, expected = null, actual = null) {
|
|
58
|
-
// Build detailed message
|
|
59
|
-
let detailedMessage = message;
|
|
60
|
-
|
|
61
|
-
if (lineNumber !== null) {
|
|
62
|
-
detailedMessage += ` at line ${lineNumber}`;
|
|
63
|
-
if (column !== null) {
|
|
64
|
-
detailedMessage += `, column ${column}`;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (context !== null) {
|
|
69
|
-
detailedMessage += `\nContext: ${context}`;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (expected !== null && actual !== null) {
|
|
73
|
-
detailedMessage += `\nExpected: ${expected}`;
|
|
74
|
-
detailedMessage += `\nActual: ${actual}`;
|
|
75
|
-
} else if (expected !== null) {
|
|
76
|
-
detailedMessage += `\nExpected: ${expected}`;
|
|
77
|
-
} else if (actual !== null) {
|
|
78
|
-
detailedMessage += `\nActual: ${actual}`;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
super(detailedMessage, 'PARSING_ERROR');
|
|
82
|
-
this.name = 'ParsingError';
|
|
83
|
-
this.lineNumber = lineNumber;
|
|
84
|
-
this.column = column;
|
|
85
|
-
this.context = context;
|
|
86
|
-
this.expected = expected;
|
|
87
|
-
this.actual = actual;
|
|
88
|
-
this.originalMessage = message;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Create a ParsingError for CSV format issues
|
|
93
|
-
*/
|
|
94
|
-
static csvFormat(message, lineNumber = null, column = null, rowContent = null) {
|
|
95
|
-
let context = null;
|
|
96
|
-
if (rowContent !== null) {
|
|
97
|
-
context = `Row content: "${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}"`;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return new ParsingError(
|
|
101
|
-
`CSV format error: ${message}`,
|
|
102
|
-
lineNumber,
|
|
103
|
-
column,
|
|
104
|
-
context
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Create a ParsingError for field count mismatch
|
|
110
|
-
*/
|
|
111
|
-
static fieldCountMismatch(expectedCount, actualCount, lineNumber = null, rowContent = null) {
|
|
112
|
-
return new ParsingError(
|
|
113
|
-
'Field count mismatch',
|
|
114
|
-
lineNumber,
|
|
115
|
-
null,
|
|
116
|
-
rowContent ? `Row: "${rowContent.substring(0, 100)}${rowContent.length > 100 ? '...' : ''}"` : null,
|
|
117
|
-
`${expectedCount} fields`,
|
|
118
|
-
`${actualCount} fields`
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Create a ParsingError for unclosed quotes
|
|
124
|
-
*/
|
|
125
|
-
static unclosedQuotes(lineNumber = null, column = null, content = null) {
|
|
126
|
-
return new ParsingError(
|
|
127
|
-
'Unclosed quotes in CSV',
|
|
128
|
-
lineNumber,
|
|
129
|
-
column,
|
|
130
|
-
content ? `Content: "${content}"` : null
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Create a ParsingError for invalid delimiter
|
|
136
|
-
*/
|
|
137
|
-
static invalidDelimiter(delimiter, lineNumber = null, context = null) {
|
|
138
|
-
return new ParsingError(
|
|
139
|
-
`Invalid delimiter '${delimiter}'`,
|
|
140
|
-
lineNumber,
|
|
141
|
-
null,
|
|
142
|
-
context
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Error for size/limit violations
|
|
149
|
-
*/
|
|
150
|
-
class LimitError extends JtcsvError {
|
|
151
|
-
constructor(message, limit, actual) {
|
|
152
|
-
super(message, 'LIMIT_ERROR');
|
|
153
|
-
this.name = 'LimitError';
|
|
154
|
-
this.limit = limit;
|
|
155
|
-
this.actual = actual;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Error for configuration issues
|
|
161
|
-
*/
|
|
162
|
-
class ConfigurationError extends JtcsvError {
|
|
163
|
-
constructor(message) {
|
|
164
|
-
super(message, 'CONFIGURATION_ERROR');
|
|
165
|
-
this.name = 'ConfigurationError';
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Utility function to create detailed error messages
|
|
171
|
-
*/
|
|
172
|
-
function createDetailedErrorMessage(baseMessage, details = {}) {
|
|
173
|
-
let message = baseMessage;
|
|
174
|
-
|
|
175
|
-
if (details.lineNumber !== undefined) {
|
|
176
|
-
message += ` at line ${details.lineNumber}`;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
if (details.column !== undefined) {
|
|
180
|
-
message += `, column ${details.column}`;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (details.context !== undefined) {
|
|
184
|
-
message += `\nContext: ${details.context}`;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (details.expected !== undefined) {
|
|
188
|
-
message += `\nExpected: ${details.expected}`;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (details.actual !== undefined) {
|
|
192
|
-
message += `\nActual: ${details.actual}`;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if (details.suggestion !== undefined) {
|
|
196
|
-
message += `\nSuggestion: ${details.suggestion}`;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
if (details.codeSnippet !== undefined) {
|
|
200
|
-
message += `\nCode snippet: ${details.codeSnippet}`;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return message;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Error context builder for better debugging
|
|
208
|
-
*/
|
|
209
|
-
class ErrorContext {
|
|
210
|
-
constructor() {
|
|
211
|
-
this.details = {};
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
lineNumber(line) {
|
|
215
|
-
this.details.lineNumber = line;
|
|
216
|
-
return this;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
column(col) {
|
|
220
|
-
this.details.column = col;
|
|
221
|
-
return this;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
context(ctx) {
|
|
225
|
-
this.details.context = ctx;
|
|
226
|
-
return this;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
expected(exp) {
|
|
230
|
-
this.details.expected = exp;
|
|
231
|
-
return this;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
actual(act) {
|
|
235
|
-
this.details.actual = act;
|
|
236
|
-
return this;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
suggestion(sugg) {
|
|
240
|
-
this.details.suggestion = sugg;
|
|
241
|
-
return this;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
codeSnippet(snippet) {
|
|
245
|
-
this.details.codeSnippet = snippet;
|
|
246
|
-
return this;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
buildMessage(baseMessage) {
|
|
250
|
-
return createDetailedErrorMessage(baseMessage, this.details);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
throwParsingError(baseMessage) {
|
|
254
|
-
const message = this.buildMessage(baseMessage);
|
|
255
|
-
throw new ParsingError(
|
|
256
|
-
message,
|
|
257
|
-
this.details.lineNumber,
|
|
258
|
-
this.details.column,
|
|
259
|
-
this.details.context,
|
|
260
|
-
this.details.expected,
|
|
261
|
-
this.details.actual
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
throwValidationError(baseMessage) {
|
|
266
|
-
const message = this.buildMessage(baseMessage);
|
|
267
|
-
throw new ValidationError(message);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const ERROR_CODES = {
|
|
272
|
-
JTCSV_ERROR: 'JTCSV_ERROR',
|
|
273
|
-
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
|
274
|
-
SECURITY_ERROR: 'SECURITY_ERROR',
|
|
275
|
-
FILE_SYSTEM_ERROR: 'FILE_SYSTEM_ERROR',
|
|
276
|
-
PARSING_ERROR: 'PARSING_ERROR',
|
|
277
|
-
LIMIT_ERROR: 'LIMIT_ERROR',
|
|
278
|
-
CONFIGURATION_ERROR: 'CONFIGURATION_ERROR',
|
|
279
|
-
INVALID_INPUT: 'INVALID_INPUT',
|
|
280
|
-
SECURITY_VIOLATION: 'SECURITY_VIOLATION',
|
|
281
|
-
FILE_NOT_FOUND: 'FILE_NOT_FOUND',
|
|
282
|
-
PARSE_FAILED: 'PARSE_FAILED',
|
|
283
|
-
SIZE_LIMIT: 'SIZE_LIMIT',
|
|
284
|
-
INVALID_CONFIG: 'INVALID_CONFIG',
|
|
285
|
-
UNKNOWN_ERROR: 'UNKNOWN_ERROR'
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Utility function to create standardized error messages
|
|
290
|
-
*/
|
|
291
|
-
function createErrorMessage(type, details) {
|
|
292
|
-
const messages = {
|
|
293
|
-
INVALID_INPUT: `Invalid input: ${details}`,
|
|
294
|
-
SECURITY_VIOLATION: `Security violation: ${details}`,
|
|
295
|
-
FILE_NOT_FOUND: `File not found: ${details}`,
|
|
296
|
-
PARSE_FAILED: `Parse failed: ${details}`,
|
|
297
|
-
SIZE_LIMIT: `Size limit exceeded: ${details}`,
|
|
298
|
-
INVALID_CONFIG: `Invalid configuration: ${details}`,
|
|
299
|
-
UNKNOWN_ERROR: `Unknown error: ${details}`
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
return messages[type] || messages.UNKNOWN_ERROR;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Error handler utility
|
|
307
|
-
*/
|
|
308
|
-
/* istanbul ignore next */
|
|
309
|
-
function handleError(error, context = {}) {
|
|
310
|
-
// Log error in development
|
|
311
|
-
if (process.env.NODE_ENV === 'development') {
|
|
312
|
-
console.error(`[jtcsv] Error in ${context.function || 'unknown'}:`, {
|
|
313
|
-
message: error.message,
|
|
314
|
-
code: error.code,
|
|
315
|
-
stack: error.stack,
|
|
316
|
-
context
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Re-throw the error
|
|
321
|
-
throw error;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Safe execution wrapper for async functions
|
|
326
|
-
*/
|
|
327
|
-
/* istanbul ignore next */
|
|
328
|
-
async function safeExecuteAsync(fn, errorType, context = {}) {
|
|
329
|
-
try {
|
|
330
|
-
return await fn();
|
|
331
|
-
} catch (error) {
|
|
332
|
-
if (error instanceof JtcsvError) {
|
|
333
|
-
throw error;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// Wrap unknown errors
|
|
337
|
-
const message = createErrorMessage(errorType, error.message);
|
|
338
|
-
const wrappedError = new JtcsvError(message, errorType);
|
|
339
|
-
wrappedError.originalError = error;
|
|
340
|
-
|
|
341
|
-
handleError(wrappedError, context);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Safe execution wrapper for sync functions
|
|
347
|
-
*/
|
|
348
|
-
function safeExecuteSync(fn, errorType, context = {}) {
|
|
349
|
-
try {
|
|
350
|
-
return fn();
|
|
351
|
-
} catch (error) {
|
|
352
|
-
if (error instanceof JtcsvError) {
|
|
353
|
-
throw error;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
// Wrap unknown errors
|
|
357
|
-
const message = createErrorMessage(errorType, error.message);
|
|
358
|
-
const wrappedError = new JtcsvError(message, errorType);
|
|
359
|
-
wrappedError.originalError = error;
|
|
360
|
-
|
|
361
|
-
handleError(wrappedError, context);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* Safe execution wrapper (auto-detects async/sync)
|
|
367
|
-
*/
|
|
368
|
-
function safeExecute(fn, errorType, context = {}) {
|
|
369
|
-
const result = fn();
|
|
370
|
-
|
|
371
|
-
// Check if function returns a promise
|
|
372
|
-
if (result && typeof result.then === 'function') {
|
|
373
|
-
return safeExecuteAsync(async () => result, errorType, context);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
return safeExecuteSync(() => result, errorType, context);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
module.exports = {
|
|
380
|
-
JtcsvError,
|
|
381
|
-
ValidationError,
|
|
382
|
-
SecurityError,
|
|
383
|
-
FileSystemError,
|
|
384
|
-
ParsingError,
|
|
385
|
-
LimitError,
|
|
386
|
-
ConfigurationError,
|
|
387
|
-
ERROR_CODES,
|
|
388
|
-
createErrorMessage,
|
|
389
|
-
ErrorContext,
|
|
390
|
-
handleError,
|
|
391
|
-
safeExecute,
|
|
392
|
-
safeExecuteAsync,
|
|
393
|
-
safeExecuteSync
|
|
394
|
-
};
|