pax_global_header00006660000000000000000000000064135556123350014522gustar00rootroot0000000000000052 comment=c759b5d83032c2429c837d4fb31d59601ecbe2ef deepmerge-4.2.2/000077500000000000000000000000001355561233500134645ustar00rootroot00000000000000deepmerge-4.2.2/.gitignore000066400000000000000000000000241355561233500154500ustar00rootroot00000000000000node_modules dist/* deepmerge-4.2.2/.npmignore000066400000000000000000000000351355561233500154610ustar00rootroot00000000000000test/ .gitignore .travis.yml deepmerge-4.2.2/.travis.yml000066400000000000000000000000651355561233500155760ustar00rootroot00000000000000language: node_js node_js: - "12" - "10" - "8" deepmerge-4.2.2/changelog.md000066400000000000000000000223001355561233500157320ustar00rootroot00000000000000# [4.2.2](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.2) - `isMergeableObject` is now only called if there are two values that could be merged. [a34dd4d2](https://github.com/TehShrike/deepmerge/commit/a34dd4d25bf5e250653540a2022bc832c7b00a19) # [4.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.1) - Fix: falsey values can now be merged. [#170](https://github.com/TehShrike/deepmerge/issues/170) # [4.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.0) - Properties are now only overwritten if they exist on the target object and are enumerable. [#164](https://github.com/TehShrike/deepmerge/pull/164) Technically this could probably be a patch release since "which properties get overwritten" wasn't documented and accidentally overwriting a built-in function or some function up the property chain would almost certainly be undesirable, but it feels like a gray area, so here we are with a feature version bump. # [4.1.2](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.2) - Rolled back #167 since `Object.assign` breaks ES5 support. [55067352](https://github.com/TehShrike/deepmerge/commit/55067352a92c65a6c44a5165f3387720aae1e192) # [4.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.1) - The `options` argument is no longer mutated [#167](https://github.com/TehShrike/deepmerge/pull/167) # [4.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.0) - `cloneUnlessOtherwiseSpecified` is now exposed to the `arrayMerge` function [#165](https://github.com/TehShrike/deepmerge/pull/165) # [4.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.0.0) - The `main` entry point in `package.json` is now a CommonJS module instead of a UMD module [#155](https://github.com/TehShrike/deepmerge/pull/155) # [3.3.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.3.0) - Enumerable Symbol properties are now copied [#151](https://github.com/TehShrike/deepmerge/pull/151) # [3.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v3.2.1) - bumping dev dependency versions to try to shut up bogus security warnings from Github/npm [#149](https://github.com/TehShrike/deepmerge/pull/149) # [3.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.2.0) - feature: added the [`customMerge`](https://github.com/TehShrike/deepmerge#custommerge) option [#133](https://github.com/TehShrike/deepmerge/pull/133) # [3.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.1.0) - typescript typing: make the `all` function generic [#129](https://github.com/TehShrike/deepmerge/pull/129) # [3.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.0.0) - drop ES module build [#123](https://github.com/TehShrike/deepmerge/issues/123) # [2.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.2.1) - bug: typescript export type was wrong [#121](https://github.com/TehShrike/deepmerge/pull/121) # [2.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.2.0) - feature: added TypeScript typings [#119](https://github.com/TehShrike/deepmerge/pull/119) # [2.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.1.1) - documentation: Rename "methods" to "api", note ESM syntax [#103](https://github.com/TehShrike/deepmerge/pull/103) - documentation: Fix grammar [#107](https://github.com/TehShrike/deepmerge/pull/107) - documentation: Restructure headers for clarity + some wording tweaks [108](https://github.com/TehShrike/deepmerge/pull/108) + [109](https://github.com/TehShrike/deepmerge/pull/109) # [2.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.1.0) - feature: Support a custom `isMergeableObject` function [#96](https://github.com/TehShrike/deepmerge/pull/96) - documentation: note a Webpack bug that some users might need to work around [#100](https://github.com/TehShrike/deepmerge/pull/100) # [2.0.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.0.1) - documentation: fix the old array merge algorithm in the readme. [#84](https://github.com/TehShrike/deepmerge/pull/84) # [2.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.0.0) - breaking: the array merge algorithm has changed from a complicated thing to `target.concat(source).map(element => cloneUnlessOtherwiseSpecified(element, optionsArgument))` - breaking: The `clone` option now defaults to `true` - feature: `merge.all` now accepts an array of any size, even 0 or 1 elements See [pull request 77](https://github.com/TehShrike/deepmerge/pull/77). # [1.5.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.2) - fix: no longer attempts to merge React elements [#76](https://github.com/TehShrike/deepmerge/issues/76) # [1.5.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.1) - bower support: officially dropping bower support. If you use bower, please depend on the [unpkg distribution](https://unpkg.com/deepmerge/dist/umd.js). See [#63](https://github.com/TehShrike/deepmerge/issues/63) # [1.5.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.0) - bug fix: merging objects into arrays was allowed, and doesn't make any sense. [#65](https://github.com/TehShrike/deepmerge/issues/65) published as a feature release instead of a patch because it is a decent behavior change. # [1.4.4](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.4) - bower support: updated `main` in bower.json # [1.4.3](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.3) - bower support: inline is-mergeable-object in a new CommonJS build, so that people using both bower and CommonJS can bundle the library [0b34e6](https://github.com/TehShrike/deepmerge/commit/0b34e6e95f989f2fc8091d25f0d291c08f3d2d24) # [1.4.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.2) - performance: bump is-mergeable-object dependency version for a slight performance improvement [5906c7](https://github.com/TehShrike/deepmerge/commit/5906c765d691d48e83d76efbb0d4b9ca150dc12c) # [1.4.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.1) - documentation: fix unpkg link [acc45b](https://github.com/TehShrike/deepmerge/commit/acc45be85519c1df906a72ecb24764b622d18d47) # [1.4.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.0) - api: instead of only exporting a UMD module, expose a UMD module with `pkg.main`, a CJS module with `pkg.browser`, and an ES module with `pkg.module` [#62](https://github.com/TehShrike/deepmerge/pull/62) # [1.3.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.2) - documentation: note the minified/gzipped file sizes [56](https://github.com/TehShrike/deepmerge/pull/56) - documentation: make data structures more readable in merge example: pull request [57](https://github.com/TehShrike/deepmerge/pull/57) # [1.3.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.1) - documentation: clarify and test some array merging documentation: pull request [51](https://github.com/TehShrike/deepmerge/pull/51) # [1.3.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.0) - feature: `merge.all`, a merge function that merges any number of objects: pull request [50](https://github.com/TehShrike/deepmerge/pull/50) # [1.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.2.0) - fix: an error that would be thrown when an array would be merged onto a truthy non-array value: pull request [46](https://github.com/TehShrike/deepmerge/pull/46) - feature: the ability to clone: Issue [28](https://github.com/TehShrike/deepmerge/issues/28), pull requests [44](https://github.com/TehShrike/deepmerge/pull/44) and [48](https://github.com/TehShrike/deepmerge/pull/48) - maintenance: added tests + travis to `.npmignore`: pull request [47](https://github.com/TehShrike/deepmerge/pull/47) # [1.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.1.1) - fix an issue where an error was thrown when merging an array onto a non-array: [Pull request 46](https://github.com/TehShrike/deepmerge/pull/46) # [1.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.1.0) - allow consumers to specify their own array merging algorithm: [Pull request 37](https://github.com/TehShrike/deepmerge/pull/37) # [1.0.3](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.3) - adding bower.json back: [Issue 38](https://github.com/TehShrike/deepmerge/pull/38) - updating keywords and Github links in package.json [bc3898e](https://github.com/TehShrike/deepmerge/commit/bc3898e587a56f74591328f40f656b0152c1d5eb) # [1.0.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.2) - Updating the readme: dropping bower, testing that the example works: [7102fc](https://github.com/TehShrike/deepmerge/commit/7102fcc4ddec11e2d33205866f9f18df14e5aeb5) # [1.0.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.1) - `null`, dates, and regular expressions are now properly merged in arrays: [Issue 18](https://github.com/TehShrike/deepmerge/pull/18), plus commit: [ef1c6b](https://github.com/TehShrike/deepmerge/commit/ef1c6bac8350ba12a24966f0bc7da02560827586) # 1.0.0 - Should only be a patch change, because this module is READY. [Issue 15](https://github.com/TehShrike/deepmerge/issues/15) - Regular expressions are now treated like primitive values when merging: [Issue 30](https://github.com/TehShrike/deepmerge/pull/30) - Dates are now treated like primitives when merging: [Issue 31](https://github.com/TehShrike/deepmerge/issues/31) deepmerge-4.2.2/index.d.ts000066400000000000000000000012141355561233500153630ustar00rootroot00000000000000declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T; declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T1 & T2; declare namespace deepmerge { export interface Options { arrayMerge?(target: any[], source: any[], options?: Options): any[]; clone?: boolean; customMerge?: (key: string, options?: Options) => ((x: any, y: any) => any) | undefined; isMergeableObject?(value: object): boolean; } export function all (objects: object[], options?: Options): object; export function all (objects: Partial[], options?: Options): T; } export = deepmerge; deepmerge-4.2.2/index.js000066400000000000000000000063201355561233500151320ustar00rootroot00000000000000var defaultIsMergeableObject = require('is-mergeable-object') function emptyTarget(val) { return Array.isArray(val) ? [] : {} } function cloneUnlessOtherwiseSpecified(value, options) { return (options.clone !== false && options.isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, options) : value } function defaultArrayMerge(target, source, options) { return target.concat(source).map(function(element) { return cloneUnlessOtherwiseSpecified(element, options) }) } function getMergeFunction(key, options) { if (!options.customMerge) { return deepmerge } var customMerge = options.customMerge(key) return typeof customMerge === 'function' ? customMerge : deepmerge } function getEnumerableOwnPropertySymbols(target) { return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function(symbol) { return target.propertyIsEnumerable(symbol) }) : [] } function getKeys(target) { return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) } function propertyIsOnObject(object, property) { try { return property in object } catch(_) { return false } } // Protects from prototype poisoning and unexpected merging up the prototype chain. function propertyIsUnsafe(target, key) { return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, && Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable. } function mergeObject(target, source, options) { var destination = {} if (options.isMergeableObject(target)) { getKeys(target).forEach(function(key) { destination[key] = cloneUnlessOtherwiseSpecified(target[key], options) }) } getKeys(source).forEach(function(key) { if (propertyIsUnsafe(target, key)) { return } if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { destination[key] = getMergeFunction(key, options)(target[key], source[key], options) } else { destination[key] = cloneUnlessOtherwiseSpecified(source[key], options) } }) return destination } function deepmerge(target, source, options) { options = options || {} options.arrayMerge = options.arrayMerge || defaultArrayMerge options.isMergeableObject = options.isMergeableObject || defaultIsMergeableObject // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() // implementations can use it. The caller may not replace it. options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified var sourceIsArray = Array.isArray(source) var targetIsArray = Array.isArray(target) var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray if (!sourceAndTargetTypesMatch) { return cloneUnlessOtherwiseSpecified(source, options) } else if (sourceIsArray) { return options.arrayMerge(target, source, options) } else { return mergeObject(target, source, options) } } deepmerge.all = function deepmergeAll(array, options) { if (!Array.isArray(array)) { throw new Error('first argument should be an array') } return array.reduce(function(prev, next) { return deepmerge(prev, next, options) }, {}) } module.exports = deepmerge deepmerge-4.2.2/license.txt000066400000000000000000000021341355561233500156470ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2012 James Halliday, Josh Duff, and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. deepmerge-4.2.2/package-lock.json000066400000000000000000000607731355561233500167150ustar00rootroot00000000000000{ "name": "deepmerge", "version": "4.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/node": { "version": "8.10.54", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", "dev": true }, "@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "dev": true, "requires": { "@types/node": "*" } }, "acorn": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtin-modules": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, "es-abstract": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.0", "is-callable": "^1.1.4", "is-regex": "^1.0.4", "object-inspect": "^1.6.0", "object-keys": "^1.1.1", "string.prototype.trimleft": "^2.1.0", "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "escodegen": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true } } }, "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-mergeable-object": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", "dev": true }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true } } }, "is-reference": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", "dev": true, "requires": { "@types/estree": "0.0.39" } }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { "has": "^1.0.1" } }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { "has-symbols": "^1.0.0" } }, "jsmd": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/jsmd/-/jsmd-1.0.2.tgz", "integrity": "sha512-mrQ80ysClsuw4QASa7JcjpwgTADBclo9LgIPDERD99tsfVcXGEHjkX50Q9N0NSmX1Zq3xxQYAA8fuN9GHk1Beg==", "dev": true, "requires": { "escodegen": "^1.9.1", "esprima": "^2.7.3", "estraverse": "^4.2.0", "marked": "^0.7.0", "v8-argv": "github:jkroso/v8-argv#1.1.1" } }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "magic-string": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, "marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" } }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", "dev": true, "requires": { "through": "~2.3.4" } }, "rollup": { "version": "1.23.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz", "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==", "dev": true, "requires": { "@types/estree": "*", "@types/node": "*", "acorn": "^7.1.0" } }, "rollup-plugin-commonjs": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", "dev": true, "requires": { "estree-walker": "^0.6.1", "is-reference": "^1.1.2", "magic-string": "^0.25.2", "resolve": "^1.11.0", "rollup-pluginutils": "^2.8.1" } }, "rollup-plugin-node-resolve": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", "dev": true, "requires": { "@types/resolve": "0.0.8", "builtin-modules": "^3.1.0", "is-module": "^1.0.0", "resolve": "^1.11.1", "rollup-pluginutils": "^2.8.1" } }, "rollup-pluginutils": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { "estree-walker": "^0.6.1" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "sourcemap-codec": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", "dev": true }, "string.prototype.trim": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.0", "function-bind": "^1.0.2" } }, "string.prototype.trimleft": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string.prototype.trimright": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "tape": { "version": "4.11.0", "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", "dev": true, "requires": { "deep-equal": "~1.0.1", "defined": "~1.0.0", "for-each": "~0.3.3", "function-bind": "~1.1.1", "glob": "~7.1.4", "has": "~1.0.3", "inherits": "~2.0.4", "minimist": "~1.2.0", "object-inspect": "~1.6.0", "resolve": "~1.11.1", "resumer": "~0.0.0", "string.prototype.trim": "~1.1.2", "through": "~2.3.8" }, "dependencies": { "resolve": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", "dev": true, "requires": { "path-parse": "^1.0.6" } } } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", "diff": "^3.1.0", "make-error": "^1.1.1", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", "yn": "^2.0.0" }, "dependencies": { "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true } } }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "~1.1.2" } }, "typescript": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz", "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=", "dev": true }, "uglify-js": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", "dev": true, "requires": { "commander": "2.20.0", "source-map": "~0.6.1" } }, "v8-argv": { "version": "github:jkroso/v8-argv#284f84379e292eb956a5e7b66fb953ec4974385e", "from": "github:jkroso/v8-argv#1.1.1", "dev": true }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true } } } deepmerge-4.2.2/package.json000066400000000000000000000022261355561233500157540ustar00rootroot00000000000000{ "name": "deepmerge", "description": "A library for deep (recursive) merging of Javascript objects", "keywords": [ "merge", "deep", "extend", "copy", "clone", "recursive" ], "version": "4.2.2", "homepage": "https://github.com/TehShrike/deepmerge", "repository": { "type": "git", "url": "git://github.com/TehShrike/deepmerge.git" }, "main": "dist/cjs.js", "engines": { "node": ">=0.10.0" }, "scripts": { "build": "rollup -c", "test": "npm run build && tape test/*.js && jsmd readme.md && npm run test:typescript", "test:typescript": "tsc --noEmit test/typescript.ts && ts-node test/typescript.ts", "size": "npm run build && uglifyjs --compress --mangle -- ./dist/umd.js | gzip -c | wc -c" }, "devDependencies": { "@types/node": "^8.10.54", "is-mergeable-object": "1.1.0", "is-plain-object": "^2.0.4", "jsmd": "^1.0.2", "rollup": "^1.23.1", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", "tape": "^4.11.0", "ts-node": "7.0.1", "typescript": "=2.2.2", "uglify-js": "^3.6.1" }, "license": "MIT", "dependencies": {} } deepmerge-4.2.2/readme.md000066400000000000000000000131631355561233500152470ustar00rootroot00000000000000# deepmerge Merges the enumerable properties of two or more objects deeply. > UMD bundle is 723B minified+gzipped ## Getting Started ### Example Usage ```js const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } const output = { foo: { bar: 3, baz: 4 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }, { does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }], quux: 5 } merge(x, y) // => output ``` ### Installation With [npm](http://npmjs.org) do: ```sh npm install deepmerge ``` deepmerge can be used directly in the browser without the use of package managers/bundlers as well: [UMD version from unpkg.com](https://unpkg.com/deepmerge/dist/umd.js). ### Include deepmerge exposes a CommonJS entry point: ``` const merge = require('deepmerge') ``` The ESM entry point was dropped due to a [Webpack bug](https://github.com/webpack/webpack/issues/6584). # API ## `merge(x, y, [options])` Merge two objects `x` and `y` deeply, returning a new merged object with the elements from both `x` and `y`. If an element at the same key is present for both `x` and `y`, the value from `y` will appear in the result. Merging creates a new object, so that neither `x` or `y` is modified. **Note:** By default, arrays are merged by concatenating them. ## `merge.all(arrayOfObjects, [options])` Merges any number of objects into a single result object. ```js const foobar = { foo: { bar: 3 } } const foobaz = { foo: { baz: 4 } } const bar = { bar: 'yay!' } merge.all([ foobar, foobaz, bar ]) // => { foo: { bar: 3, baz: 4 }, bar: 'yay!' } ``` ## Options ### `arrayMerge` There are multiple ways to merge two arrays, below are a few examples but you can also create your own custom function. Your `arrayMerge` function will be called with three arguments: a `target` array, the `source` array, and an `options` object with these properties: - `isMergeableObject(value)` - `cloneUnlessOtherwiseSpecified(value, options)` #### `arrayMerge` example: overwrite target array Overwrites the existing array values completely rather than concatenating them: ```js const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray merge( [1, 2, 3], [3, 2, 1], { arrayMerge: overwriteMerge } ) // => [3, 2, 1] ``` #### `arrayMerge` example: combine arrays Combines objects at the same index in the two arrays. This was the default array merging algorithm pre-version-2.0.0. ```js const combineMerge = (target, source, options) => { const destination = target.slice() source.forEach((item, index) => { if (typeof destination[index] === 'undefined') { destination[index] = options.cloneUnlessOtherwiseSpecified(item, options) } else if (options.isMergeableObject(item)) { destination[index] = merge(target[index], item, options) } else if (target.indexOf(item) === -1) { destination.push(item) } }) return destination } merge( [{ a: true }], [{ b: true }, 'ah yup'], { arrayMerge: combineMerge } ) // => [{ a: true, b: true }, 'ah yup'] ``` ### `isMergeableObject` By default, deepmerge clones every property from almost every kind of object. You may not want this, if your objects are of special types, and you want to copy the whole object instead of just copying its properties. You can accomplish this by passing in a function for the `isMergeableObject` option. If you only want to clone properties of plain objects, and ignore all "special" kinds of instantiated objects, you probably want to drop in [`is-plain-object`](https://github.com/jonschlinkert/is-plain-object). ```js const isPlainObject = require('is-plain-object') function SuperSpecial() { this.special = 'oh yeah man totally' } const instantiatedSpecialObject = new SuperSpecial() const target = { someProperty: { cool: 'oh for sure' } } const source = { someProperty: instantiatedSpecialObject } const defaultOutput = merge(target, source) defaultOutput.someProperty.cool // => 'oh for sure' defaultOutput.someProperty.special // => 'oh yeah man totally' defaultOutput.someProperty instanceof SuperSpecial // => false const customMergeOutput = merge(target, source, { isMergeableObject: isPlainObject }) customMergeOutput.someProperty.cool // => undefined customMergeOutput.someProperty.special // => 'oh yeah man totally' customMergeOutput.someProperty instanceof SuperSpecial // => true ``` ### `customMerge` Specifies a function which can be used to override the default merge behavior for a property, based on the property name. The `customMerge` function will be passed the key for each property, and should return the function which should be used to merge the values for that property. It may also return undefined, in which case the default merge behaviour will be used. ```js const alex = { name: { first: 'Alex', last: 'Alexson' }, pets: ['Cat', 'Parrot'] } const tony = { name: { first: 'Tony', last: 'Tonison' }, pets: ['Dog'] } const mergeNames = (nameA, nameB) => `${nameA.first} and ${nameB.first}` const options = { customMerge: (key) => { if (key === 'name') { return mergeNames } } } const result = merge(alex, tony, options) result.name // => 'Alex and Tony' result.pets // => ['Cat', 'Parrot', 'Dog'] ``` ### `clone` *Deprecated.* Defaults to `true`. If `clone` is `false` then child objects will be copied directly instead of being cloned. This was the default behavior before version 2.x. # Testing With [npm](http://npmjs.org) do: ```sh npm test ``` # License MIT deepmerge-4.2.2/rollup.config.js000066400000000000000000000005271355561233500166070ustar00rootroot00000000000000import resolve from 'rollup-plugin-node-resolve' import commonjs from 'rollup-plugin-commonjs' import pkg from './package.json' export default { input: `index.js`, plugins: [ commonjs(), resolve(), ], output: [ { file: pkg.main, format: `cjs` }, { name: 'deepmerge', file: 'dist/umd.js', format: `umd` }, ], } deepmerge-4.2.2/test/000077500000000000000000000000001355561233500144435ustar00rootroot00000000000000deepmerge-4.2.2/test/custom-array-merge.js000066400000000000000000000031741355561233500205310ustar00rootroot00000000000000var merge = require('../') var test = require('tape') test('custom merge array', function(t) { var mergeFunctionCalled = false function overwriteMerge(target, source, options) { mergeFunctionCalled = true t.equal(options.arrayMerge, overwriteMerge) return source } const destination = { someArray: [ 1, 2 ], someObject: { what: 'yes' }, } const source = { someArray: [ 1, 2, 3 ], } const actual = merge(destination, source, { arrayMerge: overwriteMerge }) const expected = { someArray: [ 1, 2, 3 ], someObject: { what: 'yes' }, } t.ok(mergeFunctionCalled) t.deepEqual(actual, expected) t.end() }) test('merge top-level arrays', function(t) { function overwriteMerge(a, b) { return b } var actual = merge([ 1, 2 ], [ 1, 2 ], { arrayMerge: overwriteMerge }) var expected = [ 1, 2 ] t.deepEqual(actual, expected) t.end() }) test('cloner function is available for merge functions to use', function(t) { var customMergeWasCalled = false function cloneMerge(target, source, options) { customMergeWasCalled = true t.ok(options.cloneUnlessOtherwiseSpecified, 'cloner function is available') return target.concat(source).map(function(element) { return options.cloneUnlessOtherwiseSpecified(element, options) }) } var src = { key1: [ 'one', 'three' ], key2: [ 'four' ], } var target = { key1: [ 'one', 'two' ], } var expected = { key1: [ 'one', 'two', 'one', 'three' ], key2: [ 'four' ], } t.deepEqual(merge(target, src, { arrayMerge: cloneMerge }), expected) t.ok(customMergeWasCalled) t.ok(Array.isArray(merge(target, src).key1)) t.ok(Array.isArray(merge(target, src).key2)) t.end() }) deepmerge-4.2.2/test/custom-is-mergeable-object.js000066400000000000000000000021521355561233500221110ustar00rootroot00000000000000var merge = require('../') var test = require('tape') test('isMergeableObject function copying object over object', function(t) { var src = { key: { isMergeable: false }, baz: 'yes' } var target = { key: { foo: 'wat' }, baz: 'whatever' } function isMergeableObject(object) { return object && typeof value === 'object' && object.isMergeable !== false } var res = merge(target, src, { isMergeableObject: isMergeableObject }) t.deepEqual(res, { key: { isMergeable: false }, baz: 'yes' }) t.equal(res.key, src.key, 'Object has the same identity and was not cloned') t.end() }) test('isMergeableObject function copying object over nothing', function(t) { var src = { key: { isMergeable: false, foo: 'bar' }, baz: 'yes' } var target = { baz: 'whatever' } function isMergeableObject(object) { return object && typeof value === 'object' && object.isMergeable !== false } var res = merge(target, src, { isMergeableObject: isMergeableObject }) t.deepEqual(res, { key: { isMergeable: false, foo: 'bar' }, baz: 'yes' }) t.equal(res.key, src.key, 'Object has the same identity and was not cloned') t.end() }) deepmerge-4.2.2/test/merge-all.js000066400000000000000000000054621355561233500166550ustar00rootroot00000000000000var merge = require('../') var test = require('tape') test('throw error if first argument is not an array', function(t) { t.throws(merge.all.bind(null, { example: true }, { another: '2' }), Error) t.end() }) test('return an empty object if first argument is an array with no elements', function(t) { t.deepEqual(merge.all([]), {}) t.end() }) test('Work just fine if first argument is an array with least than two elements', function(t) { var actual = merge.all([{ example: true }]) var expected = { example: true } t.deepEqual(actual, expected) t.end() }) test('execute correctly if options object were not passed', function(t) { var arrayToMerge = [{ example: true }, { another: '123' }] t.doesNotThrow(merge.all.bind(null, arrayToMerge)) t.end() }) test('execute correctly if options object were passed', function(t) { var arrayToMerge = [{ example: true }, { another: '123' }] t.doesNotThrow(merge.all.bind(null, arrayToMerge, { clone: true })) t.end() }) test('invoke merge on every item in array should result with all props', function(t) { var firstObject = { first: true } var secondObject = { second: false } var thirdObject = { third: 123 } var fourthObject = { fourth: 'some string' } var mergedObject = merge.all([ firstObject, secondObject, thirdObject, fourthObject ]) t.ok(mergedObject.first === true) t.ok(mergedObject.second === false) t.ok(mergedObject.third === 123) t.ok(mergedObject.fourth === 'some string') t.end() }) test('invoke merge on every item in array with clone should clone all elements', function(t) { var firstObject = { a: { d: 123 } } var secondObject = { b: { e: true } } var thirdObject = { c: { f: 'string' } } var mergedWithClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: true }) t.notEqual(mergedWithClone.a, firstObject.a) t.notEqual(mergedWithClone.b, secondObject.b) t.notEqual(mergedWithClone.c, thirdObject.c) t.end() }) test('invoke merge on every item in array clone=false should not clone all elements', function(t) { var firstObject = { a: { d: 123 } } var secondObject = { b: { e: true } } var thirdObject = { c: { f: 'string' } } var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: false }) t.equal(mergedWithoutClone.a, firstObject.a) t.equal(mergedWithoutClone.b, secondObject.b) t.equal(mergedWithoutClone.c, thirdObject.c) t.end() }) test('invoke merge on every item in array without clone should clone all elements', function(t) { var firstObject = { a: { d: 123 } } var secondObject = { b: { e: true } } var thirdObject = { c: { f: 'string' } } var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ]) t.notEqual(mergedWithoutClone.a, firstObject.a) t.notEqual(mergedWithoutClone.b, secondObject.b) t.notEqual(mergedWithoutClone.c, thirdObject.c) t.end() }) deepmerge-4.2.2/test/merge.js000066400000000000000000000316741355561233500161130ustar00rootroot00000000000000var merge = require('../') var test = require('tape') test('add keys in target that do not exist at the root', function(t) { var src = { key1: 'value1', key2: 'value2' } var target = {} var res = merge(target, src) t.deepEqual(target, {}, 'merge should be immutable') t.deepEqual(res, src) t.end() }) test('merge existing simple keys in target at the roots', function(t) { var src = { key1: 'changed', key2: 'value2' } var target = { key1: 'value1', key3: 'value3' } var expected = { key1: 'changed', key2: 'value2', key3: 'value3', } t.deepEqual(target, { key1: 'value1', key3: 'value3' }) t.deepEqual(merge(target, src), expected) t.end() }) test('merge nested objects into target', function(t) { var src = { key1: { subkey1: 'changed', subkey3: 'added', }, } var target = { key1: { subkey1: 'value1', subkey2: 'value2', }, } var expected = { key1: { subkey1: 'changed', subkey2: 'value2', subkey3: 'added', }, } t.deepEqual(target, { key1: { subkey1: 'value1', subkey2: 'value2', }, }) t.deepEqual(merge(target, src), expected) t.end() }) test('replace simple key with nested object in target', function(t) { var src = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2', }, } var target = { key1: 'value1', key2: 'value2', } var expected = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2', }, key2: 'value2', } t.deepEqual(target, { key1: 'value1', key2: 'value2' }) t.deepEqual(merge(target, src), expected) t.end() }) test('should add nested object in target', function(t) { var src = { "b": { "c": {}, }, } var target = { "a": {}, } var expected = { "a": {}, "b": { "c": {}, }, } t.deepEqual(merge(target, src), expected) t.end() }) test('should clone source and target', function(t) { var src = { "b": { "c": "foo", }, } var target = { "a": { "d": "bar", }, } var expected = { "a": { "d": "bar", }, "b": { "c": "foo", }, } var merged = merge(target, src, { clone: true }) t.deepEqual(merged, expected) t.notEqual(merged.a, target.a) t.notEqual(merged.b, src.b) t.end() }) test('should clone source and target', function(t) { var src = { "b": { "c": "foo", }, } var target = { "a": { "d": "bar", }, } var merged = merge(target, src) t.notEqual(merged.a, target.a) t.notEqual(merged.b, src.b) t.end() }) test('should replace object with simple key in target', function(t) { var src = { key1: 'value1' } var target = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2', }, key2: 'value2', } var expected = { key1: 'value1', key2: 'value2' } t.deepEqual(target, { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2', }, key2: 'value2', }) t.deepEqual(merge(target, src), expected) t.end() }) test('should replace objects with arrays', function(t) { var target = { key1: { subkey: 'one' } } var src = { key1: [ 'subkey' ] } var expected = { key1: [ 'subkey' ] } t.deepEqual(merge(target, src), expected) t.end() }) test('should replace arrays with objects', function(t) { var target = { key1: [ "subkey" ] } var src = { key1: { subkey: 'one' } } var expected = { key1: { subkey: 'one' } } t.deepEqual(merge(target, src), expected) t.end() }) test('should replace dates with arrays', function(t) { var target = { key1: new Date() } var src = { key1: [ "subkey" ] } var expected = { key1: [ "subkey" ] } t.deepEqual(merge(target, src), expected) t.end() }) test('should replace null with arrays', function(t) { var target = { key1: null, } var src = { key1: [ "subkey" ], } var expected = { key1: [ "subkey" ], } t.deepEqual(merge(target, src), expected) t.end() }) test('should work on simple array', function(t) { var src = [ 'one', 'three' ] var target = [ 'one', 'two' ] var expected = [ 'one', 'two', 'one', 'three' ] t.deepEqual(merge(target, src), expected) t.ok(Array.isArray(merge(target, src))) t.end() }) test('should work on another simple array', function(t) { var target = [ "a1", "a2", "c1", "f1", "p1" ] var src = [ "t1", "s1", "c2", "r1", "p2", "p3" ] var expected = [ "a1", "a2", "c1", "f1", "p1", "t1", "s1", "c2", "r1", "p2", "p3" ] t.deepEqual(target, [ "a1", "a2", "c1", "f1", "p1" ]) t.deepEqual(merge(target, src), expected) t.ok(Array.isArray(merge(target, src))) t.end() }) test('should work on array properties', function(t) { var src = { key1: [ 'one', 'three' ], key2: [ 'four' ], } var target = { key1: [ 'one', 'two' ], } var expected = { key1: [ 'one', 'two', 'one', 'three' ], key2: [ 'four' ], } t.deepEqual(merge(target, src), expected) t.ok(Array.isArray(merge(target, src).key1)) t.ok(Array.isArray(merge(target, src).key2)) t.end() }) test('should work on array properties with clone option', function(t) { var src = { key1: [ 'one', 'three' ], key2: [ 'four' ], } var target = { key1: [ 'one', 'two' ], } t.deepEqual(target, { key1: [ 'one', 'two' ], }) var merged = merge(target, src, { clone: true }) t.notEqual(merged.key1, src.key1) t.notEqual(merged.key1, target.key1) t.notEqual(merged.key2, src.key2) t.end() }) test('should work on array of objects', function(t) { var src = [ { key1: [ 'one', 'three' ], key2: [ 'one' ] }, { key3: [ 'five' ] }, ] var target = [ { key1: [ 'one', 'two' ] }, { key3: [ 'four' ] }, ] var expected = [ { key1: [ 'one', 'two' ] }, { key3: [ 'four' ] }, { key1: [ 'one', 'three' ], key2: [ 'one' ] }, { key3: [ 'five' ] }, ] t.deepEqual(merge(target, src), expected) t.ok(Array.isArray(merge(target, src)), 'result should be an array') t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too') t.end() }) test('should work on array of objects with clone option', function(t) { var src = [ { key1: [ 'one', 'three' ], key2: [ 'one' ] }, { key3: [ 'five' ] }, ] var target = [ { key1: [ 'one', 'two' ] }, { key3: [ 'four' ] }, ] var expected = [ { key1: [ 'one', 'two' ] }, { key3: [ 'four' ] }, { key1: [ 'one', 'three' ], key2: [ 'one' ] }, { key3: [ 'five' ] }, ] var merged = merge(target, src, { clone: true }) t.deepEqual(merged, expected) t.ok(Array.isArray(merge(target, src)), 'result should be an array') t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too') t.notEqual(merged[0].key1, src[0].key1) t.notEqual(merged[0].key1, target[0].key1) t.notEqual(merged[0].key2, src[0].key2) t.notEqual(merged[1].key3, src[1].key3) t.notEqual(merged[1].key3, target[1].key3) t.end() }) test('should treat regular expressions like primitive values', function(t) { var target = { key1: /abc/ } var src = { key1: /efg/ } var expected = { key1: /efg/ } t.deepEqual(merge(target, src), expected) t.deepEqual(merge(target, src).key1.test('efg'), true) t.end() }) test('should treat regular expressions like primitive values and should not' + ' clone even with clone option', function(t) { var target = { key1: /abc/ } var src = { key1: /efg/ } var output = merge(target, src, { clone: true }) t.equal(output.key1, src.key1) t.end() } ) test('should treat dates like primitives', function(t) { var monday = new Date('2016-09-27T01:08:12.761Z') var tuesday = new Date('2016-09-28T01:18:12.761Z') var target = { key: monday, } var source = { key: tuesday, } var expected = { key: tuesday, } var actual = merge(target, source) t.deepEqual(actual, expected) t.equal(actual.key.valueOf(), tuesday.valueOf()) t.end() }) test('should treat dates like primitives and should not clone even with clone' + ' option', function(t) { var monday = new Date('2016-09-27T01:08:12.761Z') var tuesday = new Date('2016-09-28T01:18:12.761Z') var target = { key: monday, } var source = { key: tuesday, } var actual = merge(target, source, { clone: true }) t.equal(actual.key, tuesday) t.end() }) test('should work on array with null in it', function(t) { var target = [] var src = [ null ] var expected = [ null ] t.deepEqual(merge(target, src), expected) t.end() }) test('should clone array\'s element if it is object', function(t) { var a = { key: 'yup' } var target = [] var source = [ a ] var output = merge(target, source, { clone: true }) t.notEqual(output[0], a) t.equal(output[0].key, 'yup') t.end() }) test('should clone an array property when there is no target array', function(t) { const someObject = {} var target = {} var source = { ary: [ someObject ] } var output = merge(target, source, { clone: true }) t.deepEqual(output, { ary: [{}] }) t.notEqual(output.ary[0], someObject) t.end() }) test('should overwrite values when property is initialised but undefined', function(t) { var target1 = { value: [] } var target2 = { value: null } var target3 = { value: 2 } var src = { value: undefined } function hasUndefinedProperty(o) { t.ok(o.hasOwnProperty('value')) t.equal(typeof o.value, 'undefined') } hasUndefinedProperty(merge(target1, src)) hasUndefinedProperty(merge(target2, src)) hasUndefinedProperty(merge(target3, src)) t.end() }) test('dates should copy correctly in an array', function(t) { var monday = new Date('2016-09-27T01:08:12.761Z') var tuesday = new Date('2016-09-28T01:18:12.761Z') var target = [ monday, 'dude' ] var source = [ tuesday, 'lol' ] var expected = [ monday, 'dude', tuesday, 'lol' ] var actual = merge(target, source) t.deepEqual(actual, expected) t.end() }) test('should handle custom merge functions', function(t) { var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert', } } var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } } const mergePeople = (target, source, options) => { const keys = new Set(Object.keys(target).concat(Object.keys(source))) const destination = {} keys.forEach(key => { if (key in target && key in source) { destination[key] = `${target[key]}-${source[key]}` } else if (key in target) { destination[key] = target[key] } else { destination[key] = source[key] } }) return destination } const options = { customMerge: (key, options) => { if (key === 'people') { return mergePeople } return merge } } var expected = { letters: ['a', 'b', 'c'], people: { first: 'Alex-Smith', second: 'Bert-Bertson', third: 'Car' } } var actual = merge(target, source, options) t.deepEqual(actual, expected) t.end() }) test('should handle custom merge functions', function(t) { var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert', } } var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } } const mergeLetters = (target, source, options) => { return 'merged letters' } const options = { customMerge: (key, options) => { if (key === 'letters') { return mergeLetters } } } const expected = { letters: 'merged letters', people: { first: 'Smith', second: 'Bertson', third: 'Car' } } var actual = merge(target, source, options) t.deepEqual(actual, expected) t.end() }) test('should merge correctly if custom merge is not a valid function', function(t) { var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert', } } var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } } const options = { customMerge: (key, options) => { return false } } const expected = { letters: ['a', 'b', 'c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } } var actual = merge(target, source, options) t.deepEqual(actual, expected) t.end() }) test('copy symbol keys in target that do not exist on the target', function(t) { var mySymbol = Symbol(); var src = { [mySymbol]: 'value1' } var target = {} var res = merge(target, src) t.equal(res[mySymbol], 'value1') t.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src)) t.end() }) test('copy symbol keys in target that do exist on the target', function(t) { var mySymbol = Symbol(); var src = { [mySymbol]: 'value1' } var target = { [mySymbol]: 'wat'} var res = merge(target, src) t.equal(res[mySymbol], 'value1') t.end() }) test('Falsey properties should be mergeable', function(t) { var uniqueValue = {} var target = { wat: false } var source = { wat: false } var customMergeWasCalled = false var result = merge(target, source, { isMergeableObject: function() { return true }, customMerge: function() { return function() { customMergeWasCalled = true return uniqueValue } } }) t.equal(result.wat, uniqueValue) t.ok(customMergeWasCalled, 'custom merge function was called') t.end() }) deepmerge-4.2.2/test/prototype-poisoning.js000066400000000000000000000046031355561233500210540ustar00rootroot00000000000000var merge = require('../') var test = require('tape') var isMergeableObject = require('is-mergeable-object') test('merging objects with own __proto__', function(t) { var user = {} var malicious = JSON.parse('{ "__proto__": { "admin": true } }') var mergedObject = merge(user, malicious) t.notOk(mergedObject.__proto__.admin, 'non-plain properties should not be merged') t.notOk(mergedObject.admin, 'the destination should have an unmodified prototype') t.end() }) test('merging objects with plain and non-plain properties', function(t) { var plainSymbolKey = Symbol('plainSymbolKey') var parent = { parentKey: 'should be undefined' } var target = Object.create(parent) target.plainKey = 'should be replaced' target[plainSymbolKey] = 'should also be replaced' var source = { parentKey: 'foo', plainKey: 'bar', newKey: 'baz', [plainSymbolKey]: 'qux' } var mergedObject = merge(target, source) t.equal(undefined, mergedObject.parentKey, 'inherited properties of target should be removed, not merged or ignored') t.equal('bar', mergedObject.plainKey, 'enumerable own properties of target should be merged') t.equal('baz', mergedObject.newKey, 'properties not yet on target should be merged') t.equal('qux', mergedObject[plainSymbolKey], 'enumerable own symbol properties of target should be merged') t.end() }) // the following cases come from the thread here: https://github.com/TehShrike/deepmerge/pull/164 test('merging strings works with a custom string merge', function(t) { var target = { name: "Alexander" } var source = { name: "Hamilton" } function customMerge(key, options) { if (key === 'name') { return function(target, source, options) { return target[0] + '. ' + source.substring(0, 3) } } else { return merge } } function mergeable(target) { return isMergeableObject(target) || (typeof target === 'string' && target.length > 1) } t.equal('A. Ham', merge(target, source, { customMerge: customMerge, isMergeableObject: mergeable }).name) t.end() }) test('merging objects with null prototype', function(t) { var target = Object.create(null) var source = Object.create(null) target.wheels = 4 target.trunk = { toolbox: ['hammer'] } source.trunk = { toolbox: ['wrench'] } source.engine = 'v8' var expected = { wheels: 4, engine: 'v8', trunk: { toolbox: ['hammer', 'wrench' ] } } t.deepEqual(expected, merge(target, source)) t.end() }) deepmerge-4.2.2/test/typescript.ts000066400000000000000000000017661355561233500172330ustar00rootroot00000000000000import * as merge from '../'; const x = { foo: 'abc', bar: 'def', wat: 42, } const y = { foo: 'cba', bar: 'fed', wat: 42, } const z = { baz: '123', quux: '456', wat: 42, } let merged1 = merge(x, y); let merged2 = merge(x, z); let merged3 = merge.all<{wat: number}>([ x, y, z ]); merged1.foo; merged1.bar; merged2.foo; merged2.baz; merged3.wat; const options1: merge.Options = { clone: true, isMergeableObject (obj) { return false; }, }; const options2: merge.Options = { arrayMerge (target, source, options) { target.length; source.length; options.isMergeableObject(target); return []; }, clone: true, isMergeableObject (obj) { return false; }, }; const options3: merge.Options = { customMerge: (key) => { if (key === 'foo') { return (target, source) => target + source; } } } merged1 = merge(x, y, options1); merged2 = merge(x, z, options2); merged3 = merge.all<{wat: number}>([x, y, z], options1); const merged4 = merge(x, y, options3);