64 lines
1.1 KiB
JavaScript
64 lines
1.1 KiB
JavaScript
/*!
|
|
* 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;
|
|
};
|
|
|