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.
Files changed (258) hide show
  1. package/README.md +205 -146
  2. package/bin/jtcsv.ts +280 -202
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1262 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +336 -7
  23. package/dist/jtcsv-core.cjs.js.map +1 -1
  24. package/dist/jtcsv-core.esm.js +336 -7
  25. package/dist/jtcsv-core.esm.js.map +1 -1
  26. package/dist/jtcsv-core.umd.js +336 -7
  27. package/dist/jtcsv-core.umd.js.map +1 -1
  28. package/dist/jtcsv-full.cjs.js +336 -7
  29. package/dist/jtcsv-full.cjs.js.map +1 -1
  30. package/dist/jtcsv-full.esm.js +336 -7
  31. package/dist/jtcsv-full.esm.js.map +1 -1
  32. package/dist/jtcsv-full.umd.js +336 -7
  33. package/dist/jtcsv-full.umd.js.map +1 -1
  34. package/dist/jtcsv-workers.esm.js +9 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -1
  36. package/dist/jtcsv-workers.umd.js +9 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -1
  38. package/dist/jtcsv.cjs.js +1998 -2092
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1994 -2092
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2251
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +112 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/{src → dist/src}/web-server/index.js +251 -286
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +665 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +2 -2
  131. package/examples/advanced/performance-optimization.ts +2 -2
  132. package/examples/cli-advanced-usage.md +2 -0
  133. package/examples/cli-tool.ts +1 -1
  134. package/examples/large-dataset-example.ts +2 -2
  135. package/examples/simple-usage.ts +2 -2
  136. package/examples/streaming-example.ts +1 -1
  137. package/index.d.ts +186 -15
  138. package/package.json +43 -108
  139. package/plugins.d.ts +37 -0
  140. package/schema.d.ts +103 -0
  141. package/src/browser/csv-to-json-browser.ts +233 -3
  142. package/src/browser/errors-browser.ts +45 -28
  143. package/src/browser/json-to-csv-browser.ts +81 -5
  144. package/src/browser/streams.ts +73 -6
  145. package/src/core/delimiter-cache.ts +21 -11
  146. package/src/core/plugin-system.ts +343 -155
  147. package/src/core/transform-hooks.ts +20 -12
  148. package/src/engines/fast-path-engine.ts +48 -32
  149. package/src/errors.ts +1 -72
  150. package/src/formats/ndjson-parser.ts +6 -0
  151. package/src/formats/tsv-parser.ts +6 -0
  152. package/src/types/index.ts +21 -1
  153. package/src/utils/validators.ts +35 -0
  154. package/src/web-server/index.ts +1 -1
  155. package/bin/jtcsv.js +0 -2532
  156. package/csv-to-json.js +0 -711
  157. package/errors.js +0 -394
  158. package/examples/advanced/conditional-transformations.js +0 -446
  159. package/examples/advanced/csv-parser.worker.js +0 -89
  160. package/examples/advanced/nested-objects-example.js +0 -306
  161. package/examples/advanced/performance-optimization.js +0 -504
  162. package/examples/advanced/run-demo-server.js +0 -116
  163. package/examples/cli-batch-processing.js +0 -38
  164. package/examples/cli-tool.js +0 -183
  165. package/examples/error-handling.js +0 -338
  166. package/examples/express-api.js +0 -164
  167. package/examples/large-dataset-example.js +0 -182
  168. package/examples/ndjson-processing.js +0 -434
  169. package/examples/plugin-excel-exporter.js +0 -406
  170. package/examples/schema-validation.js +0 -640
  171. package/examples/simple-usage.js +0 -282
  172. package/examples/streaming-example.js +0 -418
  173. package/examples/web-workers-advanced.js +0 -28
  174. package/index.js +0 -82
  175. package/json-save.js +0 -255
  176. package/json-to-csv.js +0 -668
  177. package/plugins/README.md +0 -91
  178. package/plugins/express-middleware/README.md +0 -83
  179. package/plugins/express-middleware/example.js +0 -135
  180. package/plugins/express-middleware/example.ts +0 -135
  181. package/plugins/express-middleware/index.d.ts +0 -114
  182. package/plugins/express-middleware/index.js +0 -512
  183. package/plugins/express-middleware/index.ts +0 -557
  184. package/plugins/express-middleware/package.json +0 -52
  185. package/plugins/fastify-plugin/index.js +0 -404
  186. package/plugins/fastify-plugin/index.ts +0 -443
  187. package/plugins/fastify-plugin/package.json +0 -55
  188. package/plugins/hono/README.md +0 -28
  189. package/plugins/hono/index.d.ts +0 -12
  190. package/plugins/hono/index.js +0 -36
  191. package/plugins/hono/index.ts +0 -226
  192. package/plugins/hono/package.json +0 -35
  193. package/plugins/nestjs/README.md +0 -35
  194. package/plugins/nestjs/index.d.ts +0 -25
  195. package/plugins/nestjs/index.js +0 -77
  196. package/plugins/nestjs/index.ts +0 -201
  197. package/plugins/nestjs/package.json +0 -37
  198. package/plugins/nextjs-api/README.md +0 -57
  199. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  200. package/plugins/nextjs-api/examples/ConverterComponent.tsx +0 -386
  201. package/plugins/nextjs-api/examples/api-convert.js +0 -67
  202. package/plugins/nextjs-api/examples/api-convert.ts +0 -67
  203. package/plugins/nextjs-api/index.js +0 -387
  204. package/plugins/nextjs-api/index.tsx +0 -339
  205. package/plugins/nextjs-api/package.json +0 -63
  206. package/plugins/nextjs-api/route.js +0 -370
  207. package/plugins/nextjs-api/route.ts +0 -370
  208. package/plugins/nuxt/README.md +0 -24
  209. package/plugins/nuxt/index.js +0 -21
  210. package/plugins/nuxt/index.ts +0 -94
  211. package/plugins/nuxt/package.json +0 -35
  212. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  213. package/plugins/nuxt/runtime/composables/useJtcsv.ts +0 -100
  214. package/plugins/nuxt/runtime/plugin.js +0 -6
  215. package/plugins/nuxt/runtime/plugin.ts +0 -71
  216. package/plugins/remix/README.md +0 -26
  217. package/plugins/remix/index.d.ts +0 -16
  218. package/plugins/remix/index.js +0 -62
  219. package/plugins/remix/index.ts +0 -260
  220. package/plugins/remix/package.json +0 -35
  221. package/plugins/sveltekit/README.md +0 -28
  222. package/plugins/sveltekit/index.d.ts +0 -17
  223. package/plugins/sveltekit/index.js +0 -54
  224. package/plugins/sveltekit/index.ts +0 -301
  225. package/plugins/sveltekit/package.json +0 -33
  226. package/plugins/trpc/README.md +0 -25
  227. package/plugins/trpc/index.d.ts +0 -7
  228. package/plugins/trpc/index.js +0 -32
  229. package/plugins/trpc/index.ts +0 -267
  230. package/plugins/trpc/package.json +0 -34
  231. package/src/browser/browser-functions.js +0 -219
  232. package/src/browser/core.js +0 -92
  233. package/src/browser/csv-to-json-browser.js +0 -722
  234. package/src/browser/errors-browser.js +0 -212
  235. package/src/browser/extensions/plugins.js +0 -92
  236. package/src/browser/extensions/workers.js +0 -39
  237. package/src/browser/index.js +0 -113
  238. package/src/browser/json-to-csv-browser.js +0 -319
  239. package/src/browser/streams.js +0 -403
  240. package/src/browser/workers/csv-parser.worker.js +0 -377
  241. package/src/browser/workers/worker-pool.js +0 -527
  242. package/src/core/delimiter-cache.js +0 -200
  243. package/src/core/node-optimizations.js +0 -408
  244. package/src/core/plugin-system.js +0 -494
  245. package/src/core/transform-hooks.js +0 -350
  246. package/src/engines/fast-path-engine-new.js +0 -338
  247. package/src/engines/fast-path-engine.js +0 -844
  248. package/src/errors.js +0 -26
  249. package/src/formats/ndjson-parser.js +0 -467
  250. package/src/formats/tsv-parser.js +0 -339
  251. package/src/index-with-plugins.js +0 -378
  252. package/src/utils/bom-utils.js +0 -259
  253. package/src/utils/encoding-support.js +0 -124
  254. package/src/utils/schema-validator.js +0 -594
  255. package/src/utils/transform-loader.js +0 -205
  256. package/src/utils/zod-adapter.js +0 -170
  257. package/stream-csv-to-json.js +0 -560
  258. 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
- };