refactor: MissingRefError class, closes #348
parent
d0c5a3904d
commit
84bee02a61
|
@ -30,7 +30,9 @@ Ajv.prototype._addSchema = _addSchema;
|
||||||
Ajv.prototype._compile = _compile;
|
Ajv.prototype._compile = _compile;
|
||||||
|
|
||||||
|
|
||||||
Ajv.ValidationError = require('./compile/validation_error');
|
var errorClasses = require('./compile/error_classes');
|
||||||
|
Ajv.ValidationError = errorClasses.Validation;
|
||||||
|
Ajv.MissingRefError = errorClasses.MissingRef;
|
||||||
|
|
||||||
var META_SCHEMA_ID = 'http://json-schema.org/draft-04/schema';
|
var META_SCHEMA_ID = 'http://json-schema.org/draft-04/schema';
|
||||||
var SCHEMA_URI_FORMAT = /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i;
|
var SCHEMA_URI_FORMAT = /^(?:(?:[a-z][a-z0-9+-.]*:)?\/\/)?[^\s]*$/i;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var MissingRefError = require('./error_classes').MissingRef;
|
||||||
|
|
||||||
module.exports = compileAsync;
|
module.exports = compileAsync;
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,8 +53,8 @@ function compileAsync(schema, meta, callback) {
|
||||||
function _compileAsync(schemaObj) {
|
function _compileAsync(schemaObj) {
|
||||||
try { return self._compile(schemaObj); }
|
try { return self._compile(schemaObj); }
|
||||||
catch(e) {
|
catch(e) {
|
||||||
if (!e.missingSchema) throw e;
|
if (e instanceof MissingRefError) return loadMissingSchema(e);
|
||||||
return loadMissingSchema(e);
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var resolve = require('./resolve');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
Validation: errorSubclass(ValidationError),
|
||||||
|
MissingRef: errorSubclass(MissingRefError)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function ValidationError(errors) {
|
||||||
|
this.message = 'validation failed';
|
||||||
|
this.errors = errors;
|
||||||
|
this.ajv = this.validation = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MissingRefError.message = function (baseId, ref) {
|
||||||
|
return 'can\'t resolve reference ' + ref + ' from id ' + baseId;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function MissingRefError(baseId, ref, message) {
|
||||||
|
this.message = message || MissingRefError.message(baseId, ref);
|
||||||
|
this.missingRef = resolve.url(baseId, ref);
|
||||||
|
this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function errorSubclass(Subclass) {
|
||||||
|
Subclass.prototype = Object.create(Error.prototype);
|
||||||
|
Subclass.prototype.constructor = Subclass;
|
||||||
|
return Subclass;
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
var resolve = require('./resolve')
|
var resolve = require('./resolve')
|
||||||
, util = require('./util')
|
, util = require('./util')
|
||||||
|
, errorClasses = require('./error_classes')
|
||||||
, stableStringify = require('json-stable-stringify')
|
, stableStringify = require('json-stable-stringify')
|
||||||
, async = require('../async');
|
, async = require('../async');
|
||||||
|
|
||||||
|
@ -25,7 +26,7 @@ var ucs2length = util.ucs2length;
|
||||||
var equal = require('./equal');
|
var equal = require('./equal');
|
||||||
|
|
||||||
// this error is thrown by async schemas to return validation errors via exception
|
// this error is thrown by async schemas to return validation errors via exception
|
||||||
var ValidationError = require('./validation_error');
|
var ValidationError = errorClasses.Validation;
|
||||||
|
|
||||||
module.exports = compile;
|
module.exports = compile;
|
||||||
|
|
||||||
|
@ -103,6 +104,7 @@ function compile(schema, root, localRefs, baseId) {
|
||||||
schemaPath: '',
|
schemaPath: '',
|
||||||
errSchemaPath: '#',
|
errSchemaPath: '#',
|
||||||
errorPath: '""',
|
errorPath: '""',
|
||||||
|
MissingRefError: errorClasses.MissingRef,
|
||||||
RULES: RULES,
|
RULES: RULES,
|
||||||
validate: validateGenerator,
|
validate: validateGenerator,
|
||||||
util: util,
|
util: util,
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = ValidationError;
|
|
||||||
|
|
||||||
|
|
||||||
function ValidationError(errors) {
|
|
||||||
this.message = 'validation failed';
|
|
||||||
this.errors = errors;
|
|
||||||
this.ajv = this.validation = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ValidationError.prototype = Object.create(Error.prototype);
|
|
||||||
ValidationError.prototype.constructor = ValidationError;
|
|
|
@ -25,7 +25,7 @@
|
||||||
{{??}}
|
{{??}}
|
||||||
{{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}
|
{{ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); }}
|
||||||
{{? $refVal === undefined }}
|
{{? $refVal === undefined }}
|
||||||
{{ var $message = 'can\'t resolve reference ' + $schema + ' from id ' + it.baseId; }}
|
{{ var $message = it.MissingRefError.message(it.baseId, $schema); }}
|
||||||
{{? it.opts.missingRefs == 'fail' }}
|
{{? it.opts.missingRefs == 'fail' }}
|
||||||
{{ console.error($message); }}
|
{{ console.error($message); }}
|
||||||
{{# def.error:'$ref' }}
|
{{# def.error:'$ref' }}
|
||||||
|
@ -34,12 +34,7 @@
|
||||||
{{ console.warn($message); }}
|
{{ console.warn($message); }}
|
||||||
{{? $breakOnError }} if (true) { {{?}}
|
{{? $breakOnError }} if (true) { {{?}}
|
||||||
{{??}}
|
{{??}}
|
||||||
{{
|
{{ throw new it.MissingRefError(it.baseId, $schema, $message); }}
|
||||||
var $error = new Error($message);
|
|
||||||
$error.missingRef = it.resolve.url(it.baseId, $schema);
|
|
||||||
$error.missingSchema = it.resolve.normalizeId(it.resolve.fullPath($error.missingRef));
|
|
||||||
throw $error;
|
|
||||||
}}
|
|
||||||
{{?}}
|
{{?}}
|
||||||
{{?? $refVal.inline }}
|
{{?? $refVal.inline }}
|
||||||
{{# def.setupNextLevel }}
|
{{# def.setupNextLevel }}
|
||||||
|
|
Loading…
Reference in New Issue