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
package/json-save.js
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON Save Module - Node.js Module
|
|
3
|
-
*
|
|
4
|
-
* A lightweight module for saving JSON data to files with security validation.
|
|
5
|
-
*
|
|
6
|
-
* @module json-save
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const {
|
|
10
|
-
ValidationError,
|
|
11
|
-
SecurityError,
|
|
12
|
-
FileSystemError,
|
|
13
|
-
LimitError,
|
|
14
|
-
ConfigurationError,
|
|
15
|
-
safeExecute
|
|
16
|
-
} = require('./errors');
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Validates file path for JSON saving
|
|
20
|
-
* @private
|
|
21
|
-
*/
|
|
22
|
-
function validateJsonFilePath(filePath) {
|
|
23
|
-
const path = require('path');
|
|
24
|
-
|
|
25
|
-
// Basic validation
|
|
26
|
-
if (typeof filePath !== 'string' || filePath.trim() === '') {
|
|
27
|
-
throw new ValidationError('File path must be a non-empty string');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Ensure file has .json extension
|
|
31
|
-
if (!filePath.toLowerCase().endsWith('.json')) {
|
|
32
|
-
throw new ValidationError('File must have .json extension');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Block UNC paths BEFORE path.resolve() to avoid network lookup timeouts
|
|
36
|
-
if (filePath.startsWith('\\\\') || filePath.startsWith('//')) {
|
|
37
|
-
throw new SecurityError('UNC paths are not allowed');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Get absolute path and check for traversal
|
|
41
|
-
const absolutePath = path.resolve(filePath);
|
|
42
|
-
const normalizedPath = path.normalize(filePath);
|
|
43
|
-
|
|
44
|
-
// Prevent directory traversal attacks
|
|
45
|
-
if (normalizedPath.includes('..') ||
|
|
46
|
-
/\\\.\.\\|\/\.\.\//.test(filePath) ||
|
|
47
|
-
filePath.startsWith('..') ||
|
|
48
|
-
filePath.includes('/..')) {
|
|
49
|
-
throw new SecurityError('Directory traversal detected in file path');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return absolutePath;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Validates JSON data and options
|
|
57
|
-
* @private
|
|
58
|
-
*/
|
|
59
|
-
function validateJsonData(data, options) {
|
|
60
|
-
// Validate data
|
|
61
|
-
if (data === undefined || data === null) {
|
|
62
|
-
throw new ValidationError('Data cannot be null or undefined');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Validate options
|
|
66
|
-
if (options && typeof options !== 'object') {
|
|
67
|
-
throw new ConfigurationError('Options must be an object');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Validate prettyPrint
|
|
71
|
-
if (options?.prettyPrint !== undefined && typeof options.prettyPrint !== 'boolean') {
|
|
72
|
-
throw new ConfigurationError('prettyPrint must be a boolean');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Validate maxSize
|
|
76
|
-
if (options?.maxSize && (typeof options.maxSize !== 'number' || options.maxSize <= 0)) {
|
|
77
|
-
throw new ConfigurationError('maxSize must be a positive number');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Saves JSON data to a file
|
|
85
|
-
*
|
|
86
|
-
* @param {*} data - Data to save as JSON
|
|
87
|
-
* @param {string} filePath - Path to save the JSON file
|
|
88
|
-
* @param {Object} [options] - Configuration options
|
|
89
|
-
* @param {boolean} [options.prettyPrint=false] - Format JSON with indentation
|
|
90
|
-
* @param {number} [options.maxSize=10485760] - Maximum file size in bytes (default: 10MB)
|
|
91
|
-
* @returns {Promise<void>}
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* const { saveAsJson } = require('./json-save');
|
|
95
|
-
*
|
|
96
|
-
* const data = [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }];
|
|
97
|
-
* await saveAsJson(data, './output.json', { prettyPrint: true });
|
|
98
|
-
*/
|
|
99
|
-
async function saveAsJson(data, filePath, options = {}) {
|
|
100
|
-
return safeExecute(async () => {
|
|
101
|
-
const fs = require('fs').promises;
|
|
102
|
-
|
|
103
|
-
// Validate file path
|
|
104
|
-
const safePath = validateJsonFilePath(filePath);
|
|
105
|
-
|
|
106
|
-
// Validate data and options
|
|
107
|
-
validateJsonData(data, options);
|
|
108
|
-
|
|
109
|
-
const opts = options && typeof options === 'object' ? options : {};
|
|
110
|
-
const {
|
|
111
|
-
prettyPrint = false,
|
|
112
|
-
maxSize = 10485760 // 10MB default limit
|
|
113
|
-
} = opts;
|
|
114
|
-
|
|
115
|
-
// Convert data to JSON string
|
|
116
|
-
let jsonString;
|
|
117
|
-
try {
|
|
118
|
-
if (prettyPrint) {
|
|
119
|
-
jsonString = JSON.stringify(data, null, 2);
|
|
120
|
-
} else {
|
|
121
|
-
jsonString = JSON.stringify(data);
|
|
122
|
-
}
|
|
123
|
-
} catch (error) {
|
|
124
|
-
if (error.message.includes('circular') || error.message.includes('Converting circular')) {
|
|
125
|
-
throw new ValidationError('Data contains circular references');
|
|
126
|
-
}
|
|
127
|
-
throw new ValidationError(`Failed to stringify JSON: ${error.message}`);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Check size limit
|
|
131
|
-
const byteSize = Buffer.byteLength(jsonString, 'utf8');
|
|
132
|
-
if (byteSize > maxSize) {
|
|
133
|
-
throw new LimitError(
|
|
134
|
-
`JSON size exceeds maximum limit of ${maxSize} bytes`,
|
|
135
|
-
maxSize,
|
|
136
|
-
byteSize
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Ensure directory exists
|
|
141
|
-
const dir = require('path').dirname(safePath);
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
await fs.mkdir(dir, { recursive: true });
|
|
145
|
-
|
|
146
|
-
// Write file
|
|
147
|
-
await fs.writeFile(safePath, jsonString, 'utf8');
|
|
148
|
-
|
|
149
|
-
return safePath;
|
|
150
|
-
} catch (error) {
|
|
151
|
-
if (error.code === 'ENOENT') {
|
|
152
|
-
throw new FileSystemError(`Directory does not exist: ${dir}`, error);
|
|
153
|
-
}
|
|
154
|
-
if (error.code === 'EACCES') {
|
|
155
|
-
throw new FileSystemError(`Permission denied: ${safePath}`, error);
|
|
156
|
-
}
|
|
157
|
-
if (error.code === 'ENOSPC') {
|
|
158
|
-
throw new FileSystemError(`No space left on device: ${safePath}`, error);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
throw new FileSystemError(`Failed to write JSON file: ${error.message}`, error);
|
|
162
|
-
}
|
|
163
|
-
}, 'FILE_SYSTEM_ERROR', { function: 'saveAsJson' });
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Synchronously saves JSON data to a file
|
|
168
|
-
*
|
|
169
|
-
* @param {*} data - Data to save as JSON
|
|
170
|
-
* @param {string} filePath - Path to save the JSON file
|
|
171
|
-
* @param {Object} [options] - Configuration options (same as saveAsJson)
|
|
172
|
-
* @returns {string} Path to saved file
|
|
173
|
-
*/
|
|
174
|
-
function saveAsJsonSync(data, filePath, options = {}) {
|
|
175
|
-
return safeExecute(() => {
|
|
176
|
-
const fs = require('fs');
|
|
177
|
-
|
|
178
|
-
// Validate file path
|
|
179
|
-
const safePath = validateJsonFilePath(filePath);
|
|
180
|
-
|
|
181
|
-
// Validate data and options
|
|
182
|
-
validateJsonData(data, options);
|
|
183
|
-
|
|
184
|
-
const opts = options && typeof options === 'object' ? options : {};
|
|
185
|
-
const {
|
|
186
|
-
prettyPrint = false,
|
|
187
|
-
maxSize = 10485760 // 10MB default limit
|
|
188
|
-
} = opts;
|
|
189
|
-
|
|
190
|
-
// Convert data to JSON string
|
|
191
|
-
let jsonString;
|
|
192
|
-
try {
|
|
193
|
-
if (prettyPrint) {
|
|
194
|
-
jsonString = JSON.stringify(data, null, 2);
|
|
195
|
-
} else {
|
|
196
|
-
jsonString = JSON.stringify(data);
|
|
197
|
-
}
|
|
198
|
-
} catch (error) {
|
|
199
|
-
if (error.message.includes('circular') || error.message.includes('Converting circular')) {
|
|
200
|
-
throw new ValidationError('Data contains circular references');
|
|
201
|
-
}
|
|
202
|
-
throw new ValidationError(`Failed to stringify JSON: ${error.message}`);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Check size limit
|
|
206
|
-
const byteSize = Buffer.byteLength(jsonString, 'utf8');
|
|
207
|
-
if (byteSize > maxSize) {
|
|
208
|
-
throw new LimitError(
|
|
209
|
-
`JSON size exceeds maximum limit of ${maxSize} bytes`,
|
|
210
|
-
maxSize,
|
|
211
|
-
byteSize
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Ensure directory exists
|
|
216
|
-
const dir = require('path').dirname(safePath);
|
|
217
|
-
|
|
218
|
-
try {
|
|
219
|
-
if (!fs.existsSync(dir)) {
|
|
220
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Write file
|
|
224
|
-
fs.writeFileSync(safePath, jsonString, 'utf8');
|
|
225
|
-
|
|
226
|
-
return safePath;
|
|
227
|
-
} catch (error) {
|
|
228
|
-
if (error.code === 'ENOENT') {
|
|
229
|
-
throw new FileSystemError(`Directory does not exist: ${dir}`, error);
|
|
230
|
-
}
|
|
231
|
-
if (error.code === 'EACCES') {
|
|
232
|
-
throw new FileSystemError(`Permission denied: ${safePath}`, error);
|
|
233
|
-
}
|
|
234
|
-
if (error.code === 'ENOSPC') {
|
|
235
|
-
throw new FileSystemError(`No space left on device: ${safePath}`, error);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
throw new FileSystemError(`Failed to write JSON file: ${error.message}`, error);
|
|
239
|
-
}
|
|
240
|
-
}, 'FILE_SYSTEM_ERROR', { function: 'saveAsJsonSync' });
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Export the functions
|
|
244
|
-
module.exports = {
|
|
245
|
-
saveAsJson,
|
|
246
|
-
saveAsJsonSync,
|
|
247
|
-
validateJsonFilePath
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
// For ES6 module compatibility
|
|
251
|
-
/* istanbul ignore next */
|
|
252
|
-
if (typeof module !== 'undefined' && module.exports) {
|
|
253
|
-
module.exports.default = saveAsJson;
|
|
254
|
-
}
|