/**
* @summary deep-assign
* @version 3.0.0
* @since 1.0.0
* @author Arian Khosravi<arian.khosravi@aofl.com>
*/
import {recurseObjectByPath} from './core';
/**
* Recursively calls Object.assign along the specified path.
*
* @memberof module:@aofl/object-utils
* @example
* let user = {
* name: 'Alan',
* account: {
* active: true,
* products: {
* '1': true,
* '2': true,
* '3': true
* }
* },
* preferences: {
* locale: 'en-US'
* }
* };
*
* deepAssign(user, 'account.products', {
* 2: false
* });
* { // new ref
* name: 'Alan',
* account: { // new ref
* active: true,
* products: { // new ref
* '1': true,
* '2': false,
* '3': true
* }
* },
* preferences: { // same ref
* locale: 'en-US'
* }
* };
* @param {Object} left left source
* @param {String} path path to target
* @param {Object} right right source
* @return {Object}
*/
const deepAssign = (left, path, right) => {
return recurseObjectByPath(left, path, (key, pathParts, source, recurse) => {
if (pathParts.length === 0) {
if (key === '') {
return Object.assign({}, source, right);
}
return Object.assign({}, source, {
[key]: Object.assign({}, source[key], right)
});
}
return Object.assign({}, source, {
[key]: recurse(pathParts, source[key])
});
});
};
export {
deepAssign
};