@apidevtools/json-schema-ref-parser 12.0.2 → 13.0.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/dist/lib/dereference.js +2 -2
- package/dist/lib/index.js +2 -3
- package/dist/lib/options.d.ts +1 -294
- package/dist/lib/parse.js +3 -4
- package/dist/lib/refs.js +2 -3
- package/dist/lib/resolvers/file.js +6 -3
- package/dist/lib/resolvers/http.js +12 -5
- package/dist/lib/util/errors.d.ts +12 -0
- package/dist/lib/util/errors.js +46 -3
- package/lib/dereference.ts +2 -2
- package/lib/index.ts +2 -3
- package/lib/parse.ts +3 -4
- package/lib/refs.ts +2 -3
- package/lib/resolvers/file.ts +6 -3
- package/lib/resolvers/http.ts +14 -10
- package/lib/util/errors.ts +53 -5
- package/package.json +16 -17
package/dist/lib/dereference.js
CHANGED
|
@@ -38,7 +38,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const ref_js_1 = __importDefault(require("./ref.js"));
|
|
40
40
|
const pointer_js_1 = __importDefault(require("./pointer.js"));
|
|
41
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
42
41
|
const url = __importStar(require("./util/url.js"));
|
|
43
42
|
const errors_1 = require("./util/errors");
|
|
44
43
|
exports.default = dereference;
|
|
@@ -283,7 +282,8 @@ function foundCircularReference(keyPath, $refs, options) {
|
|
|
283
282
|
$refs.circular = true;
|
|
284
283
|
options?.dereference?.onCircular?.(keyPath);
|
|
285
284
|
if (!options.dereference.circular) {
|
|
286
|
-
|
|
285
|
+
const error = new ReferenceError(`Circular $ref pointer found at ${keyPath}`);
|
|
286
|
+
throw error;
|
|
287
287
|
}
|
|
288
288
|
return true;
|
|
289
289
|
}
|
package/dist/lib/index.js
CHANGED
|
@@ -56,7 +56,6 @@ Object.defineProperty(exports, "UnmatchedParserError", { enumerable: true, get:
|
|
|
56
56
|
Object.defineProperty(exports, "UnmatchedResolverError", { enumerable: true, get: function () { return errors_js_1.UnmatchedResolverError; } });
|
|
57
57
|
Object.defineProperty(exports, "isHandledError", { enumerable: true, get: function () { return errors_js_1.isHandledError; } });
|
|
58
58
|
Object.defineProperty(exports, "JSONParserErrorGroup", { enumerable: true, get: function () { return errors_js_1.JSONParserErrorGroup; } });
|
|
59
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
60
59
|
const maybe_js_1 = __importDefault(require("./util/maybe.js"));
|
|
61
60
|
const options_js_1 = require("./options.js");
|
|
62
61
|
Object.defineProperty(exports, "getJsonSchemaRefParserDefaultOptions", { enumerable: true, get: function () { return options_js_1.getJsonSchemaRefParserDefaultOptions; } });
|
|
@@ -87,7 +86,7 @@ class $RefParser {
|
|
|
87
86
|
const args = (0, normalize_args_js_1.default)(arguments);
|
|
88
87
|
let promise;
|
|
89
88
|
if (!args.path && !args.schema) {
|
|
90
|
-
const err =
|
|
89
|
+
const err = new Error(`Expected a file path, URL, or object. Got ${args.path || args.schema}`);
|
|
91
90
|
return (0, maybe_js_1.default)(args.callback, Promise.reject(err));
|
|
92
91
|
}
|
|
93
92
|
// Reset everything
|
|
@@ -136,7 +135,7 @@ class $RefParser {
|
|
|
136
135
|
return (0, maybe_js_1.default)(args.callback, Promise.resolve(this.schema));
|
|
137
136
|
}
|
|
138
137
|
else {
|
|
139
|
-
throw
|
|
138
|
+
throw new SyntaxError(`"${this.$refs._root$Ref.path || result}" is not a valid JSON Schema`);
|
|
140
139
|
}
|
|
141
140
|
}
|
|
142
141
|
catch (err) {
|
package/dist/lib/options.d.ts
CHANGED
|
@@ -105,300 +105,7 @@ export interface $RefParserOptions<S extends object = JSONSchema> {
|
|
|
105
105
|
timeoutMs?: number;
|
|
106
106
|
}
|
|
107
107
|
export declare const getJsonSchemaRefParserDefaultOptions: () => $RefParserOptions<JSONSchema>;
|
|
108
|
-
export declare const getNewOptions: <S extends object = JSONSchema, O extends ParserOptions<S> =
|
|
109
|
-
parse?: {
|
|
110
|
-
[x: string]: boolean | {
|
|
111
|
-
name?: string | undefined;
|
|
112
|
-
order?: number | undefined;
|
|
113
|
-
allowEmpty?: boolean | undefined;
|
|
114
|
-
allowBOM?: boolean | undefined;
|
|
115
|
-
encoding?: BufferEncoding | undefined;
|
|
116
|
-
canParse?: string | boolean | {
|
|
117
|
-
exec?: {} | undefined;
|
|
118
|
-
test?: {} | undefined;
|
|
119
|
-
readonly source?: string | undefined;
|
|
120
|
-
readonly global?: boolean | undefined;
|
|
121
|
-
readonly ignoreCase?: boolean | undefined;
|
|
122
|
-
readonly multiline?: boolean | undefined;
|
|
123
|
-
lastIndex?: number | undefined;
|
|
124
|
-
compile?: {} | undefined;
|
|
125
|
-
readonly flags?: string | undefined;
|
|
126
|
-
readonly sticky?: boolean | undefined;
|
|
127
|
-
readonly unicode?: boolean | undefined;
|
|
128
|
-
readonly dotAll?: boolean | undefined;
|
|
129
|
-
readonly hasIndices?: boolean | undefined;
|
|
130
|
-
readonly unicodeSets?: boolean | undefined;
|
|
131
|
-
[Symbol.match]?: {} | undefined;
|
|
132
|
-
[Symbol.replace]?: {} | undefined;
|
|
133
|
-
[Symbol.search]?: {} | undefined;
|
|
134
|
-
[Symbol.split]?: {} | undefined;
|
|
135
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
136
|
-
} | (string | undefined)[] | {} | undefined;
|
|
137
|
-
parse?: string | number | {} | undefined;
|
|
138
|
-
} | undefined;
|
|
139
|
-
json?: boolean | {
|
|
140
|
-
name?: string | undefined;
|
|
141
|
-
order?: number | undefined;
|
|
142
|
-
allowEmpty?: boolean | undefined;
|
|
143
|
-
allowBOM?: boolean | undefined;
|
|
144
|
-
encoding?: BufferEncoding | undefined;
|
|
145
|
-
canParse?: string | boolean | {
|
|
146
|
-
exec?: {} | undefined;
|
|
147
|
-
test?: {} | undefined;
|
|
148
|
-
readonly source?: string | undefined;
|
|
149
|
-
readonly global?: boolean | undefined;
|
|
150
|
-
readonly ignoreCase?: boolean | undefined;
|
|
151
|
-
readonly multiline?: boolean | undefined;
|
|
152
|
-
lastIndex?: number | undefined;
|
|
153
|
-
compile?: {} | undefined;
|
|
154
|
-
readonly flags?: string | undefined;
|
|
155
|
-
readonly sticky?: boolean | undefined;
|
|
156
|
-
readonly unicode?: boolean | undefined;
|
|
157
|
-
readonly dotAll?: boolean | undefined;
|
|
158
|
-
readonly hasIndices?: boolean | undefined;
|
|
159
|
-
readonly unicodeSets?: boolean | undefined;
|
|
160
|
-
[Symbol.match]?: {} | undefined;
|
|
161
|
-
[Symbol.replace]?: {} | undefined;
|
|
162
|
-
[Symbol.search]?: {} | undefined;
|
|
163
|
-
[Symbol.split]?: {} | undefined;
|
|
164
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
165
|
-
} | (string | undefined)[] | {} | undefined;
|
|
166
|
-
parse?: string | number | {} | undefined;
|
|
167
|
-
} | undefined;
|
|
168
|
-
yaml?: boolean | {
|
|
169
|
-
name?: string | undefined;
|
|
170
|
-
order?: number | undefined;
|
|
171
|
-
allowEmpty?: boolean | undefined;
|
|
172
|
-
allowBOM?: boolean | undefined;
|
|
173
|
-
encoding?: BufferEncoding | undefined;
|
|
174
|
-
canParse?: string | boolean | {
|
|
175
|
-
exec?: {} | undefined;
|
|
176
|
-
test?: {} | undefined;
|
|
177
|
-
readonly source?: string | undefined;
|
|
178
|
-
readonly global?: boolean | undefined;
|
|
179
|
-
readonly ignoreCase?: boolean | undefined;
|
|
180
|
-
readonly multiline?: boolean | undefined;
|
|
181
|
-
lastIndex?: number | undefined;
|
|
182
|
-
compile?: {} | undefined;
|
|
183
|
-
readonly flags?: string | undefined;
|
|
184
|
-
readonly sticky?: boolean | undefined;
|
|
185
|
-
readonly unicode?: boolean | undefined;
|
|
186
|
-
readonly dotAll?: boolean | undefined;
|
|
187
|
-
readonly hasIndices?: boolean | undefined;
|
|
188
|
-
readonly unicodeSets?: boolean | undefined;
|
|
189
|
-
[Symbol.match]?: {} | undefined;
|
|
190
|
-
[Symbol.replace]?: {} | undefined;
|
|
191
|
-
[Symbol.search]?: {} | undefined;
|
|
192
|
-
[Symbol.split]?: {} | undefined;
|
|
193
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
194
|
-
} | (string | undefined)[] | {} | undefined;
|
|
195
|
-
parse?: string | number | {} | undefined;
|
|
196
|
-
} | undefined;
|
|
197
|
-
binary?: boolean | {
|
|
198
|
-
name?: string | undefined;
|
|
199
|
-
order?: number | undefined;
|
|
200
|
-
allowEmpty?: boolean | undefined;
|
|
201
|
-
allowBOM?: boolean | undefined;
|
|
202
|
-
encoding?: BufferEncoding | undefined;
|
|
203
|
-
canParse?: string | boolean | {
|
|
204
|
-
exec?: {} | undefined;
|
|
205
|
-
test?: {} | undefined;
|
|
206
|
-
readonly source?: string | undefined;
|
|
207
|
-
readonly global?: boolean | undefined;
|
|
208
|
-
readonly ignoreCase?: boolean | undefined;
|
|
209
|
-
readonly multiline?: boolean | undefined;
|
|
210
|
-
lastIndex?: number | undefined;
|
|
211
|
-
compile?: {} | undefined;
|
|
212
|
-
readonly flags?: string | undefined;
|
|
213
|
-
readonly sticky?: boolean | undefined;
|
|
214
|
-
readonly unicode?: boolean | undefined;
|
|
215
|
-
readonly dotAll?: boolean | undefined;
|
|
216
|
-
readonly hasIndices?: boolean | undefined;
|
|
217
|
-
readonly unicodeSets?: boolean | undefined;
|
|
218
|
-
[Symbol.match]?: {} | undefined;
|
|
219
|
-
[Symbol.replace]?: {} | undefined;
|
|
220
|
-
[Symbol.search]?: {} | undefined;
|
|
221
|
-
[Symbol.split]?: {} | undefined;
|
|
222
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
223
|
-
} | (string | undefined)[] | {} | undefined;
|
|
224
|
-
parse?: string | number | {} | undefined;
|
|
225
|
-
} | undefined;
|
|
226
|
-
text?: boolean | {
|
|
227
|
-
name?: string | undefined;
|
|
228
|
-
order?: number | undefined;
|
|
229
|
-
allowEmpty?: boolean | undefined;
|
|
230
|
-
allowBOM?: boolean | undefined;
|
|
231
|
-
encoding?: BufferEncoding | undefined;
|
|
232
|
-
canParse?: string | boolean | {
|
|
233
|
-
exec?: {} | undefined;
|
|
234
|
-
test?: {} | undefined;
|
|
235
|
-
readonly source?: string | undefined;
|
|
236
|
-
readonly global?: boolean | undefined;
|
|
237
|
-
readonly ignoreCase?: boolean | undefined;
|
|
238
|
-
readonly multiline?: boolean | undefined;
|
|
239
|
-
lastIndex?: number | undefined;
|
|
240
|
-
compile?: {} | undefined;
|
|
241
|
-
readonly flags?: string | undefined;
|
|
242
|
-
readonly sticky?: boolean | undefined;
|
|
243
|
-
readonly unicode?: boolean | undefined;
|
|
244
|
-
readonly dotAll?: boolean | undefined;
|
|
245
|
-
readonly hasIndices?: boolean | undefined;
|
|
246
|
-
readonly unicodeSets?: boolean | undefined;
|
|
247
|
-
[Symbol.match]?: {} | undefined;
|
|
248
|
-
[Symbol.replace]?: {} | undefined;
|
|
249
|
-
[Symbol.search]?: {} | undefined;
|
|
250
|
-
[Symbol.split]?: {} | undefined;
|
|
251
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
252
|
-
} | (string | undefined)[] | {} | undefined;
|
|
253
|
-
parse?: string | number | {} | undefined;
|
|
254
|
-
} | undefined;
|
|
255
|
-
} | undefined;
|
|
256
|
-
resolve?: {
|
|
257
|
-
[x: string]: boolean | {
|
|
258
|
-
name?: string | undefined;
|
|
259
|
-
order?: number | undefined;
|
|
260
|
-
canRead?: string | boolean | {
|
|
261
|
-
exec?: {} | undefined;
|
|
262
|
-
test?: {} | undefined;
|
|
263
|
-
readonly source?: string | undefined;
|
|
264
|
-
readonly global?: boolean | undefined;
|
|
265
|
-
readonly ignoreCase?: boolean | undefined;
|
|
266
|
-
readonly multiline?: boolean | undefined;
|
|
267
|
-
lastIndex?: number | undefined;
|
|
268
|
-
compile?: {} | undefined;
|
|
269
|
-
readonly flags?: string | undefined;
|
|
270
|
-
readonly sticky?: boolean | undefined;
|
|
271
|
-
readonly unicode?: boolean | undefined;
|
|
272
|
-
readonly dotAll?: boolean | undefined;
|
|
273
|
-
readonly hasIndices?: boolean | undefined;
|
|
274
|
-
readonly unicodeSets?: boolean | undefined;
|
|
275
|
-
[Symbol.match]?: {} | undefined;
|
|
276
|
-
[Symbol.replace]?: {} | undefined;
|
|
277
|
-
[Symbol.search]?: {} | undefined;
|
|
278
|
-
[Symbol.split]?: {} | undefined;
|
|
279
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
280
|
-
} | (string | undefined)[] | {} | undefined;
|
|
281
|
-
read?: string | object | {} | undefined;
|
|
282
|
-
} | {
|
|
283
|
-
headers?: ([(string | undefined)?, (string | undefined)?] | undefined)[] | {
|
|
284
|
-
[x: string]: string | undefined;
|
|
285
|
-
} | {
|
|
286
|
-
append?: {} | undefined;
|
|
287
|
-
delete?: {} | undefined;
|
|
288
|
-
get?: {} | undefined;
|
|
289
|
-
getSetCookie?: {} | undefined;
|
|
290
|
-
has?: {} | undefined;
|
|
291
|
-
set?: {} | undefined;
|
|
292
|
-
forEach?: {} | undefined;
|
|
293
|
-
} | null | undefined;
|
|
294
|
-
timeout?: number | undefined;
|
|
295
|
-
redirects?: number | undefined;
|
|
296
|
-
withCredentials?: boolean | undefined;
|
|
297
|
-
name?: string | undefined;
|
|
298
|
-
order?: number | undefined;
|
|
299
|
-
canRead?: string | boolean | {
|
|
300
|
-
exec?: {} | undefined;
|
|
301
|
-
test?: {} | undefined;
|
|
302
|
-
readonly source?: string | undefined;
|
|
303
|
-
readonly global?: boolean | undefined;
|
|
304
|
-
readonly ignoreCase?: boolean | undefined;
|
|
305
|
-
readonly multiline?: boolean | undefined;
|
|
306
|
-
lastIndex?: number | undefined;
|
|
307
|
-
compile?: {} | undefined;
|
|
308
|
-
readonly flags?: string | undefined;
|
|
309
|
-
readonly sticky?: boolean | undefined;
|
|
310
|
-
readonly unicode?: boolean | undefined;
|
|
311
|
-
readonly dotAll?: boolean | undefined;
|
|
312
|
-
readonly hasIndices?: boolean | undefined;
|
|
313
|
-
readonly unicodeSets?: boolean | undefined;
|
|
314
|
-
[Symbol.match]?: {} | undefined;
|
|
315
|
-
[Symbol.replace]?: {} | undefined;
|
|
316
|
-
[Symbol.search]?: {} | undefined;
|
|
317
|
-
[Symbol.split]?: {} | undefined;
|
|
318
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
319
|
-
} | (string | undefined)[] | {} | undefined;
|
|
320
|
-
read?: string | object | {} | undefined;
|
|
321
|
-
} | undefined;
|
|
322
|
-
external?: boolean | undefined;
|
|
323
|
-
file?: boolean | {
|
|
324
|
-
name?: string | undefined;
|
|
325
|
-
order?: number | undefined;
|
|
326
|
-
canRead?: string | boolean | {
|
|
327
|
-
exec?: {} | undefined;
|
|
328
|
-
test?: {} | undefined;
|
|
329
|
-
readonly source?: string | undefined;
|
|
330
|
-
readonly global?: boolean | undefined;
|
|
331
|
-
readonly ignoreCase?: boolean | undefined;
|
|
332
|
-
readonly multiline?: boolean | undefined;
|
|
333
|
-
lastIndex?: number | undefined;
|
|
334
|
-
compile?: {} | undefined;
|
|
335
|
-
readonly flags?: string | undefined;
|
|
336
|
-
readonly sticky?: boolean | undefined;
|
|
337
|
-
readonly unicode?: boolean | undefined;
|
|
338
|
-
readonly dotAll?: boolean | undefined;
|
|
339
|
-
readonly hasIndices?: boolean | undefined;
|
|
340
|
-
readonly unicodeSets?: boolean | undefined;
|
|
341
|
-
[Symbol.match]?: {} | undefined;
|
|
342
|
-
[Symbol.replace]?: {} | undefined;
|
|
343
|
-
[Symbol.search]?: {} | undefined;
|
|
344
|
-
[Symbol.split]?: {} | undefined;
|
|
345
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
346
|
-
} | (string | undefined)[] | {} | undefined;
|
|
347
|
-
read?: string | object | {} | undefined;
|
|
348
|
-
} | undefined;
|
|
349
|
-
http?: boolean | {
|
|
350
|
-
headers?: ([(string | undefined)?, (string | undefined)?] | undefined)[] | {
|
|
351
|
-
[x: string]: string | undefined;
|
|
352
|
-
} | {
|
|
353
|
-
append?: {} | undefined;
|
|
354
|
-
delete?: {} | undefined;
|
|
355
|
-
get?: {} | undefined;
|
|
356
|
-
getSetCookie?: {} | undefined;
|
|
357
|
-
has?: {} | undefined;
|
|
358
|
-
set?: {} | undefined;
|
|
359
|
-
forEach?: {} | undefined;
|
|
360
|
-
} | null | undefined;
|
|
361
|
-
timeout?: number | undefined;
|
|
362
|
-
redirects?: number | undefined;
|
|
363
|
-
withCredentials?: boolean | undefined;
|
|
364
|
-
name?: string | undefined;
|
|
365
|
-
order?: number | undefined;
|
|
366
|
-
canRead?: string | boolean | {
|
|
367
|
-
exec?: {} | undefined;
|
|
368
|
-
test?: {} | undefined;
|
|
369
|
-
readonly source?: string | undefined;
|
|
370
|
-
readonly global?: boolean | undefined;
|
|
371
|
-
readonly ignoreCase?: boolean | undefined;
|
|
372
|
-
readonly multiline?: boolean | undefined;
|
|
373
|
-
lastIndex?: number | undefined;
|
|
374
|
-
compile?: {} | undefined;
|
|
375
|
-
readonly flags?: string | undefined;
|
|
376
|
-
readonly sticky?: boolean | undefined;
|
|
377
|
-
readonly unicode?: boolean | undefined;
|
|
378
|
-
readonly dotAll?: boolean | undefined;
|
|
379
|
-
readonly hasIndices?: boolean | undefined;
|
|
380
|
-
readonly unicodeSets?: boolean | undefined;
|
|
381
|
-
[Symbol.match]?: {} | undefined;
|
|
382
|
-
[Symbol.replace]?: {} | undefined;
|
|
383
|
-
[Symbol.search]?: {} | undefined;
|
|
384
|
-
[Symbol.split]?: {} | undefined;
|
|
385
|
-
[Symbol.matchAll]?: {} | undefined;
|
|
386
|
-
} | (string | undefined)[] | {} | undefined;
|
|
387
|
-
read?: string | object | {} | undefined;
|
|
388
|
-
} | undefined;
|
|
389
|
-
} | undefined;
|
|
390
|
-
continueOnError?: boolean | undefined;
|
|
391
|
-
dereference?: {
|
|
392
|
-
circular?: boolean | "ignore" | undefined;
|
|
393
|
-
excludedPathMatcher?: {} | undefined;
|
|
394
|
-
onCircular?: {} | undefined;
|
|
395
|
-
onDereference?: {} | undefined;
|
|
396
|
-
preservedProperties?: (string | undefined)[] | undefined;
|
|
397
|
-
externalReferenceResolution?: "relative" | "root" | undefined;
|
|
398
|
-
} | undefined;
|
|
399
|
-
mutateInputSchema?: boolean | undefined;
|
|
400
|
-
timeoutMs?: number | undefined;
|
|
401
|
-
}>(options: O | undefined) => O & $RefParserOptions<S>;
|
|
108
|
+
export declare const getNewOptions: <S extends object = JSONSchema, O extends ParserOptions<S> = ParserOptions<S>>(options: O | undefined) => O & $RefParserOptions<S>;
|
|
402
109
|
export type Options<S extends object = JSONSchema> = $RefParserOptions<S>;
|
|
403
110
|
export type ParserOptions<S extends object = JSONSchema> = DeepPartial<$RefParserOptions<S>>;
|
|
404
111
|
export default $RefParserOptions;
|
package/dist/lib/parse.js
CHANGED
|
@@ -33,7 +33,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
37
36
|
const url = __importStar(require("./util/url.js"));
|
|
38
37
|
const plugins = __importStar(require("./util/plugins.js"));
|
|
39
38
|
const errors_js_1 = require("./util/errors.js");
|
|
@@ -103,7 +102,7 @@ async function readFile(file, options, $refs) {
|
|
|
103
102
|
}
|
|
104
103
|
else if (!err || !("error" in err)) {
|
|
105
104
|
// Throw a generic, friendly error.
|
|
106
|
-
throw
|
|
105
|
+
throw new SyntaxError(`Unable to resolve $ref pointer "${file.url}"`);
|
|
107
106
|
}
|
|
108
107
|
// Throw the original error, if it's one of our own (user-friendly) errors.
|
|
109
108
|
else if (err.error instanceof errors_js_1.ResolverError) {
|
|
@@ -139,7 +138,7 @@ async function parseFile(file, options, $refs) {
|
|
|
139
138
|
try {
|
|
140
139
|
const parser = await plugins.run(parsers, "parse", file, $refs);
|
|
141
140
|
if (!parser.plugin.allowEmpty && isEmpty(parser.result)) {
|
|
142
|
-
throw
|
|
141
|
+
throw new SyntaxError(`Error parsing "${file.url}" as ${parser.plugin.name}. \nParsed value is empty`);
|
|
143
142
|
}
|
|
144
143
|
else {
|
|
145
144
|
return parser;
|
|
@@ -154,7 +153,7 @@ async function parseFile(file, options, $refs) {
|
|
|
154
153
|
throw err;
|
|
155
154
|
}
|
|
156
155
|
else if (!err || !("error" in err)) {
|
|
157
|
-
throw
|
|
156
|
+
throw new SyntaxError(`Unable to parse ${file.url}`);
|
|
158
157
|
}
|
|
159
158
|
else if (err.error instanceof errors_js_1.ParserError) {
|
|
160
159
|
throw err.error;
|
package/dist/lib/refs.js
CHANGED
|
@@ -36,7 +36,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
40
39
|
const ref_js_1 = __importDefault(require("./ref.js"));
|
|
41
40
|
const url = __importStar(require("./util/url.js"));
|
|
42
41
|
const convert_path_to_posix_1 = __importDefault(require("./util/convert-path-to-posix"));
|
|
@@ -120,7 +119,7 @@ class $Refs {
|
|
|
120
119
|
const withoutHash = url.stripHash(absPath);
|
|
121
120
|
const $ref = this._$refs[withoutHash];
|
|
122
121
|
if (!$ref) {
|
|
123
|
-
throw
|
|
122
|
+
throw new Error(`Error resolving $ref pointer "${path}". \n"${withoutHash}" not found.`);
|
|
124
123
|
}
|
|
125
124
|
$ref.set(absPath, value);
|
|
126
125
|
}
|
|
@@ -163,7 +162,7 @@ class $Refs {
|
|
|
163
162
|
const withoutHash = url.stripHash(absPath);
|
|
164
163
|
const $ref = this._$refs[withoutHash];
|
|
165
164
|
if (!$ref) {
|
|
166
|
-
throw
|
|
165
|
+
throw new Error(`Error resolving $ref pointer "${path}". \n"${withoutHash}" not found.`);
|
|
167
166
|
}
|
|
168
167
|
return $ref.resolve(absPath, options, path, pathFromRoot);
|
|
169
168
|
}
|
|
@@ -37,7 +37,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const fs_1 = __importDefault(require("fs"));
|
|
40
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
41
40
|
const url = __importStar(require("../util/url.js"));
|
|
42
41
|
const errors_js_1 = require("../util/errors.js");
|
|
43
42
|
exports.default = {
|
|
@@ -62,13 +61,17 @@ exports.default = {
|
|
|
62
61
|
path = url.toFileSystemPath(file.url);
|
|
63
62
|
}
|
|
64
63
|
catch (err) {
|
|
65
|
-
|
|
64
|
+
const e = err;
|
|
65
|
+
e.message = `Malformed URI: ${file.url}: ${e.message}`;
|
|
66
|
+
throw new errors_js_1.ResolverError(e, file.url);
|
|
66
67
|
}
|
|
67
68
|
try {
|
|
68
69
|
return await fs_1.default.promises.readFile(path);
|
|
69
70
|
}
|
|
70
71
|
catch (err) {
|
|
71
|
-
|
|
72
|
+
const e = err;
|
|
73
|
+
e.message = `Error opening file ${path}: ${e.message}`;
|
|
74
|
+
throw new errors_js_1.ResolverError(e, path);
|
|
72
75
|
}
|
|
73
76
|
},
|
|
74
77
|
};
|
|
@@ -33,7 +33,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
37
36
|
const url = __importStar(require("../util/url.js"));
|
|
38
37
|
const errors_js_1 = require("../util/errors.js");
|
|
39
38
|
exports.default = {
|
|
@@ -97,14 +96,20 @@ async function download(u, httpOptions, _redirects) {
|
|
|
97
96
|
try {
|
|
98
97
|
const res = await get(u, httpOptions);
|
|
99
98
|
if (res.status >= 400) {
|
|
100
|
-
|
|
99
|
+
const error = new Error(`HTTP ERROR ${res.status}`);
|
|
100
|
+
error.status = res.status;
|
|
101
|
+
throw error;
|
|
101
102
|
}
|
|
102
103
|
else if (res.status >= 300) {
|
|
103
104
|
if (!Number.isNaN(httpOptions.redirects) && redirects.length > httpOptions.redirects) {
|
|
104
|
-
|
|
105
|
+
const error = new Error(`Error downloading ${redirects[0]}. \nToo many redirects: \n ${redirects.join(" \n ")}`);
|
|
106
|
+
error.status = res.status;
|
|
107
|
+
throw new errors_js_1.ResolverError(error);
|
|
105
108
|
}
|
|
106
109
|
else if (!("location" in res.headers) || !res.headers.location) {
|
|
107
|
-
|
|
110
|
+
const error = new Error(`HTTP ${res.status} redirect with no location header`);
|
|
111
|
+
error.status = res.status;
|
|
112
|
+
throw error;
|
|
108
113
|
}
|
|
109
114
|
else {
|
|
110
115
|
const redirectTo = url.resolve(u.href, res.headers.location);
|
|
@@ -120,7 +125,9 @@ async function download(u, httpOptions, _redirects) {
|
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
127
|
catch (err) {
|
|
123
|
-
|
|
128
|
+
const e = err;
|
|
129
|
+
e.message = `Error downloading ${u.href}: ${e.message}`;
|
|
130
|
+
throw new errors_js_1.ResolverError(e, u.href);
|
|
124
131
|
}
|
|
125
132
|
}
|
|
126
133
|
/**
|
|
@@ -2,6 +2,16 @@ import type $RefParser from "../index.js";
|
|
|
2
2
|
import type { ParserOptions } from "../index.js";
|
|
3
3
|
import type { JSONSchema } from "../index.js";
|
|
4
4
|
export type JSONParserErrorType = "EUNKNOWN" | "EPARSER" | "EUNMATCHEDPARSER" | "ETIMEOUT" | "ERESOLVER" | "EUNMATCHEDRESOLVER" | "EMISSINGPOINTER" | "EINVALIDPOINTER";
|
|
5
|
+
/**
|
|
6
|
+
* Custom JSON serializer for Error objects.
|
|
7
|
+
* Returns all built-in error properties, as well as extended properties.
|
|
8
|
+
*/
|
|
9
|
+
export declare function toJSON<T extends Error>(this: T): Error & T;
|
|
10
|
+
/**
|
|
11
|
+
* Returns own, inherited, enumerable, non-enumerable, string, and symbol keys of `obj`.
|
|
12
|
+
* Does NOT return members of the base Object prototype, or the specified omitted keys.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDeepKeys(obj: object, omit?: Array<string | symbol>): Set<string | symbol>;
|
|
5
15
|
export declare class JSONParserError extends Error {
|
|
6
16
|
readonly name: string;
|
|
7
17
|
readonly message: string;
|
|
@@ -9,11 +19,13 @@ export declare class JSONParserError extends Error {
|
|
|
9
19
|
path: Array<string | number> | null;
|
|
10
20
|
readonly code: JSONParserErrorType;
|
|
11
21
|
constructor(message: string, source?: string);
|
|
22
|
+
toJSON: () => Error;
|
|
12
23
|
get footprint(): string;
|
|
13
24
|
}
|
|
14
25
|
export declare class JSONParserErrorGroup<S extends object = JSONSchema, O extends ParserOptions<S> = ParserOptions<S>> extends Error {
|
|
15
26
|
files: $RefParser<S, O>;
|
|
16
27
|
constructor(parser: $RefParser<S, O>);
|
|
28
|
+
toJSON: () => Error;
|
|
17
29
|
static getParserErrors<S extends object = JSONSchema, O extends ParserOptions<S> = ParserOptions<S>>(parser: $RefParser<S, O>): JSONParserError[];
|
|
18
30
|
get errors(): Array<JSONParserError | InvalidPointerError | ResolverError | ParserError | MissingPointerError | UnmatchedParserError | UnmatchedResolverError>;
|
|
19
31
|
}
|
package/dist/lib/util/errors.js
CHANGED
|
@@ -1,19 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InvalidPointerError = exports.TimeoutError = exports.MissingPointerError = exports.UnmatchedResolverError = exports.ResolverError = exports.UnmatchedParserError = exports.ParserError = exports.JSONParserErrorGroup = exports.JSONParserError = void 0;
|
|
4
|
+
exports.toJSON = toJSON;
|
|
5
|
+
exports.getDeepKeys = getDeepKeys;
|
|
4
6
|
exports.isHandledError = isHandledError;
|
|
5
7
|
exports.normalizeError = normalizeError;
|
|
6
|
-
const ono_1 = require("@jsdevtools/ono");
|
|
7
8
|
const url_js_1 = require("./url.js");
|
|
9
|
+
const nonJsonTypes = ["function", "symbol", "undefined"];
|
|
10
|
+
const protectedProps = ["constructor", "prototype", "__proto__"];
|
|
11
|
+
const objectPrototype = Object.getPrototypeOf({});
|
|
12
|
+
/**
|
|
13
|
+
* Custom JSON serializer for Error objects.
|
|
14
|
+
* Returns all built-in error properties, as well as extended properties.
|
|
15
|
+
*/
|
|
16
|
+
function toJSON() {
|
|
17
|
+
// HACK: We have to cast the objects to `any` so we can use symbol indexers.
|
|
18
|
+
// see https://github.com/Microsoft/TypeScript/issues/1863
|
|
19
|
+
const pojo = {};
|
|
20
|
+
const error = this;
|
|
21
|
+
for (const key of getDeepKeys(error)) {
|
|
22
|
+
if (typeof key === "string") {
|
|
23
|
+
const value = error[key];
|
|
24
|
+
const type = typeof value;
|
|
25
|
+
if (!nonJsonTypes.includes(type)) {
|
|
26
|
+
pojo[key] = value;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return pojo;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns own, inherited, enumerable, non-enumerable, string, and symbol keys of `obj`.
|
|
34
|
+
* Does NOT return members of the base Object prototype, or the specified omitted keys.
|
|
35
|
+
*/
|
|
36
|
+
function getDeepKeys(obj, omit = []) {
|
|
37
|
+
let keys = [];
|
|
38
|
+
// Crawl the prototype chain, finding all the string and symbol keys
|
|
39
|
+
while (obj && obj !== objectPrototype) {
|
|
40
|
+
keys = keys.concat(Object.getOwnPropertyNames(obj), Object.getOwnPropertySymbols(obj));
|
|
41
|
+
obj = Object.getPrototypeOf(obj);
|
|
42
|
+
}
|
|
43
|
+
// De-duplicate the list of keys
|
|
44
|
+
const uniqueKeys = new Set(keys);
|
|
45
|
+
// Remove any omitted keys
|
|
46
|
+
for (const key of omit.concat(protectedProps)) {
|
|
47
|
+
uniqueKeys.delete(key);
|
|
48
|
+
}
|
|
49
|
+
return uniqueKeys;
|
|
50
|
+
}
|
|
8
51
|
class JSONParserError extends Error {
|
|
9
52
|
constructor(message, source) {
|
|
10
53
|
super();
|
|
54
|
+
this.toJSON = toJSON.bind(this);
|
|
11
55
|
this.code = "EUNKNOWN";
|
|
12
56
|
this.name = "JSONParserError";
|
|
13
57
|
this.message = message;
|
|
14
58
|
this.source = source;
|
|
15
59
|
this.path = null;
|
|
16
|
-
ono_1.Ono.extend(this);
|
|
17
60
|
}
|
|
18
61
|
get footprint() {
|
|
19
62
|
return `${this.path}+${this.source}+${this.code}+${this.message}`;
|
|
@@ -23,10 +66,10 @@ exports.JSONParserError = JSONParserError;
|
|
|
23
66
|
class JSONParserErrorGroup extends Error {
|
|
24
67
|
constructor(parser) {
|
|
25
68
|
super();
|
|
69
|
+
this.toJSON = toJSON.bind(this);
|
|
26
70
|
this.files = parser;
|
|
27
71
|
this.name = "JSONParserErrorGroup";
|
|
28
72
|
this.message = `${this.errors.length} error${this.errors.length > 1 ? "s" : ""} occurred while reading '${(0, url_js_1.toFileSystemPath)(parser.$refs._root$Ref.path)}'`;
|
|
29
|
-
ono_1.Ono.extend(this);
|
|
30
73
|
}
|
|
31
74
|
static getParserErrors(parser) {
|
|
32
75
|
const errors = [];
|
package/lib/dereference.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import $Ref from "./ref.js";
|
|
2
2
|
import Pointer from "./pointer.js";
|
|
3
|
-
import { ono } from "@jsdevtools/ono";
|
|
4
3
|
import * as url from "./util/url.js";
|
|
5
4
|
import type $Refs from "./refs.js";
|
|
6
5
|
import type { DereferenceOptions, ParserOptions } from "./options.js";
|
|
@@ -355,7 +354,8 @@ function foundCircularReference(keyPath: any, $refs: any, options: any) {
|
|
|
355
354
|
options?.dereference?.onCircular?.(keyPath);
|
|
356
355
|
|
|
357
356
|
if (!options.dereference.circular) {
|
|
358
|
-
|
|
357
|
+
const error = new ReferenceError(`Circular $ref pointer found at ${keyPath}`);
|
|
358
|
+
throw error;
|
|
359
359
|
}
|
|
360
360
|
return true;
|
|
361
361
|
}
|
package/lib/index.ts
CHANGED
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
isHandledError,
|
|
17
17
|
JSONParserErrorGroup,
|
|
18
18
|
} from "./util/errors.js";
|
|
19
|
-
import { ono } from "@jsdevtools/ono";
|
|
20
19
|
import maybe from "./util/maybe.js";
|
|
21
20
|
import type { ParserOptions } from "./options.js";
|
|
22
21
|
import { getJsonSchemaRefParserDefaultOptions } from "./options.js";
|
|
@@ -77,7 +76,7 @@ export class $RefParser<S extends object = JSONSchema, O extends ParserOptions<S
|
|
|
77
76
|
let promise;
|
|
78
77
|
|
|
79
78
|
if (!args.path && !args.schema) {
|
|
80
|
-
const err =
|
|
79
|
+
const err = new Error(`Expected a file path, URL, or object. Got ${args.path || args.schema}`);
|
|
81
80
|
return maybe(args.callback, Promise.reject(err));
|
|
82
81
|
}
|
|
83
82
|
|
|
@@ -129,7 +128,7 @@ export class $RefParser<S extends object = JSONSchema, O extends ParserOptions<S
|
|
|
129
128
|
this.schema = null; // it's already set to null at line 79, but let's set it again for the sake of readability
|
|
130
129
|
return maybe(args.callback, Promise.resolve(this.schema!));
|
|
131
130
|
} else {
|
|
132
|
-
throw
|
|
131
|
+
throw new SyntaxError(`"${this.$refs._root$Ref.path || result}" is not a valid JSON Schema`);
|
|
133
132
|
}
|
|
134
133
|
} catch (err) {
|
|
135
134
|
if (!args.options.continueOnError || !isHandledError(err)) {
|
package/lib/parse.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ono } from "@jsdevtools/ono";
|
|
2
1
|
import * as url from "./util/url.js";
|
|
3
2
|
import * as plugins from "./util/plugins.js";
|
|
4
3
|
import {
|
|
@@ -92,7 +91,7 @@ async function readFile<S extends object = JSONSchema, O extends ParserOptions<S
|
|
|
92
91
|
throw new UnmatchedResolverError(file.url);
|
|
93
92
|
} else if (!err || !("error" in err)) {
|
|
94
93
|
// Throw a generic, friendly error.
|
|
95
|
-
throw
|
|
94
|
+
throw new SyntaxError(`Unable to resolve $ref pointer "${file.url}"`);
|
|
96
95
|
}
|
|
97
96
|
// Throw the original error, if it's one of our own (user-friendly) errors.
|
|
98
97
|
else if (err.error instanceof ResolverError) {
|
|
@@ -133,7 +132,7 @@ async function parseFile<S extends object = JSONSchema, O extends ParserOptions<
|
|
|
133
132
|
try {
|
|
134
133
|
const parser = await plugins.run<S, O>(parsers, "parse", file, $refs);
|
|
135
134
|
if (!parser.plugin.allowEmpty && isEmpty(parser.result)) {
|
|
136
|
-
throw
|
|
135
|
+
throw new SyntaxError(`Error parsing "${file.url}" as ${parser.plugin.name}. \nParsed value is empty`);
|
|
137
136
|
} else {
|
|
138
137
|
return parser;
|
|
139
138
|
}
|
|
@@ -144,7 +143,7 @@ async function parseFile<S extends object = JSONSchema, O extends ParserOptions<
|
|
|
144
143
|
} else if (err && err.message && err.message.startsWith("Error parsing")) {
|
|
145
144
|
throw err;
|
|
146
145
|
} else if (!err || !("error" in err)) {
|
|
147
|
-
throw
|
|
146
|
+
throw new SyntaxError(`Unable to parse ${file.url}`);
|
|
148
147
|
} else if (err.error instanceof ParserError) {
|
|
149
148
|
throw err.error;
|
|
150
149
|
} else {
|
package/lib/refs.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ono } from "@jsdevtools/ono";
|
|
2
1
|
import $Ref from "./ref.js";
|
|
3
2
|
import * as url from "./util/url.js";
|
|
4
3
|
import type { JSONSchema4Type, JSONSchema6Type, JSONSchema7Type } from "json-schema";
|
|
@@ -100,7 +99,7 @@ export default class $Refs<S extends object = JSONSchema, O extends ParserOption
|
|
|
100
99
|
const $ref = this._$refs[withoutHash];
|
|
101
100
|
|
|
102
101
|
if (!$ref) {
|
|
103
|
-
throw
|
|
102
|
+
throw new Error(`Error resolving $ref pointer "${path}". \n"${withoutHash}" not found.`);
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
$ref.set(absPath, value);
|
|
@@ -150,7 +149,7 @@ export default class $Refs<S extends object = JSONSchema, O extends ParserOption
|
|
|
150
149
|
const $ref = this._$refs[withoutHash];
|
|
151
150
|
|
|
152
151
|
if (!$ref) {
|
|
153
|
-
throw
|
|
152
|
+
throw new Error(`Error resolving $ref pointer "${path}". \n"${withoutHash}" not found.`);
|
|
154
153
|
}
|
|
155
154
|
|
|
156
155
|
return $ref.resolve(absPath, options, path, pathFromRoot);
|
package/lib/resolvers/file.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
|
-
import { ono } from "@jsdevtools/ono";
|
|
3
2
|
import * as url from "../util/url.js";
|
|
4
3
|
import { ResolverError } from "../util/errors.js";
|
|
5
4
|
import type { JSONSchema, ResolverOptions } from "../types/index.js";
|
|
@@ -28,12 +27,16 @@ export default {
|
|
|
28
27
|
try {
|
|
29
28
|
path = url.toFileSystemPath(file.url);
|
|
30
29
|
} catch (err: any) {
|
|
31
|
-
|
|
30
|
+
const e = err as Error;
|
|
31
|
+
e.message = `Malformed URI: ${file.url}: ${e.message}`;
|
|
32
|
+
throw new ResolverError(e, file.url);
|
|
32
33
|
}
|
|
33
34
|
try {
|
|
34
35
|
return await fs.promises.readFile(path);
|
|
35
36
|
} catch (err: any) {
|
|
36
|
-
|
|
37
|
+
const e = err as Error;
|
|
38
|
+
e.message = `Error opening file ${path}: ${e.message}`;
|
|
39
|
+
throw new ResolverError(e, path);
|
|
37
40
|
}
|
|
38
41
|
},
|
|
39
42
|
} as ResolverOptions<JSONSchema>;
|
package/lib/resolvers/http.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ono } from "@jsdevtools/ono";
|
|
2
1
|
import * as url from "../util/url.js";
|
|
3
2
|
import { ResolverError } from "../util/errors.js";
|
|
4
3
|
import type { FileInfo, HTTPResolverOptions, JSONSchema } from "../types/index.js";
|
|
@@ -78,17 +77,20 @@ async function download<S extends object = JSONSchema>(
|
|
|
78
77
|
try {
|
|
79
78
|
const res = await get(u, httpOptions);
|
|
80
79
|
if (res.status >= 400) {
|
|
81
|
-
|
|
80
|
+
const error = new Error(`HTTP ERROR ${res.status}`) as Error & { status?: number };
|
|
81
|
+
error.status = res.status;
|
|
82
|
+
throw error;
|
|
82
83
|
} else if (res.status >= 300) {
|
|
83
84
|
if (!Number.isNaN(httpOptions.redirects) && redirects.length > httpOptions.redirects!) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
);
|
|
85
|
+
const error = new Error(
|
|
86
|
+
`Error downloading ${redirects[0]}. \nToo many redirects: \n ${redirects.join(" \n ")}`,
|
|
87
|
+
) as Error & { status?: number };
|
|
88
|
+
error.status = res.status;
|
|
89
|
+
throw new ResolverError(error);
|
|
90
90
|
} else if (!("location" in res.headers) || !res.headers.location) {
|
|
91
|
-
|
|
91
|
+
const error = new Error(`HTTP ${res.status} redirect with no location header`) as Error & { status?: number };
|
|
92
|
+
error.status = res.status;
|
|
93
|
+
throw error;
|
|
92
94
|
} else {
|
|
93
95
|
const redirectTo = url.resolve(u.href, res.headers.location as string);
|
|
94
96
|
return download(redirectTo, httpOptions, redirects);
|
|
@@ -101,7 +103,9 @@ async function download<S extends object = JSONSchema>(
|
|
|
101
103
|
return Buffer.alloc(0);
|
|
102
104
|
}
|
|
103
105
|
} catch (err: any) {
|
|
104
|
-
|
|
106
|
+
const e = err as Error;
|
|
107
|
+
e.message = `Error downloading ${u.href}: ${e.message}`;
|
|
108
|
+
throw new ResolverError(e, u.href);
|
|
105
109
|
}
|
|
106
110
|
}
|
|
107
111
|
|
package/lib/util/errors.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Ono } from "@jsdevtools/ono";
|
|
2
1
|
import { getHash, stripHash, toFileSystemPath } from "./url.js";
|
|
3
2
|
import type $RefParser from "../index.js";
|
|
4
3
|
import type { ParserOptions } from "../index.js";
|
|
@@ -14,7 +13,57 @@ export type JSONParserErrorType =
|
|
|
14
13
|
| "EUNMATCHEDRESOLVER"
|
|
15
14
|
| "EMISSINGPOINTER"
|
|
16
15
|
| "EINVALIDPOINTER";
|
|
16
|
+
const nonJsonTypes = ["function", "symbol", "undefined"];
|
|
17
|
+
const protectedProps = ["constructor", "prototype", "__proto__"];
|
|
18
|
+
const objectPrototype = Object.getPrototypeOf({});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Custom JSON serializer for Error objects.
|
|
22
|
+
* Returns all built-in error properties, as well as extended properties.
|
|
23
|
+
*/
|
|
24
|
+
export function toJSON<T extends Error>(this: T): Error & T {
|
|
25
|
+
// HACK: We have to cast the objects to `any` so we can use symbol indexers.
|
|
26
|
+
// see https://github.com/Microsoft/TypeScript/issues/1863
|
|
27
|
+
const pojo: any = {};
|
|
28
|
+
const error = this as any;
|
|
29
|
+
|
|
30
|
+
for (const key of getDeepKeys(error)) {
|
|
31
|
+
if (typeof key === "string") {
|
|
32
|
+
const value = error[key];
|
|
33
|
+
const type = typeof value;
|
|
34
|
+
|
|
35
|
+
if (!nonJsonTypes.includes(type)) {
|
|
36
|
+
pojo[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return pojo as Error & T;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Returns own, inherited, enumerable, non-enumerable, string, and symbol keys of `obj`.
|
|
46
|
+
* Does NOT return members of the base Object prototype, or the specified omitted keys.
|
|
47
|
+
*/
|
|
48
|
+
export function getDeepKeys(obj: object, omit: Array<string | symbol> = []): Set<string | symbol> {
|
|
49
|
+
let keys: Array<string | symbol> = [];
|
|
50
|
+
|
|
51
|
+
// Crawl the prototype chain, finding all the string and symbol keys
|
|
52
|
+
while (obj && obj !== objectPrototype) {
|
|
53
|
+
keys = keys.concat(Object.getOwnPropertyNames(obj), Object.getOwnPropertySymbols(obj));
|
|
54
|
+
obj = Object.getPrototypeOf(obj) as object;
|
|
55
|
+
}
|
|
17
56
|
|
|
57
|
+
// De-duplicate the list of keys
|
|
58
|
+
const uniqueKeys = new Set(keys);
|
|
59
|
+
|
|
60
|
+
// Remove any omitted keys
|
|
61
|
+
for (const key of omit.concat(protectedProps)) {
|
|
62
|
+
uniqueKeys.delete(key);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return uniqueKeys;
|
|
66
|
+
}
|
|
18
67
|
export class JSONParserError extends Error {
|
|
19
68
|
public readonly name: string;
|
|
20
69
|
public readonly message: string;
|
|
@@ -29,10 +78,10 @@ export class JSONParserError extends Error {
|
|
|
29
78
|
this.message = message;
|
|
30
79
|
this.source = source;
|
|
31
80
|
this.path = null;
|
|
32
|
-
|
|
33
|
-
Ono.extend(this);
|
|
34
81
|
}
|
|
35
82
|
|
|
83
|
+
toJSON = toJSON.bind(this);
|
|
84
|
+
|
|
36
85
|
get footprint() {
|
|
37
86
|
return `${this.path}+${this.source}+${this.code}+${this.message}`;
|
|
38
87
|
}
|
|
@@ -52,9 +101,8 @@ export class JSONParserErrorGroup<
|
|
|
52
101
|
this.message = `${this.errors.length} error${
|
|
53
102
|
this.errors.length > 1 ? "s" : ""
|
|
54
103
|
} occurred while reading '${toFileSystemPath(parser.$refs._root$Ref!.path)}'`;
|
|
55
|
-
|
|
56
|
-
Ono.extend(this);
|
|
57
104
|
}
|
|
105
|
+
toJSON = toJSON.bind(this);
|
|
58
106
|
|
|
59
107
|
static getParserErrors<S extends object = JSONSchema, O extends ParserOptions<S> = ParserOptions<S>>(
|
|
60
108
|
parser: $RefParser<S, O>,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apidevtools/json-schema-ref-parser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "Parse, Resolve, and Dereference JSON Schema $ref pointers",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepublishOnly": "yarn build",
|
|
@@ -67,32 +67,31 @@
|
|
|
67
67
|
"cjs"
|
|
68
68
|
],
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@eslint/compat": "^1.2.
|
|
71
|
-
"@eslint/js": "^9.
|
|
70
|
+
"@eslint/compat": "^1.2.9",
|
|
71
|
+
"@eslint/js": "^9.28.0",
|
|
72
72
|
"@types/eslint": "^9.6.1",
|
|
73
73
|
"@types/js-yaml": "^4.0.9",
|
|
74
74
|
"@types/node": "^22",
|
|
75
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
76
|
-
"@typescript-eslint/parser": "^8.
|
|
77
|
-
"@vitest/coverage-v8": "^3.
|
|
75
|
+
"@typescript-eslint/eslint-plugin": "^8.33.1",
|
|
76
|
+
"@typescript-eslint/parser": "^8.33.1",
|
|
77
|
+
"@vitest/coverage-v8": "^3.2.1",
|
|
78
78
|
"cross-env": "^7.0.3",
|
|
79
|
-
"eslint": "^9.
|
|
80
|
-
"eslint-config-prettier": "^10.
|
|
79
|
+
"eslint": "^9.28.0",
|
|
80
|
+
"eslint-config-prettier": "^10.1.5",
|
|
81
81
|
"eslint-config-standard": "^17.1.0",
|
|
82
82
|
"eslint-plugin-import": "^2.31.0",
|
|
83
|
-
"eslint-plugin-prettier": "^5.
|
|
83
|
+
"eslint-plugin-prettier": "^5.4.1",
|
|
84
84
|
"eslint-plugin-promise": "^7.2.1",
|
|
85
85
|
"eslint-plugin-unused-imports": "^4.1.4",
|
|
86
|
-
"globals": "^
|
|
87
|
-
"jsdom": "^26.
|
|
88
|
-
"prettier": "^3.
|
|
86
|
+
"globals": "^16.2.0",
|
|
87
|
+
"jsdom": "^26.1.0",
|
|
88
|
+
"prettier": "^3.5.3",
|
|
89
89
|
"rimraf": "^6.0.1",
|
|
90
|
-
"typescript": "^5.
|
|
91
|
-
"typescript-eslint": "^8.
|
|
92
|
-
"vitest": "^3.
|
|
90
|
+
"typescript": "^5.8.3",
|
|
91
|
+
"typescript-eslint": "^8.33.1",
|
|
92
|
+
"vitest": "^3.2.1"
|
|
93
93
|
},
|
|
94
94
|
"dependencies": {
|
|
95
|
-
"@jsdevtools/ono": "^7.1.3",
|
|
96
95
|
"@types/json-schema": "^7.0.15",
|
|
97
96
|
"js-yaml": "^4.1.0"
|
|
98
97
|
},
|
|
@@ -107,5 +106,5 @@
|
|
|
107
106
|
"@semantic-release/github"
|
|
108
107
|
]
|
|
109
108
|
},
|
|
110
|
-
"packageManager": "yarn@4.
|
|
109
|
+
"packageManager": "yarn@4.9.1"
|
|
111
110
|
}
|