UNPKG

@snipsonian/core

Version:

Core/base reusable javascript code snippets

67 lines (66 loc) 2.69 kB
"use strict"; 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']; }