48 lines
1.2 KiB
JavaScript
48 lines
1.2 KiB
JavaScript
|
const _ = require("lodash");
|
||
|
const ptr = require("json-pointer");
|
||
|
|
||
|
function resolvePointer(data, rootPath, relativePath) {
|
||
|
if (relativePath[0] === "/") return ptr.get(data, relativePath);
|
||
|
|
||
|
const m = relativePath.match(/^(\d+)(.*)/);
|
||
|
relativePath = m[2];
|
||
|
for (let i = 0; i < parseInt(m[1]); i++) {
|
||
|
rootPath = rootPath.replace(/\/[^\/]+$/, "");
|
||
|
}
|
||
|
|
||
|
return ptr.get(data, rootPath + relativePath);
|
||
|
}
|
||
|
|
||
|
module.exports = (ajv) =>
|
||
|
ajv.addKeyword({
|
||
|
keyword: "sumOf",
|
||
|
validate: function validate(
|
||
|
{ list, map },
|
||
|
total,
|
||
|
_parent,
|
||
|
{ rootData, instancePath }
|
||
|
) {
|
||
|
if (list.$data) {
|
||
|
list = resolvePointer(rootData, instancePath, list.$data);
|
||
|
}
|
||
|
|
||
|
if (map) data = _.map(data, map);
|
||
|
|
||
|
if (_.sum(list) === total) return true;
|
||
|
|
||
|
validate.errors = [
|
||
|
{
|
||
|
keyword: "sumOf",
|
||
|
message: "should add up to sum total",
|
||
|
params: {
|
||
|
list,
|
||
|
},
|
||
|
},
|
||
|
];
|
||
|
|
||
|
return false;
|
||
|
},
|
||
|
$data: true,
|
||
|
errors: true,
|
||
|
});
|