webpack/lib/validateSchema.js

66 lines
1.5 KiB
JavaScript
Raw Normal View History

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Gajus Kuizinas @gajus
*/
var Ajv = require("ajv");
var ajv = new Ajv({
errorDataPath: "configuration",
allErrors: true,
verbose: true
});
2016-12-14 18:34:31 +08:00
require("ajv-keywords")(ajv);
2016-11-03 21:52:09 +08:00
function validateSchema(schema, options) {
if(Array.isArray(options)) {
var errors = options.map(validateObject.bind(this, schema));
errors.forEach(function(list, idx) {
list.forEach(function applyPrefix(err) {
err.dataPath = "[" + idx + "]" + err.dataPath;
if(err.children) {
err.children.forEach(applyPrefix);
}
});
});
return errors.reduce(function(arr, items) {
return arr.concat(items);
}, []);
} else {
2016-11-02 06:38:54 +08:00
return validateObject(schema, options);
}
}
2016-11-02 06:38:54 +08:00
function validateObject(schema, options) {
var validate = ajv.compile(schema);
var valid = validate(options);
return valid ? [] : filterErrors(validate.errors);
}
function filterErrors(errors) {
var newErrors = [];
errors.forEach(function(err) {
var dataPath = err.dataPath;
2016-12-14 18:34:31 +08:00
var children = [];
newErrors = newErrors.filter(function(oldError) {
if(oldError.dataPath.indexOf(dataPath) >= 0) {
if(oldError.children) {
oldError.children.forEach(function(child) {
children.push(child);
});
}
oldError.children = undefined;
children.push(oldError);
2016-12-14 18:34:31 +08:00
return false;
}
2016-12-14 18:34:31 +08:00
return true;
});
if(children.length) {
err.children = children;
}
newErrors.push(err);
});
2016-12-14 18:34:31 +08:00
//console.log(JSON.stringify(newErrors, 0, 2));
return newErrors;
}
2016-11-03 21:52:09 +08:00
module.exports = validateSchema;