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,
|
|
});
|