chain-able
Version:
interfaces that describe their intentions.
142 lines (128 loc) • 15 kB
JavaScript
var isObjStrict = require('../is/objStrict')
var isArray = require('../is/array')
var isTrue = require('../is/true')
var ObjectKeys = require('../util/keys')
var ObjectAssign = require('../util/assign')
var isUndefined = require('../is/undefined')
var isRegExp = require('../is/regexp')
var isDate = require('../is/date')
var isBoolean = require('../is/boolean')
var isString = require('../is/string')
var simpleKindOf = require('../util/simpleKindOf')
var includes = require('../conditional/includes')
// 1: not null object
// 2: object toString is not a date or regex
function isMergeableObj(val) {
return isObjStrict(val) && !isRegExp(val) && !isDate(val)
}
function emptyTarget(val) {
return isArray(val) ? [] : {}
}
function cloneIfNeeded(value, optsArg) {
return isTrue(optsArg.clone) && isMergeableObj(value)
? deepmerge(emptyTarget(value), value, optsArg)
: value
}
/* prettier-ignore */
function defaultArrayMerge(target, source, optsArg) {
var destination = target.slice()
for (var i = 0; i < source.length; i++) {
var v = source[i]
if (isUndefined(destination[i])) {
destination[i] = cloneIfNeeded(v, optsArg)
}
else if (isMergeableObj(v)) {
destination[i] = deepmerge(target[i], v, optsArg)
}
// @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT
// === -1
// eslint-disable-next-line prefer-includes/prefer-includes
else if (!~target.indexOf(v)) {
destination.push(cloneIfNeeded(v, optsArg))
}
}
return destination
}
function mergeObj(target, source, optsArg) {
var destination = {}
if (isMergeableObj(target)) {
var targetKeys = ObjectKeys(target)
for (var k = 0; k < targetKeys.length; k++) {
destination[targetKeys[k]] = cloneIfNeeded(target[targetKeys[k]], optsArg)
}
}
var sourceKeys = ObjectKeys(source)
for (var s = 0; s < sourceKeys.length; s++) {
var key = sourceKeys[s]
if (!isMergeableObj(source[key]) || !target[key]) {
destination[key] = cloneIfNeeded(source[key], optsArg)
}
else {
destination[key] = deepmerge(target[key], source[key], optsArg)
}
}
return destination
}
function deepmerge(target, source, optsArg) {
if (isArray(source)) {
var arrayMerge = optsArg.arrayMerge;
return isArray(target)
? arrayMerge(target, source, optsArg)
: cloneIfNeeded(source, optsArg)
}
// else
return mergeObj(target, source, optsArg)
}
/* prettier-ignore */
// eslint-disable-next-line complexity
function dopemerge(obj1, obj2, opts) {
// if they are identical, fastest === check
if (obj1 === obj2) {
return obj1
}
// setup options
var options = ObjectAssign(
{
arrayMerge: defaultArrayMerge,
stringToArray: true,
boolToArray: false,
ignoreTypes: ['null', 'undefined'],
// debug: true,
},
opts || {}
)
var ignoreTypes = options.ignoreTypes;
var stringToArray = options.stringToArray;
var boolToArray = options.boolToArray;
var clone = options.clone;
// @NOTE: much better size but oh well
// const ignoreTypes = ['null', 'undefined']
// const stringToArray = true
// const boolToArray = false
// const clone = true
// check one then check the other
if (isTrue(includes(ignoreTypes, simpleKindOf(obj1)))) {
return obj2
}
else if (isTrue(includes(ignoreTypes, simpleKindOf(obj2)))) {
return obj1
}
// @NOTE uglifier optimizes into a wicked ternary
else if (isBoolean(obj1) && isBoolean(obj2)) {
return boolToArray ? [obj1, obj2] : obj2
}
else if (isString(obj1) && isString(obj2)) {
return stringToArray ? [obj1, obj2] : obj1 + obj2
}
else if (isArray(obj1) && isString(obj2)) {
return (clone ? obj1.slice(0) : obj1).concat([obj2])
}
else if (isString(obj1) && isArray(obj2)) {
return (clone ? obj2.slice(0) : obj2).concat([obj1])
}
else {
return deepmerge(obj1, obj2, options)
}
}
module.exports = dopemerge
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9wZW1lcmdlLmpzIiwic291cmNlcyI6WyJkb3BlbWVyZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaXNPYmpTdHJpY3QgPSByZXF1aXJlKCcuLi9pcy9vYmpTdHJpY3QnKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGlzVHJ1ZSA9IHJlcXVpcmUoJy4uL2lzL3RydWUnKVxuY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL3V0aWwva2V5cycpXG5jb25zdCBPYmplY3RBc3NpZ24gPSByZXF1aXJlKCcuLi91dGlsL2Fzc2lnbicpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2lzL3JlZ2V4cCcpXG5jb25zdCBpc0RhdGUgPSByZXF1aXJlKCcuLi9pcy9kYXRlJylcbmNvbnN0IGlzQm9vbGVhbiA9IHJlcXVpcmUoJy4uL2lzL2Jvb2xlYW4nKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi9pcy9zdHJpbmcnKVxuY29uc3Qgc2ltcGxlS2luZE9mID0gcmVxdWlyZSgnLi4vdXRpbC9zaW1wbGVLaW5kT2YnKVxuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9jb25kaXRpb25hbC9pbmNsdWRlcycpXG5cbi8vIDE6IG5vdCBudWxsIG9iamVjdFxuLy8gMjogb2JqZWN0IHRvU3RyaW5nIGlzIG5vdCBhIGRhdGUgb3IgcmVnZXhcbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqKHZhbCkge1xuICByZXR1cm4gaXNPYmpTdHJpY3QodmFsKSAmJiAhaXNSZWdFeHAodmFsKSAmJiAhaXNEYXRlKHZhbClcbn1cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuZnVuY3Rpb24gY2xvbmVJZk5lZWRlZCh2YWx1ZSwgb3B0c0FyZykge1xuICByZXR1cm4gaXNUcnVlKG9wdHNBcmcuY2xvbmUpICYmIGlzTWVyZ2VhYmxlT2JqKHZhbHVlKVxuICAgID8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdHNBcmcpXG4gICAgOiB2YWx1ZVxufVxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRzQXJnKSB7XG4gIHZhciBkZXN0aW5hdGlvbiA9IHRhcmdldC5zbGljZSgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdiA9IHNvdXJjZVtpXVxuICAgIGlmIChpc1VuZGVmaW5lZChkZXN0aW5hdGlvbltpXSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gY2xvbmVJZk5lZWRlZCh2LCBvcHRzQXJnKVxuICAgIH1cbiAgICBlbHNlIGlmIChpc01lcmdlYWJsZU9iaih2KSkge1xuICAgICAgZGVzdGluYXRpb25baV0gPSBkZWVwbWVyZ2UodGFyZ2V0W2ldLCB2LCBvcHRzQXJnKVxuICAgIH1cbiAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9ycyNCaXR3aXNlX05PVFxuICAgIC8vID09PSAtMVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItaW5jbHVkZXMvcHJlZmVyLWluY2x1ZGVzXG4gICAgZWxzZSBpZiAoIX50YXJnZXQuaW5kZXhPZih2KSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChjbG9uZUlmTmVlZGVkKHYsIG9wdHNBcmcpKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmoodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqKHRhcmdldCkpIHtcbiAgICB2YXIgdGFyZ2V0S2V5cyA9IE9iamVjdEtleXModGFyZ2V0KVxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGFyZ2V0S2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgZGVzdGluYXRpb25bdGFyZ2V0S2V5c1trXV0gPSBjbG9uZUlmTmVlZGVkKHRhcmdldFt0YXJnZXRLZXlzW2tdXSwgb3B0c0FyZylcbiAgICB9XG4gIH1cbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3RLZXlzKHNvdXJjZSlcbiAgZm9yICh2YXIgcyA9IDA7IHMgPCBzb3VyY2VLZXlzLmxlbmd0aDsgcysrKSB7XG4gICAgdmFyIGtleSA9IHNvdXJjZUtleXNbc11cbiAgICBpZiAoIWlzTWVyZ2VhYmxlT2JqKHNvdXJjZVtrZXldKSB8fCAhdGFyZ2V0W2tleV0pIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVlZGVkKHNvdXJjZVtrZXldLCBvcHRzQXJnKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBkZWVwbWVyZ2UodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBvcHRzQXJnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgIGNvbnN0IHthcnJheU1lcmdlfSA9IG9wdHNBcmdcbiAgICByZXR1cm4gaXNBcnJheSh0YXJnZXQpXG4gICAgICA/IGFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpXG4gICAgICA6IGNsb25lSWZOZWVkZWQoc291cmNlLCBvcHRzQXJnKVxuICB9XG5cbiAgLy8gZWxzZVxuICByZXR1cm4gbWVyZ2VPYmoodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpXG59XG5cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIGRvcGVtZXJnZShvYmoxLCBvYmoyLCBvcHRzKSB7XG4gIC8vIGlmIHRoZXkgYXJlIGlkZW50aWNhbCwgZmFzdGVzdCA9PT0gY2hlY2tcbiAgaWYgKG9iajEgPT09IG9iajIpIHtcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLy8gc2V0dXAgb3B0aW9uc1xuICBjb25zdCBvcHRpb25zID0gT2JqZWN0QXNzaWduKFxuICAgIHtcbiAgICAgIGFycmF5TWVyZ2U6IGRlZmF1bHRBcnJheU1lcmdlLFxuICAgICAgc3RyaW5nVG9BcnJheTogdHJ1ZSxcbiAgICAgIGJvb2xUb0FycmF5OiBmYWxzZSxcbiAgICAgIGlnbm9yZVR5cGVzOiBbJ251bGwnLCAndW5kZWZpbmVkJ10sXG4gICAgICAvLyBkZWJ1ZzogdHJ1ZSxcbiAgICB9LFxuICAgIG9wdHMgfHwge31cbiAgKVxuICBjb25zdCB7aWdub3JlVHlwZXMsIHN0cmluZ1RvQXJyYXksIGJvb2xUb0FycmF5LCBjbG9uZX0gPSBvcHRpb25zXG5cbiAgLy8gQE5PVEU6IG11Y2ggYmV0dGVyIHNpemUgYnV0IG9oIHdlbGxcbiAgLy8gY29uc3QgaWdub3JlVHlwZXMgPSBbJ251bGwnLCAndW5kZWZpbmVkJ11cbiAgLy8gY29uc3Qgc3RyaW5nVG9BcnJheSA9IHRydWVcbiAgLy8gY29uc3QgYm9vbFRvQXJyYXkgPSBmYWxzZVxuICAvLyBjb25zdCBjbG9uZSA9IHRydWVcblxuICAvLyBjaGVjayBvbmUgdGhlbiBjaGVjayB0aGUgb3RoZXJcbiAgaWYgKGlzVHJ1ZShpbmNsdWRlcyhpZ25vcmVUeXBlcywgc2ltcGxlS2luZE9mKG9iajEpKSkpIHtcbiAgICByZXR1cm4gb2JqMlxuICB9XG4gIGVsc2UgaWYgKGlzVHJ1ZShpbmNsdWRlcyhpZ25vcmVUeXBlcywgc2ltcGxlS2luZE9mKG9iajIpKSkpIHtcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLy8gQE5PVEUgdWdsaWZpZXIgb3B0aW1pemVzIGludG8gYSB3aWNrZWQgdGVybmFyeVxuICBlbHNlIGlmIChpc0Jvb2xlYW4ob2JqMSkgJiYgaXNCb29sZWFuKG9iajIpKSB7XG4gICAgcmV0dXJuIGJvb2xUb0FycmF5ID8gW29iajEsIG9iajJdIDogb2JqMlxuICB9XG4gIGVsc2UgaWYgKGlzU3RyaW5nKG9iajEpICYmIGlzU3RyaW5nKG9iajIpKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RvQXJyYXkgPyBbb2JqMSwgb2JqMl0gOiBvYmoxICsgb2JqMlxuICB9XG4gIGVsc2UgaWYgKGlzQXJyYXkob2JqMSkgJiYgaXNTdHJpbmcob2JqMikpIHtcbiAgICByZXR1cm4gKGNsb25lID8gb2JqMS5zbGljZSgwKSA6IG9iajEpLmNvbmNhdChbb2JqMl0pXG4gIH1cbiAgZWxzZSBpZiAoaXNTdHJpbmcob2JqMSkgJiYgaXNBcnJheShvYmoyKSkge1xuICAgIHJldHVybiAoY2xvbmUgPyBvYmoyLnNsaWNlKDApIDogb2JqMikuY29uY2F0KFtvYmoxXSlcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gZGVlcG1lcmdlKG9iajEsIG9iajIsIG9wdGlvbnMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb3BlbWVyZ2VcbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdENBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQzFDQSxHQUFLLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUM5Q0EsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDOUNBLEdBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxD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