@cloudcome/utils-core
Version:
cloudcome core utils
88 lines (87 loc) • 2.14 kB
JavaScript
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
;