validateSchema.js
1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Gajus Kuizinas @gajus
*/
"use strict";
const Ajv = require("ajv");
const ajv = new Ajv({
errorDataPath: "configuration",
allErrors: true,
verbose: true
});
require("ajv-keywords")(ajv, ["instanceof"]);
require("../schemas/ajv.absolutePath")(ajv);
function validateSchema(schema, options) {
if(Array.isArray(options)) {
const errors = options.map((options) => validateObject(schema, options));
errors.forEach((list, idx) => {
list.forEach(function applyPrefix(err) {
err.dataPath = `[${idx}]${err.dataPath}`;
if(err.children) {
err.children.forEach(applyPrefix);
}
});
});
return errors.reduce((arr, items) => {
return arr.concat(items);
}, []);
} else {
return validateObject(schema, options);
}
}
function validateObject(schema, options) {
const validate = ajv.compile(schema);
const valid = validate(options);
return valid ? [] : filterErrors(validate.errors);
}
function filterErrors(errors) {
let newErrors = [];
errors.forEach((err) => {
const dataPath = err.dataPath;
let children = [];
newErrors = newErrors.filter((oldError) => {
if(oldError.dataPath.includes(dataPath)) {
if(oldError.children) {
children = children.concat(oldError.children.slice(0));
}
oldError.children = undefined;
children.push(oldError);
return false;
}
return true;
});
if(children.length) {
err.children = children;
}
newErrors.push(err);
});
return newErrors;
}
module.exports = validateSchema;