@ktuban/safe-json-loader 1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeJsonLoader.js","sourceRoot":"","sources":["../../src/safeJsonLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // types.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA,WAAW"}
@@ -0,0 +1,5 @@
1
+ // Public types
2
+ export * from "./types.js";
3
+ export * from "./logger.js";
4
+ export * from "./safeJsonLoader.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,eAAe;AACf,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,58 @@
1
+ // logger.ts
2
+ import stringify from "safe-json-stringify";
3
+ const NOOP_LOGGER = {
4
+ log: () => {
5
+ // no‑op
6
+ },
7
+ };
8
+ const DEFAULT_OPTIONS = {
9
+ maxFiles: 100,
10
+ maxTotalBytes: 10 * 1024 * 1024, // 10 MB
11
+ maxFileBytes: 2 * 1024 * 1024, // 2 MB
12
+ httpTimeoutMs: 8000,
13
+ maxConcurrency: 5,
14
+ looseJsonContentType: true,
15
+ maxJsonDepth: 50,
16
+ logger: NOOP_LOGGER,
17
+ onFileLoaded: () => { },
18
+ onFileSkipped: () => { },
19
+ };
20
+ export function mergeOptions(opts) {
21
+ const logger = opts?.logger ?? DEFAULT_OPTIONS.logger;
22
+ return {
23
+ ...DEFAULT_OPTIONS,
24
+ ...opts,
25
+ logger,
26
+ onFileLoaded: opts?.onFileLoaded ?? DEFAULT_OPTIONS.onFileLoaded,
27
+ onFileSkipped: opts?.onFileSkipped ?? DEFAULT_OPTIONS.onFileSkipped,
28
+ };
29
+ }
30
+ /**
31
+ * Simple adapter to allow direct use of console as logger, if desired.
32
+ */
33
+ export class ConsoleJsonLoaderLogger {
34
+ log(level, message, meta) {
35
+ const payload = meta ? `${message} | ${stringify(meta)}` : message;
36
+ switch (level) {
37
+ case "debug":
38
+ console.debug(payload);
39
+ break;
40
+ case "info":
41
+ console.info(payload);
42
+ break;
43
+ case "warn":
44
+ console.warn(payload);
45
+ break;
46
+ case "error":
47
+ console.error(payload);
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * Helper to log with a specific log level using resolved options.
54
+ */
55
+ export function logWith(options, level, message, meta) {
56
+ options.logger.log(level, message, meta);
57
+ }
58
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAQ,SAAS,MAAM,qBAAqB,CAAA;AAQ5C,MAAM,WAAW,GAAqB;IACpC,GAAG,EAAE,GAAG,EAAE;QACR,QAAQ;IACV,CAAC;CACF,CAAC;AAEF,MAAM,eAAe,GAAkC;IACrD,QAAQ,EAAE,GAAG;IACb,aAAa,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ;IACzC,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAI,OAAO;IACxC,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,CAAC;IACjB,oBAAoB,EAAE,IAAI;IAC1B,YAAY,EAAE,EAAE;IAChB,MAAM,EAAE,WAAW;IACnB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;IACtB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,IAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC;IAEtD,OAAO;QACL,GAAG,eAAe;QAClB,GAAG,IAAI;QACP,MAAM;QACN,YAAY,EAAE,IAAI,EAAE,YAAY,IAAI,eAAe,CAAC,YAAY;QAChE,aAAa,EAAE,IAAI,EAAE,aAAa,IAAI,eAAe,CAAC,aAAa;KACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAClC,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACnE,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvB,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvB,MAAM;QACV,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,OAAsC,EACtC,KAAe,EACf,OAAe,EACf,IAA8B;IAE9B,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,380 @@
1
+ // safeJsonLoader.ts
2
+ import fs from "fs/promises";
3
+ import path from "path";
4
+ import fetch from "node-fetch";
5
+ import { mergeOptions, logWith } from "./logger.js";
6
+ /* -------------------------------------------------------------------------- */
7
+ /* ERROR TYPE */
8
+ /* -------------------------------------------------------------------------- */
9
+ export class JsonLoaderError extends Error {
10
+ code;
11
+ constructor(message, code) {
12
+ super(message);
13
+ this.name = "JsonLoaderError";
14
+ this.code = code;
15
+ }
16
+ }
17
+ /* -------------------------------------------------------------------------- */
18
+ /* HELPERS */
19
+ /* -------------------------------------------------------------------------- */
20
+ function isHttpUrl(str) {
21
+ return /^https?:\/\//i.test(str);
22
+ }
23
+ function isJsonFile(file) {
24
+ return path.extname(file).toLowerCase() === ".json";
25
+ }
26
+ function ensureStringInput(input) {
27
+ if (typeof input === "string")
28
+ return input;
29
+ if (input.href)
30
+ return String(input);
31
+ return String(input);
32
+ }
33
+ // Minimal concurrency limiter to avoid external deps.
34
+ function createLimiter(maxConcurrency) {
35
+ let active = 0;
36
+ const queue = [];
37
+ const next = () => {
38
+ active--;
39
+ if (queue.length > 0) {
40
+ const fn = queue.shift();
41
+ fn();
42
+ }
43
+ };
44
+ const run = (task) => new Promise((resolve, reject) => {
45
+ const execute = () => {
46
+ active++;
47
+ task()
48
+ .then((result) => {
49
+ next();
50
+ resolve(result);
51
+ })
52
+ .catch((err) => {
53
+ next();
54
+ reject(err);
55
+ });
56
+ };
57
+ if (active < maxConcurrency) {
58
+ execute();
59
+ }
60
+ else {
61
+ queue.push(execute);
62
+ }
63
+ });
64
+ return run;
65
+ }
66
+ /* -------------------------------------------------------------------------- */
67
+ /* SECURITY: PROTOTYPE POLLUTION SANITIZER */
68
+ /* -------------------------------------------------------------------------- */
69
+ const POLLUTION_KEYS = new Set(["__proto__", "constructor", "prototype"]);
70
+ /**
71
+ * Deeply clones and strips dangerous keys to mitigate prototype pollution.
72
+ * Uses Object.create(null) to avoid inheriting from Object.prototype.
73
+ */
74
+ export function sanitizePrototypePollution(input, options) {
75
+ const maxDepth = options?.maxDepth ?? 1_000; // extremely high default, actual limit enforced separately
76
+ return deepSanitize(input, 0, maxDepth);
77
+ }
78
+ function deepSanitize(value, depth, maxDepth) {
79
+ if (depth > maxDepth) {
80
+ // Hard stop; caller should usually enforce a much smaller depth via options.maxJsonDepth.
81
+ throw new JsonLoaderError(`Maximum JSON depth exceeded during sanitation (depth > ${maxDepth}).`, "JSON_DEPTH_SANITATION_LIMIT");
82
+ }
83
+ if (Array.isArray(value)) {
84
+ const out = new Array(value.length);
85
+ for (let i = 0; i < value.length; i++) {
86
+ out[i] = deepSanitize(value[i], depth + 1, maxDepth);
87
+ }
88
+ return out;
89
+ }
90
+ if (value && typeof value === "object") {
91
+ const out = Object.create(null);
92
+ for (const key of Object.keys(value)) {
93
+ if (POLLUTION_KEYS.has(key)) {
94
+ continue;
95
+ }
96
+ out[key] = deepSanitize(value[key], depth + 1, maxDepth);
97
+ }
98
+ return out;
99
+ }
100
+ return value;
101
+ }
102
+ /**
103
+ * Computes maximum depth of a JSON value.
104
+ */
105
+ function calculateDepth(value, currentDepth = 0) {
106
+ if (value === null)
107
+ return currentDepth;
108
+ if (Array.isArray(value)) {
109
+ let max = currentDepth;
110
+ for (const item of value) {
111
+ const depth = calculateDepth(item, currentDepth + 1);
112
+ if (depth > max)
113
+ max = depth;
114
+ }
115
+ return max;
116
+ }
117
+ if (typeof value === "object") {
118
+ let max = currentDepth;
119
+ for (const key of Object.keys(value)) {
120
+ const depth = calculateDepth(value[key], currentDepth + 1);
121
+ if (depth > max)
122
+ max = depth;
123
+ }
124
+ return max;
125
+ }
126
+ return currentDepth;
127
+ }
128
+ /* -------------------------------------------------------------------------- */
129
+ /* REMOTE JSON LOADING */
130
+ /* -------------------------------------------------------------------------- */
131
+ async function fetchWithTimeout(url, opts) {
132
+ const controller = new AbortController();
133
+ const timeoutId = setTimeout(() => controller.abort(), opts.httpTimeoutMs);
134
+ try {
135
+ const res = await fetch(url, { method: "GET", signal: controller.signal });
136
+ clearTimeout(timeoutId);
137
+ return res;
138
+ }
139
+ catch (err) {
140
+ clearTimeout(timeoutId);
141
+ throw new JsonLoaderError(`Failed to fetch remote JSON at ${url}: ${err?.message ?? String(err)}`, "REMOTE_FETCH_ERROR");
142
+ }
143
+ }
144
+ function assertJsonContentType(url, res, opts) {
145
+ const ct = res.headers.get("content-type") ?? "";
146
+ const lc = ct.toLowerCase();
147
+ const isJson = opts.looseJsonContentType
148
+ ? lc.includes("json")
149
+ : lc.startsWith("application/json");
150
+ if (!isJson) {
151
+ throw new JsonLoaderError(`Remote URL does not advertise JSON content-type at ${url}: '${ct}'`, "REMOTE_CONTENT_TYPE_ERROR");
152
+ }
153
+ }
154
+ async function loadRemoteJson(url, opts) {
155
+ const res = await fetchWithTimeout(url, opts);
156
+ if (!res.ok) {
157
+ throw new JsonLoaderError(`Remote fetch failed at ${url}: ${res.status} ${res.statusText}`, "REMOTE_FETCH_STATUS_ERROR");
158
+ }
159
+ assertJsonContentType(url, res, opts);
160
+ const raw = (await res.json());
161
+ const sanitized = sanitizePrototypePollution(raw, {
162
+ maxDepth: opts.maxJsonDepth,
163
+ });
164
+ return sanitized;
165
+ }
166
+ async function loadRemoteIndex(indexUrl, indexJson, opts, limitRun) {
167
+ let fileList;
168
+ if (Array.isArray(indexJson)) {
169
+ fileList = indexJson;
170
+ }
171
+ else if (indexJson &&
172
+ typeof indexJson === "object" &&
173
+ Array.isArray(indexJson.files)) {
174
+ fileList = indexJson.files;
175
+ }
176
+ if (!Array.isArray(fileList)) {
177
+ throw new JsonLoaderError(`Remote directory index ${indexUrl} must return an array or { files: [] }.`, "REMOTE_INDEX_FORMAT_ERROR");
178
+ }
179
+ const urls = fileList.filter((item) => typeof item === "string");
180
+ if (urls.length === 0) {
181
+ return [];
182
+ }
183
+ if (urls.length > opts.maxFiles) {
184
+ throw new JsonLoaderError(`Remote directory index at ${indexUrl} lists ${urls.length} files, exceeding maxFiles=${opts.maxFiles}.`, "REMOTE_INDEX_LIMIT_ERROR");
185
+ }
186
+ logWith(opts, "debug", "Loading remote index", {
187
+ indexUrl,
188
+ fileCount: urls.length,
189
+ });
190
+ const tasks = urls.map((fileUrl) => limitRun(async () => {
191
+ if (!isHttpUrl(fileUrl)) {
192
+ throw new JsonLoaderError(`Invalid remote file URL in index at ${indexUrl}: ${fileUrl}`, "REMOTE_INDEX_URL_ERROR");
193
+ }
194
+ const data = await loadRemoteJson(fileUrl, opts);
195
+ const file = Object.freeze({
196
+ name: path.basename(new URL(fileUrl).pathname),
197
+ data,
198
+ __source: fileUrl,
199
+ });
200
+ opts.onFileLoaded(file);
201
+ logWith(opts, "info", "Remote JSON file loaded", {
202
+ url: fileUrl,
203
+ });
204
+ return file;
205
+ }));
206
+ return Promise.all(tasks);
207
+ }
208
+ /* -------------------------------------------------------------------------- */
209
+ /* LOCAL FILE JSON LOADER */
210
+ /* -------------------------------------------------------------------------- */
211
+ async function loadLocalJsonFile(filePath, opts) {
212
+ const stats = await fs.stat(filePath);
213
+ if (stats.size > opts.maxFileBytes) {
214
+ opts.onFileSkipped({
215
+ source: filePath,
216
+ reason: `File exceeds maxFileBytes=${opts.maxFileBytes}`,
217
+ });
218
+ logWith(opts, "warn", "Skipping local file due to size limit", {
219
+ filePath,
220
+ size: stats.size,
221
+ maxFileBytes: opts.maxFileBytes,
222
+ });
223
+ throw new JsonLoaderError(`Local file too large: ${filePath} (${stats.size} bytes > ${opts.maxFileBytes}).`, "LOCAL_FILE_SIZE_ERROR");
224
+ }
225
+ const content = await fs.readFile(filePath, "utf8");
226
+ let raw;
227
+ try {
228
+ raw = JSON.parse(content);
229
+ }
230
+ catch (err) {
231
+ throw new JsonLoaderError(`Invalid JSON in file ${filePath}: ${err?.message ?? String(err)}`, "LOCAL_JSON_PARSE_ERROR");
232
+ }
233
+ const sanitized = sanitizePrototypePollution(raw, {
234
+ maxDepth: opts.maxJsonDepth,
235
+ });
236
+ const file = Object.freeze({
237
+ name: path.basename(filePath),
238
+ data: sanitized,
239
+ __source: filePath,
240
+ });
241
+ opts.onFileLoaded(file);
242
+ logWith(opts, "info", "Local JSON file loaded", { filePath });
243
+ return file;
244
+ }
245
+ async function loadLocalDirectory(dirPath, opts, limitRun) {
246
+ const files = await fs.readdir(dirPath);
247
+ const jsonFiles = files.filter(isJsonFile);
248
+ if (jsonFiles.length === 0) {
249
+ logWith(opts, "debug", "No JSON files found in directory", { dirPath });
250
+ return [];
251
+ }
252
+ if (jsonFiles.length > opts.maxFiles) {
253
+ throw new JsonLoaderError(`Directory ${dirPath} contains ${jsonFiles.length} JSON files, exceeding maxFiles=${opts.maxFiles}.`, "LOCAL_DIR_LIMIT_ERROR");
254
+ }
255
+ // Enforce total size limit
256
+ let totalSize = 0;
257
+ const filePaths = [];
258
+ for (const file of jsonFiles) {
259
+ const full = path.join(dirPath, file);
260
+ const stats = await fs.stat(full);
261
+ totalSize += stats.size;
262
+ if (totalSize > opts.maxTotalBytes) {
263
+ throw new JsonLoaderError(`Total size of JSON files in ${dirPath} exceeds maxTotalBytes=${opts.maxTotalBytes}.`, "LOCAL_DIR_TOTAL_SIZE_ERROR");
264
+ }
265
+ filePaths.push(full);
266
+ }
267
+ logWith(opts, "debug", "Loading local directory", {
268
+ dirPath,
269
+ fileCount: filePaths.length,
270
+ totalSize,
271
+ });
272
+ const tasks = filePaths.map((filePath) => limitRun(() => loadLocalJsonFile(filePath, opts)));
273
+ return Promise.all(tasks);
274
+ }
275
+ /* -------------------------------------------------------------------------- */
276
+ /* PUBLIC API: SAFE JSON LOADER */
277
+ /* -------------------------------------------------------------------------- */
278
+ /**
279
+ * Load one or more JSON resources from:
280
+ * - Local file (.json)
281
+ * - Local directory (all .json files)
282
+ * - Remote URL returning JSON (object/array)
283
+ * - Remote URL acting as an index of JSON URLs (array or { files: [] })
284
+ *
285
+ * Security features:
286
+ * - Prototype‑pollution‑safe deep clone (strips __proto__, constructor, prototype)
287
+ * - Max depth for parsed JSON structures
288
+ * - Max file size and total directory size
289
+ * - Concurrency limit for I/O (local and remote)
290
+ * - HTTP timeout and content‑type checks
291
+ *
292
+ * This function does not enforce any domain/schema validation — callers
293
+ * should layer their own validation on top of the loaded `data`.
294
+ */
295
+ export async function loadSafeJsonResources(input, options) {
296
+ const inputStr = ensureStringInput(input);
297
+ if (!inputStr) {
298
+ throw new JsonLoaderError("Input path/URL must be a non-empty string.", "INPUT_VALIDATION_ERROR");
299
+ }
300
+ const opts = mergeOptions(options);
301
+ const limitRun = createLimiter(opts.maxConcurrency);
302
+ /* ---------------------------------- REMOTE --------------------------------- */
303
+ if (isHttpUrl(inputStr)) {
304
+ const json = await loadRemoteJson(inputStr, opts);
305
+ if (Array.isArray(json) ||
306
+ (json &&
307
+ typeof json === "object" &&
308
+ Array.isArray(json.files))) {
309
+ return loadRemoteIndex(inputStr, json, opts, limitRun);
310
+ }
311
+ const file = Object.freeze({
312
+ name: path.basename(new URL(inputStr).pathname),
313
+ data: json,
314
+ __source: inputStr,
315
+ });
316
+ opts.onFileLoaded(file);
317
+ logWith(opts, "info", "Remote JSON file loaded", { url: inputStr });
318
+ return [file];
319
+ }
320
+ /* ----------------------------------- LOCAL ---------------------------------- */
321
+ const resolved = path.resolve(inputStr);
322
+ let stats;
323
+ try {
324
+ stats = await fs.stat(resolved);
325
+ }
326
+ catch {
327
+ throw new JsonLoaderError(`Local path does not exist: ${resolved}`, "LOCAL_PATH_NOT_FOUND");
328
+ }
329
+ if (stats.isFile()) {
330
+ if (!isJsonFile(resolved)) {
331
+ throw new JsonLoaderError(`File is not a .json file: ${resolved}`, "LOCAL_FILE_EXTENSION_ERROR");
332
+ }
333
+ return [await loadLocalJsonFile(resolved, opts)];
334
+ }
335
+ if (stats.isDirectory()) {
336
+ return loadLocalDirectory(resolved, opts, limitRun);
337
+ }
338
+ throw new JsonLoaderError(`Unsupported path type: ${resolved}`, "LOCAL_PATH_TYPE_ERROR");
339
+ }
340
+ /**
341
+ * Safely parse and sanitize a JSON string.
342
+ *
343
+ * - Parses JSON with error handling
344
+ * - Strips prototype pollution keys (__proto__, constructor, prototype)
345
+ * - Enforces max depth
346
+ *
347
+ * @param input Raw JSON string
348
+ * @param opts Loader options (maxJsonDepth, etc.)
349
+ * @returns Safe, sanitized JSON object
350
+ */
351
+ export function parseSafeJsonString(input, opts) {
352
+ let raw;
353
+ try {
354
+ raw = JSON.parse(input);
355
+ }
356
+ catch (err) {
357
+ throw new JsonLoaderError(`Invalid JSON string: ${err?.message ?? String(err)}`, "STRING_JSON_PARSE_ERROR");
358
+ }
359
+ const sanitized = sanitizePrototypePollution(raw, {
360
+ maxDepth: opts?.maxJsonDepth ?? 50,
361
+ });
362
+ return sanitized;
363
+ }
364
+ /**
365
+ * Sanitize an already-parsed JSON object.
366
+ *
367
+ * - Strips prototype pollution keys (__proto__, constructor, prototype)
368
+ * - Enforces max depth
369
+ *
370
+ * @param input Parsed JSON object (e.g. req.body in Express)
371
+ * @param opts Loader options (maxJsonDepth, etc.)
372
+ * @returns Safe, sanitized JSON object
373
+ */
374
+ export function sanitizeParsedJsonObject(input, opts) {
375
+ const sanitized = sanitizePrototypePollution(input, {
376
+ maxDepth: opts?.maxJsonDepth ?? 50,
377
+ });
378
+ return sanitized;
379
+ }
380
+ //# sourceMappingURL=safeJsonLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeJsonLoader.js","sourceRoot":"","sources":["../../src/safeJsonLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // types.ts
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,WAAW"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./logger.js";
3
+ export * from "./safeJsonLoader.js";
@@ -0,0 +1,12 @@
1
+ import type { JsonLoaderLogger, LogLevel, ResolvedSafeJsonLoaderOptions, SafeJsonLoaderOptions } from "./types.js";
2
+ export declare function mergeOptions(opts?: SafeJsonLoaderOptions): ResolvedSafeJsonLoaderOptions;
3
+ /**
4
+ * Simple adapter to allow direct use of console as logger, if desired.
5
+ */
6
+ export declare class ConsoleJsonLoaderLogger implements JsonLoaderLogger {
7
+ log(level: LogLevel, message: string, meta?: Record<string, unknown>): void;
8
+ }
9
+ /**
10
+ * Helper to log with a specific log level using resolved options.
11
+ */
12
+ export declare function logWith(options: ResolvedSafeJsonLoaderOptions, level: LogLevel, message: string, meta?: Record<string, unknown>): void;
@@ -0,0 +1,53 @@
1
+ import { JsonValue, LoadedJsonFile, SafeJsonLoaderOptions, JsonLoadInput } from "./types.js";
2
+ export declare class JsonLoaderError extends Error {
3
+ readonly code: string;
4
+ constructor(message: string, code: string);
5
+ }
6
+ /**
7
+ * Deeply clones and strips dangerous keys to mitigate prototype pollution.
8
+ * Uses Object.create(null) to avoid inheriting from Object.prototype.
9
+ */
10
+ export declare function sanitizePrototypePollution<T extends JsonValue>(input: T, options?: {
11
+ maxDepth?: number;
12
+ }): T;
13
+ /**
14
+ * Load one or more JSON resources from:
15
+ * - Local file (.json)
16
+ * - Local directory (all .json files)
17
+ * - Remote URL returning JSON (object/array)
18
+ * - Remote URL acting as an index of JSON URLs (array or { files: [] })
19
+ *
20
+ * Security features:
21
+ * - Prototype‑pollution‑safe deep clone (strips __proto__, constructor, prototype)
22
+ * - Max depth for parsed JSON structures
23
+ * - Max file size and total directory size
24
+ * - Concurrency limit for I/O (local and remote)
25
+ * - HTTP timeout and content‑type checks
26
+ *
27
+ * This function does not enforce any domain/schema validation — callers
28
+ * should layer their own validation on top of the loaded `data`.
29
+ */
30
+ export declare function loadSafeJsonResources(input: JsonLoadInput, options?: SafeJsonLoaderOptions): Promise<LoadedJsonFile[]>;
31
+ /**
32
+ * Safely parse and sanitize a JSON string.
33
+ *
34
+ * - Parses JSON with error handling
35
+ * - Strips prototype pollution keys (__proto__, constructor, prototype)
36
+ * - Enforces max depth
37
+ *
38
+ * @param input Raw JSON string
39
+ * @param opts Loader options (maxJsonDepth, etc.)
40
+ * @returns Safe, sanitized JSON object
41
+ */
42
+ export declare function parseSafeJsonString(input: string, opts?: Pick<SafeJsonLoaderOptions, "maxJsonDepth">): JsonValue;
43
+ /**
44
+ * Sanitize an already-parsed JSON object.
45
+ *
46
+ * - Strips prototype pollution keys (__proto__, constructor, prototype)
47
+ * - Enforces max depth
48
+ *
49
+ * @param input Parsed JSON object (e.g. req.body in Express)
50
+ * @param opts Loader options (maxJsonDepth, etc.)
51
+ * @returns Safe, sanitized JSON object
52
+ */
53
+ export declare function sanitizeParsedJsonObject(input: JsonValue, opts?: Pick<SafeJsonLoaderOptions, "maxJsonDepth">): JsonValue;