|
|
|
@ -22,6 +22,7 @@ const wrapPath = require("@validatem/wrap-path");
|
|
|
|
|
|
|
|
|
|
// FIXME: Make sure to explain the purpose of this in the documentation (multi-step merging, like in zapdb)
|
|
|
|
|
let DeleteValue = Symbol("DeleteValue");
|
|
|
|
|
let Template = Symbol("Template");
|
|
|
|
|
|
|
|
|
|
function wrapValidationPath(basePathSegments, lastProperty, rules) {
|
|
|
|
|
let combinedPath = basePathSegments.concat(virtualProperty(lastProperty));
|
|
|
|
@ -102,12 +103,17 @@ function mergeValue(rule, a, b, path, options) {
|
|
|
|
|
return a;
|
|
|
|
|
}
|
|
|
|
|
} else if (typeof rule === "function") {
|
|
|
|
|
if (effectiveA === undefined) {
|
|
|
|
|
return b;
|
|
|
|
|
} else if (b === undefined) {
|
|
|
|
|
return a;
|
|
|
|
|
if (Template in rule) {
|
|
|
|
|
// This is another merge-by-template merger, the user is attempting to compose them together, so we will just apply the template directly
|
|
|
|
|
return mergeValue(rule[Template], a, b, path, options);
|
|
|
|
|
} else {
|
|
|
|
|
return rule(effectiveA, b, path, options); // FIXME: Do we want to pass the original A to the function instead?
|
|
|
|
|
if (effectiveA === undefined) {
|
|
|
|
|
return b;
|
|
|
|
|
} else if (b === undefined) {
|
|
|
|
|
return a;
|
|
|
|
|
} else {
|
|
|
|
|
return rule(effectiveA, b, path, options); // FIXME: Do we want to pass the original A to the function instead?
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (typeof rule === "object") {
|
|
|
|
|
if (Array.isArray(rule)) {
|
|
|
|
@ -130,7 +136,7 @@ module.exports = {
|
|
|
|
|
}]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return function merge(_items, _options) {
|
|
|
|
|
let merger = function merge(_items, _options) {
|
|
|
|
|
let [ items, mergeOptions ] = validateArguments(arguments, {
|
|
|
|
|
items: [ isArray, removeNullishItems ],
|
|
|
|
|
options: {
|
|
|
|
@ -145,6 +151,10 @@ module.exports = {
|
|
|
|
|
return mergeValue(template, merged, item, [], effectiveOptions);
|
|
|
|
|
}, items[0]);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
merger[Template] = template;
|
|
|
|
|
|
|
|
|
|
return merger;
|
|
|
|
|
},
|
|
|
|
|
anyProperty: function (template) {
|
|
|
|
|
/* Used for cases where an object is used like a key->value map */
|
|
|
|
|