├── .editorconfig ├── .gitignore ├── .npmignore ├── .travis.yml ├── changelog.md ├── index.d.ts ├── index.js ├── license.txt ├── package-lock.json ├── package.json ├── readme.md ├── rollup.config.js └── test ├── custom-array-merge.js ├── custom-is-mergeable-object.js ├── merge-all.js ├── merge.js ├── prototype-poisoning.js └── typescript.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = tab 5 | end_of_line = lf 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/* 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test/ 2 | .gitignore 3 | .travis.yml 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "18" 4 | - "16" 5 | - "14" 6 | - "12" 7 | - "10" 8 | - "8" 9 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # [4.3.1](https://github.com/TehShrike/deepmerge/releases/tag/v4.3.1) 2 | 3 | - Fix type definition for arrayMerge options. [#239](https://github.com/TehShrike/deepmerge/pull/239) 4 | 5 | # [4.3.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.3.0) 6 | 7 | - Avoid thrown errors if the target doesn't have `propertyIsEnumerable`. [#252](https://github.com/TehShrike/deepmerge/pull/252) 8 | 9 | # [4.2.2](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.2) 10 | 11 | - `isMergeableObject` is now only called if there are two values that could be merged. [a34dd4d2](https://github.com/TehShrike/deepmerge/commit/a34dd4d25bf5e250653540a2022bc832c7b00a19) 12 | 13 | # [4.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.1) 14 | 15 | - Fix: falsey values can now be merged. [#170](https://github.com/TehShrike/deepmerge/issues/170) 16 | 17 | # [4.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.2.0) 18 | 19 | - Properties are now only overwritten if they exist on the target object and are enumerable. [#164](https://github.com/TehShrike/deepmerge/pull/164) 20 | 21 | Technically this could probably be a patch release since "which properties get overwritten" wasn't documented and accidentally overwriting a built-in function or some function up the property chain would almost certainly be undesirable, but it feels like a gray area, so here we are with a feature version bump. 22 | 23 | # [4.1.2](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.2) 24 | 25 | - Rolled back #167 since `Object.assign` breaks ES5 support. [55067352](https://github.com/TehShrike/deepmerge/commit/55067352a92c65a6c44a5165f3387720aae1e192) 26 | 27 | # [4.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.1) 28 | 29 | - The `options` argument is no longer mutated [#167](https://github.com/TehShrike/deepmerge/pull/167) 30 | 31 | # [4.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.1.0) 32 | 33 | - `cloneUnlessOtherwiseSpecified` is now exposed to the `arrayMerge` function [#165](https://github.com/TehShrike/deepmerge/pull/165) 34 | 35 | # [4.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v4.0.0) 36 | 37 | - The `main` entry point in `package.json` is now a CommonJS module instead of a UMD module [#155](https://github.com/TehShrike/deepmerge/pull/155) 38 | 39 | # [3.3.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.3.0) 40 | 41 | - Enumerable Symbol properties are now copied [#151](https://github.com/TehShrike/deepmerge/pull/151) 42 | 43 | # [3.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v3.2.1) 44 | 45 | - bumping dev dependency versions to try to shut up bogus security warnings from Github/npm [#149](https://github.com/TehShrike/deepmerge/pull/149) 46 | 47 | # [3.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.2.0) 48 | 49 | - feature: added the [`customMerge`](https://github.com/TehShrike/deepmerge#custommerge) option [#133](https://github.com/TehShrike/deepmerge/pull/133) 50 | 51 | # [3.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.1.0) 52 | 53 | - typescript typing: make the `all` function generic [#129](https://github.com/TehShrike/deepmerge/pull/129) 54 | 55 | # [3.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v3.0.0) 56 | 57 | - drop ES module build [#123](https://github.com/TehShrike/deepmerge/issues/123) 58 | 59 | # [2.2.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.2.1) 60 | 61 | - bug: typescript export type was wrong [#121](https://github.com/TehShrike/deepmerge/pull/121) 62 | 63 | # [2.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.2.0) 64 | 65 | - feature: added TypeScript typings [#119](https://github.com/TehShrike/deepmerge/pull/119) 66 | 67 | # [2.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.1.1) 68 | 69 | - documentation: Rename "methods" to "api", note ESM syntax [#103](https://github.com/TehShrike/deepmerge/pull/103) 70 | - documentation: Fix grammar [#107](https://github.com/TehShrike/deepmerge/pull/107) 71 | - documentation: Restructure headers for clarity + some wording tweaks [108](https://github.com/TehShrike/deepmerge/pull/108) + [109](https://github.com/TehShrike/deepmerge/pull/109) 72 | 73 | 74 | # [2.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.1.0) 75 | 76 | - feature: Support a custom `isMergeableObject` function [#96](https://github.com/TehShrike/deepmerge/pull/96) 77 | - documentation: note a Webpack bug that some users might need to work around [#100](https://github.com/TehShrike/deepmerge/pull/100) 78 | 79 | # [2.0.1](https://github.com/TehShrike/deepmerge/releases/tag/v2.0.1) 80 | 81 | - documentation: fix the old array merge algorithm in the readme. [#84](https://github.com/TehShrike/deepmerge/pull/84) 82 | 83 | # [2.0.0](https://github.com/TehShrike/deepmerge/releases/tag/v2.0.0) 84 | 85 | - breaking: the array merge algorithm has changed from a complicated thing to `target.concat(source).map(element => cloneUnlessOtherwiseSpecified(element, optionsArgument))` 86 | - breaking: The `clone` option now defaults to `true` 87 | - feature: `merge.all` now accepts an array of any size, even 0 or 1 elements 88 | 89 | See [pull request 77](https://github.com/TehShrike/deepmerge/pull/77). 90 | 91 | # [1.5.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.2) 92 | 93 | - fix: no longer attempts to merge React elements [#76](https://github.com/TehShrike/deepmerge/issues/76) 94 | 95 | # [1.5.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.1) 96 | 97 | - bower support: officially dropping bower support. If you use bower, please depend on the [unpkg distribution](https://unpkg.com/deepmerge/dist/umd.js). See [#63](https://github.com/TehShrike/deepmerge/issues/63) 98 | 99 | # [1.5.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.5.0) 100 | 101 | - bug fix: merging objects into arrays was allowed, and doesn't make any sense. [#65](https://github.com/TehShrike/deepmerge/issues/65) published as a feature release instead of a patch because it is a decent behavior change. 102 | 103 | # [1.4.4](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.4) 104 | 105 | - bower support: updated `main` in bower.json 106 | 107 | # [1.4.3](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.3) 108 | 109 | - bower support: inline is-mergeable-object in a new CommonJS build, so that people using both bower and CommonJS can bundle the library [0b34e6](https://github.com/TehShrike/deepmerge/commit/0b34e6e95f989f2fc8091d25f0d291c08f3d2d24) 110 | 111 | # [1.4.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.2) 112 | 113 | - performance: bump is-mergeable-object dependency version for a slight performance improvement [5906c7](https://github.com/TehShrike/deepmerge/commit/5906c765d691d48e83d76efbb0d4b9ca150dc12c) 114 | 115 | # [1.4.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.1) 116 | 117 | - documentation: fix unpkg link [acc45b](https://github.com/TehShrike/deepmerge/commit/acc45be85519c1df906a72ecb24764b622d18d47) 118 | 119 | # [1.4.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.4.0) 120 | 121 | - api: instead of only exporting a UMD module, expose a UMD module with `pkg.main`, a CJS module with `pkg.browser`, and an ES module with `pkg.module` [#62](https://github.com/TehShrike/deepmerge/pull/62) 122 | 123 | # [1.3.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.2) 124 | 125 | - documentation: note the minified/gzipped file sizes [56](https://github.com/TehShrike/deepmerge/pull/56) 126 | - documentation: make data structures more readable in merge example: pull request [57](https://github.com/TehShrike/deepmerge/pull/57) 127 | 128 | # [1.3.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.1) 129 | 130 | - documentation: clarify and test some array merging documentation: pull request [51](https://github.com/TehShrike/deepmerge/pull/51) 131 | 132 | # [1.3.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.3.0) 133 | 134 | - feature: `merge.all`, a merge function that merges any number of objects: pull request [50](https://github.com/TehShrike/deepmerge/pull/50) 135 | 136 | # [1.2.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.2.0) 137 | 138 | - fix: an error that would be thrown when an array would be merged onto a truthy non-array value: pull request [46](https://github.com/TehShrike/deepmerge/pull/46) 139 | - feature: the ability to clone: Issue [28](https://github.com/TehShrike/deepmerge/issues/28), pull requests [44](https://github.com/TehShrike/deepmerge/pull/44) and [48](https://github.com/TehShrike/deepmerge/pull/48) 140 | - maintenance: added tests + travis to `.npmignore`: pull request [47](https://github.com/TehShrike/deepmerge/pull/47) 141 | 142 | # [1.1.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.1.1) 143 | 144 | - fix an issue where an error was thrown when merging an array onto a non-array: [Pull request 46](https://github.com/TehShrike/deepmerge/pull/46) 145 | 146 | # [1.1.0](https://github.com/TehShrike/deepmerge/releases/tag/v1.1.0) 147 | 148 | - allow consumers to specify their own array merging algorithm: [Pull request 37](https://github.com/TehShrike/deepmerge/pull/37) 149 | 150 | # [1.0.3](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.3) 151 | 152 | - adding bower.json back: [Issue 38](https://github.com/TehShrike/deepmerge/pull/38) 153 | - updating keywords and Github links in package.json [bc3898e](https://github.com/TehShrike/deepmerge/commit/bc3898e587a56f74591328f40f656b0152c1d5eb) 154 | 155 | # [1.0.2](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.2) 156 | 157 | - Updating the readme: dropping bower, testing that the example works: [7102fc](https://github.com/TehShrike/deepmerge/commit/7102fcc4ddec11e2d33205866f9f18df14e5aeb5) 158 | 159 | # [1.0.1](https://github.com/TehShrike/deepmerge/releases/tag/v1.0.1) 160 | 161 | - `null`, dates, and regular expressions are now properly merged in arrays: [Issue 18](https://github.com/TehShrike/deepmerge/pull/18), plus commit: [ef1c6b](https://github.com/TehShrike/deepmerge/commit/ef1c6bac8350ba12a24966f0bc7da02560827586) 162 | 163 | # 1.0.0 164 | 165 | - Should only be a patch change, because this module is READY. [Issue 15](https://github.com/TehShrike/deepmerge/issues/15) 166 | - Regular expressions are now treated like primitive values when merging: [Issue 30](https://github.com/TehShrike/deepmerge/pull/30) 167 | - Dates are now treated like primitives when merging: [Issue 31](https://github.com/TehShrike/deepmerge/issues/31) 168 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T; 2 | declare function deepmerge(x: Partial, y: Partial, options?: deepmerge.Options): T1 & T2; 3 | 4 | declare namespace deepmerge { 5 | export interface Options { 6 | arrayMerge?(target: any[], source: any[], options?: ArrayMergeOptions): any[]; 7 | clone?: boolean; 8 | customMerge?: (key: string, options?: Options) => ((x: any, y: any) => any) | undefined; 9 | isMergeableObject?(value: object): boolean; 10 | } 11 | export interface ArrayMergeOptions { 12 | isMergeableObject(value: object): boolean; 13 | cloneUnlessOtherwiseSpecified(value: object, options?: Options): object; 14 | } 15 | 16 | export function all (objects: object[], options?: Options): object; 17 | export function all (objects: Partial[], options?: Options): T; 18 | } 19 | 20 | export = deepmerge; 21 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var defaultIsMergeableObject = require('is-mergeable-object') 2 | 3 | function emptyTarget(val) { 4 | return Array.isArray(val) ? [] : {} 5 | } 6 | 7 | function cloneUnlessOtherwiseSpecified(value, options) { 8 | return (options.clone !== false && options.isMergeableObject(value)) 9 | ? deepmerge(emptyTarget(value), value, options) 10 | : value 11 | } 12 | 13 | function defaultArrayMerge(target, source, options) { 14 | return target.concat(source).map(function(element) { 15 | return cloneUnlessOtherwiseSpecified(element, options) 16 | }) 17 | } 18 | 19 | function getMergeFunction(key, options) { 20 | if (!options.customMerge) { 21 | return deepmerge 22 | } 23 | var customMerge = options.customMerge(key) 24 | return typeof customMerge === 'function' ? customMerge : deepmerge 25 | } 26 | 27 | function getEnumerableOwnPropertySymbols(target) { 28 | return Object.getOwnPropertySymbols 29 | ? Object.getOwnPropertySymbols(target).filter(function(symbol) { 30 | return Object.propertyIsEnumerable.call(target, symbol) 31 | }) 32 | : [] 33 | } 34 | 35 | function getKeys(target) { 36 | return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) 37 | } 38 | 39 | function propertyIsOnObject(object, property) { 40 | try { 41 | return property in object 42 | } catch(_) { 43 | return false 44 | } 45 | } 46 | 47 | // Protects from prototype poisoning and unexpected merging up the prototype chain. 48 | function propertyIsUnsafe(target, key) { 49 | return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, 50 | && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, 51 | && Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable. 52 | } 53 | 54 | function mergeObject(target, source, options) { 55 | var destination = {} 56 | if (options.isMergeableObject(target)) { 57 | getKeys(target).forEach(function(key) { 58 | destination[key] = cloneUnlessOtherwiseSpecified(target[key], options) 59 | }) 60 | } 61 | getKeys(source).forEach(function(key) { 62 | if (propertyIsUnsafe(target, key)) { 63 | return 64 | } 65 | 66 | if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { 67 | destination[key] = getMergeFunction(key, options)(target[key], source[key], options) 68 | } else { 69 | destination[key] = cloneUnlessOtherwiseSpecified(source[key], options) 70 | } 71 | }) 72 | return destination 73 | } 74 | 75 | function deepmerge(target, source, options) { 76 | options = options || {} 77 | options.arrayMerge = options.arrayMerge || defaultArrayMerge 78 | options.isMergeableObject = options.isMergeableObject || defaultIsMergeableObject 79 | // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() 80 | // implementations can use it. The caller may not replace it. 81 | options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified 82 | 83 | var sourceIsArray = Array.isArray(source) 84 | var targetIsArray = Array.isArray(target) 85 | var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray 86 | 87 | if (!sourceAndTargetTypesMatch) { 88 | return cloneUnlessOtherwiseSpecified(source, options) 89 | } else if (sourceIsArray) { 90 | return options.arrayMerge(target, source, options) 91 | } else { 92 | return mergeObject(target, source, options) 93 | } 94 | } 95 | 96 | deepmerge.all = function deepmergeAll(array, options) { 97 | if (!Array.isArray(array)) { 98 | throw new Error('first argument should be an array') 99 | } 100 | 101 | return array.reduce(function(prev, next) { 102 | return deepmerge(prev, next, options) 103 | }, {}) 104 | } 105 | 106 | module.exports = deepmerge 107 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012 James Halliday, Josh Duff, and other contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deepmerge", 3 | "version": "4.3.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "deepmerge", 9 | "version": "4.3.1", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@types/node": "^8.10.54", 13 | "is-mergeable-object": "1.1.0", 14 | "is-plain-object": "^5.0.0", 15 | "jsmd": "^1.0.2", 16 | "rollup": "^1.23.1", 17 | "rollup-plugin-commonjs": "^10.1.0", 18 | "rollup-plugin-node-resolve": "^5.2.0", 19 | "tape": "^4.11.0", 20 | "ts-node": "7.0.1", 21 | "typescript": "=2.2.2", 22 | "uglify-js": "^3.6.1" 23 | }, 24 | "engines": { 25 | "node": ">=0.10.0" 26 | } 27 | }, 28 | "node_modules/@types/estree": { 29 | "version": "0.0.39", 30 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 31 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 32 | "dev": true 33 | }, 34 | "node_modules/@types/node": { 35 | "version": "8.10.54", 36 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", 37 | "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", 38 | "dev": true 39 | }, 40 | "node_modules/@types/resolve": { 41 | "version": "0.0.8", 42 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 43 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 44 | "dev": true, 45 | "dependencies": { 46 | "@types/node": "*" 47 | } 48 | }, 49 | "node_modules/acorn": { 50 | "version": "7.1.0", 51 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", 52 | "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", 53 | "dev": true, 54 | "bin": { 55 | "acorn": "bin/acorn" 56 | }, 57 | "engines": { 58 | "node": ">=0.4.0" 59 | } 60 | }, 61 | "node_modules/arrify": { 62 | "version": "1.0.1", 63 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 64 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 65 | "dev": true, 66 | "engines": { 67 | "node": ">=0.10.0" 68 | } 69 | }, 70 | "node_modules/balanced-match": { 71 | "version": "1.0.0", 72 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 73 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 74 | "dev": true 75 | }, 76 | "node_modules/brace-expansion": { 77 | "version": "1.1.11", 78 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 79 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 80 | "dev": true, 81 | "dependencies": { 82 | "balanced-match": "^1.0.0", 83 | "concat-map": "0.0.1" 84 | } 85 | }, 86 | "node_modules/buffer-from": { 87 | "version": "1.1.1", 88 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 89 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 90 | "dev": true 91 | }, 92 | "node_modules/builtin-modules": { 93 | "version": "3.1.0", 94 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 95 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 96 | "dev": true, 97 | "engines": { 98 | "node": ">=6" 99 | } 100 | }, 101 | "node_modules/commander": { 102 | "version": "2.20.0", 103 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 104 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 105 | "dev": true 106 | }, 107 | "node_modules/concat-map": { 108 | "version": "0.0.1", 109 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 110 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 111 | "dev": true 112 | }, 113 | "node_modules/deep-equal": { 114 | "version": "1.0.1", 115 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 116 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 117 | "dev": true 118 | }, 119 | "node_modules/deep-is": { 120 | "version": "0.1.3", 121 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 122 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 123 | "dev": true 124 | }, 125 | "node_modules/define-properties": { 126 | "version": "1.1.3", 127 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 128 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 129 | "dev": true, 130 | "dependencies": { 131 | "object-keys": "^1.0.12" 132 | }, 133 | "engines": { 134 | "node": ">= 0.4" 135 | } 136 | }, 137 | "node_modules/defined": { 138 | "version": "1.0.0", 139 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 140 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 141 | "dev": true 142 | }, 143 | "node_modules/es-abstract": { 144 | "version": "1.15.0", 145 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", 146 | "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", 147 | "dev": true, 148 | "dependencies": { 149 | "es-to-primitive": "^1.2.0", 150 | "function-bind": "^1.1.1", 151 | "has": "^1.0.3", 152 | "has-symbols": "^1.0.0", 153 | "is-callable": "^1.1.4", 154 | "is-regex": "^1.0.4", 155 | "object-inspect": "^1.6.0", 156 | "object-keys": "^1.1.1", 157 | "string.prototype.trimleft": "^2.1.0", 158 | "string.prototype.trimright": "^2.1.0" 159 | }, 160 | "engines": { 161 | "node": ">= 0.4" 162 | } 163 | }, 164 | "node_modules/es-to-primitive": { 165 | "version": "1.2.0", 166 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 167 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 168 | "dev": true, 169 | "dependencies": { 170 | "is-callable": "^1.1.4", 171 | "is-date-object": "^1.0.1", 172 | "is-symbol": "^1.0.2" 173 | }, 174 | "engines": { 175 | "node": ">= 0.4" 176 | } 177 | }, 178 | "node_modules/escodegen": { 179 | "version": "1.12.0", 180 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", 181 | "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", 182 | "dev": true, 183 | "dependencies": { 184 | "esprima": "^3.1.3", 185 | "estraverse": "^4.2.0", 186 | "esutils": "^2.0.2", 187 | "optionator": "^0.8.1" 188 | }, 189 | "bin": { 190 | "escodegen": "bin/escodegen.js", 191 | "esgenerate": "bin/esgenerate.js" 192 | }, 193 | "engines": { 194 | "node": ">=4.0" 195 | }, 196 | "optionalDependencies": { 197 | "source-map": "~0.6.1" 198 | } 199 | }, 200 | "node_modules/escodegen/node_modules/esprima": { 201 | "version": "3.1.3", 202 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 203 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 204 | "dev": true, 205 | "bin": { 206 | "esparse": "bin/esparse.js", 207 | "esvalidate": "bin/esvalidate.js" 208 | }, 209 | "engines": { 210 | "node": ">=4" 211 | } 212 | }, 213 | "node_modules/esprima": { 214 | "version": "2.7.3", 215 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 216 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 217 | "dev": true, 218 | "bin": { 219 | "esparse": "bin/esparse.js", 220 | "esvalidate": "bin/esvalidate.js" 221 | }, 222 | "engines": { 223 | "node": ">=0.10.0" 224 | } 225 | }, 226 | "node_modules/estraverse": { 227 | "version": "4.3.0", 228 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 229 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 230 | "dev": true, 231 | "engines": { 232 | "node": ">=4.0" 233 | } 234 | }, 235 | "node_modules/estree-walker": { 236 | "version": "0.6.1", 237 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 238 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 239 | "dev": true 240 | }, 241 | "node_modules/esutils": { 242 | "version": "2.0.3", 243 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 244 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 245 | "dev": true, 246 | "engines": { 247 | "node": ">=0.10.0" 248 | } 249 | }, 250 | "node_modules/fast-levenshtein": { 251 | "version": "2.0.6", 252 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 253 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 254 | "dev": true 255 | }, 256 | "node_modules/for-each": { 257 | "version": "0.3.3", 258 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 259 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 260 | "dev": true, 261 | "dependencies": { 262 | "is-callable": "^1.1.3" 263 | } 264 | }, 265 | "node_modules/fs.realpath": { 266 | "version": "1.0.0", 267 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 268 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 269 | "dev": true 270 | }, 271 | "node_modules/function-bind": { 272 | "version": "1.1.1", 273 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 274 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 275 | "dev": true 276 | }, 277 | "node_modules/glob": { 278 | "version": "7.1.4", 279 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 280 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 281 | "dev": true, 282 | "dependencies": { 283 | "fs.realpath": "^1.0.0", 284 | "inflight": "^1.0.4", 285 | "inherits": "2", 286 | "minimatch": "^3.0.4", 287 | "once": "^1.3.0", 288 | "path-is-absolute": "^1.0.0" 289 | }, 290 | "engines": { 291 | "node": "*" 292 | } 293 | }, 294 | "node_modules/has": { 295 | "version": "1.0.3", 296 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 297 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 298 | "dev": true, 299 | "dependencies": { 300 | "function-bind": "^1.1.1" 301 | }, 302 | "engines": { 303 | "node": ">= 0.4.0" 304 | } 305 | }, 306 | "node_modules/has-symbols": { 307 | "version": "1.0.0", 308 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 309 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 310 | "dev": true, 311 | "engines": { 312 | "node": ">= 0.4" 313 | } 314 | }, 315 | "node_modules/inflight": { 316 | "version": "1.0.6", 317 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 318 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 319 | "dev": true, 320 | "dependencies": { 321 | "once": "^1.3.0", 322 | "wrappy": "1" 323 | } 324 | }, 325 | "node_modules/inherits": { 326 | "version": "2.0.4", 327 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 328 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 329 | "dev": true 330 | }, 331 | "node_modules/is-callable": { 332 | "version": "1.1.4", 333 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 334 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 335 | "dev": true, 336 | "engines": { 337 | "node": ">= 0.4" 338 | } 339 | }, 340 | "node_modules/is-date-object": { 341 | "version": "1.0.1", 342 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 343 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 344 | "dev": true, 345 | "engines": { 346 | "node": ">= 0.4" 347 | } 348 | }, 349 | "node_modules/is-mergeable-object": { 350 | "version": "1.1.0", 351 | "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", 352 | "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", 353 | "dev": true 354 | }, 355 | "node_modules/is-module": { 356 | "version": "1.0.0", 357 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 358 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 359 | "dev": true 360 | }, 361 | "node_modules/is-plain-object": { 362 | "version": "5.0.0", 363 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 364 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 365 | "dev": true, 366 | "engines": { 367 | "node": ">=0.10.0" 368 | } 369 | }, 370 | "node_modules/is-reference": { 371 | "version": "1.1.4", 372 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 373 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 374 | "dev": true, 375 | "dependencies": { 376 | "@types/estree": "0.0.39" 377 | } 378 | }, 379 | "node_modules/is-regex": { 380 | "version": "1.0.4", 381 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 382 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 383 | "dev": true, 384 | "dependencies": { 385 | "has": "^1.0.1" 386 | }, 387 | "engines": { 388 | "node": ">= 0.4" 389 | } 390 | }, 391 | "node_modules/is-symbol": { 392 | "version": "1.0.2", 393 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 394 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 395 | "dev": true, 396 | "dependencies": { 397 | "has-symbols": "^1.0.0" 398 | }, 399 | "engines": { 400 | "node": ">= 0.4" 401 | } 402 | }, 403 | "node_modules/jsmd": { 404 | "version": "1.0.2", 405 | "resolved": "https://registry.npmjs.org/jsmd/-/jsmd-1.0.2.tgz", 406 | "integrity": "sha512-mrQ80ysClsuw4QASa7JcjpwgTADBclo9LgIPDERD99tsfVcXGEHjkX50Q9N0NSmX1Zq3xxQYAA8fuN9GHk1Beg==", 407 | "dev": true, 408 | "dependencies": { 409 | "escodegen": "^1.9.1", 410 | "esprima": "^2.7.3", 411 | "estraverse": "^4.2.0", 412 | "marked": "^0.7.0", 413 | "v8-argv": "github:jkroso/v8-argv#1.1.1" 414 | }, 415 | "bin": { 416 | "jsmd": "bin/jsmd" 417 | }, 418 | "engines": { 419 | "node": ">=4.0.0" 420 | } 421 | }, 422 | "node_modules/levn": { 423 | "version": "0.3.0", 424 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 425 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 426 | "dev": true, 427 | "dependencies": { 428 | "prelude-ls": "~1.1.2", 429 | "type-check": "~0.3.2" 430 | }, 431 | "engines": { 432 | "node": ">= 0.8.0" 433 | } 434 | }, 435 | "node_modules/magic-string": { 436 | "version": "0.25.4", 437 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", 438 | "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", 439 | "dev": true, 440 | "dependencies": { 441 | "sourcemap-codec": "^1.4.4" 442 | } 443 | }, 444 | "node_modules/make-error": { 445 | "version": "1.3.5", 446 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 447 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 448 | "dev": true 449 | }, 450 | "node_modules/marked": { 451 | "version": "0.7.0", 452 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", 453 | "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", 454 | "dev": true, 455 | "bin": { 456 | "marked": "bin/marked" 457 | }, 458 | "engines": { 459 | "node": ">=0.10.0" 460 | } 461 | }, 462 | "node_modules/minimatch": { 463 | "version": "3.0.4", 464 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 465 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 466 | "dev": true, 467 | "dependencies": { 468 | "brace-expansion": "^1.1.7" 469 | }, 470 | "engines": { 471 | "node": "*" 472 | } 473 | }, 474 | "node_modules/minimist": { 475 | "version": "1.2.0", 476 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 477 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 478 | "dev": true 479 | }, 480 | "node_modules/mkdirp": { 481 | "version": "0.5.1", 482 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 483 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 484 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 485 | "dev": true, 486 | "dependencies": { 487 | "minimist": "0.0.8" 488 | }, 489 | "bin": { 490 | "mkdirp": "bin/cmd.js" 491 | } 492 | }, 493 | "node_modules/mkdirp/node_modules/minimist": { 494 | "version": "0.0.8", 495 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 496 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 497 | "dev": true 498 | }, 499 | "node_modules/object-inspect": { 500 | "version": "1.6.0", 501 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 502 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 503 | "dev": true 504 | }, 505 | "node_modules/object-keys": { 506 | "version": "1.1.1", 507 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 508 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 509 | "dev": true, 510 | "engines": { 511 | "node": ">= 0.4" 512 | } 513 | }, 514 | "node_modules/once": { 515 | "version": "1.4.0", 516 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 517 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 518 | "dev": true, 519 | "dependencies": { 520 | "wrappy": "1" 521 | } 522 | }, 523 | "node_modules/optionator": { 524 | "version": "0.8.2", 525 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 526 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 527 | "dev": true, 528 | "dependencies": { 529 | "deep-is": "~0.1.3", 530 | "fast-levenshtein": "~2.0.4", 531 | "levn": "~0.3.0", 532 | "prelude-ls": "~1.1.2", 533 | "type-check": "~0.3.2", 534 | "wordwrap": "~1.0.0" 535 | }, 536 | "engines": { 537 | "node": ">= 0.8.0" 538 | } 539 | }, 540 | "node_modules/path-is-absolute": { 541 | "version": "1.0.1", 542 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 543 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 544 | "dev": true, 545 | "engines": { 546 | "node": ">=0.10.0" 547 | } 548 | }, 549 | "node_modules/path-parse": { 550 | "version": "1.0.6", 551 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 552 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 553 | "dev": true 554 | }, 555 | "node_modules/prelude-ls": { 556 | "version": "1.1.2", 557 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 558 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 559 | "dev": true, 560 | "engines": { 561 | "node": ">= 0.8.0" 562 | } 563 | }, 564 | "node_modules/resolve": { 565 | "version": "1.12.0", 566 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 567 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 568 | "dev": true, 569 | "dependencies": { 570 | "path-parse": "^1.0.6" 571 | } 572 | }, 573 | "node_modules/resumer": { 574 | "version": "0.0.0", 575 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 576 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 577 | "dev": true, 578 | "dependencies": { 579 | "through": "~2.3.4" 580 | } 581 | }, 582 | "node_modules/rollup": { 583 | "version": "1.23.1", 584 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz", 585 | "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==", 586 | "dev": true, 587 | "dependencies": { 588 | "@types/estree": "*", 589 | "@types/node": "*", 590 | "acorn": "^7.1.0" 591 | }, 592 | "bin": { 593 | "rollup": "dist/bin/rollup" 594 | } 595 | }, 596 | "node_modules/rollup-plugin-commonjs": { 597 | "version": "10.1.0", 598 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", 599 | "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", 600 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", 601 | "dev": true, 602 | "dependencies": { 603 | "estree-walker": "^0.6.1", 604 | "is-reference": "^1.1.2", 605 | "magic-string": "^0.25.2", 606 | "resolve": "^1.11.0", 607 | "rollup-pluginutils": "^2.8.1" 608 | }, 609 | "peerDependencies": { 610 | "rollup": ">=1.12.0" 611 | } 612 | }, 613 | "node_modules/rollup-plugin-node-resolve": { 614 | "version": "5.2.0", 615 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", 616 | "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", 617 | "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", 618 | "dev": true, 619 | "dependencies": { 620 | "@types/resolve": "0.0.8", 621 | "builtin-modules": "^3.1.0", 622 | "is-module": "^1.0.0", 623 | "resolve": "^1.11.1", 624 | "rollup-pluginutils": "^2.8.1" 625 | }, 626 | "peerDependencies": { 627 | "rollup": ">=1.11.0" 628 | } 629 | }, 630 | "node_modules/rollup-pluginutils": { 631 | "version": "2.8.2", 632 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 633 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 634 | "dev": true, 635 | "dependencies": { 636 | "estree-walker": "^0.6.1" 637 | } 638 | }, 639 | "node_modules/source-map": { 640 | "version": "0.6.1", 641 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 642 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 643 | "dev": true, 644 | "engines": { 645 | "node": ">=0.10.0" 646 | } 647 | }, 648 | "node_modules/source-map-support": { 649 | "version": "0.5.9", 650 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 651 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 652 | "dev": true, 653 | "dependencies": { 654 | "buffer-from": "^1.0.0", 655 | "source-map": "^0.6.0" 656 | } 657 | }, 658 | "node_modules/source-map-support/node_modules/source-map": { 659 | "version": "0.6.1", 660 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 661 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 662 | "dev": true, 663 | "engines": { 664 | "node": ">=0.10.0" 665 | } 666 | }, 667 | "node_modules/sourcemap-codec": { 668 | "version": "1.4.6", 669 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", 670 | "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", 671 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 672 | "dev": true 673 | }, 674 | "node_modules/string.prototype.trim": { 675 | "version": "1.1.2", 676 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 677 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 678 | "dev": true, 679 | "dependencies": { 680 | "define-properties": "^1.1.2", 681 | "es-abstract": "^1.5.0", 682 | "function-bind": "^1.0.2" 683 | }, 684 | "engines": { 685 | "node": ">= 0.4" 686 | } 687 | }, 688 | "node_modules/string.prototype.trimleft": { 689 | "version": "2.1.0", 690 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 691 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 692 | "dev": true, 693 | "dependencies": { 694 | "define-properties": "^1.1.3", 695 | "function-bind": "^1.1.1" 696 | }, 697 | "engines": { 698 | "node": ">= 0.4" 699 | } 700 | }, 701 | "node_modules/string.prototype.trimright": { 702 | "version": "2.1.0", 703 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 704 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 705 | "dev": true, 706 | "dependencies": { 707 | "define-properties": "^1.1.3", 708 | "function-bind": "^1.1.1" 709 | }, 710 | "engines": { 711 | "node": ">= 0.4" 712 | } 713 | }, 714 | "node_modules/tape": { 715 | "version": "4.11.0", 716 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 717 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 718 | "dev": true, 719 | "dependencies": { 720 | "deep-equal": "~1.0.1", 721 | "defined": "~1.0.0", 722 | "for-each": "~0.3.3", 723 | "function-bind": "~1.1.1", 724 | "glob": "~7.1.4", 725 | "has": "~1.0.3", 726 | "inherits": "~2.0.4", 727 | "minimist": "~1.2.0", 728 | "object-inspect": "~1.6.0", 729 | "resolve": "~1.11.1", 730 | "resumer": "~0.0.0", 731 | "string.prototype.trim": "~1.1.2", 732 | "through": "~2.3.8" 733 | }, 734 | "bin": { 735 | "tape": "bin/tape" 736 | } 737 | }, 738 | "node_modules/tape/node_modules/resolve": { 739 | "version": "1.11.1", 740 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 741 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 742 | "dev": true, 743 | "dependencies": { 744 | "path-parse": "^1.0.6" 745 | } 746 | }, 747 | "node_modules/through": { 748 | "version": "2.3.8", 749 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 750 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 751 | "dev": true 752 | }, 753 | "node_modules/ts-node": { 754 | "version": "7.0.1", 755 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", 756 | "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", 757 | "dev": true, 758 | "dependencies": { 759 | "arrify": "^1.0.0", 760 | "buffer-from": "^1.1.0", 761 | "diff": "^3.1.0", 762 | "make-error": "^1.1.1", 763 | "minimist": "^1.2.0", 764 | "mkdirp": "^0.5.1", 765 | "source-map-support": "^0.5.6", 766 | "yn": "^2.0.0" 767 | }, 768 | "bin": { 769 | "ts-node": "dist/bin.js" 770 | }, 771 | "engines": { 772 | "node": ">=4.2.0" 773 | } 774 | }, 775 | "node_modules/ts-node/node_modules/diff": { 776 | "version": "3.5.0", 777 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 778 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 779 | "dev": true, 780 | "engines": { 781 | "node": ">=0.3.1" 782 | } 783 | }, 784 | "node_modules/type-check": { 785 | "version": "0.3.2", 786 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 787 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 788 | "dev": true, 789 | "dependencies": { 790 | "prelude-ls": "~1.1.2" 791 | }, 792 | "engines": { 793 | "node": ">= 0.8.0" 794 | } 795 | }, 796 | "node_modules/typescript": { 797 | "version": "2.2.2", 798 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz", 799 | "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=", 800 | "dev": true, 801 | "bin": { 802 | "tsc": "bin/tsc", 803 | "tsserver": "bin/tsserver" 804 | }, 805 | "engines": { 806 | "node": ">=4.2.0" 807 | } 808 | }, 809 | "node_modules/uglify-js": { 810 | "version": "3.6.1", 811 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", 812 | "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", 813 | "dev": true, 814 | "dependencies": { 815 | "commander": "2.20.0", 816 | "source-map": "~0.6.1" 817 | }, 818 | "bin": { 819 | "uglifyjs": "bin/uglifyjs" 820 | }, 821 | "engines": { 822 | "node": ">=0.8.0" 823 | } 824 | }, 825 | "node_modules/v8-argv": { 826 | "version": "1.1.1", 827 | "resolved": "git+ssh://git@github.com/jkroso/v8-argv.git#284f84379e292eb956a5e7b66fb953ec4974385e", 828 | "integrity": "sha512-OVTIyre4uhPX2v7QlbgS2R646XUcln4mNOwWhtzixaeGfGl5TChDb2gZ4fRhhN44xY/oSzPb0Vfh0LEVGQrr5A==", 829 | "dev": true, 830 | "license": "WTFPL" 831 | }, 832 | "node_modules/wordwrap": { 833 | "version": "1.0.0", 834 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 835 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 836 | "dev": true 837 | }, 838 | "node_modules/wrappy": { 839 | "version": "1.0.2", 840 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 841 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 842 | "dev": true 843 | }, 844 | "node_modules/yn": { 845 | "version": "2.0.0", 846 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 847 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 848 | "dev": true, 849 | "engines": { 850 | "node": ">=4" 851 | } 852 | } 853 | }, 854 | "dependencies": { 855 | "@types/estree": { 856 | "version": "0.0.39", 857 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 858 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 859 | "dev": true 860 | }, 861 | "@types/node": { 862 | "version": "8.10.54", 863 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.54.tgz", 864 | "integrity": "sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg==", 865 | "dev": true 866 | }, 867 | "@types/resolve": { 868 | "version": "0.0.8", 869 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 870 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 871 | "dev": true, 872 | "requires": { 873 | "@types/node": "*" 874 | } 875 | }, 876 | "acorn": { 877 | "version": "7.1.0", 878 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", 879 | "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", 880 | "dev": true 881 | }, 882 | "arrify": { 883 | "version": "1.0.1", 884 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 885 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 886 | "dev": true 887 | }, 888 | "balanced-match": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 891 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 892 | "dev": true 893 | }, 894 | "brace-expansion": { 895 | "version": "1.1.11", 896 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 897 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 898 | "dev": true, 899 | "requires": { 900 | "balanced-match": "^1.0.0", 901 | "concat-map": "0.0.1" 902 | } 903 | }, 904 | "buffer-from": { 905 | "version": "1.1.1", 906 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 907 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 908 | "dev": true 909 | }, 910 | "builtin-modules": { 911 | "version": "3.1.0", 912 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 913 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 914 | "dev": true 915 | }, 916 | "commander": { 917 | "version": "2.20.0", 918 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 919 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 920 | "dev": true 921 | }, 922 | "concat-map": { 923 | "version": "0.0.1", 924 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 925 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 926 | "dev": true 927 | }, 928 | "deep-equal": { 929 | "version": "1.0.1", 930 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 931 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 932 | "dev": true 933 | }, 934 | "deep-is": { 935 | "version": "0.1.3", 936 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 937 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 938 | "dev": true 939 | }, 940 | "define-properties": { 941 | "version": "1.1.3", 942 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 943 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 944 | "dev": true, 945 | "requires": { 946 | "object-keys": "^1.0.12" 947 | } 948 | }, 949 | "defined": { 950 | "version": "1.0.0", 951 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 952 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 953 | "dev": true 954 | }, 955 | "es-abstract": { 956 | "version": "1.15.0", 957 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", 958 | "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", 959 | "dev": true, 960 | "requires": { 961 | "es-to-primitive": "^1.2.0", 962 | "function-bind": "^1.1.1", 963 | "has": "^1.0.3", 964 | "has-symbols": "^1.0.0", 965 | "is-callable": "^1.1.4", 966 | "is-regex": "^1.0.4", 967 | "object-inspect": "^1.6.0", 968 | "object-keys": "^1.1.1", 969 | "string.prototype.trimleft": "^2.1.0", 970 | "string.prototype.trimright": "^2.1.0" 971 | } 972 | }, 973 | "es-to-primitive": { 974 | "version": "1.2.0", 975 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 976 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 977 | "dev": true, 978 | "requires": { 979 | "is-callable": "^1.1.4", 980 | "is-date-object": "^1.0.1", 981 | "is-symbol": "^1.0.2" 982 | } 983 | }, 984 | "escodegen": { 985 | "version": "1.12.0", 986 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", 987 | "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", 988 | "dev": true, 989 | "requires": { 990 | "esprima": "^3.1.3", 991 | "estraverse": "^4.2.0", 992 | "esutils": "^2.0.2", 993 | "optionator": "^0.8.1", 994 | "source-map": "~0.6.1" 995 | }, 996 | "dependencies": { 997 | "esprima": { 998 | "version": "3.1.3", 999 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 1000 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 1001 | "dev": true 1002 | } 1003 | } 1004 | }, 1005 | "esprima": { 1006 | "version": "2.7.3", 1007 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1008 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1009 | "dev": true 1010 | }, 1011 | "estraverse": { 1012 | "version": "4.3.0", 1013 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1014 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1015 | "dev": true 1016 | }, 1017 | "estree-walker": { 1018 | "version": "0.6.1", 1019 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 1020 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 1021 | "dev": true 1022 | }, 1023 | "esutils": { 1024 | "version": "2.0.3", 1025 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1026 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1027 | "dev": true 1028 | }, 1029 | "fast-levenshtein": { 1030 | "version": "2.0.6", 1031 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1032 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1033 | "dev": true 1034 | }, 1035 | "for-each": { 1036 | "version": "0.3.3", 1037 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1038 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1039 | "dev": true, 1040 | "requires": { 1041 | "is-callable": "^1.1.3" 1042 | } 1043 | }, 1044 | "fs.realpath": { 1045 | "version": "1.0.0", 1046 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1047 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1048 | "dev": true 1049 | }, 1050 | "function-bind": { 1051 | "version": "1.1.1", 1052 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1053 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1054 | "dev": true 1055 | }, 1056 | "glob": { 1057 | "version": "7.1.4", 1058 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 1059 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 1060 | "dev": true, 1061 | "requires": { 1062 | "fs.realpath": "^1.0.0", 1063 | "inflight": "^1.0.4", 1064 | "inherits": "2", 1065 | "minimatch": "^3.0.4", 1066 | "once": "^1.3.0", 1067 | "path-is-absolute": "^1.0.0" 1068 | } 1069 | }, 1070 | "has": { 1071 | "version": "1.0.3", 1072 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1073 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1074 | "dev": true, 1075 | "requires": { 1076 | "function-bind": "^1.1.1" 1077 | } 1078 | }, 1079 | "has-symbols": { 1080 | "version": "1.0.0", 1081 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 1082 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 1083 | "dev": true 1084 | }, 1085 | "inflight": { 1086 | "version": "1.0.6", 1087 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1088 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1089 | "dev": true, 1090 | "requires": { 1091 | "once": "^1.3.0", 1092 | "wrappy": "1" 1093 | } 1094 | }, 1095 | "inherits": { 1096 | "version": "2.0.4", 1097 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1098 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1099 | "dev": true 1100 | }, 1101 | "is-callable": { 1102 | "version": "1.1.4", 1103 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 1104 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 1105 | "dev": true 1106 | }, 1107 | "is-date-object": { 1108 | "version": "1.0.1", 1109 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1110 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1111 | "dev": true 1112 | }, 1113 | "is-mergeable-object": { 1114 | "version": "1.1.0", 1115 | "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", 1116 | "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", 1117 | "dev": true 1118 | }, 1119 | "is-module": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1122 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 1123 | "dev": true 1124 | }, 1125 | "is-plain-object": { 1126 | "version": "5.0.0", 1127 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 1128 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 1129 | "dev": true 1130 | }, 1131 | "is-reference": { 1132 | "version": "1.1.4", 1133 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 1134 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 1135 | "dev": true, 1136 | "requires": { 1137 | "@types/estree": "0.0.39" 1138 | } 1139 | }, 1140 | "is-regex": { 1141 | "version": "1.0.4", 1142 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1143 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1144 | "dev": true, 1145 | "requires": { 1146 | "has": "^1.0.1" 1147 | } 1148 | }, 1149 | "is-symbol": { 1150 | "version": "1.0.2", 1151 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 1152 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 1153 | "dev": true, 1154 | "requires": { 1155 | "has-symbols": "^1.0.0" 1156 | } 1157 | }, 1158 | "jsmd": { 1159 | "version": "1.0.2", 1160 | "resolved": "https://registry.npmjs.org/jsmd/-/jsmd-1.0.2.tgz", 1161 | "integrity": "sha512-mrQ80ysClsuw4QASa7JcjpwgTADBclo9LgIPDERD99tsfVcXGEHjkX50Q9N0NSmX1Zq3xxQYAA8fuN9GHk1Beg==", 1162 | "dev": true, 1163 | "requires": { 1164 | "escodegen": "^1.9.1", 1165 | "esprima": "^2.7.3", 1166 | "estraverse": "^4.2.0", 1167 | "marked": "^0.7.0", 1168 | "v8-argv": "github:jkroso/v8-argv#1.1.1" 1169 | } 1170 | }, 1171 | "levn": { 1172 | "version": "0.3.0", 1173 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1174 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1175 | "dev": true, 1176 | "requires": { 1177 | "prelude-ls": "~1.1.2", 1178 | "type-check": "~0.3.2" 1179 | } 1180 | }, 1181 | "magic-string": { 1182 | "version": "0.25.4", 1183 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", 1184 | "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", 1185 | "dev": true, 1186 | "requires": { 1187 | "sourcemap-codec": "^1.4.4" 1188 | } 1189 | }, 1190 | "make-error": { 1191 | "version": "1.3.5", 1192 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 1193 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 1194 | "dev": true 1195 | }, 1196 | "marked": { 1197 | "version": "0.7.0", 1198 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", 1199 | "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", 1200 | "dev": true 1201 | }, 1202 | "minimatch": { 1203 | "version": "3.0.4", 1204 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1205 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1206 | "dev": true, 1207 | "requires": { 1208 | "brace-expansion": "^1.1.7" 1209 | } 1210 | }, 1211 | "minimist": { 1212 | "version": "1.2.0", 1213 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1214 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1215 | "dev": true 1216 | }, 1217 | "mkdirp": { 1218 | "version": "0.5.1", 1219 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1220 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1221 | "dev": true, 1222 | "requires": { 1223 | "minimist": "0.0.8" 1224 | }, 1225 | "dependencies": { 1226 | "minimist": { 1227 | "version": "0.0.8", 1228 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1229 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1230 | "dev": true 1231 | } 1232 | } 1233 | }, 1234 | "object-inspect": { 1235 | "version": "1.6.0", 1236 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 1237 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 1238 | "dev": true 1239 | }, 1240 | "object-keys": { 1241 | "version": "1.1.1", 1242 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1243 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1244 | "dev": true 1245 | }, 1246 | "once": { 1247 | "version": "1.4.0", 1248 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1249 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1250 | "dev": true, 1251 | "requires": { 1252 | "wrappy": "1" 1253 | } 1254 | }, 1255 | "optionator": { 1256 | "version": "0.8.2", 1257 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1258 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1259 | "dev": true, 1260 | "requires": { 1261 | "deep-is": "~0.1.3", 1262 | "fast-levenshtein": "~2.0.4", 1263 | "levn": "~0.3.0", 1264 | "prelude-ls": "~1.1.2", 1265 | "type-check": "~0.3.2", 1266 | "wordwrap": "~1.0.0" 1267 | } 1268 | }, 1269 | "path-is-absolute": { 1270 | "version": "1.0.1", 1271 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1272 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1273 | "dev": true 1274 | }, 1275 | "path-parse": { 1276 | "version": "1.0.6", 1277 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1278 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1279 | "dev": true 1280 | }, 1281 | "prelude-ls": { 1282 | "version": "1.1.2", 1283 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1284 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1285 | "dev": true 1286 | }, 1287 | "resolve": { 1288 | "version": "1.12.0", 1289 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 1290 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 1291 | "dev": true, 1292 | "requires": { 1293 | "path-parse": "^1.0.6" 1294 | } 1295 | }, 1296 | "resumer": { 1297 | "version": "0.0.0", 1298 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1299 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1300 | "dev": true, 1301 | "requires": { 1302 | "through": "~2.3.4" 1303 | } 1304 | }, 1305 | "rollup": { 1306 | "version": "1.23.1", 1307 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz", 1308 | "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==", 1309 | "dev": true, 1310 | "requires": { 1311 | "@types/estree": "*", 1312 | "@types/node": "*", 1313 | "acorn": "^7.1.0" 1314 | } 1315 | }, 1316 | "rollup-plugin-commonjs": { 1317 | "version": "10.1.0", 1318 | "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", 1319 | "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", 1320 | "dev": true, 1321 | "requires": { 1322 | "estree-walker": "^0.6.1", 1323 | "is-reference": "^1.1.2", 1324 | "magic-string": "^0.25.2", 1325 | "resolve": "^1.11.0", 1326 | "rollup-pluginutils": "^2.8.1" 1327 | } 1328 | }, 1329 | "rollup-plugin-node-resolve": { 1330 | "version": "5.2.0", 1331 | "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", 1332 | "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", 1333 | "dev": true, 1334 | "requires": { 1335 | "@types/resolve": "0.0.8", 1336 | "builtin-modules": "^3.1.0", 1337 | "is-module": "^1.0.0", 1338 | "resolve": "^1.11.1", 1339 | "rollup-pluginutils": "^2.8.1" 1340 | } 1341 | }, 1342 | "rollup-pluginutils": { 1343 | "version": "2.8.2", 1344 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1345 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1346 | "dev": true, 1347 | "requires": { 1348 | "estree-walker": "^0.6.1" 1349 | } 1350 | }, 1351 | "source-map": { 1352 | "version": "0.6.1", 1353 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1354 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1355 | "dev": true 1356 | }, 1357 | "source-map-support": { 1358 | "version": "0.5.9", 1359 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 1360 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 1361 | "dev": true, 1362 | "requires": { 1363 | "buffer-from": "^1.0.0", 1364 | "source-map": "^0.6.0" 1365 | }, 1366 | "dependencies": { 1367 | "source-map": { 1368 | "version": "0.6.1", 1369 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1370 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1371 | "dev": true 1372 | } 1373 | } 1374 | }, 1375 | "sourcemap-codec": { 1376 | "version": "1.4.6", 1377 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", 1378 | "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", 1379 | "dev": true 1380 | }, 1381 | "string.prototype.trim": { 1382 | "version": "1.1.2", 1383 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1384 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1385 | "dev": true, 1386 | "requires": { 1387 | "define-properties": "^1.1.2", 1388 | "es-abstract": "^1.5.0", 1389 | "function-bind": "^1.0.2" 1390 | } 1391 | }, 1392 | "string.prototype.trimleft": { 1393 | "version": "2.1.0", 1394 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1395 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1396 | "dev": true, 1397 | "requires": { 1398 | "define-properties": "^1.1.3", 1399 | "function-bind": "^1.1.1" 1400 | } 1401 | }, 1402 | "string.prototype.trimright": { 1403 | "version": "2.1.0", 1404 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1405 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1406 | "dev": true, 1407 | "requires": { 1408 | "define-properties": "^1.1.3", 1409 | "function-bind": "^1.1.1" 1410 | } 1411 | }, 1412 | "tape": { 1413 | "version": "4.11.0", 1414 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 1415 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 1416 | "dev": true, 1417 | "requires": { 1418 | "deep-equal": "~1.0.1", 1419 | "defined": "~1.0.0", 1420 | "for-each": "~0.3.3", 1421 | "function-bind": "~1.1.1", 1422 | "glob": "~7.1.4", 1423 | "has": "~1.0.3", 1424 | "inherits": "~2.0.4", 1425 | "minimist": "~1.2.0", 1426 | "object-inspect": "~1.6.0", 1427 | "resolve": "~1.11.1", 1428 | "resumer": "~0.0.0", 1429 | "string.prototype.trim": "~1.1.2", 1430 | "through": "~2.3.8" 1431 | }, 1432 | "dependencies": { 1433 | "resolve": { 1434 | "version": "1.11.1", 1435 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 1436 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 1437 | "dev": true, 1438 | "requires": { 1439 | "path-parse": "^1.0.6" 1440 | } 1441 | } 1442 | } 1443 | }, 1444 | "through": { 1445 | "version": "2.3.8", 1446 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1447 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1448 | "dev": true 1449 | }, 1450 | "ts-node": { 1451 | "version": "7.0.1", 1452 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", 1453 | "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", 1454 | "dev": true, 1455 | "requires": { 1456 | "arrify": "^1.0.0", 1457 | "buffer-from": "^1.1.0", 1458 | "diff": "^3.1.0", 1459 | "make-error": "^1.1.1", 1460 | "minimist": "^1.2.0", 1461 | "mkdirp": "^0.5.1", 1462 | "source-map-support": "^0.5.6", 1463 | "yn": "^2.0.0" 1464 | }, 1465 | "dependencies": { 1466 | "diff": { 1467 | "version": "3.5.0", 1468 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 1469 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 1470 | "dev": true 1471 | } 1472 | } 1473 | }, 1474 | "type-check": { 1475 | "version": "0.3.2", 1476 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1477 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1478 | "dev": true, 1479 | "requires": { 1480 | "prelude-ls": "~1.1.2" 1481 | } 1482 | }, 1483 | "typescript": { 1484 | "version": "2.2.2", 1485 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz", 1486 | "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=", 1487 | "dev": true 1488 | }, 1489 | "uglify-js": { 1490 | "version": "3.6.1", 1491 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz", 1492 | "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==", 1493 | "dev": true, 1494 | "requires": { 1495 | "commander": "2.20.0", 1496 | "source-map": "~0.6.1" 1497 | } 1498 | }, 1499 | "v8-argv": { 1500 | "version": "git+ssh://git@github.com/jkroso/v8-argv.git#284f84379e292eb956a5e7b66fb953ec4974385e", 1501 | "integrity": "sha512-OVTIyre4uhPX2v7QlbgS2R646XUcln4mNOwWhtzixaeGfGl5TChDb2gZ4fRhhN44xY/oSzPb0Vfh0LEVGQrr5A==", 1502 | "dev": true, 1503 | "from": "v8-argv@github:jkroso/v8-argv#1.1.1" 1504 | }, 1505 | "wordwrap": { 1506 | "version": "1.0.0", 1507 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1508 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1509 | "dev": true 1510 | }, 1511 | "wrappy": { 1512 | "version": "1.0.2", 1513 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1514 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1515 | "dev": true 1516 | }, 1517 | "yn": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 1520 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 1521 | "dev": true 1522 | } 1523 | } 1524 | } 1525 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deepmerge", 3 | "description": "A library for deep (recursive) merging of Javascript objects", 4 | "keywords": [ 5 | "merge", 6 | "deep", 7 | "extend", 8 | "copy", 9 | "clone", 10 | "recursive" 11 | ], 12 | "version": "4.3.1", 13 | "homepage": "https://github.com/TehShrike/deepmerge", 14 | "repository": { 15 | "type": "git", 16 | "url": "git://github.com/TehShrike/deepmerge.git" 17 | }, 18 | "main": "dist/cjs.js", 19 | "engines": { 20 | "node": ">=0.10.0" 21 | }, 22 | "scripts": { 23 | "build": "rollup -c", 24 | "test": "npm run build && tape test/*.js && jsmd readme.md && npm run test:typescript", 25 | "test:typescript": "tsc --noEmit test/typescript.ts && ts-node test/typescript.ts", 26 | "size": "npm run build && uglifyjs --compress --mangle -- ./dist/umd.js | gzip -c | wc -c" 27 | }, 28 | "devDependencies": { 29 | "@types/node": "^8.10.54", 30 | "is-mergeable-object": "1.1.0", 31 | "is-plain-object": "^5.0.0", 32 | "jsmd": "^1.0.2", 33 | "rollup": "^1.23.1", 34 | "rollup-plugin-commonjs": "^10.1.0", 35 | "rollup-plugin-node-resolve": "^5.2.0", 36 | "tape": "^4.11.0", 37 | "ts-node": "7.0.1", 38 | "typescript": "=2.2.2", 39 | "uglify-js": "^3.6.1" 40 | }, 41 | "license": "MIT" 42 | } 43 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # deepmerge 2 | 3 | Merges the enumerable properties of two or more objects deeply. 4 | 5 | > UMD bundle is 723B minified+gzipped 6 | 7 | ## Getting Started 8 | 9 | ### Example Usage 10 | 13 | 14 | ```js 15 | const x = { 16 | foo: { bar: 3 }, 17 | array: [{ 18 | does: 'work', 19 | too: [ 1, 2, 3 ] 20 | }] 21 | } 22 | 23 | const y = { 24 | foo: { baz: 4 }, 25 | quux: 5, 26 | array: [{ 27 | does: 'work', 28 | too: [ 4, 5, 6 ] 29 | }, { 30 | really: 'yes' 31 | }] 32 | } 33 | 34 | const output = { 35 | foo: { 36 | bar: 3, 37 | baz: 4 38 | }, 39 | array: [{ 40 | does: 'work', 41 | too: [ 1, 2, 3 ] 42 | }, { 43 | does: 'work', 44 | too: [ 4, 5, 6 ] 45 | }, { 46 | really: 'yes' 47 | }], 48 | quux: 5 49 | } 50 | 51 | merge(x, y) // => output 52 | ``` 53 | 54 | 55 | ### Installation 56 | 57 | With [npm](http://npmjs.org) do: 58 | 59 | ```sh 60 | npm install deepmerge 61 | ``` 62 | 63 | deepmerge can be used directly in the browser without the use of package managers/bundlers as well: [UMD version from unpkg.com](https://unpkg.com/deepmerge/dist/umd.js). 64 | 65 | 66 | ### Include 67 | 68 | deepmerge exposes a CommonJS entry point: 69 | 70 | ``` 71 | const merge = require('deepmerge') 72 | ``` 73 | 74 | The ESM entry point was dropped due to a [Webpack bug](https://github.com/webpack/webpack/issues/6584). 75 | 76 | # API 77 | 78 | 79 | ## `merge(x, y, [options])` 80 | 81 | Merge two objects `x` and `y` deeply, returning a new merged object with the 82 | elements from both `x` and `y`. 83 | 84 | If an element at the same key is present for both `x` and `y`, the value from 85 | `y` will appear in the result. 86 | 87 | Merging creates a new object, so that neither `x` or `y` is modified. 88 | 89 | **Note:** By default, arrays are merged by concatenating them. 90 | 91 | ## `merge.all(arrayOfObjects, [options])` 92 | 93 | Merges any number of objects into a single result object. 94 | 95 | ```js 96 | const foobar = { foo: { bar: 3 } } 97 | const foobaz = { foo: { baz: 4 } } 98 | const bar = { bar: 'yay!' } 99 | 100 | merge.all([ foobar, foobaz, bar ]) // => { foo: { bar: 3, baz: 4 }, bar: 'yay!' } 101 | ``` 102 | 103 | 104 | ## Options 105 | 106 | ### `arrayMerge` 107 | 108 | There are multiple ways to merge two arrays, below are a few examples but you can also create your own custom function. 109 | 110 | Your `arrayMerge` function will be called with three arguments: a `target` array, the `source` array, and an `options` object with these properties: 111 | 112 | - `isMergeableObject(value)` 113 | - `cloneUnlessOtherwiseSpecified(value, options)` 114 | 115 | #### `arrayMerge` example: overwrite target array 116 | 117 | Overwrites the existing array values completely rather than concatenating them: 118 | 119 | ```js 120 | const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray 121 | 122 | merge( 123 | [1, 2, 3], 124 | [3, 2, 1], 125 | { arrayMerge: overwriteMerge } 126 | ) // => [3, 2, 1] 127 | ``` 128 | 129 | #### `arrayMerge` example: combine arrays 130 | 131 | Combines objects at the same index in the two arrays. 132 | 133 | This was the default array merging algorithm pre-version-2.0.0. 134 | 135 | ```js 136 | const combineMerge = (target, source, options) => { 137 | const destination = target.slice() 138 | 139 | source.forEach((item, index) => { 140 | if (typeof destination[index] === 'undefined') { 141 | destination[index] = options.cloneUnlessOtherwiseSpecified(item, options) 142 | } else if (options.isMergeableObject(item)) { 143 | destination[index] = merge(target[index], item, options) 144 | } else if (target.indexOf(item) === -1) { 145 | destination.push(item) 146 | } 147 | }) 148 | return destination 149 | } 150 | 151 | merge( 152 | [{ a: true }], 153 | [{ b: true }, 'ah yup'], 154 | { arrayMerge: combineMerge } 155 | ) // => [{ a: true, b: true }, 'ah yup'] 156 | ``` 157 | 158 | ### `isMergeableObject` 159 | 160 | By default, deepmerge clones every property from almost every kind of object. 161 | 162 | You may not want this, if your objects are of special types, and you want to copy the whole object instead of just copying its properties. 163 | 164 | You can accomplish this by passing in a function for the `isMergeableObject` option. 165 | 166 | If you only want to clone properties of plain objects, and ignore all "special" kinds of instantiated objects, you probably want to drop in [`is-plain-object`](https://github.com/jonschlinkert/is-plain-object). 167 | 168 | ```js 169 | const { isPlainObject } = require('is-plain-object') 170 | 171 | function SuperSpecial() { 172 | this.special = 'oh yeah man totally' 173 | } 174 | 175 | const instantiatedSpecialObject = new SuperSpecial() 176 | 177 | const target = { 178 | someProperty: { 179 | cool: 'oh for sure' 180 | } 181 | } 182 | 183 | const source = { 184 | someProperty: instantiatedSpecialObject 185 | } 186 | 187 | const defaultOutput = merge(target, source) 188 | 189 | defaultOutput.someProperty.cool // => 'oh for sure' 190 | defaultOutput.someProperty.special // => 'oh yeah man totally' 191 | defaultOutput.someProperty instanceof SuperSpecial // => false 192 | 193 | const customMergeOutput = merge(target, source, { 194 | isMergeableObject: isPlainObject 195 | }) 196 | 197 | customMergeOutput.someProperty.cool // => undefined 198 | customMergeOutput.someProperty.special // => 'oh yeah man totally' 199 | customMergeOutput.someProperty instanceof SuperSpecial // => true 200 | ``` 201 | 202 | ### `customMerge` 203 | 204 | Specifies a function which can be used to override the default merge behavior for a property, based on the property name. 205 | 206 | The `customMerge` function will be passed the key for each property, and should return the function which should be used to merge the values for that property. 207 | 208 | It may also return undefined, in which case the default merge behaviour will be used. 209 | 210 | ```js 211 | const alex = { 212 | name: { 213 | first: 'Alex', 214 | last: 'Alexson' 215 | }, 216 | pets: ['Cat', 'Parrot'] 217 | } 218 | 219 | const tony = { 220 | name: { 221 | first: 'Tony', 222 | last: 'Tonison' 223 | }, 224 | pets: ['Dog'] 225 | } 226 | 227 | const mergeNames = (nameA, nameB) => `${nameA.first} and ${nameB.first}` 228 | 229 | const options = { 230 | customMerge: (key) => { 231 | if (key === 'name') { 232 | return mergeNames 233 | } 234 | } 235 | } 236 | 237 | const result = merge(alex, tony, options) 238 | 239 | result.name // => 'Alex and Tony' 240 | result.pets // => ['Cat', 'Parrot', 'Dog'] 241 | ``` 242 | 243 | 244 | ### `clone` 245 | 246 | *Deprecated.* 247 | 248 | Defaults to `true`. 249 | 250 | If `clone` is `false` then child objects will be copied directly instead of being cloned. This was the default behavior before version 2.x. 251 | 252 | 253 | # Testing 254 | 255 | With [npm](http://npmjs.org) do: 256 | 257 | ```sh 258 | npm test 259 | ``` 260 | 261 | 262 | # License 263 | 264 | MIT 265 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from 'rollup-plugin-node-resolve' 2 | import commonjs from 'rollup-plugin-commonjs' 3 | import pkg from './package.json' 4 | 5 | export default { 6 | input: `index.js`, 7 | plugins: [ 8 | commonjs(), 9 | resolve(), 10 | ], 11 | output: [ 12 | { 13 | file: pkg.main, 14 | format: `cjs` 15 | }, 16 | { 17 | name: 'deepmerge', 18 | file: 'dist/umd.js', 19 | format: `umd` 20 | }, 21 | ], 22 | } 23 | -------------------------------------------------------------------------------- /test/custom-array-merge.js: -------------------------------------------------------------------------------- 1 | var merge = require('../') 2 | var test = require('tape') 3 | 4 | test('custom merge array', function(t) { 5 | var mergeFunctionCalled = false 6 | function overwriteMerge(target, source, options) { 7 | mergeFunctionCalled = true 8 | t.equal(options.arrayMerge, overwriteMerge) 9 | 10 | return source 11 | } 12 | const destination = { 13 | someArray: [ 1, 2 ], 14 | someObject: { what: 'yes' }, 15 | } 16 | const source = { 17 | someArray: [ 1, 2, 3 ], 18 | } 19 | 20 | const actual = merge(destination, source, { arrayMerge: overwriteMerge }) 21 | const expected = { 22 | someArray: [ 1, 2, 3 ], 23 | someObject: { what: 'yes' }, 24 | } 25 | 26 | t.ok(mergeFunctionCalled) 27 | t.deepEqual(actual, expected) 28 | t.end() 29 | }) 30 | 31 | test('merge top-level arrays', function(t) { 32 | function overwriteMerge(a, b) { 33 | return b 34 | } 35 | var actual = merge([ 1, 2 ], [ 1, 2 ], { arrayMerge: overwriteMerge }) 36 | var expected = [ 1, 2 ] 37 | 38 | t.deepEqual(actual, expected) 39 | t.end() 40 | }) 41 | 42 | test('cloner function is available for merge functions to use', function(t) { 43 | var customMergeWasCalled = false 44 | function cloneMerge(target, source, options) { 45 | customMergeWasCalled = true 46 | t.ok(options.cloneUnlessOtherwiseSpecified, 'cloner function is available') 47 | return target.concat(source).map(function(element) { 48 | return options.cloneUnlessOtherwiseSpecified(element, options) 49 | }) 50 | } 51 | 52 | var src = { 53 | key1: [ 'one', 'three' ], 54 | key2: [ 'four' ], 55 | } 56 | var target = { 57 | key1: [ 'one', 'two' ], 58 | } 59 | 60 | var expected = { 61 | key1: [ 'one', 'two', 'one', 'three' ], 62 | key2: [ 'four' ], 63 | } 64 | 65 | t.deepEqual(merge(target, src, { arrayMerge: cloneMerge }), expected) 66 | t.ok(customMergeWasCalled) 67 | t.ok(Array.isArray(merge(target, src).key1)) 68 | t.ok(Array.isArray(merge(target, src).key2)) 69 | t.end() 70 | }) 71 | -------------------------------------------------------------------------------- /test/custom-is-mergeable-object.js: -------------------------------------------------------------------------------- 1 | const merge = require(`..`) 2 | const test = require(`tape`) 3 | 4 | test(`isMergeableObject function copying object over object`, t => { 5 | const src = { key: { isMergeable: false }, baz: `yes` } 6 | const target = { key: { foo: `wat` }, baz: `whatever` } 7 | 8 | function isMergeableObject(object) { 9 | return object && typeof value === `object` && object.isMergeable !== false 10 | } 11 | 12 | const res = merge(target, src, { 13 | isMergeableObject, 14 | }) 15 | 16 | t.deepEqual(res, { key: { isMergeable: false }, baz: `yes` }) 17 | t.equal(res.key, src.key, `Object has the same identity and was not cloned`) 18 | t.end() 19 | }) 20 | 21 | test(`isMergeableObject function copying object over nothing`, t => { 22 | const src = { key: { isMergeable: false, foo: `bar` }, baz: `yes` } 23 | const target = { baz: `whatever` } 24 | 25 | function isMergeableObject(object) { 26 | return object && typeof value === `object` && object.isMergeable !== false 27 | } 28 | 29 | const res = merge(target, src, { 30 | isMergeableObject, 31 | }) 32 | 33 | t.deepEqual(res, { key: { isMergeable: false, foo: `bar` }, baz: `yes` }) 34 | t.equal(res.key, src.key, `Object has the same identity and was not cloned`) 35 | t.end() 36 | }) 37 | 38 | test(`example from readme`, t => { 39 | const { isPlainObject } = require(`is-plain-object`) 40 | 41 | function SuperSpecial() { 42 | this.special = `oh yeah man totally` 43 | } 44 | 45 | const instantiatedSpecialObject = new SuperSpecial() 46 | 47 | const target = { 48 | someProperty: { 49 | cool: `oh for sure`, 50 | }, 51 | } 52 | 53 | const source = { 54 | someProperty: instantiatedSpecialObject, 55 | } 56 | 57 | const defaultOutput = merge(target, source) 58 | 59 | t.equal(defaultOutput.someProperty.cool, `oh for sure`) 60 | t.equal(defaultOutput.someProperty.special, `oh yeah man totally`) 61 | t.equal(defaultOutput.someProperty instanceof SuperSpecial, false) 62 | 63 | const customMergeOutput = merge(target, source, { 64 | isMergeableObject: isPlainObject, 65 | }) 66 | 67 | t.equal(customMergeOutput.someProperty.cool, undefined) 68 | t.equal(customMergeOutput.someProperty.special, `oh yeah man totally`) 69 | t.equal(customMergeOutput.someProperty instanceof SuperSpecial, true) 70 | 71 | t.end() 72 | }) 73 | -------------------------------------------------------------------------------- /test/merge-all.js: -------------------------------------------------------------------------------- 1 | var merge = require('../') 2 | var test = require('tape') 3 | 4 | test('throw error if first argument is not an array', function(t) { 5 | t.throws(merge.all.bind(null, { example: true }, { another: '2' }), Error) 6 | t.end() 7 | }) 8 | 9 | test('return an empty object if first argument is an array with no elements', function(t) { 10 | t.deepEqual(merge.all([]), {}) 11 | t.end() 12 | }) 13 | 14 | test('Work just fine if first argument is an array with least than two elements', function(t) { 15 | var actual = merge.all([{ example: true }]) 16 | var expected = { example: true } 17 | t.deepEqual(actual, expected) 18 | t.end() 19 | }) 20 | 21 | test('execute correctly if options object were not passed', function(t) { 22 | var arrayToMerge = [{ example: true }, { another: '123' }] 23 | t.doesNotThrow(merge.all.bind(null, arrayToMerge)) 24 | t.end() 25 | }) 26 | 27 | test('execute correctly if options object were passed', function(t) { 28 | var arrayToMerge = [{ example: true }, { another: '123' }] 29 | t.doesNotThrow(merge.all.bind(null, arrayToMerge, { clone: true })) 30 | t.end() 31 | }) 32 | 33 | test('invoke merge on every item in array should result with all props', function(t) { 34 | var firstObject = { first: true } 35 | var secondObject = { second: false } 36 | var thirdObject = { third: 123 } 37 | var fourthObject = { fourth: 'some string' } 38 | 39 | var mergedObject = merge.all([ firstObject, secondObject, thirdObject, fourthObject ]) 40 | 41 | t.ok(mergedObject.first === true) 42 | t.ok(mergedObject.second === false) 43 | t.ok(mergedObject.third === 123) 44 | t.ok(mergedObject.fourth === 'some string') 45 | t.end() 46 | }) 47 | 48 | test('invoke merge on every item in array with clone should clone all elements', function(t) { 49 | var firstObject = { a: { d: 123 } } 50 | var secondObject = { b: { e: true } } 51 | var thirdObject = { c: { f: 'string' } } 52 | 53 | var mergedWithClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: true }) 54 | 55 | t.notEqual(mergedWithClone.a, firstObject.a) 56 | t.notEqual(mergedWithClone.b, secondObject.b) 57 | t.notEqual(mergedWithClone.c, thirdObject.c) 58 | 59 | t.end() 60 | }) 61 | 62 | test('invoke merge on every item in array clone=false should not clone all elements', function(t) { 63 | var firstObject = { a: { d: 123 } } 64 | var secondObject = { b: { e: true } } 65 | var thirdObject = { c: { f: 'string' } } 66 | 67 | var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ], { clone: false }) 68 | 69 | t.equal(mergedWithoutClone.a, firstObject.a) 70 | t.equal(mergedWithoutClone.b, secondObject.b) 71 | t.equal(mergedWithoutClone.c, thirdObject.c) 72 | 73 | t.end() 74 | }) 75 | 76 | 77 | test('invoke merge on every item in array without clone should clone all elements', function(t) { 78 | var firstObject = { a: { d: 123 } } 79 | var secondObject = { b: { e: true } } 80 | var thirdObject = { c: { f: 'string' } } 81 | 82 | var mergedWithoutClone = merge.all([ firstObject, secondObject, thirdObject ]) 83 | 84 | t.notEqual(mergedWithoutClone.a, firstObject.a) 85 | t.notEqual(mergedWithoutClone.b, secondObject.b) 86 | t.notEqual(mergedWithoutClone.c, thirdObject.c) 87 | 88 | t.end() 89 | }) 90 | -------------------------------------------------------------------------------- /test/merge.js: -------------------------------------------------------------------------------- 1 | var merge = require('../') 2 | var test = require('tape') 3 | 4 | test('add keys in target that do not exist at the root', function(t) { 5 | var src = { key1: 'value1', key2: 'value2' } 6 | var target = {} 7 | 8 | var res = merge(target, src) 9 | 10 | t.deepEqual(target, {}, 'merge should be immutable') 11 | t.deepEqual(res, src) 12 | t.end() 13 | }) 14 | 15 | test('merge existing simple keys in target at the roots', function(t) { 16 | var src = { key1: 'changed', key2: 'value2' } 17 | var target = { key1: 'value1', key3: 'value3' } 18 | 19 | var expected = { 20 | key1: 'changed', 21 | key2: 'value2', 22 | key3: 'value3', 23 | } 24 | 25 | t.deepEqual(target, { key1: 'value1', key3: 'value3' }) 26 | t.deepEqual(merge(target, src), expected) 27 | t.end() 28 | }) 29 | 30 | test('merge nested objects into target', function(t) { 31 | var src = { 32 | key1: { 33 | subkey1: 'changed', 34 | subkey3: 'added', 35 | }, 36 | } 37 | var target = { 38 | key1: { 39 | subkey1: 'value1', 40 | subkey2: 'value2', 41 | }, 42 | } 43 | 44 | var expected = { 45 | key1: { 46 | subkey1: 'changed', 47 | subkey2: 'value2', 48 | subkey3: 'added', 49 | }, 50 | } 51 | 52 | t.deepEqual(target, { 53 | key1: { 54 | subkey1: 'value1', 55 | subkey2: 'value2', 56 | }, 57 | }) 58 | t.deepEqual(merge(target, src), expected) 59 | t.end() 60 | }) 61 | 62 | test('replace simple key with nested object in target', function(t) { 63 | var src = { 64 | key1: { 65 | subkey1: 'subvalue1', 66 | subkey2: 'subvalue2', 67 | }, 68 | } 69 | var target = { 70 | key1: 'value1', 71 | key2: 'value2', 72 | } 73 | 74 | var expected = { 75 | key1: { 76 | subkey1: 'subvalue1', 77 | subkey2: 'subvalue2', 78 | }, 79 | key2: 'value2', 80 | } 81 | 82 | t.deepEqual(target, { key1: 'value1', key2: 'value2' }) 83 | t.deepEqual(merge(target, src), expected) 84 | t.end() 85 | }) 86 | 87 | test('should add nested object in target', function(t) { 88 | var src = { 89 | "b": { 90 | "c": {}, 91 | }, 92 | } 93 | 94 | var target = { 95 | "a": {}, 96 | } 97 | 98 | var expected = { 99 | "a": {}, 100 | "b": { 101 | "c": {}, 102 | }, 103 | } 104 | 105 | t.deepEqual(merge(target, src), expected) 106 | t.end() 107 | }) 108 | 109 | test('should clone source and target', function(t) { 110 | var src = { 111 | "b": { 112 | "c": "foo", 113 | }, 114 | } 115 | 116 | var target = { 117 | "a": { 118 | "d": "bar", 119 | }, 120 | } 121 | 122 | var expected = { 123 | "a": { 124 | "d": "bar", 125 | }, 126 | "b": { 127 | "c": "foo", 128 | }, 129 | } 130 | 131 | var merged = merge(target, src, { clone: true }) 132 | 133 | t.deepEqual(merged, expected) 134 | 135 | t.notEqual(merged.a, target.a) 136 | t.notEqual(merged.b, src.b) 137 | 138 | t.end() 139 | }) 140 | 141 | test('should clone source and target', function(t) { 142 | var src = { 143 | "b": { 144 | "c": "foo", 145 | }, 146 | } 147 | 148 | var target = { 149 | "a": { 150 | "d": "bar", 151 | }, 152 | } 153 | 154 | var merged = merge(target, src) 155 | t.notEqual(merged.a, target.a) 156 | t.notEqual(merged.b, src.b) 157 | 158 | t.end() 159 | }) 160 | 161 | test('should replace object with simple key in target', function(t) { 162 | var src = { key1: 'value1' } 163 | var target = { 164 | key1: { 165 | subkey1: 'subvalue1', 166 | subkey2: 'subvalue2', 167 | }, 168 | key2: 'value2', 169 | } 170 | 171 | var expected = { key1: 'value1', key2: 'value2' } 172 | 173 | t.deepEqual(target, { 174 | key1: { 175 | subkey1: 'subvalue1', 176 | subkey2: 'subvalue2', 177 | }, 178 | key2: 'value2', 179 | }) 180 | t.deepEqual(merge(target, src), expected) 181 | t.end() 182 | }) 183 | 184 | test('should replace objects with arrays', function(t) { 185 | var target = { key1: { subkey: 'one' } } 186 | 187 | var src = { key1: [ 'subkey' ] } 188 | 189 | var expected = { key1: [ 'subkey' ] } 190 | 191 | t.deepEqual(merge(target, src), expected) 192 | t.end() 193 | }) 194 | 195 | test('should replace arrays with objects', function(t) { 196 | var target = { key1: [ "subkey" ] } 197 | 198 | var src = { key1: { subkey: 'one' } } 199 | 200 | var expected = { key1: { subkey: 'one' } } 201 | 202 | t.deepEqual(merge(target, src), expected) 203 | t.end() 204 | }) 205 | 206 | test('should replace dates with arrays', function(t) { 207 | var target = { key1: new Date() } 208 | 209 | var src = { key1: [ "subkey" ] } 210 | 211 | var expected = { key1: [ "subkey" ] } 212 | 213 | t.deepEqual(merge(target, src), expected) 214 | t.end() 215 | }) 216 | 217 | test('should replace null with arrays', function(t) { 218 | var target = { 219 | key1: null, 220 | } 221 | 222 | var src = { 223 | key1: [ "subkey" ], 224 | } 225 | 226 | var expected = { 227 | key1: [ "subkey" ], 228 | } 229 | 230 | t.deepEqual(merge(target, src), expected) 231 | t.end() 232 | }) 233 | 234 | test('should work on simple array', function(t) { 235 | var src = [ 'one', 'three' ] 236 | var target = [ 'one', 'two' ] 237 | 238 | var expected = [ 'one', 'two', 'one', 'three' ] 239 | 240 | t.deepEqual(merge(target, src), expected) 241 | t.ok(Array.isArray(merge(target, src))) 242 | t.end() 243 | }) 244 | 245 | test('should work on another simple array', function(t) { 246 | var target = [ "a1", "a2", "c1", "f1", "p1" ] 247 | var src = [ "t1", "s1", "c2", "r1", "p2", "p3" ] 248 | 249 | var expected = [ "a1", "a2", "c1", "f1", "p1", "t1", "s1", "c2", "r1", "p2", "p3" ] 250 | t.deepEqual(target, [ "a1", "a2", "c1", "f1", "p1" ]) 251 | t.deepEqual(merge(target, src), expected) 252 | t.ok(Array.isArray(merge(target, src))) 253 | t.end() 254 | }) 255 | 256 | test('should work on array properties', function(t) { 257 | var src = { 258 | key1: [ 'one', 'three' ], 259 | key2: [ 'four' ], 260 | } 261 | var target = { 262 | key1: [ 'one', 'two' ], 263 | } 264 | 265 | var expected = { 266 | key1: [ 'one', 'two', 'one', 'three' ], 267 | key2: [ 'four' ], 268 | } 269 | 270 | t.deepEqual(merge(target, src), expected) 271 | t.ok(Array.isArray(merge(target, src).key1)) 272 | t.ok(Array.isArray(merge(target, src).key2)) 273 | t.end() 274 | }) 275 | 276 | test('should work on array properties with clone option', function(t) { 277 | var src = { 278 | key1: [ 'one', 'three' ], 279 | key2: [ 'four' ], 280 | } 281 | var target = { 282 | key1: [ 'one', 'two' ], 283 | } 284 | 285 | t.deepEqual(target, { 286 | key1: [ 'one', 'two' ], 287 | }) 288 | var merged = merge(target, src, { clone: true }) 289 | t.notEqual(merged.key1, src.key1) 290 | t.notEqual(merged.key1, target.key1) 291 | t.notEqual(merged.key2, src.key2) 292 | t.end() 293 | }) 294 | 295 | test('should work on array of objects', function(t) { 296 | var src = [ 297 | { key1: [ 'one', 'three' ], key2: [ 'one' ] }, 298 | { key3: [ 'five' ] }, 299 | ] 300 | var target = [ 301 | { key1: [ 'one', 'two' ] }, 302 | { key3: [ 'four' ] }, 303 | ] 304 | 305 | var expected = [ 306 | { key1: [ 'one', 'two' ] }, 307 | { key3: [ 'four' ] }, 308 | { key1: [ 'one', 'three' ], key2: [ 'one' ] }, 309 | { key3: [ 'five' ] }, 310 | ] 311 | 312 | t.deepEqual(merge(target, src), expected) 313 | t.ok(Array.isArray(merge(target, src)), 'result should be an array') 314 | t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too') 315 | 316 | t.end() 317 | }) 318 | 319 | test('should work on array of objects with clone option', function(t) { 320 | var src = [ 321 | { key1: [ 'one', 'three' ], key2: [ 'one' ] }, 322 | { key3: [ 'five' ] }, 323 | ] 324 | var target = [ 325 | { key1: [ 'one', 'two' ] }, 326 | { key3: [ 'four' ] }, 327 | ] 328 | 329 | var expected = [ 330 | { key1: [ 'one', 'two' ] }, 331 | { key3: [ 'four' ] }, 332 | { key1: [ 'one', 'three' ], key2: [ 'one' ] }, 333 | { key3: [ 'five' ] }, 334 | ] 335 | 336 | var merged = merge(target, src, { clone: true }) 337 | t.deepEqual(merged, expected) 338 | t.ok(Array.isArray(merge(target, src)), 'result should be an array') 339 | t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too') 340 | t.notEqual(merged[0].key1, src[0].key1) 341 | t.notEqual(merged[0].key1, target[0].key1) 342 | t.notEqual(merged[0].key2, src[0].key2) 343 | t.notEqual(merged[1].key3, src[1].key3) 344 | t.notEqual(merged[1].key3, target[1].key3) 345 | t.end() 346 | }) 347 | 348 | test('should treat regular expressions like primitive values', function(t) { 349 | var target = { key1: /abc/ } 350 | var src = { key1: /efg/ } 351 | var expected = { key1: /efg/ } 352 | 353 | t.deepEqual(merge(target, src), expected) 354 | t.deepEqual(merge(target, src).key1.test('efg'), true) 355 | t.end() 356 | }) 357 | 358 | test('should treat regular expressions like primitive values and should not' 359 | + ' clone even with clone option', function(t) { 360 | var target = { key1: /abc/ } 361 | var src = { key1: /efg/ } 362 | 363 | var output = merge(target, src, { clone: true }) 364 | 365 | t.equal(output.key1, src.key1) 366 | t.end() 367 | } 368 | ) 369 | 370 | test('should treat dates like primitives', function(t) { 371 | var monday = new Date('2016-09-27T01:08:12.761Z') 372 | var tuesday = new Date('2016-09-28T01:18:12.761Z') 373 | 374 | var target = { 375 | key: monday, 376 | } 377 | var source = { 378 | key: tuesday, 379 | } 380 | 381 | var expected = { 382 | key: tuesday, 383 | } 384 | var actual = merge(target, source) 385 | 386 | t.deepEqual(actual, expected) 387 | t.equal(actual.key.valueOf(), tuesday.valueOf()) 388 | t.end() 389 | }) 390 | 391 | test('should treat dates like primitives and should not clone even with clone' 392 | + ' option', function(t) { 393 | var monday = new Date('2016-09-27T01:08:12.761Z') 394 | var tuesday = new Date('2016-09-28T01:18:12.761Z') 395 | 396 | var target = { 397 | key: monday, 398 | } 399 | var source = { 400 | key: tuesday, 401 | } 402 | 403 | var actual = merge(target, source, { clone: true }) 404 | 405 | t.equal(actual.key, tuesday) 406 | t.end() 407 | }) 408 | 409 | test('should work on array with null in it', function(t) { 410 | var target = [] 411 | 412 | var src = [ null ] 413 | 414 | var expected = [ null ] 415 | 416 | t.deepEqual(merge(target, src), expected) 417 | t.end() 418 | }) 419 | 420 | test('should clone array\'s element if it is object', function(t) { 421 | var a = { key: 'yup' } 422 | var target = [] 423 | var source = [ a ] 424 | 425 | var output = merge(target, source, { clone: true }) 426 | 427 | t.notEqual(output[0], a) 428 | t.equal(output[0].key, 'yup') 429 | t.end() 430 | }) 431 | 432 | test('should clone an array property when there is no target array', function(t) { 433 | const someObject = {} 434 | var target = {} 435 | var source = { ary: [ someObject ] } 436 | var output = merge(target, source, { clone: true }) 437 | 438 | t.deepEqual(output, { ary: [{}] }) 439 | t.notEqual(output.ary[0], someObject) 440 | t.end() 441 | }) 442 | 443 | test('should overwrite values when property is initialised but undefined', function(t) { 444 | var target1 = { value: [] } 445 | var target2 = { value: null } 446 | var target3 = { value: 2 } 447 | 448 | var src = { value: undefined } 449 | 450 | function hasUndefinedProperty(o) { 451 | t.ok(o.hasOwnProperty('value')) 452 | t.equal(typeof o.value, 'undefined') 453 | } 454 | 455 | hasUndefinedProperty(merge(target1, src)) 456 | hasUndefinedProperty(merge(target2, src)) 457 | hasUndefinedProperty(merge(target3, src)) 458 | 459 | t.end() 460 | }) 461 | 462 | test('dates should copy correctly in an array', function(t) { 463 | var monday = new Date('2016-09-27T01:08:12.761Z') 464 | var tuesday = new Date('2016-09-28T01:18:12.761Z') 465 | 466 | var target = [ monday, 'dude' ] 467 | var source = [ tuesday, 'lol' ] 468 | 469 | var expected = [ monday, 'dude', tuesday, 'lol' ] 470 | var actual = merge(target, source) 471 | 472 | t.deepEqual(actual, expected) 473 | t.end() 474 | }) 475 | 476 | test('should handle custom merge functions', function(t) { 477 | var target = { 478 | letters: ['a', 'b'], 479 | people: { 480 | first: 'Alex', 481 | second: 'Bert', 482 | } 483 | } 484 | 485 | var source = { 486 | letters: ['c'], 487 | people: { 488 | first: 'Smith', 489 | second: 'Bertson', 490 | third: 'Car' 491 | } 492 | } 493 | 494 | const mergePeople = (target, source, options) => { 495 | const keys = new Set(Object.keys(target).concat(Object.keys(source))) 496 | const destination = {} 497 | keys.forEach(key => { 498 | if (key in target && key in source) { 499 | destination[key] = `${target[key]}-${source[key]}` 500 | } else if (key in target) { 501 | destination[key] = target[key] 502 | } else { 503 | destination[key] = source[key] 504 | } 505 | }) 506 | return destination 507 | } 508 | 509 | const options = { 510 | customMerge: (key, options) => { 511 | if (key === 'people') { 512 | return mergePeople 513 | } 514 | 515 | return merge 516 | } 517 | } 518 | 519 | var expected = { 520 | letters: ['a', 'b', 'c'], 521 | people: { 522 | first: 'Alex-Smith', 523 | second: 'Bert-Bertson', 524 | third: 'Car' 525 | } 526 | } 527 | 528 | var actual = merge(target, source, options) 529 | t.deepEqual(actual, expected) 530 | t.end() 531 | }) 532 | 533 | 534 | test('should handle custom merge functions', function(t) { 535 | var target = { 536 | letters: ['a', 'b'], 537 | people: { 538 | first: 'Alex', 539 | second: 'Bert', 540 | } 541 | } 542 | 543 | var source = { 544 | letters: ['c'], 545 | people: { 546 | first: 'Smith', 547 | second: 'Bertson', 548 | third: 'Car' 549 | } 550 | } 551 | 552 | const mergeLetters = (target, source, options) => { 553 | return 'merged letters' 554 | } 555 | 556 | 557 | const options = { 558 | customMerge: (key, options) => { 559 | if (key === 'letters') { 560 | return mergeLetters 561 | } 562 | } 563 | } 564 | 565 | const expected = { 566 | letters: 'merged letters', 567 | people: { 568 | first: 'Smith', 569 | second: 'Bertson', 570 | third: 'Car' 571 | } 572 | } 573 | 574 | var actual = merge(target, source, options) 575 | t.deepEqual(actual, expected) 576 | t.end() 577 | }) 578 | 579 | test('should merge correctly if custom merge is not a valid function', function(t) { 580 | var target = { 581 | letters: ['a', 'b'], 582 | people: { 583 | first: 'Alex', 584 | second: 'Bert', 585 | } 586 | } 587 | 588 | var source = { 589 | letters: ['c'], 590 | people: { 591 | first: 'Smith', 592 | second: 'Bertson', 593 | third: 'Car' 594 | } 595 | } 596 | 597 | const options = { 598 | customMerge: (key, options) => { 599 | return false 600 | } 601 | } 602 | 603 | const expected = { 604 | letters: ['a', 'b', 'c'], 605 | people: { 606 | first: 'Smith', 607 | second: 'Bertson', 608 | third: 'Car' 609 | } 610 | } 611 | 612 | var actual = merge(target, source, options) 613 | t.deepEqual(actual, expected) 614 | t.end() 615 | 616 | }) 617 | 618 | test('copy symbol keys in target that do not exist on the target', function(t) { 619 | var mySymbol = Symbol(); 620 | var src = { [mySymbol]: 'value1' } 621 | var target = {} 622 | 623 | var res = merge(target, src) 624 | 625 | t.equal(res[mySymbol], 'value1') 626 | t.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src)) 627 | t.end() 628 | }) 629 | 630 | test('copy symbol keys in target that do exist on the target', function(t) { 631 | var mySymbol = Symbol(); 632 | var src = { [mySymbol]: 'value1' } 633 | var target = { [mySymbol]: 'wat'} 634 | 635 | var res = merge(target, src) 636 | 637 | t.equal(res[mySymbol], 'value1') 638 | t.end() 639 | }) 640 | 641 | test('Falsey properties should be mergeable', function(t) { 642 | var uniqueValue = {} 643 | 644 | var target = { 645 | wat: false 646 | } 647 | 648 | var source = { 649 | wat: false 650 | } 651 | 652 | var customMergeWasCalled = false 653 | 654 | var result = merge(target, source, { 655 | isMergeableObject: function() { 656 | return true 657 | }, 658 | customMerge: function() { 659 | return function() { 660 | customMergeWasCalled = true 661 | return uniqueValue 662 | } 663 | } 664 | }) 665 | 666 | t.equal(result.wat, uniqueValue) 667 | t.ok(customMergeWasCalled, 'custom merge function was called') 668 | t.end() 669 | }) 670 | -------------------------------------------------------------------------------- /test/prototype-poisoning.js: -------------------------------------------------------------------------------- 1 | var merge = require('../') 2 | var test = require('tape') 3 | var isMergeableObject = require('is-mergeable-object') 4 | 5 | test('merging objects with own __proto__', function(t) { 6 | var user = {} 7 | var malicious = JSON.parse('{ "__proto__": { "admin": true } }') 8 | var mergedObject = merge(user, malicious) 9 | t.notOk(mergedObject.__proto__.admin, 'non-plain properties should not be merged') 10 | t.notOk(mergedObject.admin, 'the destination should have an unmodified prototype') 11 | t.end() 12 | }) 13 | 14 | test('merging objects with plain and non-plain properties', function(t) { 15 | var plainSymbolKey = Symbol('plainSymbolKey') 16 | var parent = { 17 | parentKey: 'should be undefined' 18 | } 19 | 20 | var target = Object.create(parent) 21 | target.plainKey = 'should be replaced' 22 | target[plainSymbolKey] = 'should also be replaced' 23 | 24 | var source = { 25 | parentKey: 'foo', 26 | plainKey: 'bar', 27 | newKey: 'baz', 28 | [plainSymbolKey]: 'qux' 29 | } 30 | 31 | var mergedObject = merge(target, source) 32 | t.equal(undefined, mergedObject.parentKey, 'inherited properties of target should be removed, not merged or ignored') 33 | t.equal('bar', mergedObject.plainKey, 'enumerable own properties of target should be merged') 34 | t.equal('baz', mergedObject.newKey, 'properties not yet on target should be merged') 35 | t.equal('qux', mergedObject[plainSymbolKey], 'enumerable own symbol properties of target should be merged') 36 | t.end() 37 | }) 38 | 39 | // the following cases come from the thread here: https://github.com/TehShrike/deepmerge/pull/164 40 | test('merging strings works with a custom string merge', function(t) { 41 | var target = { name: "Alexander" } 42 | var source = { name: "Hamilton" } 43 | function customMerge(key, options) { 44 | if (key === 'name') { 45 | return function(target, source, options) { 46 | return target[0] + '. ' + source.substring(0, 3) 47 | } 48 | } else { 49 | return merge 50 | } 51 | } 52 | 53 | function mergeable(target) { 54 | return isMergeableObject(target) || (typeof target === 'string' && target.length > 1) 55 | } 56 | 57 | t.equal('A. Ham', merge(target, source, { customMerge: customMerge, isMergeableObject: mergeable }).name) 58 | t.end() 59 | }) 60 | 61 | test('merging objects with null prototype', function(t) { 62 | var target = Object.create(null) 63 | var source = Object.create(null) 64 | target.wheels = 4 65 | target.trunk = { toolbox: ['hammer'] } 66 | source.trunk = { toolbox: ['wrench'] } 67 | source.engine = 'v8' 68 | var expected = { 69 | wheels: 4, 70 | engine: 'v8', 71 | trunk: { 72 | toolbox: ['hammer', 'wrench' ] 73 | } 74 | } 75 | 76 | t.deepEqual(expected, merge(target, source)) 77 | t.end() 78 | }) 79 | -------------------------------------------------------------------------------- /test/typescript.ts: -------------------------------------------------------------------------------- 1 | import * as merge from '../'; 2 | 3 | const x = { 4 | foo: 'abc', 5 | bar: 'def', 6 | wat: 42, 7 | } 8 | 9 | const y = { 10 | foo: 'cba', 11 | bar: 'fed', 12 | wat: 42, 13 | } 14 | 15 | const z = { 16 | baz: '123', 17 | quux: '456', 18 | wat: 42, 19 | } 20 | 21 | let merged1 = merge(x, y); 22 | let merged2 = merge(x, z); 23 | let merged3 = merge.all<{wat: number}>([ x, y, z ]); 24 | 25 | merged1.foo; 26 | merged1.bar; 27 | merged2.foo; 28 | merged2.baz; 29 | merged3.wat; 30 | 31 | 32 | const options1: merge.Options = { 33 | clone: true, 34 | isMergeableObject (obj) { 35 | return false; 36 | }, 37 | }; 38 | 39 | const options2: merge.Options = { 40 | arrayMerge (target, source, options) { 41 | target.length; 42 | source.length; 43 | options.isMergeableObject(target); 44 | 45 | return []; 46 | }, 47 | clone: true, 48 | isMergeableObject (obj) { 49 | return false; 50 | }, 51 | }; 52 | 53 | const options3: merge.Options = { 54 | customMerge: (key) => { 55 | if (key === 'foo') { 56 | return (target, source) => target + source; 57 | } 58 | } 59 | } 60 | 61 | merged1 = merge(x, y, options1); 62 | merged2 = merge(x, z, options2); 63 | merged3 = merge.all<{wat: number}>([x, y, z], options1); 64 | 65 | const merged4 = merge(x, y, options3); 66 | --------------------------------------------------------------------------------