jtcsv 2.2.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +204 -115
  2. package/bin/jtcsv.ts +2612 -0
  3. package/browser.d.ts +142 -0
  4. package/dist/benchmark.js +446 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/bin/jtcsv.js +1940 -0
  7. package/dist/bin/jtcsv.js.map +1 -0
  8. package/dist/csv-to-json.js +1262 -0
  9. package/dist/csv-to-json.js.map +1 -0
  10. package/dist/errors.js +291 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/eslint.config.js +147 -0
  13. package/dist/eslint.config.js.map +1 -0
  14. package/dist/index-core.js +95 -0
  15. package/dist/index-core.js.map +1 -0
  16. package/dist/index.js +93 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/json-save.js +229 -0
  19. package/dist/json-save.js.map +1 -0
  20. package/dist/json-to-csv.js +576 -0
  21. package/dist/json-to-csv.js.map +1 -0
  22. package/dist/jtcsv-core.cjs.js +1736 -0
  23. package/dist/jtcsv-core.cjs.js.map +1 -0
  24. package/dist/jtcsv-core.esm.js +1708 -0
  25. package/dist/jtcsv-core.esm.js.map +1 -0
  26. package/dist/jtcsv-core.umd.js +1742 -0
  27. package/dist/jtcsv-core.umd.js.map +1 -0
  28. package/dist/jtcsv-full.cjs.js +2241 -0
  29. package/dist/jtcsv-full.cjs.js.map +1 -0
  30. package/dist/jtcsv-full.esm.js +2209 -0
  31. package/dist/jtcsv-full.esm.js.map +1 -0
  32. package/dist/jtcsv-full.umd.js +2247 -0
  33. package/dist/jtcsv-full.umd.js.map +1 -0
  34. package/dist/jtcsv-workers.esm.js +768 -0
  35. package/dist/jtcsv-workers.esm.js.map +1 -0
  36. package/dist/jtcsv-workers.umd.js +782 -0
  37. package/dist/jtcsv-workers.umd.js.map +1 -0
  38. package/dist/jtcsv.cjs.js +1996 -2048
  39. package/dist/jtcsv.cjs.js.map +1 -1
  40. package/dist/jtcsv.esm.js +1992 -2048
  41. package/dist/jtcsv.esm.js.map +1 -1
  42. package/dist/jtcsv.umd.js +2157 -2209
  43. package/dist/jtcsv.umd.js.map +1 -1
  44. package/dist/plugins/express-middleware/index.js +350 -0
  45. package/dist/plugins/express-middleware/index.js.map +1 -0
  46. package/dist/plugins/fastify-plugin/index.js +315 -0
  47. package/dist/plugins/fastify-plugin/index.js.map +1 -0
  48. package/dist/plugins/hono/index.js +111 -0
  49. package/dist/plugins/hono/index.js.map +1 -0
  50. package/dist/plugins/nestjs/index.js +112 -0
  51. package/dist/plugins/nestjs/index.js.map +1 -0
  52. package/dist/plugins/nuxt/index.js +53 -0
  53. package/dist/plugins/nuxt/index.js.map +1 -0
  54. package/dist/plugins/remix/index.js +133 -0
  55. package/dist/plugins/remix/index.js.map +1 -0
  56. package/dist/plugins/sveltekit/index.js +155 -0
  57. package/dist/plugins/sveltekit/index.js.map +1 -0
  58. package/dist/plugins/trpc/index.js +136 -0
  59. package/dist/plugins/trpc/index.js.map +1 -0
  60. package/dist/run-demo.js +49 -0
  61. package/dist/run-demo.js.map +1 -0
  62. package/dist/src/browser/browser-functions.js +193 -0
  63. package/dist/src/browser/browser-functions.js.map +1 -0
  64. package/dist/src/browser/core.js +123 -0
  65. package/dist/src/browser/core.js.map +1 -0
  66. package/dist/src/browser/csv-to-json-browser.js +353 -0
  67. package/dist/src/browser/csv-to-json-browser.js.map +1 -0
  68. package/dist/src/browser/errors-browser.js +219 -0
  69. package/dist/src/browser/errors-browser.js.map +1 -0
  70. package/dist/src/browser/extensions/plugins.js +106 -0
  71. package/dist/src/browser/extensions/plugins.js.map +1 -0
  72. package/dist/src/browser/extensions/workers.js +66 -0
  73. package/dist/src/browser/extensions/workers.js.map +1 -0
  74. package/dist/src/browser/index.js +140 -0
  75. package/dist/src/browser/index.js.map +1 -0
  76. package/dist/src/browser/json-to-csv-browser.js +225 -0
  77. package/dist/src/browser/json-to-csv-browser.js.map +1 -0
  78. package/dist/src/browser/streams.js +340 -0
  79. package/dist/src/browser/streams.js.map +1 -0
  80. package/dist/src/browser/workers/csv-parser.worker.js +264 -0
  81. package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
  82. package/dist/src/browser/workers/worker-pool.js +338 -0
  83. package/dist/src/browser/workers/worker-pool.js.map +1 -0
  84. package/dist/src/core/delimiter-cache.js +196 -0
  85. package/dist/src/core/delimiter-cache.js.map +1 -0
  86. package/dist/src/core/node-optimizations.js +279 -0
  87. package/dist/src/core/node-optimizations.js.map +1 -0
  88. package/dist/src/core/plugin-system.js +399 -0
  89. package/dist/src/core/plugin-system.js.map +1 -0
  90. package/dist/src/core/transform-hooks.js +348 -0
  91. package/dist/src/core/transform-hooks.js.map +1 -0
  92. package/dist/src/engines/fast-path-engine-new.js +262 -0
  93. package/dist/src/engines/fast-path-engine-new.js.map +1 -0
  94. package/dist/src/engines/fast-path-engine.js +671 -0
  95. package/dist/src/engines/fast-path-engine.js.map +1 -0
  96. package/dist/src/errors.js +18 -0
  97. package/dist/src/errors.js.map +1 -0
  98. package/dist/src/formats/ndjson-parser.js +332 -0
  99. package/dist/src/formats/ndjson-parser.js.map +1 -0
  100. package/dist/src/formats/tsv-parser.js +230 -0
  101. package/dist/src/formats/tsv-parser.js.map +1 -0
  102. package/dist/src/index-with-plugins.js +259 -0
  103. package/dist/src/index-with-plugins.js.map +1 -0
  104. package/dist/src/types/index.js +3 -0
  105. package/dist/src/types/index.js.map +1 -0
  106. package/dist/src/utils/bom-utils.js +267 -0
  107. package/dist/src/utils/bom-utils.js.map +1 -0
  108. package/dist/src/utils/encoding-support.js +77 -0
  109. package/dist/src/utils/encoding-support.js.map +1 -0
  110. package/dist/src/utils/schema-validator.js +609 -0
  111. package/dist/src/utils/schema-validator.js.map +1 -0
  112. package/dist/src/utils/transform-loader.js +281 -0
  113. package/dist/src/utils/transform-loader.js.map +1 -0
  114. package/dist/src/utils/validators.js +40 -0
  115. package/dist/src/utils/validators.js.map +1 -0
  116. package/dist/src/utils/zod-adapter.js +144 -0
  117. package/dist/src/utils/zod-adapter.js.map +1 -0
  118. package/dist/src/web-server/index.js +648 -0
  119. package/dist/src/web-server/index.js.map +1 -0
  120. package/dist/src/workers/csv-multithreaded.js +211 -0
  121. package/dist/src/workers/csv-multithreaded.js.map +1 -0
  122. package/dist/src/workers/csv-parser.worker.js +179 -0
  123. package/dist/src/workers/csv-parser.worker.js.map +1 -0
  124. package/dist/src/workers/worker-pool.js +228 -0
  125. package/dist/src/workers/worker-pool.js.map +1 -0
  126. package/dist/stream-csv-to-json.js +665 -0
  127. package/dist/stream-csv-to-json.js.map +1 -0
  128. package/dist/stream-json-to-csv.js +389 -0
  129. package/dist/stream-json-to-csv.js.map +1 -0
  130. package/examples/advanced/conditional-transformations.ts +446 -0
  131. package/examples/advanced/csv-parser.worker.ts +89 -0
  132. package/examples/advanced/nested-objects-example.ts +306 -0
  133. package/examples/advanced/performance-optimization.ts +504 -0
  134. package/examples/advanced/run-demo-server.ts +116 -0
  135. package/examples/advanced/web-worker-usage.html +874 -0
  136. package/examples/async-multithreaded-example.ts +335 -0
  137. package/examples/cli-advanced-usage.md +290 -0
  138. package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
  139. package/examples/{cli-tool.js → cli-tool.ts} +5 -8
  140. package/examples/{error-handling.js → error-handling.ts} +356 -324
  141. package/examples/{express-api.js → express-api.ts} +161 -164
  142. package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
  143. package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
  144. package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
  145. package/examples/react-integration.tsx +637 -0
  146. package/examples/{schema-validation.js → schema-validation.ts} +2 -2
  147. package/examples/simple-usage.ts +194 -0
  148. package/examples/{streaming-example.js → streaming-example.ts} +12 -12
  149. package/index.d.ts +187 -18
  150. package/package.json +75 -81
  151. package/plugins.d.ts +37 -0
  152. package/schema.d.ts +103 -0
  153. package/src/browser/browser-functions.ts +402 -0
  154. package/src/browser/core.ts +152 -0
  155. package/src/browser/csv-to-json-browser.d.ts +3 -0
  156. package/src/browser/csv-to-json-browser.ts +494 -0
  157. package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
  158. package/src/browser/extensions/plugins.ts +93 -0
  159. package/src/browser/extensions/workers.ts +39 -0
  160. package/src/browser/globals.d.ts +5 -0
  161. package/src/browser/index.ts +192 -0
  162. package/src/browser/json-to-csv-browser.d.ts +3 -0
  163. package/src/browser/json-to-csv-browser.ts +338 -0
  164. package/src/browser/streams.ts +403 -0
  165. package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
  166. package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
  167. package/src/core/delimiter-cache.ts +320 -0
  168. package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
  169. package/src/core/plugin-system.ts +588 -0
  170. package/src/core/transform-hooks.ts +566 -0
  171. package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
  172. package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
  173. package/src/errors.ts +1 -0
  174. package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
  175. package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
  176. package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
  177. package/src/types/index.ts +275 -0
  178. package/src/utils/bom-utils.ts +373 -0
  179. package/src/utils/encoding-support.ts +155 -0
  180. package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
  181. package/src/utils/transform-loader.ts +389 -0
  182. package/src/utils/validators.ts +35 -0
  183. package/src/utils/zod-adapter.ts +280 -0
  184. package/src/web-server/{index.js → index.ts} +19 -19
  185. package/src/workers/csv-multithreaded.ts +310 -0
  186. package/src/workers/csv-parser.worker.ts +227 -0
  187. package/src/workers/worker-pool.ts +409 -0
  188. package/bin/jtcsv.js +0 -2462
  189. package/csv-to-json.js +0 -688
  190. package/errors.js +0 -208
  191. package/examples/simple-usage.js +0 -282
  192. package/index.js +0 -68
  193. package/json-save.js +0 -254
  194. package/json-to-csv.js +0 -526
  195. package/plugins/README.md +0 -91
  196. package/plugins/express-middleware/README.md +0 -64
  197. package/plugins/express-middleware/example.js +0 -136
  198. package/plugins/express-middleware/index.d.ts +0 -114
  199. package/plugins/express-middleware/index.js +0 -360
  200. package/plugins/express-middleware/package.json +0 -52
  201. package/plugins/fastify-plugin/index.js +0 -406
  202. package/plugins/fastify-plugin/package.json +0 -55
  203. package/plugins/hono/README.md +0 -28
  204. package/plugins/hono/index.d.ts +0 -12
  205. package/plugins/hono/index.js +0 -36
  206. package/plugins/hono/package.json +0 -35
  207. package/plugins/nestjs/README.md +0 -35
  208. package/plugins/nestjs/index.d.ts +0 -25
  209. package/plugins/nestjs/index.js +0 -77
  210. package/plugins/nestjs/package.json +0 -37
  211. package/plugins/nextjs-api/README.md +0 -57
  212. package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
  213. package/plugins/nextjs-api/examples/api-convert.js +0 -69
  214. package/plugins/nextjs-api/index.js +0 -387
  215. package/plugins/nextjs-api/package.json +0 -63
  216. package/plugins/nextjs-api/route.js +0 -371
  217. package/plugins/nuxt/README.md +0 -24
  218. package/plugins/nuxt/index.js +0 -21
  219. package/plugins/nuxt/package.json +0 -35
  220. package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
  221. package/plugins/nuxt/runtime/plugin.js +0 -6
  222. package/plugins/remix/README.md +0 -26
  223. package/plugins/remix/index.d.ts +0 -16
  224. package/plugins/remix/index.js +0 -62
  225. package/plugins/remix/package.json +0 -35
  226. package/plugins/sveltekit/README.md +0 -28
  227. package/plugins/sveltekit/index.d.ts +0 -17
  228. package/plugins/sveltekit/index.js +0 -54
  229. package/plugins/sveltekit/package.json +0 -33
  230. package/plugins/trpc/README.md +0 -25
  231. package/plugins/trpc/index.d.ts +0 -7
  232. package/plugins/trpc/index.js +0 -32
  233. package/plugins/trpc/package.json +0 -34
  234. package/src/browser/browser-functions.js +0 -219
  235. package/src/browser/csv-to-json-browser.js +0 -700
  236. package/src/browser/index.js +0 -113
  237. package/src/browser/json-to-csv-browser.js +0 -309
  238. package/src/browser/streams.js +0 -393
  239. package/src/core/delimiter-cache.js +0 -186
  240. package/src/core/plugin-system.js +0 -476
  241. package/src/core/transform-hooks.js +0 -350
  242. package/src/errors.js +0 -26
  243. package/src/utils/transform-loader.js +0 -205
  244. package/stream-csv-to-json.js +0 -542
  245. package/stream-json-to-csv.js +0 -464
  246. /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
