melt
Version:
The next generation of Melt UI. Built for Svelte 5.
31 lines (30 loc) • 1.23 kB
JavaScript
function isPlainObject(value) {
return (value !== null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype);
}
export function deepMerge(target, source) {
const result = { ...target };
for (const key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
const sourceValue = source[key];
const targetValue = result[key];
// Handle arrays - merge them
if (Array.isArray(sourceValue)) {
result[key] = Array.isArray(targetValue)
? [...targetValue, ...sourceValue]
: [...sourceValue];
continue;
}
// Handle plain objects (not null, not arrays, not class instances)
if (isPlainObject(sourceValue)) {
result[key] =
Object.prototype.hasOwnProperty.call(result, key) && isPlainObject(result[key])
? deepMerge(result[key], sourceValue)
: deepMerge({}, sourceValue);
continue;
}
// Handle primitives and everything else
result[key] = sourceValue;
}
}
return result;
}