Make mergers natively composable (within the same merge-by-template version)

master
Sven Slootweg 4 years ago
parent 8a0ae87334
commit ca863b026d

@ -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 */

Loading…
Cancel
Save