package/json-save.js DELETED
@@ -1,254 +0,0 @@
1
- /**
2
- * JSON Save Module - Node.js Module
3
- *
4
- * A lightweight module for saving JSON data to files with security validation.
5
- *
6
- * @module json-save
7
- */
8
-
9
- const {
10
- ValidationError,
11
- SecurityError,
12
- FileSystemError,
13
- LimitError,
14
- ConfigurationError,
15
- safeExecute
16
- } = require('./errors');
17
-
18
- /**
19
- * Validates file path for JSON saving
20
- * @private
21
- */
22
- function validateJsonFilePath(filePath) {
23
- const path = require('path');
24
-
25
- // Basic validation
26
- if (typeof filePath !== 'string' || filePath.trim() === '') {
27
- throw new ValidationError('File path must be a non-empty string');
28
- }
29
-
30
- // Ensure file has .json extension
31
- if (!filePath.toLowerCase().endsWith('.json')) {
32
- throw new ValidationError('File must have .json extension');
33
- }
34
-
35
- // Block UNC paths BEFORE path.resolve() to avoid network lookup timeouts
36
- if (filePath.startsWith('\\\\') || filePath.startsWith('//')) {
37
- throw new SecurityError('UNC paths are not allowed');
38
- }
39
-
40
- // Get absolute path and check for traversal
41
- const absolutePath = path.resolve(filePath);
42
- const normalizedPath = path.normalize(filePath);
43
-
44
- // Prevent directory traversal attacks
45
- if (normalizedPath.includes('..') ||
46
- /\\\.\.\\|\/\.\.\//.test(filePath) ||
47
- filePath.startsWith('..') ||
48
- filePath.includes('/..')) {
49
- throw new SecurityError('Directory traversal detected in file path');
50
- }
51
-
52
- return absolutePath;
53
- }
54
-
55
- /**
56
- * Validates JSON data and options
57
- * @private
58
- */
59
- function validateJsonData(data, options) {
60
- // Validate data
61
- if (data === undefined || data === null) {
62
- throw new ValidationError('Data cannot be null or undefined');
63
- }
64
-
65
- // Validate options
66
- if (options && typeof options !== 'object') {
67
- throw new ConfigurationError('Options must be an object');
68
- }
69
-
70
- // Validate prettyPrint
71
- if (options?.prettyPrint !== undefined && typeof options.prettyPrint !== 'boolean') {
72
- throw new ConfigurationError('prettyPrint must be a boolean');
73
- }
74
-
75
- // Validate maxSize
76
- if (options?.maxSize && (typeof options.maxSize !== 'number' || options.maxSize <= 0)) {
77
- throw new ConfigurationError('maxSize must be a positive number');
78
- }
79
-
80
- return true;
81
- }
82
-
83
- /**
84
- * Saves JSON data to a file
85
- *
86
- * @param {*} data - Data to save as JSON
87
- * @param {string} filePath - Path to save the JSON file
88
- * @param {Object} [options] - Configuration options
89
- * @param {boolean} [options.prettyPrint=false] - Format JSON with indentation
90
- * @param {number} [options.maxSize=10485760] - Maximum file size in bytes (default: 10MB)
91
- * @returns {Promise<void>}
92
- *
93
- * @example
94
- * const { saveAsJson } = require('./json-save');
95
- *
96
- * const data = [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }];
97
- * await saveAsJson(data, './output.json', { prettyPrint: true });
98
- */
99
- async function saveAsJson(data, filePath, options = {}) {
100
- return safeExecute(async () => {
101
- const fs = require('fs').promises;
102
-
103
- // Validate file path
104
- const safePath = validateJsonFilePath(filePath);
105
-
106
- // Validate data and options
107
- validateJsonData(data, options);
108
-
109
- const opts = options && typeof options === 'object' ? options : {};
110
- const {
111
- prettyPrint = false,
112
- maxSize = 10485760 // 10MB default limit
113
- } = opts;
114
-
115
- // Convert data to JSON string
116
- let jsonString;
117
- try {
118
- if (prettyPrint) {
119
- jsonString = JSON.stringify(data, null, 2);
120
- } else {
121
- jsonString = JSON.stringify(data);
122
- }
123
- } catch (error) {
124
- if (error.message.includes('circular') || error.message.includes('Converting circular')) {
125
- throw new ValidationError('Data contains circular references');
126
- }
127
- throw new ValidationError(`Failed to stringify JSON: ${error.message}`);
128
- }
129
-
130
- // Check size limit
131
- const byteSize = Buffer.byteLength(jsonString, 'utf8');
132
- if (byteSize > maxSize) {
133
- throw new LimitError(
134
- `JSON size exceeds maximum limit of ${maxSize} bytes`,
135
- maxSize,
136
- byteSize
137
- );
138
- }
139
-
140
- // Ensure directory exists
141
- const dir = require('path').dirname(safePath);
142
-
143
- try {
144
- await fs.mkdir(dir, { recursive: true });
145
-
146
- // Write file
147
- await fs.writeFile(safePath, jsonString, 'utf8');
148
-
149
- return safePath;
150
- } catch (error) {
151
- if (error.code === 'ENOENT') {
152
- throw new FileSystemError(`Directory does not exist: ${dir}`, error);
153
- }
154
- if (error.code === 'EACCES') {
155
- throw new FileSystemError(`Permission denied: ${safePath}`, error);
156
- }
157
- if (error.code === 'ENOSPC') {
158
- throw new FileSystemError(`No space left on device: ${safePath}`, error);
159
- }
160
-
161
- throw new FileSystemError(`Failed to write JSON file: ${error.message}`, error);
162
- }
163
- }, 'FILE_SYSTEM_ERROR', { function: 'saveAsJson' });
164
- }
165
-
166
- /**
167
- * Synchronously saves JSON data to a file
168
- *
169
- * @param {*} data - Data to save as JSON
170
- * @param {string} filePath - Path to save the JSON file
171
- * @param {Object} [options] - Configuration options (same as saveAsJson)
172
- * @returns {string} Path to saved file
173
- */
174
- function saveAsJsonSync(data, filePath, options = {}) {
175
- return safeExecute(() => {
176
- const fs = require('fs');
177
-
178
- // Validate file path
179
- const safePath = validateJsonFilePath(filePath);
180
-
181
- // Validate data and options
182
- validateJsonData(data, options);
183
-
184
- const opts = options && typeof options === 'object' ? options : {};
185
- const {
186
- prettyPrint = false,
187
- maxSize = 10485760 // 10MB default limit
188
- } = opts;
189
-
190
- // Convert data to JSON string
191
- let jsonString;
192
- try {
193
- if (prettyPrint) {
194
- jsonString = JSON.stringify(data, null, 2);
195
- } else {
196
- jsonString = JSON.stringify(data);
197
- }
198
- } catch (error) {
199
- if (error.message.includes('circular') || error.message.includes('Converting circular')) {
200
- throw new ValidationError('Data contains circular references');
201
- }
202
- throw new ValidationError(`Failed to stringify JSON: ${error.message}`);
203
- }
204
-
205
- // Check size limit
206
- const byteSize = Buffer.byteLength(jsonString, 'utf8');
207
- if (byteSize > maxSize) {
208
- throw new LimitError(
209
- `JSON size exceeds maximum limit of ${maxSize} bytes`,
210
- maxSize,
211
- byteSize
212
- );
213
- }
214
-
215
- // Ensure directory exists
216
- const dir = require('path').dirname(safePath);
217
-
218
- try {
219
- if (!fs.existsSync(dir)) {
220
- fs.mkdirSync(dir, { recursive: true });
221
- }
222
-
223
- // Write file
224
- fs.writeFileSync(safePath, jsonString, 'utf8');
225
-
226
- return safePath;
227
- } catch (error) {
228
- if (error.code === 'ENOENT') {
229
- throw new FileSystemError(`Directory does not exist: ${dir}`, error);
230
- }
231
- if (error.code === 'EACCES') {
232
- throw new FileSystemError(`Permission denied: ${safePath}`, error);
233
- }
234
- if (error.code === 'ENOSPC') {
235
- throw new FileSystemError(`No space left on device: ${safePath}`, error);
236
- }
237
-
238
- throw new FileSystemError(`Failed to write JSON file: ${error.message}`, error);
239
- }
240
- }, 'FILE_SYSTEM_ERROR', { function: 'saveAsJsonSync' });
241
- }
242
-
243
- // Export the functions
244
- module.exports = {
245
- saveAsJson,
246
- saveAsJsonSync,
247
- validateJsonFilePath
248
- };
249
-
250
- // For ES6 module compatibility
251
- /* istanbul ignore next */
252
- if (typeof module !== 'undefined' && module.exports) {
253
- module.exports.default = saveAsJson;
254
- }