UNPKG

@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
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