hypertune
Version:
[Hypertune](https://www.hypertune.com/) is the most flexible platform for feature flags, A/B testing, analytics and app configuration. Built with full end-to-end type-safety, Git-style version control and local, synchronous, in-memory flag evaluation. Opt
49 lines • 1.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = merge;
/**
* merge recursively merges sources into value, returning a value.
*/
function merge(value, ...sources) {
return sources.reduce((currentValue, source) => {
return mergeSource(currentValue, source);
}, value);
}
function mergeSource(value, source) {
if (source === null || source === undefined) {
return value; // No override specified so we just return the value.
}
if (Array.isArray(value) && Array.isArray(source)) {
return mergeArraySource(value, source);
}
if (!Array.isArray(value) &&
!Array.isArray(source) &&
typeof value === "object" &&
typeof source === "object") {
return mergeObjectSource(value, source);
}
return source;
}
function mergeArraySource(value, source) {
// No null or undefined values indicate that we should override the list length.
const overrideLength = !source.some((item) => item === undefined || item === null);
if (overrideLength) {
return source.map((itemOverride, index) => mergeSource(value[index], itemOverride));
}
// Add extra items to the end in case override array is longer than value array.
return ([...value, ...source.slice(value.length)]
.map((itemValue, index) => mergeSource(itemValue, source[index]))
// Remove any null or undefined values that are beyond the original list length.
.filter((item) => item !== null && item !== undefined));
}
function mergeObjectSource(value, override) {
return Object.fromEntries(Object.entries(value)
.map(([fieldName, field]) => [
fieldName,
mergeSource(field, override[fieldName]),
])
.concat(
// Add any additional fields from the override to the object.
Object.entries(override).filter(([fieldName]) => !(fieldName in value))));
}
//# sourceMappingURL=merge.js.map