UNPKG

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
"use strict"; 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