12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- 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);
-
- const validateSchema = (schema, options) => {
- if (Array.isArray(options)) {
- const errors = options.map(options => validateObject(schema, options));
- errors.forEach((list, idx) => {
- const applyPrefix = err => {
- err.dataPath = `[${idx}]${err.dataPath}`;
- if (err.children) {
- err.children.forEach(applyPrefix);
- }
- };
- list.forEach(applyPrefix);
- });
- return errors.reduce((arr, items) => {
- return arr.concat(items);
- }, []);
- } else {
- return validateObject(schema, options);
- }
- };
-
- const validateObject = (schema, options) => {
- const validate = ajv.compile(schema);
- const valid = validate(options);
- return valid ? [] : filterErrors(validate.errors);
- };
-
- const filterErrors = errors => {
- let newErrors = [];
- for (const err of errors) {
- 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;
|