Codebase list node-deepmerge / 6cc46c0
Import upstream version 4.2.2+~1.1.1+git20211207.1.e5a2771 Debian Janitor 1 year, 3 months ago
15 changed file(s) with 22 addition(s) and 1934 deletion(s). Raw diff Collapse all Expand all
0 root = true
1
2 [*]
3 indent_style = tab
4 end_of_line = lf
5 trim_trailing_whitespace = true
6 insert_final_newline = true
+0
-3
.npmignore less more
0 test/
1 .gitignore
2 .travis.yml
+0
-3
is-mergeable-object/index.d.ts less more
0 declare function isMergeableObject(value: any): boolean;
1
2 export default isMergeableObject;
+0
-24
is-mergeable-object/index.js less more
0 module.exports = function isMergeableObject(value) {
1 return isNonNullObject(value)
2 && !isSpecial(value)
3 }
4
5 function isNonNullObject(value) {
6 return !!value && typeof value === 'object'
7 }
8
9 function isSpecial(value) {
10 var stringValue = Object.prototype.toString.call(value)
11
12 return stringValue === '[object RegExp]'
13 || stringValue === '[object Date]'
14 || isReactElement(value)
15 }
16
17 // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
18 var canUseSymbol = typeof Symbol === 'function' && Symbol.for
19 var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7
20
21 function isReactElement(value) {
22 return value.$$typeof === REACT_ELEMENT_TYPE
23 }
+0
-135
is-mergeable-object/package-lock.json less more
0 {
1 "name": "is-mergeable-object",
2 "version": "1.1.1",
3 "lockfileVersion": 1,
4 "requires": true,
5 "dependencies": {
6 "deep-is": {
7 "version": "0.1.3",
8 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
9 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
10 "dev": true
11 },
12 "escodegen": {
13 "version": "1.11.1",
14 "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
15 "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
16 "dev": true,
17 "requires": {
18 "esprima": "^3.1.3",
19 "estraverse": "^4.2.0",
20 "esutils": "^2.0.2",
21 "optionator": "^0.8.1",
22 "source-map": "~0.6.1"
23 },
24 "dependencies": {
25 "esprima": {
26 "version": "3.1.3",
27 "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
28 "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
29 "dev": true
30 }
31 }
32 },
33 "esprima": {
34 "version": "2.7.3",
35 "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
36 "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
37 "dev": true
38 },
39 "estraverse": {
40 "version": "4.2.0",
41 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
42 "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
43 "dev": true
44 },
45 "esutils": {
46 "version": "2.0.2",
47 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
48 "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
49 "dev": true
50 },
51 "fast-levenshtein": {
52 "version": "2.0.6",
53 "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
54 "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
55 "dev": true
56 },
57 "jsmd": {
58 "version": "1.0.1",
59 "resolved": "https://registry.npmjs.org/jsmd/-/jsmd-1.0.1.tgz",
60 "integrity": "sha512-fcNxki98MSYdJyWj9jjbSrQkd+ptYLRgb3HgLMZxALI9TznqbqmTImBhWei2GkOSerX84Ve8Swq6AYqCrti8dw==",
61 "dev": true,
62 "requires": {
63 "escodegen": "^1.9.1",
64 "esprima": "^2.7.3",
65 "estraverse": "^4.2.0",
66 "marked": "0.6.2",
67 "v8-argv": "github:jkroso/v8-argv#1.1.1"
68 }
69 },
70 "levn": {
71 "version": "0.3.0",
72 "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
73 "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
74 "dev": true,
75 "requires": {
76 "prelude-ls": "~1.1.2",
77 "type-check": "~0.3.2"
78 }
79 },
80 "marked": {
81 "version": "0.6.2",
82 "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz",
83 "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==",
84 "dev": true
85 },
86 "optionator": {
87 "version": "0.8.2",
88 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
89 "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
90 "dev": true,
91 "requires": {
92 "deep-is": "~0.1.3",
93 "fast-levenshtein": "~2.0.4",
94 "levn": "~0.3.0",
95 "prelude-ls": "~1.1.2",
96 "type-check": "~0.3.2",
97 "wordwrap": "~1.0.0"
98 }
99 },
100 "prelude-ls": {
101 "version": "1.1.2",
102 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
103 "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
104 "dev": true
105 },
106 "source-map": {
107 "version": "0.6.1",
108 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
109 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
110 "dev": true,
111 "optional": true
112 },
113 "type-check": {
114 "version": "0.3.2",
115 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
116 "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
117 "dev": true,
118 "requires": {
119 "prelude-ls": "~1.1.2"
120 }
121 },
122 "v8-argv": {
123 "version": "github:jkroso/v8-argv#284f84379e292eb956a5e7b66fb953ec4974385e",
124 "from": "github:jkroso/v8-argv#1.1.1",
125 "dev": true
126 },
127 "wordwrap": {
128 "version": "1.0.0",
129 "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
130 "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
131 "dev": true
132 }
133 }
134 }
+0
-30
is-mergeable-object/package.json less more
0 {
1 "name": "is-mergeable-object",
2 "version": "1.1.1",
3 "description": "Check whether or not a value is an object that makes sense to iterate over",
4 "main": "index.js",
5 "types": "index.d.ts",
6 "scripts": {
7 "test": "jsmd readme.md"
8 },
9 "repository": {
10 "type": "git",
11 "url": "git+ssh://git@github.com/TehShrike/is-mergeable-object.git"
12 },
13 "keywords": [
14 "object",
15 "iterate",
16 "recursive",
17 "merge",
18 "deep"
19 ],
20 "author": "TehShrike",
21 "license": "MIT",
22 "bugs": {
23 "url": "https://github.com/TehShrike/is-mergeable-object/issues"
24 },
25 "homepage": "https://github.com/TehShrike/is-mergeable-object#readme",
26 "devDependencies": {
27 "jsmd": "^1.0.1"
28 }
29 }
+0
-31
is-mergeable-object/readme.md less more
0 # is-mergeable-object
1
2 <!--js
3 const isMergeableObject = require('./')
4 -->
5
6 The biggest difficulty deep merge libraries run into is figuring out which properties of an object should be recursively iterated over.
7
8 This module contains the algorithm used by [`deepmerge`](https://github.com/KyleAMathews/deepmerge/).
9
10 <!--js
11 const someReactElement = {
12 $$typeof: Symbol.for('react.element')
13 }
14 -->
15
16 ```js
17 isMergeableObject(null) // => false
18
19 isMergeableObject({}) // => true
20
21 isMergeableObject(new RegExp('wat')) // => false
22
23 isMergeableObject(undefined) // => false
24
25 isMergeableObject(new Object()) // => true
26
27 isMergeableObject(new Date()) // => false
28
29 isMergeableObject(someReactElement) // => false
30 ```
+0
-686
package-lock.json less more
0 {
1 "name": "deepmerge",
2 "version": "4.2.2",
3 "lockfileVersion": 1,
4 "requires": true,
5 "dependencies": {
6 "@types/estree": {
7 "version": "0.0.39",
8 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
9 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
10 "dev": true
11 },
12 "@types/node": {
13 "version": "8.10.54",
14 "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz",
15 "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==",
16 "dev": true
17 },
18 "@types/resolve": {
19 "version": "0.0.8",
20 "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
21 "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
22 "dev": true,
23 "requires": {
24 "@types/node": "*"
25 }
26 },
27 "acorn": {
28 "version": "7.1.0",
29 "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
30 "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
31 "dev": true
32 },
33 "arrify": {
34 "version": "1.0.1",
35 "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
36 "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
37 "dev": true
38 },
39 "balanced-match": {
40 "version": "1.0.0",
41 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
42 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
43 "dev": true
44 },
45 "brace-expansion": {
46 "version": "1.1.11",
47 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
48 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
49 "dev": true,
50 "requires": {
51 "balanced-match": "^1.0.0",
52 "concat-map": "0.0.1"
53 }
54 },
55 "buffer-from": {
56 "version": "1.1.1",
57 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
58 "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
59 "dev": true
60 },
61 "builtin-modules": {
62 "version": "3.1.0",
63 "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
64 "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
65 "dev": true
66 },
67 "commander": {
68 "version": "2.20.0",
69 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
70 "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
71 "dev": true
72 },
73 "concat-map": {
74 "version": "0.0.1",
75 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
76 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
77 "dev": true
78 },
79 "deep-equal": {
80 "version": "1.0.1",
81 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
82 "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
83 "dev": true
84 },
85 "deep-is": {
86 "version": "0.1.3",
87 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
88 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
89 "dev": true
90 },
91 "define-properties": {
92 "version": "1.1.3",
93 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
94 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
95 "dev": true,
96 "requires": {
97 "object-keys": "^1.0.12"
98 }
99 },
100 "defined": {
101 "version": "1.0.0",
102 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
103 "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
104 "dev": true
105 },
106 "es-abstract": {
107 "version": "1.15.0",
108 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz",
109 "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==",
110 "dev": true,
111 "requires": {
112 "es-to-primitive": "^1.2.0",
113 "function-bind": "^1.1.1",
114 "has": "^1.0.3",
115 "has-symbols": "^1.0.0",
116 "is-callable": "^1.1.4",
117 "is-regex": "^1.0.4",
118 "object-inspect": "^1.6.0",
119 "object-keys": "^1.1.1",
120 "string.prototype.trimleft": "^2.1.0",
121 "string.prototype.trimright": "^2.1.0"
122 }
123 },
124 "es-to-primitive": {
125 "version": "1.2.0",
126 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
127 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
128 "dev": true,
129 "requires": {
130 "is-callable": "^1.1.4",
131 "is-date-object": "^1.0.1",
132 "is-symbol": "^1.0.2"
133 }
134 },
135 "escodegen": {
136 "version": "1.12.0",
137 "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz",
138 "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==",
139 "dev": true,
140 "requires": {
141 "esprima": "^3.1.3",
142 "estraverse": "^4.2.0",
143 "esutils": "^2.0.2",
144 "optionator": "^0.8.1",
145 "source-map": "~0.6.1"
146 },
147 "dependencies": {
148 "esprima": {
149 "version": "3.1.3",
150 "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
151 "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
152 "dev": true
153 }
154 }
155 },
156 "esprima": {
157 "version": "2.7.3",
158 "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
159 "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
160 "dev": true
161 },
162 "estraverse": {
163 "version": "4.3.0",
164 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
165 "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
166 "dev": true
167 },
168 "estree-walker": {
169 "version": "0.6.1",
170 "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
171 "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
172 "dev": true
173 },
174 "esutils": {
175 "version": "2.0.3",
176 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
177 "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
178 "dev": true
179 },
180 "fast-levenshtein": {
181 "version": "2.0.6",
182 "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
183 "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
184 "dev": true
185 },
186 "for-each": {
187 "version": "0.3.3",
188 "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
189 "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
190 "dev": true,
191 "requires": {
192 "is-callable": "^1.1.3"
193 }
194 },
195 "fs.realpath": {
196 "version": "1.0.0",
197 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
198 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
199 "dev": true
200 },
201 "function-bind": {
202 "version": "1.1.1",
203 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
204 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
205 "dev": true
206 },
207 "glob": {
208 "version": "7.1.4",
209 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
210 "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
211 "dev": true,
212 "requires": {
213 "fs.realpath": "^1.0.0",
214 "inflight": "^1.0.4",
215 "inherits": "2",
216 "minimatch": "^3.0.4",
217 "once": "^1.3.0",
218 "path-is-absolute": "^1.0.0"
219 }
220 },
221 "has": {
222 "version": "1.0.3",
223 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
224 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
225 "dev": true,
226 "requires": {
227 "function-bind": "^1.1.1"
228 }
229 },
230 "has-symbols": {
231 "version": "1.0.0",
232 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
233 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
234 "dev": true
235 },
236 "inflight": {
237 "version": "1.0.6",
238 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
239 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
240 "dev": true,
241 "requires": {
242 "once": "^1.3.0",
243 "wrappy": "1"
244 }
245 },
246 "inherits": {
247 "version": "2.0.4",
248 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
249 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
250 "dev": true
251 },
252 "is-callable": {
253 "version": "1.1.4",
254 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
255 "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
256 "dev": true
257 },
258 "is-date-object": {
259 "version": "1.0.1",
260 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
261 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
262 "dev": true
263 },
264 "is-mergeable-object": {
265 "version": "1.1.0",
266 "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz",
267 "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==",
268 "dev": true
269 },
270 "is-module": {
271 "version": "1.0.0",
272 "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
273 "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
274 "dev": true
275 },
276 "is-plain-object": {
277 "version": "2.0.4",
278 "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
279 "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
280 "dev": true,
281 "requires": {
282 "isobject": "^3.0.1"
283 },
284 "dependencies": {
285 "isobject": {
286 "version": "3.0.1",
287 "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
288 "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
289 "dev": true
290 }
291 }
292 },
293 "is-reference": {
294 "version": "1.1.4",
295 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz",
296 "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==",
297 "dev": true,
298 "requires": {
299 "@types/estree": "0.0.39"
300 }
301 },
302 "is-regex": {
303 "version": "1.0.4",
304 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
305 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
306 "dev": true,
307 "requires": {
308 "has": "^1.0.1"
309 }
310 },
311 "is-symbol": {
312 "version": "1.0.2",
313 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
314 "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
315 "dev": true,
316 "requires": {
317 "has-symbols": "^1.0.0"
318 }
319 },
320 "jsmd": {
321 "version": "1.0.2",
322 "resolved": "https://registry.npmjs.org/jsmd/-/jsmd-1.0.2.tgz",
323 "integrity": "sha512-mrQ80ysClsuw4QASa7JcjpwgTADBclo9LgIPDERD99tsfVcXGEHjkX50Q9N0NSmX1Zq3xxQYAA8fuN9GHk1Beg==",
324 "dev": true,
325 "requires": {
326 "escodegen": "^1.9.1",
327 "esprima": "^2.7.3",
328 "estraverse": "^4.2.0",
329 "marked": "^0.7.0",
330 "v8-argv": "github:jkroso/v8-argv#1.1.1"
331 }
332 },
333 "levn": {
334 "version": "0.3.0",
335 "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
336 "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
337 "dev": true,
338 "requires": {
339 "prelude-ls": "~1.1.2",
340 "type-check": "~0.3.2"
341 }
342 },
343 "magic-string": {
344 "version": "0.25.4",
345 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz",
346 "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==",
347 "dev": true,
348 "requires": {
349 "sourcemap-codec": "^1.4.4"
350 }
351 },
352 "make-error": {
353 "version": "1.3.5",
354 "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
355 "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
356 "dev": true
357 },
358 "marked": {
359 "version": "0.7.0",
360 "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz",
361 "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==",
362 "dev": true
363 },
364 "minimatch": {
365 "version": "3.0.4",
366 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
367 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
368 "dev": true,
369 "requires": {
370 "brace-expansion": "^1.1.7"
371 }
372 },
373 "minimist": {
374 "version": "1.2.0",
375 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
376 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
377 "dev": true
378 },
379 "mkdirp": {
380 "version": "0.5.1",
381 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
382 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
383 "dev": true,
384 "requires": {
385 "minimist": "0.0.8"
386 },
387 "dependencies": {
388 "minimist": {
389 "version": "0.0.8",
390 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
391 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
392 "dev": true
393 }
394 }
395 },
396 "object-inspect": {
397 "version": "1.6.0",
398 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
399 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
400 "dev": true
401 },
402 "object-keys": {
403 "version": "1.1.1",
404 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
405 "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
406 "dev": true
407 },
408 "once": {
409 "version": "1.4.0",
410 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
411 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
412 "dev": true,
413 "requires": {
414 "wrappy": "1"
415 }
416 },
417 "optionator": {
418 "version": "0.8.2",
419 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
420 "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
421 "dev": true,
422 "requires": {
423 "deep-is": "~0.1.3",
424 "fast-levenshtein": "~2.0.4",
425 "levn": "~0.3.0",
426 "prelude-ls": "~1.1.2",
427 "type-check": "~0.3.2",
428 "wordwrap": "~1.0.0"
429 }
430 },
431 "path-is-absolute": {
432 "version": "1.0.1",
433 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
434 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
435 "dev": true
436 },
437 "path-parse": {
438 "version": "1.0.6",
439 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
440 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
441 "dev": true
442 },
443 "prelude-ls": {
444 "version": "1.1.2",
445 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
446 "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
447 "dev": true
448 },
449 "resolve": {
450 "version": "1.12.0",
451 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
452 "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
453 "dev": true,
454 "requires": {
455 "path-parse": "^1.0.6"
456 }
457 },
458 "resumer": {
459 "version": "0.0.0",
460 "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
461 "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
462 "dev": true,
463 "requires": {
464 "through": "~2.3.4"
465 }
466 },
467 "rollup": {
468 "version": "1.23.1",
469 "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz",
470 "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==",
471 "dev": true,
472 "requires": {
473 "@types/estree": "*",
474 "@types/node": "*",
475 "acorn": "^7.1.0"
476 }
477 },
478 "rollup-plugin-commonjs": {
479 "version": "10.1.0",
480 "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz",
481 "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==",
482 "dev": true,
483 "requires": {
484 "estree-walker": "^0.6.1",
485 "is-reference": "^1.1.2",
486 "magic-string": "^0.25.2",
487 "resolve": "^1.11.0",
488 "rollup-pluginutils": "^2.8.1"
489 }
490 },
491 "rollup-plugin-node-resolve": {
492 "version": "5.2.0",
493 "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz",
494 "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==",
495 "dev": true,
496 "requires": {
497 "@types/resolve": "0.0.8",
498 "builtin-modules": "^3.1.0",
499 "is-module": "^1.0.0",
500 "resolve": "^1.11.1",
501 "rollup-pluginutils": "^2.8.1"
502 }
503 },
504 "rollup-pluginutils": {
505 "version": "2.8.2",
506 "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
507 "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
508 "dev": true,
509 "requires": {
510 "estree-walker": "^0.6.1"
511 }
512 },
513 "source-map": {
514 "version": "0.6.1",
515 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
516 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
517 "dev": true
518 },
519 "source-map-support": {
520 "version": "0.5.9",
521 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
522 "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
523 "dev": true,
524 "requires": {
525 "buffer-from": "^1.0.0",
526 "source-map": "^0.6.0"
527 },
528 "dependencies": {
529 "source-map": {
530 "version": "0.6.1",
531 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
532 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
533 "dev": true
534 }
535 }
536 },
537 "sourcemap-codec": {
538 "version": "1.4.6",
539 "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz",
540 "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==",
541 "dev": true
542 },
543 "string.prototype.trim": {
544 "version": "1.1.2",
545 "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
546 "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
547 "dev": true,
548 "requires": {
549 "define-properties": "^1.1.2",
550 "es-abstract": "^1.5.0",
551 "function-bind": "^1.0.2"
552 }
553 },
554 "string.prototype.trimleft": {
555 "version": "2.1.0",
556 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
557 "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
558 "dev": true,
559 "requires": {
560 "define-properties": "^1.1.3",
561 "function-bind": "^1.1.1"
562 }
563 },
564 "string.prototype.trimright": {
565 "version": "2.1.0",
566 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
567 "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
568 "dev": true,
569 "requires": {
570 "define-properties": "^1.1.3",
571 "function-bind": "^1.1.1"
572 }
573 },
574 "tape": {
575 "version": "4.11.0",
576 "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz",
577 "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==",
578 "dev": true,
579 "requires": {
580 "deep-equal": "~1.0.1",
581 "defined": "~1.0.0",
582 "for-each": "~0.3.3",
583 "function-bind": "~1.1.1",
584 "glob": "~7.1.4",
585 "has": "~1.0.3",
586 "inherits": "~2.0.4",
587 "minimist": "~1.2.0",
588 "object-inspect": "~1.6.0",
589 "resolve": "~1.11.1",
590 "resumer": "~0.0.0",
591 "string.prototype.trim": "~1.1.2",
592 "through": "~2.3.8"
593 },
594 "dependencies": {
595 "resolve": {
596 "version": "1.11.1",
597 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
598 "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
599 "dev": true,
600 "requires": {
601 "path-parse": "^1.0.6"
602 }
603 }
604 }
605 },
606 "through": {
607 "version": "2.3.8",
608 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
609 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
610 "dev": true
611 },
612 "ts-node": {
613 "version": "7.0.1",
614 "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz",
615 "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==",
616 "dev": true,
617 "requires": {
618 "arrify": "^1.0.0",
619 "buffer-from": "^1.1.0",
620 "diff": "^3.1.0",
621 "make-error": "^1.1.1",
622 "minimist": "^1.2.0",
623 "mkdirp": "^0.5.1",
624 "source-map-support": "^0.5.6",
625 "yn": "^2.0.0"
626 },
627 "dependencies": {
628 "diff": {
629 "version": "3.5.0",
630 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
631 "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
632 "dev": true
633 }
634 }
635 },
636 "type-check": {
637 "version": "0.3.2",
638 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
639 "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
640 "dev": true,
641 "requires": {
642 "prelude-ls": "~1.1.2"
643 }
644 },
645 "typescript": {
646 "version": "2.2.2",
647 "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz",
648 "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=",
649 "dev": true
650 },
651 "uglify-js": {
652 "version": "3.6.1",
653 "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz",
654 "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==",
655 "dev": true,
656 "requires": {
657 "commander": "2.20.0",
658 "source-map": "~0.6.1"
659 }
660 },
661 "v8-argv": {
662 "version": "github:jkroso/v8-argv#284f84379e292eb956a5e7b66fb953ec4974385e",
663 "from": "github:jkroso/v8-argv#1.1.1",
664 "dev": true
665 },
666 "wordwrap": {
667 "version": "1.0.0",
668 "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
669 "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
670 "dev": true
671 },
672 "wrappy": {
673 "version": "1.0.2",
674 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
675 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
676 "dev": true
677 },
678 "yn": {
679 "version": "2.0.0",
680 "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
681 "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=",
682 "dev": true
683 }
684 }
685 }
208208
209209 ```js
210210 const alex = {
211 name: {
212 first: 'Alex',
213 last: 'Alexson'
214 },
215 pets: ['Cat', 'Parrot']
211 name: {
212 first: 'Alex',
213 last: 'Alexson'
214 },
215 pets: ['Cat', 'Parrot']
216216 }
217217
218218 const tony = {
219 name: {
220 first: 'Tony',
221 last: 'Tonison'
222 },
223 pets: ['Dog']
219 name: {
220 first: 'Tony',
221 last: 'Tonison'
222 },
223 pets: ['Dog']
224224 }
225225
226226 const mergeNames = (nameA, nameB) => `${nameA.first} and ${nameB.first}`
227227
228228 const options = {
229 customMerge: (key) => {
230 if (key === 'name') {
231 return mergeNames
232 }
233 }
229 customMerge: (key) => {
230 if (key === 'name') {
231 return mergeNames
232 }
233 }
234234 }
235235
236236 const result = merge(alex, tony, options)
+0
-70
test/custom-array-merge.js less more
0 var merge = require('../')
1 var test = require('tape')
2
3 test('custom merge array', function(t) {
4 var mergeFunctionCalled = false
5 function overwriteMerge(target, source, options) {
6 mergeFunctionCalled = true
7 t.equal(options.arrayMerge, overwriteMerge)
8
9 return source
10 }
11 const destination = {
12 someArray: [ 1, 2 ],
13 someObject: { what: 'yes' },
14 }
15 const source = {
16 someArray: [ 1, 2, 3 ],
17 }
18
19 const actual = merge(destination, source, { arrayMerge: overwriteMerge })
20 const expected = {
21 someArray: [ 1, 2, 3 ],
22 someObject: { what: 'yes' },
23 }
24
25 t.ok(mergeFunctionCalled)
26 t.deepEqual(actual, expected)
27 t.end()
28 })
29
30 test('merge top-level arrays', function(t) {
31 function overwriteMerge(a, b) {
32 return b
33 }
34 var actual = merge([ 1, 2 ], [ 1, 2 ], { arrayMerge: overwriteMerge })
35 var expected = [ 1, 2 ]
36
37 t.deepEqual(actual, expected)
38 t.end()
39 })
40
41 test('cloner function is available for merge functions to use', function(t) {
42 var customMergeWasCalled = false
43 function cloneMerge(target, source, options) {
44 customMergeWasCalled = true
45 t.ok(options.cloneUnlessOtherwiseSpecified, 'cloner function is available')
46 return target.concat(source).map(function(element) {
47 return options.cloneUnlessOtherwiseSpecified(element, options)
48 })
49 }
50
51 var src = {
52 key1: [ 'one', 'three' ],
53 key2: [ 'four' ],
54 }
55 var target = {
56 key1: [ 'one', 'two' ],
57 }
58
59 var expected = {
60 key1: [ 'one', 'two', 'one', 'three' ],
61 key2: [ 'four' ],
62 }
63
64 t.deepEqual(merge(target, src, { arrayMerge: cloneMerge }), expected)
65 t.ok(customMergeWasCalled)
66 t.ok(Array.isArray(merge(target, src).key1))
67 t.ok(Array.isArray(merge(target, src).key2))
68 t.end()
69 })
+0
-36
test/custom-is-mergeable-object.js less more
0 var merge = require('../')
1 var test = require('tape')
2
3 test('isMergeableObject function copying object over object', function(t) {
4 var src = { key: { isMergeable: false }, baz: 'yes' }
5 var target = { key: { foo: 'wat' }, baz: 'whatever' }
6
7 function isMergeableObject(object) {
8 return object && typeof value === 'object' && object.isMergeable !== false
9 }
10
11 var res = merge(target, src, {
12 isMergeableObject: isMergeableObject
13 })
14
15 t.deepEqual(res, { key: { isMergeable: false }, baz: 'yes' })
16 t.equal(res.key, src.key, 'Object has the same identity and was not cloned')
17 t.end()
18 })
19
20 test('isMergeableObject function copying object over nothing', function(t) {
21 var src = { key: { isMergeable: false, foo: 'bar' }, baz: 'yes' }
22 var target = { baz: 'whatever' }
23
24 function isMergeableObject(object) {
25 return object && typeof value === 'object' && object.isMergeable !== false
26 }
27
28 var res = merge(target, src, {
29 isMergeableObject: isMergeableObject
30 })
31
32 t.deepEqual(res, { key: { isMergeable: false, foo: 'bar' }, baz: 'yes' })
33 t.equal(res.key, src.key, 'Object has the same identity and was not cloned')
34 t.end()
35 })
+0
-89
test/merge-all.js less more
0 var merge = require('../')
1 var test = require('tape')
2
3 test('throw error if first argument is not an array', function(t) {
4 t.throws(merge.all.bind(null, { example: true }, { another: '2' }), Error)
5 t.end()
6 })
7
8 test('return an empty object if first argument is an array with no elements', function(t) {
9 t.deepEqual(merge.all([]), {})
10 t.end()
11 })
12
13 test('Work just fine if first argument is an array with least than two elements', function(t) {
14 var actual = merge.all([{ example: true }])
15 var expected = { example: true }
16 t.deepEqual(actual, expected)
17 t.end()
18 })
19
20 test('execute correctly if options object were not passed', function(t) {
21 var arrayToMerge = [{ example: true }, { another: '123' }]
22 t.doesNotThrow(merge.all.bind(null, arrayToMerge))
23 t.end()
24 })
25
26 test('execute correctly if options object were passed', function(t) {
27 var arrayToMerge = [{ example: true }, { another: '123' }]
28 t.doesNotThrow(merge.all.bind(null, arrayToMerge, { clone: true }))
29 t.end()
30 })
31
32 test('invoke merge on every item in array should result with all props', function(t) {
33 var firstObject = { first: true }
34 var secondObject = { second: false }
35 var thirdObject = { third: 123 }
36 var fourthObject = { fourth: 'some string' }
37
38 var mergedObject = merge.all([ firstObject, secondObject, thirdObject, fourthObject ])
39
40 t.ok(mergedObject.first === true)
41 t.ok(mergedObject.second === false)
42 t.ok(mergedObject.third === 123)
43 t.ok(mergedObject.fourth === 'some string')
44 t.end()
45 })
46
47 test('invoke merge on every item in array with clone should clone all elements', function(t) {
48 var firstObject = { a: { d: 123 } }
49 var secondObject = { b: { e: true } }
50 var thirdObject = { c: { f: 'string' } }
51
52 var mergedWithClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: true })
53
54 t.notEqual(mergedWithClone.a, firstObject.a)
55 t.notEqual(mergedWithClone.b, secondObject.b)
56 t.notEqual(mergedWithClone.c, thirdObject.c)
57
58 t.end()
59 })
60
61 test('invoke merge on every item in array clone=false should not clone all elements', function(t) {
62 var firstObject = { a: { d: 123 } }
63 var secondObject = { b: { e: true } }
64 var thirdObject = { c: { f: 'string' } }
65
66 var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: false })
67
68 t.equal(mergedWithoutClone.a, firstObject.a)
69 t.equal(mergedWithoutClone.b, secondObject.b)
70 t.equal(mergedWithoutClone.c, thirdObject.c)
71
72 t.end()
73 })
74
75
76 test('invoke merge on every item in array without clone should clone all elements', function(t) {
77 var firstObject = { a: { d: 123 } }
78 var secondObject = { b: { e: true } }
79 var thirdObject = { c: { f: 'string' } }
80
81 var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ])
82
83 t.notEqual(mergedWithoutClone.a, firstObject.a)
84 t.notEqual(mergedWithoutClone.b, secondObject.b)
85 t.notEqual(mergedWithoutClone.c, thirdObject.c)
86
87 t.end()
88 })
+0
-669
test/merge.js less more
0 var merge = require('../')
1 var test = require('tape')
2
3 test('add keys in target that do not exist at the root', function(t) {
4 var src = { key1: 'value1', key2: 'value2' }
5 var target = {}
6
7 var res = merge(target, src)
8
9 t.deepEqual(target, {}, 'merge should be immutable')
10 t.deepEqual(res, src)
11 t.end()
12 })
13
14 test('merge existing simple keys in target at the roots', function(t) {
15 var src = { key1: 'changed', key2: 'value2' }
16 var target = { key1: 'value1', key3: 'value3' }
17
18 var expected = {
19 key1: 'changed',
20 key2: 'value2',
21 key3: 'value3',
22 }
23
24 t.deepEqual(target, { key1: 'value1', key3: 'value3' })
25 t.deepEqual(merge(target, src), expected)
26 t.end()
27 })
28
29 test('merge nested objects into target', function(t) {
30 var src = {
31 key1: {
32 subkey1: 'changed',
33 subkey3: 'added',
34 },
35 }
36 var target = {
37 key1: {
38 subkey1: 'value1',
39 subkey2: 'value2',
40 },
41 }
42
43 var expected = {
44 key1: {
45 subkey1: 'changed',
46 subkey2: 'value2',
47 subkey3: 'added',
48 },
49 }
50
51 t.deepEqual(target, {
52 key1: {
53 subkey1: 'value1',
54 subkey2: 'value2',
55 },
56 })
57 t.deepEqual(merge(target, src), expected)
58 t.end()
59 })
60
61 test('replace simple key with nested object in target', function(t) {
62 var src = {
63 key1: {
64 subkey1: 'subvalue1',
65 subkey2: 'subvalue2',
66 },
67 }
68 var target = {
69 key1: 'value1',
70 key2: 'value2',
71 }
72
73 var expected = {
74 key1: {
75 subkey1: 'subvalue1',
76 subkey2: 'subvalue2',
77 },
78 key2: 'value2',
79 }
80
81 t.deepEqual(target, { key1: 'value1', key2: 'value2' })
82 t.deepEqual(merge(target, src), expected)
83 t.end()
84 })
85
86 test('should add nested object in target', function(t) {
87 var src = {
88 "b": {
89 "c": {},
90 },
91 }
92
93 var target = {
94 "a": {},
95 }
96
97 var expected = {
98 "a": {},
99 "b": {
100 "c": {},
101 },
102 }
103
104 t.deepEqual(merge(target, src), expected)
105 t.end()
106 })
107
108 test('should clone source and target', function(t) {
109 var src = {
110 "b": {
111 "c": "foo",
112 },
113 }
114
115 var target = {
116 "a": {
117 "d": "bar",
118 },
119 }
120
121 var expected = {
122 "a": {
123 "d": "bar",
124 },
125 "b": {
126 "c": "foo",
127 },
128 }
129
130 var merged = merge(target, src, { clone: true })
131
132 t.deepEqual(merged, expected)
133
134 t.notEqual(merged.a, target.a)
135 t.notEqual(merged.b, src.b)
136
137 t.end()
138 })
139
140 test('should clone source and target', function(t) {
141 var src = {
142 "b": {
143 "c": "foo",
144 },
145 }
146
147 var target = {
148 "a": {
149 "d": "bar",
150 },
151 }
152
153 var merged = merge(target, src)
154 t.notEqual(merged.a, target.a)
155 t.notEqual(merged.b, src.b)
156
157 t.end()
158 })
159
160 test('should replace object with simple key in target', function(t) {
161 var src = { key1: 'value1' }
162 var target = {
163 key1: {
164 subkey1: 'subvalue1',
165 subkey2: 'subvalue2',
166 },
167 key2: 'value2',
168 }
169
170 var expected = { key1: 'value1', key2: 'value2' }
171
172 t.deepEqual(target, {
173 key1: {
174 subkey1: 'subvalue1',
175 subkey2: 'subvalue2',
176 },
177 key2: 'value2',
178 })
179 t.deepEqual(merge(target, src), expected)
180 t.end()
181 })
182
183 test('should replace objects with arrays', function(t) {
184 var target = { key1: { subkey: 'one' } }
185
186 var src = { key1: [ 'subkey' ] }
187
188 var expected = { key1: [ 'subkey' ] }
189
190 t.deepEqual(merge(target, src), expected)
191 t.end()
192 })
193
194 test('should replace arrays with objects', function(t) {
195 var target = { key1: [ "subkey" ] }
196
197 var src = { key1: { subkey: 'one' } }
198
199 var expected = { key1: { subkey: 'one' } }
200
201 t.deepEqual(merge(target, src), expected)
202 t.end()
203 })
204
205 test('should replace dates with arrays', function(t) {
206 var target = { key1: new Date() }
207
208 var src = { key1: [ "subkey" ] }
209
210 var expected = { key1: [ "subkey" ] }
211
212 t.deepEqual(merge(target, src), expected)
213 t.end()
214 })
215
216 test('should replace null with arrays', function(t) {
217 var target = {
218 key1: null,
219 }
220
221 var src = {
222 key1: [ "subkey" ],
223 }
224
225 var expected = {
226 key1: [ "subkey" ],
227 }
228
229 t.deepEqual(merge(target, src), expected)
230 t.end()
231 })
232
233 test('should work on simple array', function(t) {
234 var src = [ 'one', 'three' ]
235 var target = [ 'one', 'two' ]
236
237 var expected = [ 'one', 'two', 'one', 'three' ]
238
239 t.deepEqual(merge(target, src), expected)
240 t.ok(Array.isArray(merge(target, src)))
241 t.end()
242 })
243
244 test('should work on another simple array', function(t) {
245 var target = [ "a1", "a2", "c1", "f1", "p1" ]
246 var src = [ "t1", "s1", "c2", "r1", "p2", "p3" ]
247
248 var expected = [ "a1", "a2", "c1", "f1", "p1", "t1", "s1", "c2", "r1", "p2", "p3" ]
249 t.deepEqual(target, [ "a1", "a2", "c1", "f1", "p1" ])
250 t.deepEqual(merge(target, src), expected)
251 t.ok(Array.isArray(merge(target, src)))
252 t.end()
253 })
254
255 test('should work on array properties', function(t) {
256 var src = {
257 key1: [ 'one', 'three' ],
258 key2: [ 'four' ],
259 }
260 var target = {
261 key1: [ 'one', 'two' ],
262 }
263
264 var expected = {
265 key1: [ 'one', 'two', 'one', 'three' ],
266 key2: [ 'four' ],
267 }
268
269 t.deepEqual(merge(target, src), expected)
270 t.ok(Array.isArray(merge(target, src).key1))
271 t.ok(Array.isArray(merge(target, src).key2))
272 t.end()
273 })
274
275 test('should work on array properties with clone option', function(t) {
276 var src = {
277 key1: [ 'one', 'three' ],
278 key2: [ 'four' ],
279 }
280 var target = {
281 key1: [ 'one', 'two' ],
282 }
283
284 t.deepEqual(target, {
285 key1: [ 'one', 'two' ],
286 })
287 var merged = merge(target, src, { clone: true })
288 t.notEqual(merged.key1, src.key1)
289 t.notEqual(merged.key1, target.key1)
290 t.notEqual(merged.key2, src.key2)
291 t.end()
292 })
293
294 test('should work on array of objects', function(t) {
295 var src = [
296 { key1: [ 'one', 'three' ], key2: [ 'one' ] },
297 { key3: [ 'five' ] },
298 ]
299 var target = [
300 { key1: [ 'one', 'two' ] },
301 { key3: [ 'four' ] },
302 ]
303
304 var expected = [
305 { key1: [ 'one', 'two' ] },
306 { key3: [ 'four' ] },
307 { key1: [ 'one', 'three' ], key2: [ 'one' ] },
308 { key3: [ 'five' ] },
309 ]
310
311 t.deepEqual(merge(target, src), expected)
312 t.ok(Array.isArray(merge(target, src)), 'result should be an array')
313 t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too')
314
315 t.end()
316 })
317
318 test('should work on array of objects with clone option', function(t) {
319 var src = [
320 { key1: [ 'one', 'three' ], key2: [ 'one' ] },
321 { key3: [ 'five' ] },
322 ]
323 var target = [
324 { key1: [ 'one', 'two' ] },
325 { key3: [ 'four' ] },
326 ]
327
328 var expected = [
329 { key1: [ 'one', 'two' ] },
330 { key3: [ 'four' ] },
331 { key1: [ 'one', 'three' ], key2: [ 'one' ] },
332 { key3: [ 'five' ] },
333 ]
334
335 var merged = merge(target, src, { clone: true })
336 t.deepEqual(merged, expected)
337 t.ok(Array.isArray(merge(target, src)), 'result should be an array')
338 t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too')
339 t.notEqual(merged[0].key1, src[0].key1)
340 t.notEqual(merged[0].key1, target[0].key1)
341 t.notEqual(merged[0].key2, src[0].key2)
342 t.notEqual(merged[1].key3, src[1].key3)
343 t.notEqual(merged[1].key3, target[1].key3)
344 t.end()
345 })
346
347 test('should treat regular expressions like primitive values', function(t) {
348 var target = { key1: /abc/ }
349 var src = { key1: /efg/ }
350 var expected = { key1: /efg/ }
351
352 t.deepEqual(merge(target, src), expected)
353 t.deepEqual(merge(target, src).key1.test('efg'), true)
354 t.end()
355 })
356
357 test('should treat regular expressions like primitive values and should not'
358 + ' clone even with clone option', function(t) {
359 var target = { key1: /abc/ }
360 var src = { key1: /efg/ }
361
362 var output = merge(target, src, { clone: true })
363
364 t.equal(output.key1, src.key1)
365 t.end()
366 }
367 )
368
369 test('should treat dates like primitives', function(t) {
370 var monday = new Date('2016-09-27T01:08:12.761Z')
371 var tuesday = new Date('2016-09-28T01:18:12.761Z')
372
373 var target = {
374 key: monday,
375 }
376 var source = {
377 key: tuesday,
378 }
379
380 var expected = {
381 key: tuesday,
382 }
383 var actual = merge(target, source)
384
385 t.deepEqual(actual, expected)
386 t.equal(actual.key.valueOf(), tuesday.valueOf())
387 t.end()
388 })
389
390 test('should treat dates like primitives and should not clone even with clone'
391 + ' option', function(t) {
392 var monday = new Date('2016-09-27T01:08:12.761Z')
393 var tuesday = new Date('2016-09-28T01:18:12.761Z')
394
395 var target = {
396 key: monday,
397 }
398 var source = {
399 key: tuesday,
400 }
401
402 var actual = merge(target, source, { clone: true })
403
404 t.equal(actual.key, tuesday)
405 t.end()
406 })
407
408 test('should work on array with null in it', function(t) {
409 var target = []
410
411 var src = [ null ]
412
413 var expected = [ null ]
414
415 t.deepEqual(merge(target, src), expected)
416 t.end()
417 })
418
419 test('should clone array\'s element if it is object', function(t) {
420 var a = { key: 'yup' }
421 var target = []
422 var source = [ a ]
423
424 var output = merge(target, source, { clone: true })
425
426 t.notEqual(output[0], a)
427 t.equal(output[0].key, 'yup')
428 t.end()
429 })
430
431 test('should clone an array property when there is no target array', function(t) {
432 const someObject = {}
433 var target = {}
434 var source = { ary: [ someObject ] }
435 var output = merge(target, source, { clone: true })
436
437 t.deepEqual(output, { ary: [{}] })
438 t.notEqual(output.ary[0], someObject)
439 t.end()
440 })
441
442 test('should overwrite values when property is initialised but undefined', function(t) {
443 var target1 = { value: [] }
444 var target2 = { value: null }
445 var target3 = { value: 2 }
446
447 var src = { value: undefined }
448
449 function hasUndefinedProperty(o) {
450 t.ok(o.hasOwnProperty('value'))
451 t.equal(typeof o.value, 'undefined')
452 }
453
454 hasUndefinedProperty(merge(target1, src))
455 hasUndefinedProperty(merge(target2, src))
456 hasUndefinedProperty(merge(target3, src))
457
458 t.end()
459 })
460
461 test('dates should copy correctly in an array', function(t) {
462 var monday = new Date('2016-09-27T01:08:12.761Z')
463 var tuesday = new Date('2016-09-28T01:18:12.761Z')
464
465 var target = [ monday, 'dude' ]
466 var source = [ tuesday, 'lol' ]
467
468 var expected = [ monday, 'dude', tuesday, 'lol' ]
469 var actual = merge(target, source)
470
471 t.deepEqual(actual, expected)
472 t.end()
473 })
474
475 test('should handle custom merge functions', function(t) {
476 var target = {
477 letters: ['a', 'b'],
478 people: {
479 first: 'Alex',
480 second: 'Bert',
481 }
482 }
483
484 var source = {
485 letters: ['c'],
486 people: {
487 first: 'Smith',
488 second: 'Bertson',
489 third: 'Car'
490 }
491 }
492
493 const mergePeople = (target, source, options) => {
494 const keys = new Set(Object.keys(target).concat(Object.keys(source)))
495 const destination = {}
496 keys.forEach(key => {
497 if (key in target && key in source) {
498 destination[key] = `${target[key]}-${source[key]}`
499 } else if (key in target) {
500 destination[key] = target[key]
501 } else {
502 destination[key] = source[key]
503 }
504 })
505 return destination
506 }
507
508 const options = {
509 customMerge: (key, options) => {
510 if (key === 'people') {
511 return mergePeople
512 }
513
514 return merge
515 }
516 }
517
518 var expected = {
519 letters: ['a', 'b', 'c'],
520 people: {
521 first: 'Alex-Smith',
522 second: 'Bert-Bertson',
523 third: 'Car'
524 }
525 }
526
527 var actual = merge(target, source, options)
528 t.deepEqual(actual, expected)
529 t.end()
530 })
531
532
533 test('should handle custom merge functions', function(t) {
534 var target = {
535 letters: ['a', 'b'],
536 people: {
537 first: 'Alex',
538 second: 'Bert',
539 }
540 }
541
542 var source = {
543 letters: ['c'],
544 people: {
545 first: 'Smith',
546 second: 'Bertson',
547 third: 'Car'
548 }
549 }
550
551 const mergeLetters = (target, source, options) => {
552 return 'merged letters'
553 }
554
555
556 const options = {
557 customMerge: (key, options) => {
558 if (key === 'letters') {
559 return mergeLetters
560 }
561 }
562 }
563
564 const expected = {
565 letters: 'merged letters',
566 people: {
567 first: 'Smith',
568 second: 'Bertson',
569 third: 'Car'
570 }
571 }
572
573 var actual = merge(target, source, options)
574 t.deepEqual(actual, expected)
575 t.end()
576 })
577
578 test('should merge correctly if custom merge is not a valid function', function(t) {
579 var target = {
580 letters: ['a', 'b'],
581 people: {
582 first: 'Alex',
583 second: 'Bert',
584 }
585 }
586
587 var source = {
588 letters: ['c'],
589 people: {
590 first: 'Smith',
591 second: 'Bertson',
592 third: 'Car'
593 }
594 }
595
596 const options = {
597 customMerge: (key, options) => {
598 return false
599 }
600 }
601
602 const expected = {
603 letters: ['a', 'b', 'c'],
604 people: {
605 first: 'Smith',
606 second: 'Bertson',
607 third: 'Car'
608 }
609 }
610
611 var actual = merge(target, source, options)
612 t.deepEqual(actual, expected)
613 t.end()
614
615 })
616
617 test('copy symbol keys in target that do not exist on the target', function(t) {
618 var mySymbol = Symbol();
619 var src = { [mySymbol]: 'value1' }
620 var target = {}
621
622 var res = merge(target, src)
623
624 t.equal(res[mySymbol], 'value1')
625 t.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src))
626 t.end()
627 })
628
629 test('copy symbol keys in target that do exist on the target', function(t) {
630 var mySymbol = Symbol();
631 var src = { [mySymbol]: 'value1' }
632 var target = { [mySymbol]: 'wat'}
633
634 var res = merge(target, src)
635
636 t.equal(res[mySymbol], 'value1')
637 t.end()
638 })
639
640 test('Falsey properties should be mergeable', function(t) {
641 var uniqueValue = {}
642
643 var target = {
644 wat: false
645 }
646
647 var source = {
648 wat: false
649 }
650
651 var customMergeWasCalled = false
652
653 var result = merge(target, source, {
654 isMergeableObject: function() {
655 return true
656 },
657 customMerge: function() {
658 return function() {
659 customMergeWasCalled = true
660 return uniqueValue
661 }
662 }
663 })
664
665 t.equal(result.wat, uniqueValue)
666 t.ok(customMergeWasCalled, 'custom merge function was called')
667 t.end()
668 })
+0
-78
test/prototype-poisoning.js less more
0 var merge = require('../')
1 var test = require('tape')
2 var isMergeableObject = require('is-mergeable-object')
3
4 test('merging objects with own __proto__', function(t) {
5 var user = {}
6 var malicious = JSON.parse('{ "__proto__": { "admin": true } }')
7 var mergedObject = merge(user, malicious)
8 t.notOk(mergedObject.__proto__.admin, 'non-plain properties should not be merged')
9 t.notOk(mergedObject.admin, 'the destination should have an unmodified prototype')
10 t.end()
11 })
12
13 test('merging objects with plain and non-plain properties', function(t) {
14 var plainSymbolKey = Symbol('plainSymbolKey')
15 var parent = {
16 parentKey: 'should be undefined'
17 }
18
19 var target = Object.create(parent)
20 target.plainKey = 'should be replaced'
21 target[plainSymbolKey] = 'should also be replaced'
22
23 var source = {
24 parentKey: 'foo',
25 plainKey: 'bar',
26 newKey: 'baz',
27 [plainSymbolKey]: 'qux'
28 }
29
30 var mergedObject = merge(target, source)
31 t.equal(undefined, mergedObject.parentKey, 'inherited properties of target should be removed, not merged or ignored')
32 t.equal('bar', mergedObject.plainKey, 'enumerable own properties of target should be merged')
33 t.equal('baz', mergedObject.newKey, 'properties not yet on target should be merged')
34 t.equal('qux', mergedObject[plainSymbolKey], 'enumerable own symbol properties of target should be merged')
35 t.end()
36 })
37
38 // the following cases come from the thread here: https://github.com/TehShrike/deepmerge/pull/164
39 test('merging strings works with a custom string merge', function(t) {
40 var target = { name: "Alexander" }
41 var source = { name: "Hamilton" }
42 function customMerge(key, options) {
43 if (key === 'name') {
44 return function(target, source, options) {
45 return target[0] + '. ' + source.substring(0, 3)
46 }
47 } else {
48 return merge
49 }
50 }
51
52 function mergeable(target) {
53 return isMergeableObject(target) || (typeof target === 'string' && target.length > 1)
54 }
55
56 t.equal('A. Ham', merge(target, source, { customMerge: customMerge, isMergeableObject: mergeable }).name)
57 t.end()
58 })
59
60 test('merging objects with null prototype', function(t) {
61 var target = Object.create(null)
62 var source = Object.create(null)
63 target.wheels = 4
64 target.trunk = { toolbox: ['hammer'] }
65 source.trunk = { toolbox: ['wrench'] }
66 source.engine = 'v8'
67 var expected = {
68 wheels: 4,
69 engine: 'v8',
70 trunk: {
71 toolbox: ['hammer', 'wrench' ]
72 }
73 }
74
75 t.deepEqual(expected, merge(target, source))
76 t.end()
77 })
+0
-65
test/typescript.ts less more
0 import * as merge from '../';
1
2 const x = {
3 foo: 'abc',
4 bar: 'def',
5 wat: 42,
6 }
7
8 const y = {
9 foo: 'cba',
10 bar: 'fed',
11 wat: 42,
12 }
13
14 const z = {
15 baz: '123',
16 quux: '456',
17 wat: 42,
18 }
19
20 let merged1 = merge(x, y);
21 let merged2 = merge(x, z);
22 let merged3 = merge.all<{wat: number}>([ x, y, z ]);
23
24 merged1.foo;
25 merged1.bar;
26 merged2.foo;
27 merged2.baz;
28 merged3.wat;
29
30
31 const options1: merge.Options = {
32 clone: true,
33 isMergeableObject (obj) {
34 return false;
35 },
36 };
37
38 const options2: merge.Options = {
39 arrayMerge (target, source, options) {
40 target.length;
41 source.length;
42 options.isMergeableObject(target);
43
44 return [];
45 },
46 clone: true,
47 isMergeableObject (obj) {
48 return false;
49 },
50 };
51
52 const options3: merge.Options = {
53 customMerge: (key) => {
54 if (key === 'foo') {
55 return (target, source) => target + source;
56 }
57 }
58 }
59
60 merged1 = merge(x, y, options1);
61 merged2 = merge(x, z, options2);
62 merged3 = merge.all<{wat: number}>([x, y, z], options1);
63
64 const merged4 = merge(x, y, options3);