You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.3 KiB
136 lines
3.3 KiB
"use strict";
|
|
|
|
const { Ono } = require("@jsdevtools/ono");
|
|
|
|
const { stripHash, toFileSystemPath } = require("./url");
|
|
|
|
const JSONParserError = exports.JSONParserError = class JSONParserError extends Error {
|
|
constructor (message, source) {
|
|
super();
|
|
|
|
this.code = "EUNKNOWN";
|
|
this.message = message;
|
|
this.source = source;
|
|
this.path = null;
|
|
|
|
Ono.extend(this);
|
|
}
|
|
|
|
get footprint () {
|
|
return `${this.path}+${this.source}+${this.code}+${this.message}`;
|
|
}
|
|
};
|
|
|
|
setErrorName(JSONParserError);
|
|
|
|
const JSONParserErrorGroup = exports.JSONParserErrorGroup = class JSONParserErrorGroup extends Error {
|
|
constructor (parser) {
|
|
super();
|
|
|
|
this.files = parser;
|
|
this.message = `${this.errors.length} error${this.errors.length > 1 ? "s" : ""} occurred while reading '${toFileSystemPath(parser.$refs._root$Ref.path)}'`;
|
|
|
|
Ono.extend(this);
|
|
}
|
|
|
|
static getParserErrors (parser) {
|
|
const errors = [];
|
|
|
|
for (const $ref of Object.values(parser.$refs._$refs)) {
|
|
if ($ref.errors) {
|
|
errors.push(...$ref.errors);
|
|
}
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
get errors () {
|
|
return JSONParserErrorGroup.getParserErrors(this.files);
|
|
}
|
|
};
|
|
|
|
setErrorName(JSONParserErrorGroup);
|
|
|
|
const ParserError = exports.ParserError = class ParserError extends JSONParserError {
|
|
constructor (message, source) {
|
|
super(`Error parsing ${source}: ${message}`, source);
|
|
|
|
this.code = "EPARSER";
|
|
}
|
|
};
|
|
|
|
setErrorName(ParserError);
|
|
|
|
const UnmatchedParserError = exports.UnmatchedParserError = class UnmatchedParserError extends JSONParserError {
|
|
constructor (source) {
|
|
super(`Could not find parser for "${source}"`, source);
|
|
|
|
this.code = "EUNMATCHEDPARSER";
|
|
}
|
|
};
|
|
|
|
setErrorName(UnmatchedParserError);
|
|
|
|
const ResolverError = exports.ResolverError = class ResolverError extends JSONParserError {
|
|
constructor (ex, source) {
|
|
super(ex.message || `Error reading file "${source}"`, source);
|
|
|
|
this.code = "ERESOLVER";
|
|
|
|
if ("code" in ex) {
|
|
this.ioErrorCode = String(ex.code);
|
|
}
|
|
}
|
|
};
|
|
|
|
setErrorName(ResolverError);
|
|
|
|
const UnmatchedResolverError = exports.UnmatchedResolverError = class UnmatchedResolverError extends JSONParserError {
|
|
constructor (source) {
|
|
super(`Could not find resolver for "${source}"`, source);
|
|
|
|
this.code = "EUNMATCHEDRESOLVER";
|
|
}
|
|
};
|
|
|
|
setErrorName(UnmatchedResolverError);
|
|
|
|
const MissingPointerError = exports.MissingPointerError = class MissingPointerError extends JSONParserError {
|
|
constructor (token, path) {
|
|
super(`Token "${token}" does not exist.`, stripHash(path));
|
|
|
|
this.code = "EMISSINGPOINTER";
|
|
}
|
|
};
|
|
|
|
setErrorName(MissingPointerError);
|
|
|
|
const InvalidPointerError = exports.InvalidPointerError = class InvalidPointerError extends JSONParserError {
|
|
constructor (pointer, path) {
|
|
super(`Invalid $ref pointer "${pointer}". Pointers must begin with "#/"`, stripHash(path));
|
|
|
|
this.code = "EINVALIDPOINTER";
|
|
}
|
|
};
|
|
|
|
setErrorName(InvalidPointerError);
|
|
|
|
function setErrorName (err) {
|
|
Object.defineProperty(err.prototype, "name", {
|
|
value: err.name,
|
|
enumerable: true,
|
|
});
|
|
}
|
|
|
|
exports.isHandledError = function (err) {
|
|
return err instanceof JSONParserError || err instanceof JSONParserErrorGroup;
|
|
};
|
|
|
|
exports.normalizeError = function (err) {
|
|
if (err.path === null) {
|
|
err.path = [];
|
|
}
|
|
|
|
return err;
|
|
};
|
|
|