@studion/infra-code-blocks
Version:
Studion common infra components
44 lines (43 loc) • 1.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeWithDefaults = mergeWithDefaults;
function isPlainObject(value) {
if (value === null || typeof value !== 'object') {
return false;
}
const prototype = Object.getPrototypeOf(value);
return prototype === Object.prototype || prototype === null;
}
function mergeObjects(defaults, args) {
const result = { ...defaults };
for (const [key, value] of Object.entries(args)) {
if (value === undefined) {
continue;
}
const defaultValue = defaults[key];
result[key] =
isPlainObject(defaultValue) && isPlainObject(value)
? mergeObjects(defaultValue, value)
: value;
}
return result;
}
/**
* Merges `args` into `defaults`, recursively merging plain-object values.
*
* `undefined` values in `args` are ignored, including inside nested objects.
* Arrays, `null`, and non-plain objects are treated as replacement values and
* are not recursively merged.
*
* @example
* const merged = mergeWithDefaults(
* { timeout: 3000, retry: { count: 3, delay: 500 } },
* { retry: { count: 5 } },
* );
*
* console.log(merged);
* // { timeout: 3000, retry: { count: 5, delay: 500 } }
*/
function mergeWithDefaults(defaults, args) {
return mergeObjects(defaults, args);
}