/*! * set-value * * Copyright (c) 2014-2015, 2017, Jon Schlinkert. * Released under the MIT License. */ 'use strict'; var toPath = require('to-object-path'); var extend = require('extend-shallow'); var isPlainObject = require('is-plain-object'); var isObject = require('is-extendable'); module.exports = function(obj, path, val) { if (!isObject(obj)) { return obj; } if (Array.isArray(path)) { path = toPath(path); } if (typeof path !== 'string') { return obj; } var segs = path.split('.'); var len = segs.length, i = -1; var res = obj; var last; while (++i < len) { var key = segs[i]; while (key[key.length - 1] === '\\') { key = key.slice(0, -1) + '.' + segs[++i]; } if (i === len - 1) { last = key; break; } if (!isObject(obj[key])) { obj[key] = {}; } obj = obj[key]; } if (obj.hasOwnProperty(last) && isObject(obj[last])) { if (isPlainObject(val)) { extend(obj[last], val); } else { obj[last] = val; } } else { obj[last] = val; } return res; };