UNPKG

@cloudcome/utils-core

Version:
88 lines (87 loc) 2.14 kB
"use strict"; const type = require("./type.cjs"); const each = require("./each.cjs"); function _objectMerge(mergeRule, target, ...sources) { const seen = /* @__PURE__ */ new WeakMap(); const { assign, next } = mergeRule; const align = (target2, source) => { const targetType = type.typeIs(target2); const sourceType = type.typeIs(source); if (targetType === sourceType) { return target2; } return sourceType === "array" ? [] : {}; }; const each$1 = (source, iterator) => { if (type.isObject(source)) { each.objectEach(source, iterator); } else { source.forEach(iterator); } }; const merge = (target2, source) => { if (seen.has(source)) { return seen.get(source); } const merged = align(target2, source); seen.set(source, merged); each$1(source, (value, key) => { if (!next({ target: merged, source, key })) { return; } if (type.isObject(value) || type.isArray(value)) { merged[key] = assign({ target: merged, source, key, // @ts-expect-error merge: () => merge(merged[key], value) }); } else { merged[key] = assign({ target: merged, source, key, merge: () => value }); } }); return merged; }; let returnTarget = target; for (const source of sources) { returnTarget = merge(target, source); } return returnTarget; } function objectMerge(target, ...sources) { return _objectMerge( { next() { return true; }, assign({ merge }) { return merge(); } }, target, ...sources ); } function objectDefaults(target, defaults) { return _objectMerge( { next({ target: target2, source, key }) { return target2[key] === void 0 || type.isObject(target2[key]) || type.isArray(target2[key]); }, assign({ merge }) { return merge(); } }, target, defaults ); } exports.objectDefaults = objectDefaults; exports.objectMerge = objectMerge; //# sourceMappingURL=merge.cjs.map