@pulzar/core
Version:
Next-generation Node.js framework for ultra-fast web applications with zero-reflection DI, GraphQL, WebSockets, events, and edge runtime support
92 lines • 3.31 kB
JavaScript
export function deepMerge(target, source) {
const result = { ...target };
for (const key in source) {
if (source.hasOwnProperty(key)) {
const sourceValue = source[key];
const targetValue = result[key];
if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {
result[key] = deepMerge(targetValue, sourceValue);
}
else if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
result[key] = [...targetValue, ...sourceValue];
}
else if (sourceValue !== undefined) {
result[key] = sourceValue;
}
}
}
return result;
}
export function isObject(value) {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
export function isPlainObject(value) {
return isObject(value) && Object.getPrototypeOf(value) === Object.prototype;
}
/**
* Deep merge with custom strategy
*/
export function deepMergeWithStrategy(target, source, options = {}) {
const { arrayStrategy = "append", objectStrategy = "merge" } = options;
const result = { ...target };
for (const key in source) {
if (source.hasOwnProperty(key)) {
const sourceValue = source[key];
const targetValue = result[key];
if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {
if (objectStrategy === "replace") {
result[key] = sourceValue;
}
else {
result[key] = deepMergeWithStrategy(targetValue, sourceValue, options);
}
}
else if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
switch (arrayStrategy) {
case "replace":
result[key] = sourceValue;
break;
case "prepend":
result[key] = [...sourceValue, ...targetValue];
break;
case "merge":
result[key] = deepMergeArray(targetValue, sourceValue);
break;
default: // append
result[key] = [...targetValue, ...sourceValue];
}
}
else if (sourceValue !== undefined) {
result[key] = sourceValue;
}
}
}
return result;
}
/**
* Merge arrays by deduplicating items
*/
function deepMergeArray(target, source) {
const result = [...target];
for (const item of source) {
if (isPlainObject(item)) {
// For objects, check if similar object exists and merge
const existingIndex = result.findIndex((existing) => isPlainObject(existing) &&
existing.id === item.id);
if (existingIndex >= 0) {
result[existingIndex] = deepMerge(result[existingIndex], item);
}
else {
result.push(item);
}
}
else {
// For primitives, avoid duplicates
if (!result.includes(item)) {
result.push(item);
}
}
}
return result;
}
//# sourceMappingURL=deepMerge.js.map