jtcsv 2.2.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +204 -115
- package/bin/jtcsv.ts +2612 -0
- package/browser.d.ts +142 -0
- package/dist/benchmark.js +446 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/bin/jtcsv.js +1940 -0
- package/dist/bin/jtcsv.js.map +1 -0
- package/dist/csv-to-json.js +1262 -0
- package/dist/csv-to-json.js.map +1 -0
- package/dist/errors.js +291 -0
- package/dist/errors.js.map +1 -0
- package/dist/eslint.config.js +147 -0
- package/dist/eslint.config.js.map +1 -0
- package/dist/index-core.js +95 -0
- package/dist/index-core.js.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/json-save.js +229 -0
- package/dist/json-save.js.map +1 -0
- package/dist/json-to-csv.js +576 -0
- package/dist/json-to-csv.js.map +1 -0
- package/dist/jtcsv-core.cjs.js +1736 -0
- package/dist/jtcsv-core.cjs.js.map +1 -0
- package/dist/jtcsv-core.esm.js +1708 -0
- package/dist/jtcsv-core.esm.js.map +1 -0
- package/dist/jtcsv-core.umd.js +1742 -0
- package/dist/jtcsv-core.umd.js.map +1 -0
- package/dist/jtcsv-full.cjs.js +2241 -0
- package/dist/jtcsv-full.cjs.js.map +1 -0
- package/dist/jtcsv-full.esm.js +2209 -0
- package/dist/jtcsv-full.esm.js.map +1 -0
- package/dist/jtcsv-full.umd.js +2247 -0
- package/dist/jtcsv-full.umd.js.map +1 -0
- package/dist/jtcsv-workers.esm.js +768 -0
- package/dist/jtcsv-workers.esm.js.map +1 -0
- package/dist/jtcsv-workers.umd.js +782 -0
- package/dist/jtcsv-workers.umd.js.map +1 -0
- package/dist/jtcsv.cjs.js +1996 -2048
- package/dist/jtcsv.cjs.js.map +1 -1
- package/dist/jtcsv.esm.js +1992 -2048
- package/dist/jtcsv.esm.js.map +1 -1
- package/dist/jtcsv.umd.js +2157 -2209
- package/dist/jtcsv.umd.js.map +1 -1
- package/dist/plugins/express-middleware/index.js +350 -0
- package/dist/plugins/express-middleware/index.js.map +1 -0
- package/dist/plugins/fastify-plugin/index.js +315 -0
- package/dist/plugins/fastify-plugin/index.js.map +1 -0
- package/dist/plugins/hono/index.js +111 -0
- package/dist/plugins/hono/index.js.map +1 -0
- package/dist/plugins/nestjs/index.js +112 -0
- package/dist/plugins/nestjs/index.js.map +1 -0
- package/dist/plugins/nuxt/index.js +53 -0
- package/dist/plugins/nuxt/index.js.map +1 -0
- package/dist/plugins/remix/index.js +133 -0
- package/dist/plugins/remix/index.js.map +1 -0
- package/dist/plugins/sveltekit/index.js +155 -0
- package/dist/plugins/sveltekit/index.js.map +1 -0
- package/dist/plugins/trpc/index.js +136 -0
- package/dist/plugins/trpc/index.js.map +1 -0
- package/dist/run-demo.js +49 -0
- package/dist/run-demo.js.map +1 -0
- package/dist/src/browser/browser-functions.js +193 -0
- package/dist/src/browser/browser-functions.js.map +1 -0
- package/dist/src/browser/core.js +123 -0
- package/dist/src/browser/core.js.map +1 -0
- package/dist/src/browser/csv-to-json-browser.js +353 -0
- package/dist/src/browser/csv-to-json-browser.js.map +1 -0
- package/dist/src/browser/errors-browser.js +219 -0
- package/dist/src/browser/errors-browser.js.map +1 -0
- package/dist/src/browser/extensions/plugins.js +106 -0
- package/dist/src/browser/extensions/plugins.js.map +1 -0
- package/dist/src/browser/extensions/workers.js +66 -0
- package/dist/src/browser/extensions/workers.js.map +1 -0
- package/dist/src/browser/index.js +140 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/json-to-csv-browser.js +225 -0
- package/dist/src/browser/json-to-csv-browser.js.map +1 -0
- package/dist/src/browser/streams.js +340 -0
- package/dist/src/browser/streams.js.map +1 -0
- package/dist/src/browser/workers/csv-parser.worker.js +264 -0
- package/dist/src/browser/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/browser/workers/worker-pool.js +338 -0
- package/dist/src/browser/workers/worker-pool.js.map +1 -0
- package/dist/src/core/delimiter-cache.js +196 -0
- package/dist/src/core/delimiter-cache.js.map +1 -0
- package/dist/src/core/node-optimizations.js +279 -0
- package/dist/src/core/node-optimizations.js.map +1 -0
- package/dist/src/core/plugin-system.js +399 -0
- package/dist/src/core/plugin-system.js.map +1 -0
- package/dist/src/core/transform-hooks.js +348 -0
- package/dist/src/core/transform-hooks.js.map +1 -0
- package/dist/src/engines/fast-path-engine-new.js +262 -0
- package/dist/src/engines/fast-path-engine-new.js.map +1 -0
- package/dist/src/engines/fast-path-engine.js +671 -0
- package/dist/src/engines/fast-path-engine.js.map +1 -0
- package/dist/src/errors.js +18 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/formats/ndjson-parser.js +332 -0
- package/dist/src/formats/ndjson-parser.js.map +1 -0
- package/dist/src/formats/tsv-parser.js +230 -0
- package/dist/src/formats/tsv-parser.js.map +1 -0
- package/dist/src/index-with-plugins.js +259 -0
- package/dist/src/index-with-plugins.js.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/bom-utils.js +267 -0
- package/dist/src/utils/bom-utils.js.map +1 -0
- package/dist/src/utils/encoding-support.js +77 -0
- package/dist/src/utils/encoding-support.js.map +1 -0
- package/dist/src/utils/schema-validator.js +609 -0
- package/dist/src/utils/schema-validator.js.map +1 -0
- package/dist/src/utils/transform-loader.js +281 -0
- package/dist/src/utils/transform-loader.js.map +1 -0
- package/dist/src/utils/validators.js +40 -0
- package/dist/src/utils/validators.js.map +1 -0
- package/dist/src/utils/zod-adapter.js +144 -0
- package/dist/src/utils/zod-adapter.js.map +1 -0
- package/dist/src/web-server/index.js +648 -0
- package/dist/src/web-server/index.js.map +1 -0
- package/dist/src/workers/csv-multithreaded.js +211 -0
- package/dist/src/workers/csv-multithreaded.js.map +1 -0
- package/dist/src/workers/csv-parser.worker.js +179 -0
- package/dist/src/workers/csv-parser.worker.js.map +1 -0
- package/dist/src/workers/worker-pool.js +228 -0
- package/dist/src/workers/worker-pool.js.map +1 -0
- package/dist/stream-csv-to-json.js +665 -0
- package/dist/stream-csv-to-json.js.map +1 -0
- package/dist/stream-json-to-csv.js +389 -0
- package/dist/stream-json-to-csv.js.map +1 -0
- package/examples/advanced/conditional-transformations.ts +446 -0
- package/examples/advanced/csv-parser.worker.ts +89 -0
- package/examples/advanced/nested-objects-example.ts +306 -0
- package/examples/advanced/performance-optimization.ts +504 -0
- package/examples/advanced/run-demo-server.ts +116 -0
- package/examples/advanced/web-worker-usage.html +874 -0
- package/examples/async-multithreaded-example.ts +335 -0
- package/examples/cli-advanced-usage.md +290 -0
- package/examples/{cli-batch-processing.js → cli-batch-processing.ts} +38 -38
- package/examples/{cli-tool.js → cli-tool.ts} +5 -8
- package/examples/{error-handling.js → error-handling.ts} +356 -324
- package/examples/{express-api.js → express-api.ts} +161 -164
- package/examples/{large-dataset-example.js → large-dataset-example.ts} +201 -182
- package/examples/{ndjson-processing.js → ndjson-processing.ts} +456 -434
- package/examples/{plugin-excel-exporter.js → plugin-excel-exporter.ts} +6 -7
- package/examples/react-integration.tsx +637 -0
- package/examples/{schema-validation.js → schema-validation.ts} +2 -2
- package/examples/simple-usage.ts +194 -0
- package/examples/{streaming-example.js → streaming-example.ts} +12 -12
- package/index.d.ts +187 -18
- package/package.json +75 -81
- package/plugins.d.ts +37 -0
- package/schema.d.ts +103 -0
- package/src/browser/browser-functions.ts +402 -0
- package/src/browser/core.ts +152 -0
- package/src/browser/csv-to-json-browser.d.ts +3 -0
- package/src/browser/csv-to-json-browser.ts +494 -0
- package/src/browser/{errors-browser.js → errors-browser.ts} +305 -197
- package/src/browser/extensions/plugins.ts +93 -0
- package/src/browser/extensions/workers.ts +39 -0
- package/src/browser/globals.d.ts +5 -0
- package/src/browser/index.ts +192 -0
- package/src/browser/json-to-csv-browser.d.ts +3 -0
- package/src/browser/json-to-csv-browser.ts +338 -0
- package/src/browser/streams.ts +403 -0
- package/src/browser/workers/{csv-parser.worker.js → csv-parser.worker.ts} +3 -3
- package/src/browser/workers/{worker-pool.js → worker-pool.ts} +51 -30
- package/src/core/delimiter-cache.ts +320 -0
- package/src/core/{node-optimizations.js → node-optimizations.ts} +448 -407
- package/src/core/plugin-system.ts +588 -0
- package/src/core/transform-hooks.ts +566 -0
- package/src/engines/{fast-path-engine-new.js → fast-path-engine-new.ts} +11 -2
- package/src/engines/{fast-path-engine.js → fast-path-engine.ts} +79 -53
- package/src/errors.ts +1 -0
- package/src/formats/{ndjson-parser.js → ndjson-parser.ts} +24 -16
- package/src/formats/{tsv-parser.js → tsv-parser.ts} +18 -17
- package/src/{index-with-plugins.js → index-with-plugins.ts} +381 -357
- package/src/types/index.ts +275 -0
- package/src/utils/bom-utils.ts +373 -0
- package/src/utils/encoding-support.ts +155 -0
- package/src/utils/{schema-validator.js → schema-validator.ts} +814 -589
- package/src/utils/transform-loader.ts +389 -0
- package/src/utils/validators.ts +35 -0
- package/src/utils/zod-adapter.ts +280 -0
- package/src/web-server/{index.js → index.ts} +19 -19
- package/src/workers/csv-multithreaded.ts +310 -0
- package/src/workers/csv-parser.worker.ts +227 -0
- package/src/workers/worker-pool.ts +409 -0
- package/bin/jtcsv.js +0 -2462
- package/csv-to-json.js +0 -688
- package/errors.js +0 -208
- package/examples/simple-usage.js +0 -282
- package/index.js +0 -68
- package/json-save.js +0 -254
- package/json-to-csv.js +0 -526
- package/plugins/README.md +0 -91
- package/plugins/express-middleware/README.md +0 -64
- package/plugins/express-middleware/example.js +0 -136
- package/plugins/express-middleware/index.d.ts +0 -114
- package/plugins/express-middleware/index.js +0 -360
- package/plugins/express-middleware/package.json +0 -52
- package/plugins/fastify-plugin/index.js +0 -406
- package/plugins/fastify-plugin/package.json +0 -55
- package/plugins/hono/README.md +0 -28
- package/plugins/hono/index.d.ts +0 -12
- package/plugins/hono/index.js +0 -36
- package/plugins/hono/package.json +0 -35
- package/plugins/nestjs/README.md +0 -35
- package/plugins/nestjs/index.d.ts +0 -25
- package/plugins/nestjs/index.js +0 -77
- package/plugins/nestjs/package.json +0 -37
- package/plugins/nextjs-api/README.md +0 -57
- package/plugins/nextjs-api/examples/ConverterComponent.jsx +0 -386
- package/plugins/nextjs-api/examples/api-convert.js +0 -69
- package/plugins/nextjs-api/index.js +0 -387
- package/plugins/nextjs-api/package.json +0 -63
- package/plugins/nextjs-api/route.js +0 -371
- package/plugins/nuxt/README.md +0 -24
- package/plugins/nuxt/index.js +0 -21
- package/plugins/nuxt/package.json +0 -35
- package/plugins/nuxt/runtime/composables/useJtcsv.js +0 -6
- package/plugins/nuxt/runtime/plugin.js +0 -6
- package/plugins/remix/README.md +0 -26
- package/plugins/remix/index.d.ts +0 -16
- package/plugins/remix/index.js +0 -62
- package/plugins/remix/package.json +0 -35
- package/plugins/sveltekit/README.md +0 -28
- package/plugins/sveltekit/index.d.ts +0 -17
- package/plugins/sveltekit/index.js +0 -54
- package/plugins/sveltekit/package.json +0 -33
- package/plugins/trpc/README.md +0 -25
- package/plugins/trpc/index.d.ts +0 -7
- package/plugins/trpc/index.js +0 -32
- package/plugins/trpc/package.json +0 -34
- package/src/browser/browser-functions.js +0 -219
- package/src/browser/csv-to-json-browser.js +0 -700
- package/src/browser/index.js +0 -113
- package/src/browser/json-to-csv-browser.js +0 -309
- package/src/browser/streams.js +0 -393
- package/src/core/delimiter-cache.js +0 -186
- package/src/core/plugin-system.js +0 -476
- package/src/core/transform-hooks.js +0 -350
- package/src/errors.js +0 -26
- package/src/utils/transform-loader.js +0 -205
- package/stream-csv-to-json.js +0 -542
- package/stream-json-to-csv.js +0 -464
- /package/examples/{web-workers-advanced.js → web-workers-advanced.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-to-csv.js","sourceRoot":"","sources":["../json-to-csv.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * JSON to CSV Converter - TypeScript Module\r\n * \r\n * A lightweight, efficient module for converting JSON data to CSV format\r\n * with proper escaping and formatting for Excel compatibility.\r\n */\r\n\r\nimport {\r\n ValidationError,\r\n SecurityError,\r\n FileSystemError,\r\n JtcsvError,\r\n LimitError,\r\n ConfigurationError,\r\n safeExecuteSync,\r\n safeExecuteAsync,\r\n ErrorCode\r\n} from './errors';\r\n\r\nimport { createSchemaValidators } from './src/utils/schema-validator';\r\nimport type {\r\n AsyncJsonToCsvOptions,\r\n DeepUnwrapOptions,\r\n JsonToCsvOptions,\r\n PreprocessOptions,\r\n SaveAsCsvOptions\r\n} from './src/types';\r\n\r\ntype SchemaValidator = {\r\n validate?: (value: any) => boolean;\r\n format?: (value: any) => any;\r\n};\r\n\r\n/**\r\n * Validates input data and options\r\n * @private\r\n */\r\nfunction validateInput(data: any[], options?: JsonToCsvOptions) {\r\n // Validate data\r\n if (!Array.isArray(data)) {\r\n throw new ValidationError('Input data must be an array');\r\n }\r\n \r\n // Validate options\r\n if (options && typeof options !== 'object') {\r\n throw new ConfigurationError('Options must be an object');\r\n }\r\n \r\n // Validate delimiter\r\n if (options?.delimiter && typeof options.delimiter !== 'string') {\r\n throw new ConfigurationError('Delimiter must be a string');\r\n }\r\n \r\n if (options?.delimiter && options.delimiter.length !== 1) {\r\n throw new ConfigurationError('Delimiter must be a single character');\r\n }\r\n \r\n // Validate renameMap\r\n if (options?.renameMap && typeof options.renameMap !== 'object') {\r\n throw new ConfigurationError('renameMap must be an object');\r\n }\r\n \r\n // Validate maxRecords\r\n if (options && options.maxRecords !== undefined) {\r\n if (typeof options.maxRecords !== 'number' || options.maxRecords <= 0) {\r\n throw new ConfigurationError('maxRecords must be a positive number');\r\n }\r\n }\r\n\r\n if (options?.memoryWarningThreshold !== undefined) {\r\n if (typeof options.memoryWarningThreshold !== 'number' || options.memoryWarningThreshold <= 0) {\r\n throw new ConfigurationError('memoryWarningThreshold must be a positive number');\r\n }\r\n }\r\n\r\n if (options?.memoryLimit !== undefined) {\r\n if (typeof options.memoryLimit !== 'number') {\r\n throw new ConfigurationError('memoryLimit must be a number');\r\n }\r\n if (options.memoryLimit !== Infinity && options.memoryLimit <= 0) {\r\n throw new ConfigurationError('memoryLimit must be a positive number or Infinity');\r\n }\r\n }\r\n \r\n // Validate preventCsvInjection\r\n if (options?.preventCsvInjection !== undefined && typeof options.preventCsvInjection !== 'boolean') {\r\n throw new ConfigurationError('preventCsvInjection must be a boolean');\r\n }\r\n \r\n // Validate rfc4180Compliant\r\n if (options?.rfc4180Compliant !== undefined && typeof options.rfc4180Compliant !== 'boolean') {\r\n throw new ConfigurationError('rfc4180Compliant must be a boolean');\r\n }\r\n \r\n if (options?.normalizeQuotes !== undefined && typeof options.normalizeQuotes !== 'boolean') {\r\n throw new ConfigurationError('normalizeQuotes must be a boolean');\r\n }\r\n \r\n // Validate schema\r\n if (options?.schema && typeof options.schema !== 'object') {\r\n throw new ConfigurationError('schema must be an object');\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n * Preprocesses data with flattening and array handling options\r\n */\r\nexport function preprocessData(\r\n data: any[],\r\n options: PreprocessOptions = {}\r\n) {\r\n const {\r\n flatten = false,\r\n flattenSeparator = '.',\r\n flattenMaxDepth = 3,\r\n arrayHandling = 'join'\r\n } = options;\r\n \r\n if (!Array.isArray(data)) {\r\n return [];\r\n }\r\n \r\n const processed = [];\r\n const fastPath = !flatten && arrayHandling === 'join';\r\n \r\n for (const item of data) {\r\n if (!item || typeof item !== 'object') {\r\n processed.push({});\r\n continue;\r\n }\r\n if (fastPath) {\r\n let hasComplex = false;\r\n let hasNullish = false;\r\n for (const key in item) {\r\n if (!Object.prototype.hasOwnProperty.call(item, key)) {\r\n continue;\r\n }\r\n const value = item[key];\r\n if (value === null || value === undefined) {\r\n hasNullish = true;\r\n continue;\r\n }\r\n if (typeof value === 'object') {\r\n hasComplex = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasComplex && !hasNullish) {\r\n processed.push(item);\r\n continue;\r\n }\r\n\r\n const processedItem = {};\r\n for (const key in item) {\r\n if (!Object.prototype.hasOwnProperty.call(item, key)) {\r\n continue;\r\n }\r\n const value = item[key];\r\n if (value === null || value === undefined) {\r\n processedItem[key] = '';\r\n } else if (typeof value === 'object') {\r\n processedItem[key] = deepUnwrap(value);\r\n } else {\r\n processedItem[key] = value;\r\n }\r\n }\r\n processed.push(processedItem);\r\n continue;\r\n }\r\n let processedItem = { ...item };\r\n \r\n // Handle flattening if enabled\r\n if (flatten) {\r\n processedItem = flattenObject(item, flattenSeparator, flattenMaxDepth);\r\n }\r\n \r\n // Handle arrays based on arrayHandling option\r\n processedItem = processArrays(processedItem, arrayHandling);\r\n\r\n // Unwrap nested objects into strings\r\n for (const [key, value] of Object.entries(processedItem)) {\r\n if (value && typeof value === 'object') {\r\n processedItem[key] = deepUnwrap(value);\r\n } else if (value === null || value === undefined) {\r\n processedItem[key] = '';\r\n } else {\r\n processedItem[key] = value;\r\n }\r\n }\r\n \r\n processed.push(processedItem);\r\n }\r\n \r\n return processed;\r\n}\r\n\r\n/**\r\n * Flattens a nested object into dot notation\r\n */\r\nfunction flattenObject(\r\n obj,\r\n separator = '.',\r\n maxDepth = 3,\r\n currentDepth = 0,\r\n prefix = ''\r\n) {\r\n if (currentDepth >= maxDepth) {\r\n return { [prefix || 'value']: obj };\r\n }\r\n \r\n const flattened = {};\r\n \r\n for (const [key, value] of Object.entries(obj)) {\r\n const newKey = prefix ? `${prefix}${separator}${key}` : key;\r\n \r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n const nestedFlattened = flattenObject(\r\n value,\r\n separator,\r\n maxDepth,\r\n currentDepth + 1,\r\n newKey\r\n );\r\n Object.assign(flattened, nestedFlattened);\r\n } else {\r\n flattened[newKey] = value;\r\n }\r\n }\r\n \r\n return flattened;\r\n}\r\n\r\n/**\r\n * Processes arrays based on the arrayHandling option\r\n */\r\nfunction processArrays(obj, arrayHandling) {\r\n const processed = { ...obj };\r\n \r\n for (const [key, value] of Object.entries(obj)) {\r\n if (Array.isArray(value)) {\r\n switch (arrayHandling) {\r\n case 'stringify':\r\n processed[key] = JSON.stringify(value);\r\n break;\r\n case 'join':\r\n processed[key] = value.join(', ');\r\n break;\r\n case 'expand':\r\n // For expand, we would create multiple columns\r\n // This is a simplified version\r\n if (value.length > 0 && typeof value[0] === 'object') {\r\n // Complex case - for now, stringify\r\n processed[key] = JSON.stringify(value);\r\n } else {\r\n processed[key] = value.join(', ');\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n \r\n return processed;\r\n}\r\n\r\n/**\r\n * Deeply unwraps nested objects/arrays to primitive values\r\n */\r\nexport function deepUnwrap(\r\n value: any,\r\n depthOrOptions: number | DeepUnwrapOptions = 0,\r\n maxDepthParam: number = 10\r\n) {\r\n let currentDepth = 0;\r\n let maxDepth = 10;\r\n let preserveArrays = false;\r\n\r\n if (depthOrOptions && typeof depthOrOptions === 'object') {\r\n maxDepth = typeof depthOrOptions.maxDepth === 'number' ? depthOrOptions.maxDepth : maxDepth;\r\n preserveArrays = Boolean(depthOrOptions.preserveArrays);\r\n } else {\r\n currentDepth = typeof depthOrOptions === 'number' ? depthOrOptions : 0;\r\n maxDepth = typeof maxDepthParam === 'number' ? maxDepthParam : maxDepth;\r\n }\r\n\r\n return unwrapRecursive(value, currentDepth, maxDepth, preserveArrays, new WeakSet());\r\n}\r\n\r\nfunction unwrapRecursive(\r\n value,\r\n currentDepth,\r\n maxDepth,\r\n preserveArrays,\r\n seen\r\n) {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\r\n return String(value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (seen.has(value)) {\r\n return '[Circular Reference]';\r\n }\r\n if (currentDepth >= maxDepth) {\r\n return '[Too Deep]';\r\n }\r\n if (value.length === 0) {\r\n return '';\r\n }\r\n seen.add(value);\r\n if (preserveArrays) {\r\n try {\r\n return value.map(item => unwrapRecursive(item, currentDepth + 1, maxDepth, preserveArrays, seen));\r\n } finally {\r\n seen.delete(value);\r\n }\r\n }\r\n try {\r\n const parts = value.map(item => unwrapRecursive(item, currentDepth + 1, maxDepth, preserveArrays, seen));\r\n return parts.join(', ');\r\n } finally {\r\n seen.delete(value);\r\n }\r\n }\r\n\r\n if (typeof value === 'object') {\r\n if (currentDepth >= maxDepth) {\r\n return '[Too Deep]';\r\n }\r\n if (Object.keys(value).length === 0) {\r\n return '';\r\n }\r\n if (seen.has(value)) {\r\n return '[Circular Reference]';\r\n }\r\n seen.add(value);\r\n try {\r\n return JSON.stringify(value);\r\n } catch (error) {\r\n const message = error?.message ? String(error.message) : '';\r\n if (message.toLowerCase().includes('circular')) {\r\n return '[Circular Reference]';\r\n }\r\n return '[Unstringifiable Object]';\r\n } finally {\r\n seen.delete(value);\r\n }\r\n }\r\n\r\n return String(value);\r\n}\r\n\r\n/**\r\n * Validates file path for security\r\n */\r\nexport function validateFilePath(filePath: string, options: { allowRelative?: boolean } = {}) {\r\n const { allowRelative = true } = options;\r\n \r\n if (typeof filePath !== 'string' || filePath.trim().length === 0) {\r\n throw new ValidationError('File path must be a non-empty string');\r\n }\r\n \r\n const normalized = filePath.trim();\r\n\r\n // Check for null bytes\r\n if (normalized.includes('\\0')) {\r\n throw new SecurityError('File path contains null byte');\r\n }\r\n \r\n // Check for directory traversal\r\n const traversalPattern = /(^|[\\\\/])\\.\\.([\\\\/]|$)/;\r\n const pathsToCheck = [normalized];\r\n try {\r\n const decodedOnce = decodeURIComponent(normalized);\r\n pathsToCheck.push(decodedOnce);\r\n try {\r\n pathsToCheck.push(decodeURIComponent(decodedOnce));\r\n } catch {\r\n // ignore double decode failures\r\n }\r\n } catch {\r\n // ignore decode failures\r\n }\r\n for (const candidate of pathsToCheck) {\r\n if (candidate.includes('..') || traversalPattern.test(candidate)) {\r\n throw new SecurityError('Directory traversal detected in file path');\r\n }\r\n }\r\n if (!allowRelative && (normalized.startsWith('./') || normalized.startsWith('.\\\\'))) {\r\n throw new SecurityError('Relative file paths are not allowed');\r\n }\r\n\r\n // Block UNC/network paths on Windows to avoid remote access/hangs\r\n if (process.platform === 'win32') {\r\n const normalizedWin = normalized.replace(/\\//g, '\\\\');\r\n if (normalizedWin.startsWith('\\\\\\\\')) {\r\n if (!normalizedWin.toLowerCase().startsWith('\\\\\\\\?\\\\')) {\r\n throw new SecurityError('UNC paths are not allowed');\r\n }\r\n if (normalizedWin.toLowerCase().startsWith('\\\\\\\\?\\\\unc\\\\')) {\r\n throw new SecurityError('UNC paths are not allowed');\r\n }\r\n }\r\n }\r\n\r\n const ext = require('path').extname(normalized);\r\n if (!ext || ext.toLowerCase() !== '.csv') {\r\n throw new ValidationError('File must have .csv extension');\r\n }\r\n \r\n // Check for dangerous patterns (simplified)\r\n const dangerousPatterns = [\r\n /^\\/etc\\/passwd/,\r\n /^\\/etc\\/shadow/,\r\n /^\\/proc\\/self/,\r\n /^\\/dev\\/null/,\r\n /^\\/dev\\/zero/,\r\n /^\\/dev\\/random/,\r\n /^\\/dev\\/urandom/\r\n ];\r\n \r\n for (const pattern of dangerousPatterns) {\r\n if (pattern.test(filePath)) {\r\n throw new SecurityError('File path matches dangerous pattern');\r\n }\r\n }\r\n \r\n return true;\r\n}\r\n\r\n/**\r\n * Converts JSON data to CSV format\r\n */\r\nexport function jsonToCsv(\r\n data: any[],\r\n options: JsonToCsvOptions = {}\r\n) {\r\n return safeExecuteSync(() => {\r\n // Validate input\r\n validateInput(data, options);\r\n \r\n const opts: JsonToCsvOptions = options && typeof options === 'object' ? options : {};\r\n \r\n const {\r\n delimiter = ';',\r\n includeHeaders = true,\r\n renameMap = {},\r\n template = {},\r\n maxRecords,\r\n preventCsvInjection = true,\r\n rfc4180Compliant = true,\r\n normalizeQuotes = true,\r\n schema = null,\r\n flatten = false,\r\n flattenSeparator = '.',\r\n flattenMaxDepth = 3,\r\n arrayHandling = 'stringify',\r\n memoryWarningThreshold = 1000000,\r\n memoryLimit = 5000000\r\n } = opts;\r\n \r\n // Initialize schema validators if schema is provided\r\n let schemaValidators: Record<string, SchemaValidator> | null = null;\r\n if (schema) {\r\n schemaValidators = createSchemaValidators(schema) as Record<string, SchemaValidator>;\r\n }\r\n \r\n // Handle empty data\r\n if (data.length === 0) {\r\n return '';\r\n }\r\n \r\n if (Number.isFinite(memoryLimit) && data.length > memoryLimit) {\r\n throw new LimitError(\r\n `Data size exceeds memory safety limit of ${memoryLimit} records`,\r\n memoryLimit,\r\n data.length\r\n );\r\n }\r\n\r\n // Show warning for large datasets\r\n if (memoryWarningThreshold\r\n && data.length > memoryWarningThreshold\r\n && process.env['NODE_ENV'] !== 'test') {\r\n console.warn(\r\n 'Warning: Large in-memory conversion detected.\\n' +\r\n 'Consider using streaming or batching for big datasets.\\n' +\r\n 'Current size: ' + data.length.toLocaleString() + ' records\\n' +\r\n 'Tip: Increase memoryLimit or set memoryLimit: Infinity to override.'\r\n );\r\n }\r\n \r\n // Apply optional record limit if specified\r\n if (maxRecords && data.length > maxRecords) {\r\n throw new LimitError(\r\n `Data size exceeds maximum limit of ${maxRecords} records`,\r\n maxRecords,\r\n data.length\r\n );\r\n }\r\n \r\n // Preprocess data with flattening options if needed\r\n const processedData = preprocessData(data, {\r\n flatten,\r\n flattenSeparator,\r\n flattenMaxDepth,\r\n arrayHandling\r\n });\r\n\r\n if (schemaValidators && Object.keys(schemaValidators).length > 0) {\r\n for (let i = 0; i < processedData.length; i++) {\r\n const row = processedData[i];\r\n if (!row || typeof row !== 'object') {\r\n continue;\r\n }\r\n for (const [field, validator] of Object.entries(schemaValidators)) {\r\n const typedValidator = validator as SchemaValidator;\r\n const value = row[field];\r\n if (typeof typedValidator.validate === 'function' && !typedValidator.validate(value)) {\r\n throw new ValidationError(`Invalid value for field \"${field}\"`);\r\n }\r\n if (typeof typedValidator.format === 'function') {\r\n row[field] = typedValidator.format(value);\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Get all unique keys from all objects with minimal allocations.\r\n const allKeys = new Set();\r\n const originalKeys = [];\r\n for (let i = 0; i < processedData.length; i++) {\r\n const item = processedData[i];\r\n if (!item || typeof item !== 'object') {\r\n continue;\r\n }\r\n for (const key in item) {\r\n if (Object.prototype.hasOwnProperty.call(item, key) && !allKeys.has(key)) {\r\n allKeys.add(key);\r\n originalKeys.push(key);\r\n }\r\n }\r\n }\r\n \r\n const hasRenameMap = Object.keys(renameMap).length > 0;\r\n const hasTemplate = Object.keys(template).length > 0;\r\n \r\n // Apply rename map to create header names.\r\n let headers = originalKeys;\r\n let reverseRenameMap = null;\r\n if (hasRenameMap) {\r\n headers = new Array(originalKeys.length);\r\n reverseRenameMap = {};\r\n for (let i = 0; i < originalKeys.length; i++) {\r\n const key = originalKeys[i];\r\n const header = renameMap[key] || key;\r\n headers[i] = header;\r\n reverseRenameMap[header] = key;\r\n }\r\n }\r\n \r\n // Apply template ordering if provided.\r\n let finalHeaders = headers;\r\n if (hasTemplate) {\r\n const templateKeys = Object.keys(template);\r\n const templateHeaders = hasRenameMap\r\n ? templateKeys.map(key => renameMap[key] || key)\r\n : templateKeys;\r\n const templateHeaderSet = new Set(templateHeaders);\r\n const extraHeaders = [];\r\n for (let i = 0; i < headers.length; i++) {\r\n const header = headers[i];\r\n if (!templateHeaderSet.has(header)) {\r\n extraHeaders.push(header);\r\n }\r\n }\r\n finalHeaders = templateHeaders.concat(extraHeaders);\r\n }\r\n \r\n const finalKeys = new Array(finalHeaders.length);\r\n if (hasRenameMap && reverseRenameMap) {\r\n for (let i = 0; i < finalHeaders.length; i++) {\r\n const header = finalHeaders[i];\r\n finalKeys[i] = reverseRenameMap[header] || header;\r\n }\r\n } else {\r\n for (let i = 0; i < finalHeaders.length; i++) {\r\n finalKeys[i] = finalHeaders[i];\r\n }\r\n }\r\n\r\n const phoneKeys = new Set(['phone', 'phonenumber', 'phone_number', 'tel', 'telephone']);\r\n\r\n const normalizeQuotesInField = (value: string): string => {\r\n // Не нормализуем кавычки в JSON-строках - это ломает структуру JSON\r\n // Проверяем, выглядит ли значение как JSON\r\n if ((value.startsWith('{') && value.endsWith('}')) ||\r\n (value.startsWith('[') && value.endsWith(']'))) {\r\n return value; // Возвращаем как есть для JSON\r\n }\r\n \r\n let normalized = value.replace(/\"{2,}/g, '\"');\r\n // Убираем правило, которое ломает JSON: не заменяем \",\" на \",\"\r\n // normalized = normalized.replace(/\"\\s*,\\s*\"/g, ',');\r\n normalized = normalized.replace(/\"\\n/g, '\\n').replace(/\\n\"/g, '\\n');\r\n if (normalized.length >= 2 && normalized.startsWith('\"') && normalized.endsWith('\"')) {\r\n normalized = normalized.slice(1, -1);\r\n }\r\n return normalized;\r\n };\r\n\r\n const normalizePhoneValue = (value: string): string => {\r\n const trimmed = value.trim();\r\n if (trimmed === '') {\r\n return trimmed;\r\n }\r\n return trimmed.replace(/[\"'\\\\]/g, '');\r\n };\r\n\r\n const normalizeValueForCsv = (value: any, key?: string) => {\r\n if (!normalizeQuotes || typeof value !== 'string') {\r\n return value;\r\n }\r\n const base = normalizeQuotesInField(value);\r\n if (key && phoneKeys.has(String(key).toLowerCase())) {\r\n return normalizePhoneValue(base);\r\n }\r\n return base;\r\n };\r\n \r\n /**\r\n * Escapes a value for CSV format with CSV injection protection\r\n */\r\n const quoteRegex = /\"/g;\r\n const delimiterCode = delimiter.charCodeAt(0);\r\n const isPotentialFormula = (value) => {\r\n let idx = 0;\r\n while (idx < value.length) {\r\n const code = value.charCodeAt(idx);\r\n if (code === 32 || code === 9 || code === 10 || code === 13 || code === 0xfeff) {\r\n idx++;\r\n continue;\r\n }\r\n break;\r\n }\r\n if (idx < value.length && (value[idx] === '\"' || value[idx] === \"'\")) {\r\n idx++;\r\n while (idx < value.length) {\r\n const code = value.charCodeAt(idx);\r\n if (code === 32 || code === 9) {\r\n idx++;\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n if (idx >= value.length) {\r\n return false;\r\n }\r\n const char = value[idx];\r\n return char === '=' || char === '+' || char === '-' || char === '@';\r\n };\r\n \r\n const escapeValue = (value) => {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n \r\n let stringValue = value;\r\n if (typeof stringValue !== 'string') {\r\n stringValue = String(stringValue);\r\n }\r\n \r\n // CSV Injection protection - escape formulas if enabled\r\n let escapedValue = stringValue;\r\n if (preventCsvInjection) {\r\n if (isPotentialFormula(stringValue)) {\r\n escapedValue = \"'\" + stringValue;\r\n }\r\n // Unicode Bidi override characters\r\n const bidiChars = ['\\u202A', '\\u202B', '\\u202C', '\\u202D', '\\u202E'];\r\n for (const bidi of bidiChars) {\r\n if (stringValue.includes(bidi)) {\r\n escapedValue = escapedValue.replace(new RegExp(bidi, 'g'), '');\r\n }\r\n }\r\n }\r\n \r\n let needsQuoting = false;\r\n let hasQuote = false;\r\n for (let i = 0; i < escapedValue.length; i++) {\r\n const code = escapedValue.charCodeAt(i);\r\n if (code === 34) {\r\n hasQuote = true;\r\n needsQuoting = true;\r\n } else if (code === delimiterCode || code === 10 || code === 13) {\r\n needsQuoting = true;\r\n }\r\n }\r\n \r\n if (needsQuoting) {\r\n const quotedValue = hasQuote ? escapedValue.replace(quoteRegex, '\"\"') : escapedValue;\r\n return `\"${quotedValue}\"`;\r\n }\r\n \r\n return escapedValue;\r\n };\r\n \r\n // Build CSV rows\r\n const rows = [];\r\n \r\n // Add headers row if requested\r\n if (includeHeaders) {\r\n const headerRow = finalHeaders.map(header => escapeValue(header)).join(delimiter);\r\n rows.push(headerRow);\r\n }\r\n \r\n // Process each data row\r\n for (let i = 0; i < processedData.length; i++) {\r\n const item = processedData[i];\r\n const rowValues = [];\r\n \r\n for (let j = 0; j < finalKeys.length; j++) {\r\n const key = finalKeys[j];\r\n const value = item && typeof item === 'object' ? item[key] : undefined;\r\n const normalized = normalizeValueForCsv(value, key);\r\n rowValues.push(escapeValue(normalized));\r\n }\r\n \r\n rows.push(rowValues.join(delimiter));\r\n }\r\n \r\n // Apply RFC 4180 compliance if requested\r\n let csv = rows.join(rfc4180Compliant ? '\\r\\n' : '\\n');\r\n \r\n return csv;\r\n }, 'PARSING_ERROR', { function: 'jsonToCsv' });\r\n}\r\n\r\n/**\r\n * Asynchronous version of jsonToCsv with support for worker threads\r\n */\r\nexport async function jsonToCsvAsync(\r\n data: any[],\r\n options: AsyncJsonToCsvOptions = {}\r\n) {\r\n return safeExecuteAsync(async () => {\r\n // For now, use the synchronous version\r\n // In the future, this will use worker threads for large datasets\r\n const { useWorkers = false, workerCount, chunkSize, onProgress, ...syncOptions } = options;\r\n \r\n // Simple implementation - just call the synchronous version\r\n // TODO: Implement worker thread support for large datasets\r\n return jsonToCsv(data, syncOptions);\r\n }, 'PARSING_ERROR', { function: 'jsonToCsvAsync' });\r\n}\r\n\r\n/**\r\n * Saves JSON data as CSV file\r\n */\r\nexport async function saveAsCsv(\r\n data: any[],\r\n filePath: string,\r\n options: SaveAsCsvOptions = {}\r\n) {\r\n return safeExecuteAsync(async () => {\r\n const { validatePath = true, ...csvOptions } = options;\r\n \r\n if (validatePath) {\r\n validateFilePath(filePath);\r\n }\r\n\r\n const path = require('path');\r\n const fs = require('fs');\r\n const resolvedPath = path.resolve(filePath);\r\n const dir = path.dirname(resolvedPath);\r\n \r\n try {\r\n await fs.promises.mkdir(dir, { recursive: true });\r\n const csv = jsonToCsv(data, csvOptions);\r\n await fs.promises.writeFile(resolvedPath, csv, 'utf8');\r\n } catch (error) {\r\n if (error instanceof JtcsvError) {\r\n throw error;\r\n }\r\n throw new FileSystemError(error.message || 'File system error', error);\r\n }\r\n }, 'FILE_SYSTEM_ERROR', { function: 'saveAsCsv' });\r\n}\r\n\r\n/**\r\n * Asynchronous version of saveAsCsv\r\n */\r\nexport async function saveAsCsvAsync(\r\n data: any[],\r\n filePath: string,\r\n options: SaveAsCsvOptions = {}\r\n) {\r\n return saveAsCsv(data, filePath, options);\r\n}\r\n\r\n// Default export\r\nexport default {\r\n jsonToCsv,\r\n jsonToCsvAsync,\r\n preprocessData,\r\n deepUnwrap,\r\n validateFilePath,\r\n saveAsCsv,\r\n saveAsCsvAsync\r\n};\r\n"]}
|