| /*! |
| * set-value <https://github.com/jonschlinkert/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; |
| }; |
| |