jtcsv 3.1.0 → 3.1.1

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.
@@ -1 +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"]}
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 const 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"]}
@@ -1,5 +1,16 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var JtcsvModule_1;
2
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.JtcsvModule = exports.JsonToCsvPipe = exports.ParseCsvPipe = exports.JtcsvService = void 0;
3
14
  exports.createCsvParserInterceptor = createCsvParserInterceptor;
4
15
  exports.createCsvDownloadInterceptor = createCsvDownloadInterceptor;
5
16
  exports.CsvParserInterceptor = CsvParserInterceptor;
@@ -8,7 +19,62 @@ exports.createAsyncCsvParserInterceptor = createAsyncCsvParserInterceptor;
8
19
  exports.createAsyncCsvDownloadInterceptor = createAsyncCsvDownloadInterceptor;
9
20
  exports.AsyncCsvParserInterceptor = AsyncCsvParserInterceptor;
10
21
  exports.AsyncCsvDownloadDecorator = AsyncCsvDownloadDecorator;
11
- const index_core_1 = require("../../index-core");
22
+ const common_1 = require("@nestjs/common");
23
+ const operators_1 = require("rxjs/operators");
24
+ const jtcsv_1 = require("jtcsv");
25
+ let JtcsvService = class JtcsvService {
26
+ csvToJson(csv, options) {
27
+ return (0, jtcsv_1.csvToJson)(csv, options);
28
+ }
29
+ jsonToCsv(json, options) {
30
+ return (0, jtcsv_1.jsonToCsv)(json, options);
31
+ }
32
+ async csvToJsonAsync(csv, options) {
33
+ return (0, jtcsv_1.csvToJsonAsync)(csv, options);
34
+ }
35
+ async jsonToCsvAsync(json, options) {
36
+ return (0, jtcsv_1.jsonToCsvAsync)(json, options);
37
+ }
38
+ };
39
+ exports.JtcsvService = JtcsvService;
40
+ exports.JtcsvService = JtcsvService = __decorate([
41
+ (0, common_1.Injectable)()
42
+ ], JtcsvService);
43
+ let ParseCsvPipe = class ParseCsvPipe {
44
+ constructor(options) {
45
+ this.options = options;
46
+ }
47
+ transform(value) {
48
+ if (typeof value === 'string') {
49
+ return (0, jtcsv_1.csvToJson)(value, this.options);
50
+ }
51
+ if (Buffer.isBuffer(value)) {
52
+ return (0, jtcsv_1.csvToJson)(value.toString('utf8'), this.options);
53
+ }
54
+ return value;
55
+ }
56
+ };
57
+ exports.ParseCsvPipe = ParseCsvPipe;
58
+ exports.ParseCsvPipe = ParseCsvPipe = __decorate([
59
+ (0, common_1.Injectable)(),
60
+ __metadata("design:paramtypes", [Object])
61
+ ], ParseCsvPipe);
62
+ let JsonToCsvPipe = class JsonToCsvPipe {
63
+ constructor(options) {
64
+ this.options = options;
65
+ }
66
+ transform(value) {
67
+ if (Array.isArray(value)) {
68
+ return (0, jtcsv_1.jsonToCsv)(value, this.options);
69
+ }
70
+ return value;
71
+ }
72
+ };
73
+ exports.JsonToCsvPipe = JsonToCsvPipe;
74
+ exports.JsonToCsvPipe = JsonToCsvPipe = __decorate([
75
+ (0, common_1.Injectable)(),
76
+ __metadata("design:paramtypes", [Object])
77
+ ], JsonToCsvPipe);
12
78
  function normalizeFilename(filename) {
13
79
  if (!filename || typeof filename !== 'string') {
14
80
  return 'export.csv';
@@ -22,7 +88,7 @@ function createCsvParserInterceptor(options = {}) {
22
88
  const body = req && req.body;
23
89
  if (typeof body === 'string' || Buffer.isBuffer(body)) {
24
90
  const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;
25
- req.body = await (0, index_core_1.csvToJson)(csv, options);
91
+ req.body = await (0, jtcsv_1.csvToJsonAsync)(csv, options);
26
92
  }
27
93
  return next.handle();
28
94
  }
@@ -36,9 +102,9 @@ function createCsvDownloadInterceptor(options = {}) {
36
102
  const filename = normalizeFilename(options.filename);
37
103
  const csvOptions = { ...options };
38
104
  delete csvOptions.filename;
39
- return next.handle().pipe((async (data) => {
105
+ return next.handle().pipe((0, operators_1.switchMap)(async (data) => {
40
106
  const rows = Array.isArray(data) ? data : [data];
41
- const csv = await (0, index_core_1.jsonToCsv)(rows, csvOptions);
107
+ const csv = await (0, jtcsv_1.jsonToCsvAsync)(rows, csvOptions);
42
108
  if (res && typeof res.setHeader === 'function') {
43
109
  res.setHeader('Content-Type', 'text/csv; charset=utf-8');
44
110
  res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
@@ -64,7 +130,7 @@ function createAsyncCsvParserInterceptor(options = {}) {
64
130
  const body = req && req.body;
65
131
  if (typeof body === 'string' || Buffer.isBuffer(body)) {
66
132
  const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;
67
- req.body = await (0, index_core_1.csvToJson)(csv, options);
133
+ req.body = await (0, jtcsv_1.csvToJsonAsync)(csv, options);
68
134
  }
69
135
  return next.handle();
70
136
  }
@@ -78,9 +144,9 @@ function createAsyncCsvDownloadInterceptor(options = {}) {
78
144
  const filename = normalizeFilename(options.filename);
79
145
  const csvOptions = { ...options };
80
146
  delete csvOptions.filename;
81
- return next.handle().pipe((async (data) => {
147
+ return next.handle().pipe((0, operators_1.switchMap)(async (data) => {
82
148
  const rows = Array.isArray(data) ? data : [data];
83
- const csv = await (0, index_core_1.jsonToCsv)(rows, csvOptions);
149
+ const csv = await (0, jtcsv_1.jsonToCsvAsync)(rows, csvOptions);
84
150
  if (res && typeof res.setHeader === 'function') {
85
151
  res.setHeader('Content-Type', 'text/csv; charset=utf-8');
86
152
  res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
@@ -99,14 +165,28 @@ function AsyncCsvDownloadDecorator(options = {}) {
99
165
  const Interceptor = createAsyncCsvDownloadInterceptor(options);
100
166
  return Interceptor;
101
167
  }
102
- exports.default = {
103
- CsvParserInterceptor,
104
- CsvDownloadDecorator,
105
- createCsvParserInterceptor,
106
- createCsvDownloadInterceptor,
107
- AsyncCsvParserInterceptor,
108
- AsyncCsvDownloadDecorator,
109
- createAsyncCsvParserInterceptor,
110
- createAsyncCsvDownloadInterceptor,
168
+ let JtcsvModule = JtcsvModule_1 = class JtcsvModule {
169
+ static forRoot() {
170
+ return {
171
+ module: JtcsvModule_1,
172
+ providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],
173
+ exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]
174
+ };
175
+ }
176
+ static forChild() {
177
+ return {
178
+ module: JtcsvModule_1,
179
+ providers: [JtcsvService],
180
+ exports: [JtcsvService]
181
+ };
182
+ }
111
183
  };
184
+ exports.JtcsvModule = JtcsvModule;
185
+ exports.JtcsvModule = JtcsvModule = JtcsvModule_1 = __decorate([
186
+ (0, common_1.Module)({
187
+ providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],
188
+ exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]
189
+ })
190
+ ], JtcsvModule);
191
+ exports.default = JtcsvModule;
112
192
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/nestjs/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * NestJS plugin for jtcsv\r\n * Provides interceptors and decorators for CSV parsing and downloading in NestJS applications\r\n * @module plugins/nestjs\r\n */\r\n\r\n// Note: NestJS and RxJS types are optional - users need to install @nestjs/common and rxjs\r\n// We use conditional imports to avoid breaking the build\r\ntype Injectable = any;\r\ntype UseInterceptors = any;\r\ntype ExecutionContext = any;\r\ntype CallHandler = any;\r\ntype NestInterceptor = any;\r\ntype Observable<T> = any;\r\n\r\nimport { csvToJson, jsonToCsv } from '../../index-core';\r\nimport type { CsvToJsonOptions, JsonToCsvOptions } from '../../src/types';\r\n\r\n/**\r\n * Options for CSV parser interceptor\r\n */\r\nexport interface CsvParserOptions extends CsvToJsonOptions {\r\n // Additional options specific to CSV parsing\r\n}\r\n\r\n/**\r\n * Options for CSV download interceptor\r\n */\r\nexport interface CsvDownloadOptions extends JsonToCsvOptions {\r\n /** Filename for the downloaded CSV file */\r\n filename?: string;\r\n}\r\n\r\n/**\r\n * Normalize filename for CSV download\r\n */\r\nfunction normalizeFilename(filename?: string): string {\r\n if (!filename || typeof filename !== 'string') {\r\n return 'export.csv';\r\n }\r\n return filename.includes('.') ? filename : `${filename}.csv`;\r\n}\r\n\r\n/**\r\n * Creates a CSV parser interceptor for NestJS\r\n * Parses incoming CSV request bodies into JSON\r\n */\r\nexport function createCsvParserInterceptor(options: CsvParserOptions = {}): any {\r\n class CsvParserInterceptorImpl {\r\n async intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>> {\r\n const req = context.switchToHttp().getRequest();\r\n const body = req && req.body;\r\n\r\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\r\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\r\n req.body = await csvToJson(csv, options);\r\n }\r\n\r\n return next.handle();\r\n }\r\n }\r\n\r\n return CsvParserInterceptorImpl;\r\n}\r\n\r\n/**\r\n * Creates a CSV download interceptor for NestJS\r\n * Converts JSON responses to CSV and sets appropriate headers\r\n */\r\nexport function createCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\r\n class CsvDownloadInterceptorImpl {\r\n intercept(context: ExecutionContext, next: CallHandler): Observable<any> {\r\n const res = context.switchToHttp().getResponse();\r\n const filename = normalizeFilename(options.filename);\r\n const csvOptions = { ...options } as JsonToCsvOptions;\r\n delete (csvOptions as any).filename;\r\n\r\n return next.handle().pipe(\r\n (async (data: any) => {\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = await jsonToCsv(rows, csvOptions);\r\n\r\n if (res && typeof res.setHeader === 'function') {\r\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\r\n res.setHeader(\r\n 'Content-Disposition',\r\n `attachment; filename=\"${filename}\"`\r\n );\r\n }\r\n\r\n return csv;\r\n }) as any\r\n );\r\n }\r\n }\r\n\r\n return CsvDownloadInterceptorImpl;\r\n}\r\n\r\n/**\r\n * Decorator for CSV parsing interceptor\r\n * Usage: @CsvParserInterceptor({ delimiter: ',' })\r\n */\r\nexport function CsvParserInterceptor(options: CsvParserOptions = {}): any {\r\n const Interceptor = createCsvParserInterceptor(options);\r\n return Interceptor;\r\n}\r\n\r\n/**\r\n * Decorator for CSV download interceptor\r\n * Usage: @CsvDownloadDecorator({ filename: 'data.csv' })\r\n */\r\nexport function CsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\r\n const Interceptor = createCsvDownloadInterceptor(options);\r\n return Interceptor;\r\n}\r\n\r\n/**\r\n * Async version of CSV parser interceptor\r\n * Uses async/await for better performance with large files\r\n */\r\nexport function createAsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\r\n class AsyncCsvParserInterceptorImpl {\r\n async intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>> {\r\n const req = context.switchToHttp().getRequest();\r\n const body = req && req.body;\r\n\r\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\r\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\r\n req.body = await csvToJson(csv, options);\r\n }\r\n\r\n return next.handle();\r\n }\r\n }\r\n\r\n return AsyncCsvParserInterceptorImpl;\r\n}\r\n\r\n/**\r\n * Async version of CSV download interceptor\r\n * Uses async/await for better performance with large files\r\n */\r\nexport function createAsyncCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\r\n class AsyncCsvDownloadInterceptorImpl {\r\n async intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>> {\r\n const res = context.switchToHttp().getResponse();\r\n const filename = normalizeFilename(options.filename);\r\n const csvOptions = { ...options } as JsonToCsvOptions;\r\n delete (csvOptions as any).filename;\r\n\r\n return next.handle().pipe(\r\n (async (data: any) => {\r\n const rows = Array.isArray(data) ? data : [data];\r\n const csv = await jsonToCsv(rows, csvOptions);\r\n\r\n if (res && typeof res.setHeader === 'function') {\r\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\r\n res.setHeader(\r\n 'Content-Disposition',\r\n `attachment; filename=\"${filename}\"`\r\n );\r\n }\r\n\r\n return csv;\r\n }) as any\r\n );\r\n }\r\n }\r\n\r\n return AsyncCsvDownloadInterceptorImpl;\r\n}\r\n\r\n/**\r\n * Async decorator for CSV parsing interceptor\r\n * Usage: @AsyncCsvParserInterceptor({ delimiter: ',' })\r\n */\r\nexport function AsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\r\n const Interceptor = createAsyncCsvParserInterceptor(options);\r\n return Interceptor;\r\n}\r\n\r\n/**\r\n * Async decorator for CSV download interceptor\r\n * Usage: @AsyncCsvDownloadDecorator({ filename: 'data.csv' })\r\n */\r\nexport function AsyncCsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\r\n const Interceptor = createAsyncCsvDownloadInterceptor(options);\r\n return Interceptor;\r\n}\r\n\r\nexport default {\r\n CsvParserInterceptor,\r\n CsvDownloadDecorator,\r\n createCsvParserInterceptor,\r\n createCsvDownloadInterceptor,\r\n AsyncCsvParserInterceptor,\r\n AsyncCsvDownloadDecorator,\r\n createAsyncCsvParserInterceptor,\r\n createAsyncCsvDownloadInterceptor,\r\n};"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../plugins/nestjs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAuIA,gEAgBC;AAMD,oEA4BC;AAMD,oDAGC;AAMD,oDAGC;AAMD,0EAgBC;AAMD,8EA4BC;AAMD,8DAGC;AAMD,8DAGC;AA/QD,2CAQwB;AACxB,8CAA2C;AAC3C,iCAOe;AAqBR,IAAM,YAAY,GAAlB,MAAM,YAAY;IAOvB,SAAS,CAAC,GAAW,EAAE,OAA0B;QAC/C,OAAO,IAAA,iBAAS,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAQD,SAAS,CAAC,IAAW,EAAE,OAA0B;QAC/C,OAAO,IAAA,iBAAS,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAQD,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,OAA0B;QAC1D,OAAO,IAAA,sBAAc,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAQD,KAAK,CAAC,cAAc,CAAC,IAAW,EAAE,OAA0B;QAC1D,OAAO,IAAA,sBAAc,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AAxCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAwCxB;AAOM,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,YAAoB,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAElD,SAAS,CAAC,KAAU;QAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAA,iBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAA,iBAAS,EAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAZY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;;GACA,YAAY,CAYxB;AAOM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAAoB,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAElD,SAAS,CAAC,KAAU;QAClB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAA,iBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AATY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CASzB;AAKD,SAAS,iBAAiB,CAAC,QAAiB;IAC1C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;AAC/D,CAAC;AAMD,SAAgB,0BAA0B,CAAC,UAA4B,EAAE;IACvE,MAAM,wBAAwB;QAC5B,KAAK,CAAC,SAAS,CAAC,OAAY,EAAE,IAAS;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAE7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,GAAG,CAAC,IAAI,GAAG,MAAM,IAAA,sBAAc,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;YAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;KACF;IAED,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAMD,SAAgB,4BAA4B,CAAC,UAA8B,EAAE;IAC3E,MAAM,0BAA0B;QAC9B,SAAS,CAAC,OAAY,EAAE,IAAS;YAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAsB,CAAC;YACtD,OAAQ,UAAkB,CAAC,QAAQ,CAAC;YAEpC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,qBAAS,EAAC,KAAK,EAAE,IAAS,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAEnD,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC/C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;oBACzD,GAAG,CAAC,SAAS,CACX,qBAAqB,EACrB,yBAAyB,QAAQ,GAAG,CACrC,CAAC;gBACJ,CAAC;gBAED,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;KACF;IAED,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAMD,SAAgB,oBAAoB,CAAC,UAA4B,EAAE;IACjE,MAAM,WAAW,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,WAAW,CAAC;AACrB,CAAC;AAMD,SAAgB,oBAAoB,CAAC,UAA8B,EAAE;IACnE,MAAM,WAAW,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAC1D,OAAO,WAAW,CAAC;AACrB,CAAC;AAMD,SAAgB,+BAA+B,CAAC,UAA4B,EAAE;IAC5E,MAAM,6BAA6B;QACjC,KAAK,CAAC,SAAS,CAAC,OAAY,EAAE,IAAS;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAE7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjE,GAAG,CAAC,IAAI,GAAG,MAAM,IAAA,sBAAc,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;YAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;KACF;IAED,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAMD,SAAgB,iCAAiC,CAAC,UAA8B,EAAE;IAChF,MAAM,+BAA+B;QACnC,KAAK,CAAC,SAAS,CAAC,OAAY,EAAE,IAAS;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAsB,CAAC;YACtD,OAAQ,UAAkB,CAAC,QAAQ,CAAC;YAEpC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,qBAAS,EAAC,KAAK,EAAE,IAAS,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAEnD,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC/C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;oBACzD,GAAG,CAAC,SAAS,CACX,qBAAqB,EACrB,yBAAyB,QAAQ,GAAG,CACrC,CAAC;gBACJ,CAAC;gBAED,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;KACF;IAED,OAAO,+BAA+B,CAAC;AACzC,CAAC;AAMD,SAAgB,yBAAyB,CAAC,UAA4B,EAAE;IACtE,MAAM,WAAW,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC;AACrB,CAAC;AAMD,SAAgB,yBAAyB,CAAC,UAA8B,EAAE;IACxE,MAAM,WAAW,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,WAAW,CAAC;AACrB,CAAC;AASM,IAAM,WAAW,mBAAjB,MAAM,WAAW;IACtB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;YACtD,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE,CAAC,YAAY,CAAC;YACzB,OAAO,EAAE,CAAC,YAAY,CAAC;SACxB,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,kCAAW;sBAAX,WAAW;IAJvB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;QACtD,OAAO,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,aAAa,CAAC;KACrD,CAAC;GACW,WAAW,CAgBvB;AAKD,kBAAe,WAAW,CAAC","sourcesContent":["/**\n * NestJS plugin for jtcsv\n * Provides service, pipes, module, and interceptors for CSV parsing and downloading in NestJS applications\n * @module plugins/nestjs\n */\n\nimport {\n Injectable,\n PipeTransform,\n Pipe,\n Module,\n NestInterceptor,\n Inject,\n DynamicModule\n} from '@nestjs/common';\nimport { switchMap } from 'rxjs/operators';\nimport { \n csvToJson, \n jsonToCsv, \n csvToJsonAsync, \n jsonToCsvAsync,\n type CsvToJsonOptions, \n type JsonToCsvOptions \n} from 'jtcsv';\n\n/**\n * Options for CSV parser interceptor\n */\nexport interface CsvParserOptions extends CsvToJsonOptions {\n // Additional options specific to CSV parsing\n}\n\n/**\n * Options for CSV download interceptor\n */\nexport interface CsvDownloadOptions extends JsonToCsvOptions {\n /** Filename for the downloaded CSV file */\n filename?: string;\n}\n\n/**\n * NestJS Service for CSV/JSON conversion\n */\n@Injectable()\nexport class JtcsvService {\n /**\n * Convert CSV string to JSON array\n * @param csv - CSV string\n * @param options - Conversion options\n * @returns JSON array\n */\n csvToJson(csv: string, options?: CsvToJsonOptions): any[] {\n return csvToJson(csv, options);\n }\n\n /**\n * Convert JSON array to CSV string\n * @param json - JSON array\n * @param options - Conversion options\n * @returns CSV string\n */\n jsonToCsv(json: any[], options?: JsonToCsvOptions): string {\n return jsonToCsv(json, options);\n }\n\n /**\n * Async CSV to JSON conversion\n * @param csv - CSV string\n * @param options - Conversion options\n * @returns Promise resolving to JSON array\n */\n async csvToJsonAsync(csv: string, options?: CsvToJsonOptions): Promise<any[]> {\n return csvToJsonAsync(csv, options);\n }\n\n /**\n * Async JSON to CSV conversion\n * @param json - JSON array\n * @param options - Conversion options\n * @returns Promise resolving to CSV string\n */\n async jsonToCsvAsync(json: any[], options?: JsonToCsvOptions): Promise<string> {\n return jsonToCsvAsync(json, options);\n }\n}\n\n/**\n * NestJS Pipe for CSV parsing\n * Usage: @UsePipes(new ParseCsvPipe(options))\n */\n@Injectable()\nexport class ParseCsvPipe implements PipeTransform {\n constructor(private options?: CsvToJsonOptions) {}\n\n transform(value: any): any[] {\n if (typeof value === 'string') {\n return csvToJson(value, this.options);\n }\n if (Buffer.isBuffer(value)) {\n return csvToJson(value.toString('utf8'), this.options);\n }\n return value;\n }\n}\n\n/**\n * NestJS Pipe for JSON to CSV\n * Usage: @UsePipes(new JsonToCsvPipe(options))\n */\n@Injectable()\nexport class JsonToCsvPipe implements PipeTransform {\n constructor(private options?: JsonToCsvOptions) {}\n\n transform(value: any): string {\n if (Array.isArray(value)) {\n return jsonToCsv(value, this.options);\n }\n return value;\n }\n}\n\n/**\n * Normalize filename for CSV download\n */\nfunction normalizeFilename(filename?: string): string {\n if (!filename || typeof filename !== 'string') {\n return 'export.csv';\n }\n return filename.includes('.') ? filename : `${filename}.csv`;\n}\n\n/**\n * Creates a CSV parser interceptor for NestJS\n * Parses incoming CSV request bodies into JSON\n */\nexport function createCsvParserInterceptor(options: CsvParserOptions = {}): any {\n class CsvParserInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const req = context.switchToHttp().getRequest();\n const body = req && req.body;\n\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\n req.body = await csvToJsonAsync(csv, options);\n }\n\n return next.handle();\n }\n }\n\n return CsvParserInterceptorImpl;\n}\n\n/**\n * Creates a CSV download interceptor for NestJS\n * Converts JSON responses to CSV and sets appropriate headers\n */\nexport function createCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\n class CsvDownloadInterceptorImpl {\n intercept(context: any, next: any): any {\n const res = context.switchToHttp().getResponse();\n const filename = normalizeFilename(options.filename);\n const csvOptions = { ...options } as JsonToCsvOptions;\n delete (csvOptions as any).filename;\n\n return next.handle().pipe(\n switchMap(async (data: any) => {\n const rows = Array.isArray(data) ? data : [data];\n const csv = await jsonToCsvAsync(rows, csvOptions);\n\n if (res && typeof res.setHeader === 'function') {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\n res.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n }\n\n return csv;\n })\n );\n }\n }\n\n return CsvDownloadInterceptorImpl;\n}\n\n/**\n * Decorator for CSV parsing interceptor\n * Usage: @CsvParserInterceptor({ delimiter: ',' })\n */\nexport function CsvParserInterceptor(options: CsvParserOptions = {}): any {\n const Interceptor = createCsvParserInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Decorator for CSV download interceptor\n * Usage: @CsvDownloadDecorator({ filename: 'data.csv' })\n */\nexport function CsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\n const Interceptor = createCsvDownloadInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Async version of CSV parser interceptor\n * Uses async/await for better performance with large files\n */\nexport function createAsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\n class AsyncCsvParserInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const req = context.switchToHttp().getRequest();\n const body = req && req.body;\n\n if (typeof body === 'string' || Buffer.isBuffer(body)) {\n const csv = Buffer.isBuffer(body) ? body.toString('utf8') : body;\n req.body = await csvToJsonAsync(csv, options);\n }\n\n return next.handle();\n }\n }\n\n return AsyncCsvParserInterceptorImpl;\n}\n\n/**\n * Async version of CSV download interceptor\n * Uses async/await for better performance with large files\n */\nexport function createAsyncCsvDownloadInterceptor(options: CsvDownloadOptions = {}): any {\n class AsyncCsvDownloadInterceptorImpl {\n async intercept(context: any, next: any): Promise<any> {\n const res = context.switchToHttp().getResponse();\n const filename = normalizeFilename(options.filename);\n const csvOptions = { ...options } as JsonToCsvOptions;\n delete (csvOptions as any).filename;\n\n return next.handle().pipe(\n switchMap(async (data: any) => {\n const rows = Array.isArray(data) ? data : [data];\n const csv = await jsonToCsvAsync(rows, csvOptions);\n\n if (res && typeof res.setHeader === 'function') {\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\n res.setHeader(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n }\n\n return csv;\n })\n );\n }\n }\n\n return AsyncCsvDownloadInterceptorImpl;\n}\n\n/**\n * Async decorator for CSV parsing interceptor\n * Usage: @AsyncCsvParserInterceptor({ delimiter: ',' })\n */\nexport function AsyncCsvParserInterceptor(options: CsvParserOptions = {}): any {\n const Interceptor = createAsyncCsvParserInterceptor(options);\n return Interceptor;\n}\n\n/**\n * Async decorator for CSV download interceptor\n * Usage: @AsyncCsvDownloadDecorator({ filename: 'data.csv' })\n */\nexport function AsyncCsvDownloadDecorator(options: CsvDownloadOptions = {}): any {\n const Interceptor = createAsyncCsvDownloadInterceptor(options);\n return Interceptor;\n}\n\n/**\n * NestJS Module\n */\n@Module({\n providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],\n exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]\n})\nexport class JtcsvModule {\n static forRoot(): DynamicModule {\n return {\n module: JtcsvModule,\n providers: [JtcsvService, ParseCsvPipe, JsonToCsvPipe],\n exports: [JtcsvService, ParseCsvPipe, JsonToCsvPipe]\n };\n }\n\n static forChild(): DynamicModule {\n return {\n module: JtcsvModule,\n providers: [JtcsvService],\n exports: [JtcsvService]\n };\n }\n}\n\n// Export types\nexport type { CsvToJsonOptions, JsonToCsvOptions };\n\nexport default JtcsvModule;\n"]}
@@ -597,7 +597,6 @@ function autoDetectDelimiterFromLine(line, candidates) {
597
597
  }
598
598
  const fields = line.split(delimiter);
599
599
  let hasQuotes = false;
600
- let consistent = true;
601
600
  for (const field of fields) {
602
601
  if (field.includes('"') || field.includes("'")) {
603
602
  hasQuotes = true;