保誠-保戶業務員媒合平台
Tomas
2022-05-19 957a1f10a06fdbb76f1a0ba94fe44126c613fee3
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
67
/*
    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;