mirror of https://github.com/webpack/webpack.git
64 lines
1.5 KiB
JavaScript
64 lines
1.5 KiB
JavaScript
|
/*
|
||
|
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
|
||
|
});
|
||
|
require('ajv-keywords')(ajv);
|
||
|
|
||
|
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 {
|
||
|
return validateObject(schema, options);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function validateObject(schema, options) {
|
||
|
var validate = ajv.compile(schema);
|
||
|
var valid = validate(options);
|
||
|
return valid ? [] : filterErrors(validate.errors);
|
||
|
}
|
||
|
|
||
|
function filterErrors(errors) {
|
||
|
var errorsByDataPath = {};
|
||
|
var newErrors = [];
|
||
|
errors.forEach(function(err) {
|
||
|
var dataPath = err.dataPath;
|
||
|
var key = "$" + dataPath;
|
||
|
if(errorsByDataPath[key]) {
|
||
|
var oldError = errorsByDataPath[key];
|
||
|
var idx = newErrors.indexOf(oldError);
|
||
|
newErrors.splice(idx, 1);
|
||
|
if(oldError.children) {
|
||
|
var children = oldError.children;
|
||
|
delete oldError.children;
|
||
|
children.push(oldError);
|
||
|
err.children = children;
|
||
|
} else {
|
||
|
err.children = [oldError];
|
||
|
}
|
||
|
}
|
||
|
errorsByDataPath[key] = err;
|
||
|
newErrors.push(err);
|
||
|
});
|
||
|
return newErrors;
|
||
|
}
|
||
|
|
||
|
module.exports = validateSchema;
|