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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-adapter.js","sourceRoot":"","sources":["../../../src/utils/zod-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Zod adapter for JTCSV schema validation.\r\n * \r\n * Provides integration with Zod schemas for CSV validation.\r\n * \r\n * @example\r\n * const { z } = require('zod');\r\n * const { createZodValidationHook } = require('./zod-adapter');\r\n * \r\n * const schema = z.object({\r\n * name: z.string().min(1),\r\n * age: z.number().int().min(0).max(150),\r\n * email: z.string().email()\r\n * });\r\n * \r\n * const validationHook = createZodValidationHook(schema);\r\n * \r\n * // Use with csvToJson\r\n * const data = await csvToJson(csv, {\r\n * hooks: { perRow: validationHook }\r\n * });\r\n */\r\n\r\nimport { ValidationError } from '../errors';\r\n\r\n// Conditional imports for optional dependencies\r\ntype ZodSchema = any;\r\ntype YupSchema = any;\r\n\r\nexport interface ZodValidationOptions {\r\n coerce?: boolean;\r\n mode?: 'strict' | 'collect';\r\n}\r\n\r\nexport interface YupValidationOptions {\r\n abortEarly?: boolean;\r\n stripUnknown?: boolean;\r\n}\r\n\r\nexport interface ValidatedParserOptions {\r\n library?: 'zod' | 'yup';\r\n [key: string]: any;\r\n}\r\n\r\nexport type RowHook = (row: any, index: number, context: any) => any | Promise<any>;\r\n\r\n/**\r\n * Creates a validation hook from a Zod schema.\r\n * \r\n * @param zodSchema - Zod schema instance\r\n * @param options - Validation options\r\n * @param options.coerce - Whether to coerce values according to Zod's coerce (default: true)\r\n * @param options.mode - 'strict' (throw on first error) or 'collect' (collect all errors)\r\n * @returns Validation hook compatible with JTCSV hooks.perRow\r\n */\r\nexport function createZodValidationHook(\r\n zodSchema: ZodSchema,\r\n options: ZodValidationOptions = {}\r\n): RowHook {\r\n const { coerce = true, mode = 'strict' } = options;\r\n \r\n // Check if Zod is available\r\n let zod: any;\r\n try {\r\n zod = require('zod');\r\n } catch (error) {\r\n throw new Error(\r\n 'Zod is not installed. Please install zod: npm install zod'\r\n );\r\n }\r\n \r\n // Ensure the passed schema is a Zod schema\r\n if (!zodSchema || typeof zodSchema.safeParse !== 'function') {\r\n throw new ValidationError('Provided schema is not a valid Zod schema');\r\n }\r\n \r\n // Return hook function\r\n return function (row: any, index: number, context: any): any {\r\n try {\r\n const result = zodSchema.safeParse(row);\r\n \r\n if (!result.success) {\r\n const errors = result.error.errors;\r\n const firstError = errors[0];\r\n const path = firstError.path?.join('.') || '';\r\n const message = firstError.message;\r\n \r\n if (mode === 'strict') {\r\n throw new ValidationError(\r\n `Row ${index + 1}: ${path ? `Field \"${path}\": ` : ''}${message}`\r\n );\r\n } else {\r\n // In collect mode, we attach errors to row metadata\r\n // For simplicity, we still throw but could be extended\r\n console.warn(`Row ${index + 1}: ${path ? `Field \"${path}\": ` : ''}${message}`);\r\n return row;\r\n }\r\n }\r\n \r\n // Return validated (and possibly coerced) data\r\n return result.data;\r\n } catch (error: any) {\r\n if (error instanceof ValidationError) {\r\n throw error;\r\n }\r\n // Unexpected error - log and return original row\r\n console.error(`Zod validation error at row ${index}: ${error.message}`);\r\n if (process.env['NODE_ENV'] === 'development') {\r\n console.error(error.stack);\r\n }\r\n return row;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Creates a Yup validation hook.\r\n * \r\n * @param yupSchema - Yup schema instance\r\n * @param options - Validation options\r\n * @returns Validation hook\r\n */\r\nexport function createYupValidationHook(\r\n yupSchema: YupSchema,\r\n options: YupValidationOptions = {}\r\n): RowHook {\r\n const { abortEarly = false, stripUnknown = true } = options;\r\n \r\n // Check if Yup is available\r\n let yup: any;\r\n try {\r\n yup = require('yup');\r\n } catch (error) {\r\n throw new Error(\r\n 'Yup is not installed. Please install yup: npm install yup'\r\n );\r\n }\r\n \r\n if (!yupSchema || typeof yupSchema.validate !== 'function') {\r\n throw new ValidationError('Provided schema is not a valid Yup schema');\r\n }\r\n \r\n return async function (row: any, index: number, context: any): Promise<any> {\r\n try {\r\n const validated = await yupSchema.validate(row, { abortEarly, stripUnknown });\r\n return validated;\r\n } catch (error: any) {\r\n if (error.name === 'ValidationError') {\r\n throw new ValidationError(`Row ${index + 1}: ${error.message}`);\r\n }\r\n console.error(`Yup validation error at row ${index}: ${error.message}`);\r\n return row;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Higher-order function that creates a csvToJson wrapper with schema validation.\r\n * \r\n * @param schema - Zod or Yup schema\r\n * @param adapterOptions - Adapter-specific options\r\n * @returns Function that takes csv and options, returns validated data\r\n */\r\nexport function createValidatedParser(\r\n schema: ZodSchema | YupSchema,\r\n adapterOptions: ValidatedParserOptions = {}\r\n): (csv: string, parseOptions?: any) => Promise<any[]> {\r\n const { library = 'zod', ...options } = adapterOptions;\r\n \r\n let validationHook: RowHook;\r\n if (library === 'zod') {\r\n validationHook = createZodValidationHook(schema as ZodSchema, options);\r\n } else if (library === 'yup') {\r\n validationHook = createYupValidationHook(schema as YupSchema, options);\r\n } else {\r\n throw new ValidationError(`Unsupported validation library: ${library}`);\r\n }\r\n \r\n return async function (csv: string, parseOptions: any = {}): Promise<any[]> {\r\n const { csvToJson } = require('../index');\r\n const hooks = parseOptions.hooks || {};\r\n // Merge validation hook with existing perRow hook\r\n const existingPerRow = hooks.perRow;\r\n hooks.perRow = function (row: any, index: number, context: any): any {\r\n let validated = row;\r\n if (existingPerRow) {\r\n validated = existingPerRow(validated, index, context);\r\n }\r\n return validationHook(validated, index, context);\r\n };\r\n \r\n return csvToJson(csv, { ...parseOptions, hooks });\r\n };\r\n}\r\n\r\n/**\r\n * Async version of createValidatedParser that uses worker threads for validation.\r\n * \r\n * @param schema - Zod or Yup schema\r\n * @param adapterOptions - Adapter-specific options\r\n * @returns Async function that validates CSV data in parallel\r\n */\r\nexport function createAsyncValidatedParser(\r\n schema: ZodSchema | YupSchema,\r\n adapterOptions: ValidatedParserOptions = {}\r\n): (csv: string, parseOptions?: any) => Promise<any[]> {\r\n const { library = 'zod', ...options } = adapterOptions;\r\n \r\n return async function (csv: string, parseOptions: any = {}): Promise<any[]> {\r\n const { csvToJson } = require('../index');\r\n const { createWorkerPool } = require('../workers/worker-pool');\r\n \r\n // Create worker pool for parallel validation\r\n const pool = createWorkerPool({\r\n workerCount: Math.min(4, require('os').cpus().length),\r\n workerScript: require.resolve('./validation-worker.js')\r\n });\r\n \r\n try {\r\n // Parse CSV without validation first\r\n const data = await csvToJson(csv, parseOptions);\r\n \r\n // Validate in parallel using worker pool\r\n const validationPromises = data.map((row: any, index: number) => \r\n pool.execute({ row, index, schema, library, options })\r\n );\r\n \r\n const validatedRows = await Promise.all(validationPromises);\r\n return validatedRows;\r\n } finally {\r\n await pool.terminate();\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Creates a validation hook that works asynchronously with Zod schemas.\r\n * \r\n * @param zodSchema - Zod schema instance\r\n * @param options - Validation options\r\n * @returns Async validation hook\r\n */\r\nexport function createAsyncZodValidationHook(\r\n zodSchema: ZodSchema,\r\n options: ZodValidationOptions = {}\r\n): RowHook {\r\n const hook = createZodValidationHook(zodSchema, options);\r\n \r\n return async function (row: any, index: number, context: any): Promise<any> {\r\n // For async compatibility, wrap in Promise\r\n return Promise.resolve(hook(row, index, context));\r\n };\r\n}\r\n\r\n/**\r\n * Creates a validation hook that works asynchronously with Yup schemas.\r\n * \r\n * @param yupSchema - Yup schema instance\r\n * @param options - Validation options\r\n * @returns Async validation hook\r\n */\r\nexport function createAsyncYupValidationHook(\r\n yupSchema: YupSchema,\r\n options: YupValidationOptions = {}\r\n): RowHook {\r\n const hook = createYupValidationHook(yupSchema, options);\r\n \r\n return async function (row: any, index: number, context: any): Promise<any> {\r\n return hook(row, index, context);\r\n };\r\n}\r\n\r\nexport default {\r\n createZodValidationHook,\r\n createYupValidationHook,\r\n createValidatedParser,\r\n createAsyncValidatedParser,\r\n createAsyncZodValidationHook,\r\n createAsyncYupValidationHook\r\n};"]}
@@ -1,230 +1,217 @@
1
- /**
2
- * JTCSV Web Server
3
- *
4
- * Simple web server for browser-based CSV/JSON conversion
5
- * with REST API endpoints
6
- */
7
-
8
- const http = require('http');
9
- const fs = require('fs');
10
- const path = require('path');
11
- const url = require('url');
12
- const jtcsv = require('../../index.js');
13
-
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const http_1 = __importDefault(require("http"));
40
+ const url_1 = __importDefault(require("url"));
41
+ const jtcsv = __importStar(require("../../index"));
14
42
  const PORT = process.env.PORT || 3000;
