Import upstream version 4.2.2+~1.1.1+git20211207.1.e5a2771
Debian Janitor
1 year, 3 months ago
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 | 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 | { | |
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 | { | |
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 | # 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 | { | |
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 | } |
208 | 208 | |
209 | 209 | ```js |
210 | 210 | 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'] | |
216 | 216 | } |
217 | 217 | |
218 | 218 | 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'] | |
224 | 224 | } |
225 | 225 | |
226 | 226 | const mergeNames = (nameA, nameB) => `${nameA.first} and ${nameB.first}` |
227 | 227 | |
228 | 228 | 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 | } | |
234 | 234 | } |
235 | 235 | |
236 | 236 | const result = merge(alex, tony, options) |
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 | 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 | 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 | 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 | 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 | 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); |