@snipsonian/core
Version:
Core/base reusable javascript code snippets
67 lines (66 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeObjectPropsDeeplyFromSourceToTarget = exports.mergeObjectPropsDeeplyOptionable = void 0;
const isUndefined_1 = require("../is/isUndefined");
const isNull_1 = require("../is/isNull");
const isObjectPure_1 = require("../is/isObjectPure");
const cloneObjectDataProps_1 = require("../object/cloneObjectDataProps");
function mergeObjectPropsDeeply(...sources) {
return mergeObjectPropsDeeplyOptionable({
sources,
});
}
exports.default = mergeObjectPropsDeeply;
function mergeObjectPropsDeeplyOptionable({ options, sources, }) {
const initialValue = {};
return sources.reduce((accumulator, source, index) => {
if (index === 0) {
return (0, cloneObjectDataProps_1.default)(source);
}
return mergeObjectPropsDeeplyFromSourceToTarget({
target: accumulator,
source,
options,
});
}, initialValue);
}
exports.mergeObjectPropsDeeplyOptionable = mergeObjectPropsDeeplyOptionable;
function mergeObjectPropsDeeplyFromSourceToTarget({ target, source, options, }) {
const { ignoreUndefinedSourceProps = true, ignoreNullSourceProps = true, ignoreDifferentTypeSourceProps = true, } = options || {};
if ((0, isUndefined_1.default)(target) || (0, isNull_1.default)(target)) {
return cloneProp(source);
}
if ((0, isUndefined_1.default)(source)) {
return ignoreUndefinedSourceProps ? target : cloneProp(source);
}
if ((0, isNull_1.default)(source)) {
return ignoreNullSourceProps ? target : cloneProp(source);
}
if ((typeof source !== typeof target)) {
return ignoreDifferentTypeSourceProps ? target : cloneProp(source);
}
if ((0, isObjectPure_1.default)(target)) {
if ((0, isObjectPure_1.default)(source)) {
Object.keys(source).forEach((key) => {
target[key] = mergeObjectPropsDeeplyFromSourceToTarget({
target: target[key],
source: source[key],
options,
});
});
return target;
}
return ignoreDifferentTypeSourceProps ? target : cloneProp(source);
}
return cloneProp(source);
}
exports.mergeObjectPropsDeeplyFromSourceToTarget = mergeObjectPropsDeeplyFromSourceToTarget;
function cloneProp(prop) {
if ((0, isUndefined_1.default)(prop) || (0, isNull_1.default)(prop)) {
return prop;
}
if ((0, isObjectPure_1.default)(prop)) {
return (0, cloneObjectDataProps_1.default)(prop);
}
return (0, cloneObjectDataProps_1.default)({ temp: prop })['temp'];
}