15
43
  const HOST = process.env.HOST || 'localhost';
16
-
17
- /**
18
- * Parse JSON body from request
19
- */
20
44
  function parseBody(req) {
21
- return new Promise((resolve, reject) => {
22
- let body = '';
23
- req.on('data', chunk => {
24
- body += chunk.toString();
25
- });
26
- req.on('end', () => {
27
- try {
28
- resolve(JSON.parse(body));
29
- } catch (error) {
30
- reject(new Error('Invalid JSON'));
31
- }
45
+ return new Promise((resolve, reject) => {
46
+ let body = '';
47
+ req.on('data', chunk => {
48
+ body += chunk.toString();
49
+ });
50
+ req.on('end', () => {
51
+ try {
52
+ resolve(JSON.parse(body));
53
+ }
54
+ catch (error) {
55
+ reject(new Error('Invalid JSON'));
56
+ }
57
+ });
58
+ req.on('error', reject);
32
59
  });
33
- req.on('error', reject);
34
- });
35
60
  }
36
-
37
- /**
38
- * Send JSON response
39
- */
40
61
  function sendJson(res, statusCode, data) {
41
- res.statusCode = statusCode;
42
- res.setHeader('Content-Type', 'application/json');
43
- res.setHeader('Access-Control-Allow-Origin', '*');
44
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
45
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
46
- res.end(JSON.stringify(data));
62
+ res.statusCode = statusCode;
63
+ res.setHeader('Content-Type', 'application/json');
64
+ res.setHeader('Access-Control-Allow-Origin', '*');
65
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
66
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
67
+ res.end(JSON.stringify(data));
47
68
  }
48
-
49
- /**
50
- * Send error response
51
- */
52
69
  function sendError(res, statusCode, message) {
53
- sendJson(res, statusCode, {
54
- success: false,
55
- error: message
56
- });
70
+ sendJson(res, statusCode, {
71
+ success: false,
72
+ error: message
73
+ });
57
74
  }
58
-
59
- /**
60
- * API Handler: Convert JSON to CSV
61
- */
62
75
  async function handleJsonToCsv(req, res) {
63
- try {
64
- const body = await parseBody(req);
65
- const { data, options = {} } = body;
66
-
67
- if (!Array.isArray(data)) {
68
- return sendError(res, 400, 'Data must be an array of objects');
69
- }
70
-
71
- const csv = jtcsv.jsonToCsv(data, {
72
- delimiter: options.delimiter || ',',
73
- includeHeaders: options.includeHeaders !== false,
74
- preventCsvInjection: options.preventCsvInjection !== false,
75
- rfc4180Compliant: options.rfc4180Compliant !== false
76
- });
77
-
78
- sendJson(res, 200, {
79
- success: true,
80
- result: csv,
81
- records: data.length,
82
- bytes: csv.length
83
- });
84
- } catch (error) {
85
- sendError(res, 500, error.message);
86
- }
76
+ try {
77
+ const body = await parseBody(req);
78
+ const { data, options = {} } = body;
79
+ if (!Array.isArray(data)) {
80
+ return sendError(res, 400, 'Data must be an array of objects');
81
+ }
82
+ const csv = jtcsv.jsonToCsv(data, {
83
+ delimiter: options.delimiter || ',',
84
+ includeHeaders: options.includeHeaders !== false,
85
+ preventCsvInjection: options.preventCsvInjection !== false,
86
+ rfc4180Compliant: options.rfc4180Compliant !== false
87
+ });
88
+ sendJson(res, 200, {
89
+ success: true,
90
+ result: csv,
91
+ records: data.length,
92
+ bytes: csv.length
93
+ });
94
+ }
95
+ catch (error) {
96
+ sendError(res, 500, error.message);
97
+ }
87
98
  }
88
-
89
- /**
90
- * API Handler: Convert CSV to JSON
91
- */
92
99
  async function handleCsvToJson(req, res) {
93
- try {
94
- const body = await parseBody(req);
95
- const { data, options = {} } = body;
96
-
97
- if (typeof data !== 'string') {
98
- return sendError(res, 400, 'Data must be a CSV string');
99
- }
100
-
101
- const json = jtcsv.csvToJson(data, {
102
- delimiter: options.delimiter,
103
- autoDetect: options.autoDetect !== false,
104
- hasHeaders: options.hasHeaders !== false,
105
- trim: options.trim !== false,
106
- parseNumbers: options.parseNumbers === true,
107
- parseBooleans: options.parseBooleans === true
108
- });
109
-
110
- sendJson(res, 200, {
111
- success: true,
112
- result: json,
113
- rows: json.length
114
- });
115
- } catch (error) {
116
- sendError(res, 500, error.message);
117
- }
100
+ try {
101
+ const body = await parseBody(req);
102
+ const { data, options = {} } = body;
103
+ if (typeof data !== 'string') {
104
+ return sendError(res, 400, 'Data must be a CSV string');
105
+ }
106
+ const json = jtcsv.csvToJson(data, {
107
+ delimiter: options.delimiter,
108
+ autoDetect: options.autoDetect !== false,
109
+ hasHeaders: options.hasHeaders !== false,
110
+ trim: options.trim !== false,
111
+ parseNumbers: options.parseNumbers === true,
112
+ parseBooleans: options.parseBooleans === true
113
+ });
114
+ sendJson(res, 200, {
115
+ success: true,
116
+ result: json,
117
+ rows: json.length
118
+ });
119
+ }
120
+ catch (error) {
121
+ sendError(res, 500, error.message);
122
+ }
118
123
  }
119
-
120
- /**
121
- * API Handler: Validate data
122
- */
123
124
  async function handleValidate(req, res) {
124
- try {
125
- const body = await parseBody(req);
126
- const { data, format } = body;
127
-
128
- let isValid = false;
129
- const errors = [];
130
-
131
- if (format === 'json') {
132
- if (Array.isArray(data)) {
133
- isValid = data.every(item => typeof item === 'object' && item !== null);
134
- if (!isValid) {
135
- errors.push('All items must be objects');
125
+ try {
126
+ const body = await parseBody(req);
127
+ const { data, format } = body;
128
+ let isValid = false;
129
+ const errors = [];
130
+ if (format === 'json') {
131
+ if (Array.isArray(data)) {
132
+ isValid = data.every(item => typeof item === 'object' && item !== null);
133
+ if (!isValid) {
134
+ errors.push('All items must be objects');
135
+ }
136
+ }
137
+ else {
138
+ errors.push('Data must be an array');
139
+ }
136
140
  }
137
- } else {
138
- errors.push('Data must be an array');
139
- }
140
- } else if (format === 'csv') {
141
- if (typeof data === 'string') {
142
- try {
143
- const parsed = jtcsv.csvToJson(data);
144
- isValid = Array.isArray(parsed) && parsed.length > 0;
145
- } catch (error) {
146
- errors.push(error.message);
141
+ else if (format === 'csv') {
142
+ if (typeof data === 'string') {
143
+ try {
144
+ const parsed = jtcsv.csvToJson(data);
145
+ isValid = Array.isArray(parsed) && parsed.length > 0;
146
+ }
147
+ catch (error) {
148
+ errors.push(error.message);
149
+ }
150
+ }
151
+ else {
152
+ errors.push('Data must be a string');
153
+ }
147
154
  }
148
- } else {
149
- errors.push('Data must be a string');
150
- }
151
- } else {
152
- errors.push('Format must be "json" or "csv"');
153
- }
154
-
155
- sendJson(res, 200, {
156
- success: true,
157
- valid: isValid,
158
- errors: errors
159
- });
160
- } catch (error) {
161
- sendError(res, 500, error.message);
162
- }
155
+ else {
156
+ errors.push('Format must be "json" or "csv"');
157
+ }
158
+ sendJson(res, 200, {
159
+ success: true,
160
+ valid: isValid,
161
+ errors: errors
162
+ });
163
+ }
164
+ catch (error) {
165
+ sendError(res, 500, error.message);
166
+ }
163
167
  }
164
-
165
- /**
166
- * API Handler: Convert NDJSON to CSV
167
- */
168
168
  async function handleNdjsonToCsv(req, res) {
169
- try {
170
- const body = await parseBody(req);
171
- const { data, options = {} } = body;
172
-
173
- if (typeof data !== 'string') {
174
- return sendError(res, 400, 'Data must be an NDJSON string');
175
- }
176
-
177
- const json = jtcsv.ndjsonToJson(data);
178
- const csv = jtcsv.jsonToCsv(json, {
179
- delimiter: options.delimiter || ',',
180
- includeHeaders: options.includeHeaders !== false
181
- });
182
-
183
- sendJson(res, 200, {
184
- success: true,
185
- result: csv,
186
- records: json.length
187
- });
188
- } catch (error) {
189
- sendError(res, 500, error.message);
190
- }
169
+ try {
170
+ const body = await parseBody(req);
171
+ const { data, options = {} } = body;
172
+ if (typeof data !== 'string') {
173
+ return sendError(res, 400, 'Data must be an NDJSON string');
174
+ }
175
+ const json = jtcsv.ndjsonToJson(data);
176
+ const csv = jtcsv.jsonToCsv(json, {
177
+ delimiter: options.delimiter || ',',
178
+ includeHeaders: options.includeHeaders !== false
179
+ });
180
+ sendJson(res, 200, {
181
+ success: true,
182
+ result: csv,
183
+ records: json.length
184
+ });
185
+ }
186
+ catch (error) {
187
+ sendError(res, 500, error.message);
188
+ }
191
189
  }
192
-
193
- /**
194
- * API Handler: Convert CSV to NDJSON
195
- */
196
190
  async function handleCsvToNdjson(req, res) {
197
- try {
198
- const body = await parseBody(req);
199
- const { data, options = {} } = body;
200
-
201
- if (typeof data !== 'string') {
202
- return sendError(res, 400, 'Data must be a CSV string');
203
- }
204
-
205
- const json = jtcsv.csvToJson(data, {
206
- delimiter: options.delimiter,
207
- autoDetect: options.autoDetect !== false,
208
- hasHeaders: options.hasHeaders !== false
209
- });
210
-
211
- const ndjson = jtcsv.jsonToNdjson(json);
212
-
213
- sendJson(res, 200, {
214
- success: true,
215
- result: ndjson,
216
- records: json.length
217
- });
218
- } catch (error) {
219
- sendError(res, 500, error.message);
220
- }
191
+ try {
192
+ const body = await parseBody(req);
193
+ const { data, options = {} } = body;
194
+ if (typeof data !== 'string') {
195
+ return sendError(res, 400, 'Data must be a CSV string');
196
+ }
197
+ const json = jtcsv.csvToJson(data, {
198
+ delimiter: options.delimiter,
199
+ autoDetect: options.autoDetect !== false,
200
+ hasHeaders: options.hasHeaders !== false
201
+ });
202
+ const ndjson = jtcsv.jsonToNdjson(json);
203
+ sendJson(res, 200, {
204
+ success: true,
205
+ result: ndjson,
206
+ records: json.length
207
+ });
208
+ }
209
+ catch (error) {
210
+ sendError(res, 500, error.message);
211
+ }
221
212
  }
222
-
223
- /**
224
- * Serve static HTML page
225
- */
226
213
  function serveHomePage(res) {
227
- const html = `<!DOCTYPE html>
214
+ const html = `<!DOCTYPE html>
228
215
  <html lang="en">
229
216
  <head>
230
217
  <meta charset="UTF-8">
@@ -590,94 +577,72 @@ function serveHomePage(res) {
590
577
  </script>
591
578
  </body>
592
579
  </html>`;
593
-
594
- res.statusCode = 200;
595
- res.setHeader('Content-Type', 'text/html');
596
- res.end(html);
580
+ res.statusCode = 200;
581
+ res.setHeader('Content-Type', 'text/html');
582
+ res.end(html);
597
583
  }
598
-
599
- /**
600
- * Request handler
601
- */
602
584
  function handleRequest(req, res) {
603
- const parsedUrl = url.parse(req.url, true);
604
- const pathname = parsedUrl.pathname;
605
-
606
- // Handle CORS preflight
607
- if (req.method === 'OPTIONS') {
608
- res.statusCode = 204;
609
- res.setHeader('Access-Control-Allow-Origin', '*');
610
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
611
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
612
- res.end();
613
- return;
614
- }
615
-
616
- // Home page
617
- if (pathname === '/' && req.method === 'GET') {
618
- return serveHomePage(res);
619
- }
620
-
621
- // API endpoints
622
- if (req.method === 'POST') {
623
- if (pathname === '/api/json-to-csv') {
624
- return handleJsonToCsv(req, res);
625
- }
626
- if (pathname === '/api/csv-to-json') {
627
- return handleCsvToJson(req, res);
628
- }
629
- if (pathname === '/api/validate') {
630
- return handleValidate(req, res);
585
+ const parsedUrl = url_1.default.parse(req.url, true);
586
+ const pathname = parsedUrl.pathname;
587
+ if (req.method === 'OPTIONS') {
588
+ res.statusCode = 204;
589
+ res.setHeader('Access-Control-Allow-Origin', '*');
590
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
591
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
592
+ res.end();
593
+ return;
631
594
  }
632
- if (pathname === '/api/ndjson-to-csv') {
633
- return handleNdjsonToCsv(req, res);
595
+ if (pathname === '/' && req.method === 'GET') {
596
+ return serveHomePage(res);
634
597
  }
635
- if (pathname === '/api/csv-to-ndjson') {
636
- return handleCsvToNdjson(req, res);
598
+ if (req.method === 'POST') {
599
+ if (pathname === '/api/json-to-csv') {
600
+ return handleJsonToCsv(req, res);
601
+ }
602
+ if (pathname === '/api/csv-to-json') {
603
+ return handleCsvToJson(req, res);
604
+ }
605
+ if (pathname === '/api/validate') {
606
+ return handleValidate(req, res);
607
+ }
608
+ if (pathname === '/api/ndjson-to-csv') {
609
+ return handleNdjsonToCsv(req, res);
610
+ }
611
+ if (pathname === '/api/csv-to-ndjson') {
612
+ return handleCsvToNdjson(req, res);
613
+ }
637
614
  }
638
- }
639
-
640
- // 404
641
- sendError(res, 404, 'Not found');
615
+ sendError(res, 404, 'Not found');
642
616
  }
643
-
644
- /**
645
- * Start server
646
- */
647
617
  function startServer(options = {}) {
648
- const port = options.port || PORT;
649
- const host = options.host || HOST;
650
-
651
- const server = http.createServer(handleRequest);
652
-
653
- server.listen(port, host, () => {
654
- console.log('\n🌐 JTCSV Web Server started!');
655
- console.log(`\nšŸ“ URL: http://${host}:${port}`);
656
- console.log('\nšŸ“” API Endpoints:');
657
- console.log(' POST /api/json-to-csv');
658
- console.log(' POST /api/csv-to-json');
659
- console.log(' POST /api/ndjson-to-csv');
660
- console.log(' POST /api/csv-to-ndjson');
661
- console.log(' POST /api/validate');
662
- console.log('\n✨ Press Ctrl+C to stop\n');
663
- });
664
-
665
- server.on('error', (error) => {
666
- if (error.code === 'EADDRINUSE') {
667
- console.error(`\nāŒ Error: Port ${port} is already in use`);
668
- console.error(' Try a different port: jtcsv web --port=3001\n');
669
- } else {
670
- console.error(`\nāŒ Server error: ${error.message}\n`);
671
- }
672
- process.exit(1);
673
- });
674
-
675
- return server;
618
+ const port = options.port || PORT;
619
+ const host = options.host || HOST;
620
+ const server = http_1.default.createServer(handleRequest);
621
+ server.listen(port, host, () => {
622
+ console.log('\n🌐 JTCSV Web Server started!');
623
+ console.log(`\nšŸ“ URL: http://${host}:${port}`);
624
+ console.log('\nšŸ“” API Endpoints:');
625
+ console.log(' POST /api/json-to-csv');
626
+ console.log(' POST /api/csv-to-json');
627
+ console.log(' POST /api/ndjson-to-csv');
628
+ console.log(' POST /api/csv-to-ndjson');
629
+ console.log(' POST /api/validate');
630
+ console.log('\n✨ Press Ctrl+C to stop\n');
631
+ });
632
+ server.on('error', (error) => {
633
+ if (error.code === 'EADDRINUSE') {
634
+ console.error(`\nāŒ Error: Port ${port} is already in use`);
635
+ console.error(' Try a different port: jtcsv web --port=3001\n');
636
+ }
637
+ else {
638
+ console.error(`\nāŒ Server error: ${error.message}\n`);
639
+ }
640
+ process.exit(1);
641
+ });
642
+ return server;
676
643
  }
677
-
678
- module.exports = { startServer };
679
-
680
- // Run as standalone
644
+ exports.default = { startServer };
681
645
  if (require.main === module) {
682
- startServer();
646
+ startServer();
683
647
  }
648
+ //# sourceMappingURL=index.js.map