diff --git a/.appveyor.yml b/.appveyor.yml index de1c9fd24d..dc4d85bc51 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -9,7 +9,7 @@ test: off shallow_clone: true platform: x64 environment: - NODEJS_VERSION: "10" + NODEJS_VERSION: '10' CSC_LINK: '%WINDOWS_CSC_LINK%' CSC_KEY_PASSWORD: '%WINDOWS_CSC_KEY_PASSWORD%' diff --git a/.editorconfig b/.editorconfig index 9f4c927e1e..5cf5ac2d95 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,7 @@ -[*.{js,json,html,md}] +[*.{js,json,html,md,graphql,gql}] charset = utf-8 indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true -end_of_line = lf \ No newline at end of file +end_of_line = lf diff --git a/.gitignore b/.gitignore index 6fad6eca6c..534298f81c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,8 @@ node_modules/ .idea .DS_Store *test-plugins -.vscode \ No newline at end of file +.vscode +graphql.config.json +.cache +.graphqlconfig +schema.graphql diff --git a/.nvmrc b/.nvmrc index f599e28b8a..ec3053c8dc 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -10 +10.15 diff --git a/README.md b/README.md index 7dab54da6f..d286f09bb2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Insomnia REST Client +# Insomnia REST Client [![Insomnia](https://img.shields.io/badge/maintainer-Insomnia-purple.svg?colorB=6e60cc)](https://insomnia.rest) [![Travis](https://api.travis-ci.org/getinsomnia/insomnia.svg)](https://travis-ci.org/getinsomnia/insomnia) @@ -12,26 +12,26 @@ Insomnia is a cross-platform _REST client_, built on top of [Electron](http://el ## Download -Insomnia is available for Mac, Windows, and Linux and can be downloaded +Insomnia is available for Mac, Windows, and Linux and can be downloaded from the website. **[https://insomnia.rest/download](https://insomnia.rest/download/)** ## Bugs and Feature Requests -Have a bug or a feature request? First, read the -[issue guidelines](CONTRIBUTING.md#using-the-issue-tracker) and search for existing and +Have a bug or a feature request? First, read the +[issue guidelines](CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](/issues). -For more generic product questions and feedback, join the [Slack Team](https://chat.insomnia.rest) or email +For more generic product questions and feedback, join the [Slack Team](https://chat.insomnia.rest) or email [support@insomnia.rest](mailto:support@insomnia.rest) ## Contributing -Please read through our [contributing guidelines](CONTRIBUTING.md) and [code of conduct](CODE_OF_CONDUCT.md). Included are directions +Please read through our [contributing guidelines](CONTRIBUTING.md) and [code of conduct](CODE_OF_CONDUCT.md). Included are directions for opening issues, coding standards, and notes on development. -Editor preferences are available in the [editor config](.editorconfig) for easy use in +Editor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at [editorconfig.org](http://editorconfig.org). ## Developing @@ -94,6 +94,7 @@ Here is a list of plugins available for installation via NPM. - [XDebug](https://www.npmjs.com/package/insomnia-plugin-xdebug) – Enable Xdebug debugging by adding an `XDEBUG_SESSION` cookie to the request ## Community Projects + - [GitHub API Spec Importer](https://github.com/swinton/github-rest-apis-for-insomnia) – A complete set of GitHub REST API route specifications that can be imported straight into Insomnia - [Swaggymnia](https://github.com/mlabouardy/swaggymnia) – Generate [Swagger](https://swagger.io/) documentation for your existing API in Insomnia. diff --git a/lerna.json b/lerna.json index d8c4762ac8..26f3b60f28 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "lerna": "3.4.3", + "lerna": "3.13.1", "version": "independent", "packages": ["plugins/*", "packages/*"] } diff --git a/package-lock.json b/package-lock.json index 23426ce3d2..91d5799f08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,710 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/cli": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.4.3.tgz", + "integrity": "sha512-cbC5H9iTDV9H7sMxK5rUm18UbdVPNTPqgdzmQAkOUP3YLysgDWLZaysVAfylK49rgTlzL01a6tXyq9rCb3yLhQ==", + "dev": true, + "requires": { + "chokidar": "^2.0.4", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "output-file-sync": "^2.0.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -13,6 +717,1539 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", + "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helpers": "^7.4.3", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", + "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44", + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz", + "integrity": "sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz", + "integrity": "sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-define-map": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz", + "integrity": "sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", + "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.44", + "@babel/template": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", + "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz", + "integrity": "sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz", + "integrity": "sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.11" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.3.tgz", + "integrity": "sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz", + "integrity": "sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", + "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.44" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.3.tgz", + "integrity": "sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q==", + "dev": true, + "requires": { + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", @@ -32,65 +2269,2360 @@ } } }, - "@lerna/add": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.4.1.tgz", - "integrity": "sha512-Vf54B42jlD6G52qnv/cAGH70cVQIa+LX//lfsbkxHvzkhIqBl5J4KsnTOPkA9uq3R+zP58ayicCHB9ReiEWGJg==", + "@babel/parser": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", + "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", "dev": true, "requires": { - "@lerna/bootstrap": "^3.4.1", - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/npm-conf": "^3.4.1", - "@lerna/validation-error": "^3.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz", + "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz", + "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz", + "integrity": "sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", + "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz", + "integrity": "sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz", + "integrity": "sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz", + "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz", + "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz", + "integrity": "sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.3", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz", + "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz", + "integrity": "sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz", + "integrity": "sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz", + "integrity": "sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.3", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz", + "integrity": "sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.4.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz", + "integrity": "sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz", + "integrity": "sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz", + "integrity": "sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.4.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", + "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz", + "integrity": "sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.4" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz", + "integrity": "sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.3", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/preset-env": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", + "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.4.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.0", + "@babel/plugin-transform-classes": "^7.4.3", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.3", + "@babel/plugin-transform-dotall-regex": "^7.4.3", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.3", + "@babel/plugin-transform-function-name": "^7.4.3", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.3", + "@babel/plugin-transform-modules-systemjs": "^7.4.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2", + "@babel/plugin-transform-new-target": "^7.4.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.3", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.3", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.3", + "@babel/types": "^7.4.0", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "browserslist": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", + "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000955", + "electron-to-chromium": "^1.3.122", + "node-releases": "^1.1.13" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@babel/preset-flow": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.0.0.tgz", + "integrity": "sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", + "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "lodash": "^4.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", + "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/generator": "7.0.0-beta.44", + "@babel/helper-function-name": "7.0.0-beta.44", + "@babel/helper-split-export-declaration": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", + "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@jest/core": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.7.1.tgz", + "integrity": "sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.7.0", + "jest-config": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-message-util": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.7.1", + "jest-runner": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "jest-watcher": "^24.7.1", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@jest/environment": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.7.1.tgz", + "integrity": "sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0" + } + }, + "@jest/fake-timers": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.7.1.tgz", + "integrity": "sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-mock": "^24.7.0" + } + }, + "@jest/reporters": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.7.1.tgz", + "integrity": "sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw==", + "dev": true, + "requires": { + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-api": "^2.1.1", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-source-maps": "^3.0.1", + "jest-haste-map": "^24.7.1", + "jest-resolve": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.7.1.tgz", + "integrity": "sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz", + "integrity": "sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA==", + "dev": true, + "requires": { + "@jest/test-result": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-runner": "^24.7.1", + "jest-runtime": "^24.7.1" + } + }, + "@jest/transform": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.7.1.tgz", + "integrity": "sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.7.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.7.1", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "babel-plugin-istanbul": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz", + "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.0.0", + "test-exclude": "^5.0.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "@jest/types": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz", + "integrity": "sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/yargs": "^12.0.9" + } + }, + "@lerna/add": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.13.1.tgz", + "integrity": "sha512-cXk42YbuhzEnADCK8Qte5laC9Qo03eJLVnr0qKY85jQUM/T4URe3IIUemqpg0CpVATrB+Vz+iNdeqw9ng1iALw==", + "dev": true, + "requires": { + "@lerna/bootstrap": "3.13.1", + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/npm-conf": "3.13.0", + "@lerna/validation-error": "3.13.0", "dedent": "^0.7.0", - "npm-package-arg": "^6.0.0", + "npm-package-arg": "^6.1.0", "p-map": "^1.2.0", - "pacote": "^9.1.0", + "pacote": "^9.5.0", "semver": "^5.5.0" }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/batch-packages": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@lerna/batch-packages/-/batch-packages-3.1.2.tgz", - "integrity": "sha512-HAkpptrYeUVlBYbLScXgeCgk6BsNVXxDd53HVWgzzTWpXV4MHpbpeKrByyt7viXlNhW0w73jJbipb/QlFsHIhQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/batch-packages/-/batch-packages-3.13.0.tgz", + "integrity": "sha512-TgLBTZ7ZlqilGnzJ3xh1KdAHcySfHytgNRTdG9YomfriTU6kVfp1HrXxKJYVGs7ClPUNt2CTFEOkw0tMBronjw==", "dev": true, "requires": { - "@lerna/package-graph": "^3.1.2", - "@lerna/validation-error": "^3.0.0", + "@lerna/package-graph": "3.13.0", + "@lerna/validation-error": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yZDJgNm/KDoRH2klzmQGmpWMg/XMzWgeWvauXkrfW/mj1wwmufOuh5pN4fBFxVmUUa/RFZdfMeaaJt3+W3PPBw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.13.1.tgz", + "integrity": "sha512-mKdi5Ds5f82PZwEFyB9/W60I3iELobi1i87sTeVrbJh/um7GvqpSPy7kG/JPxyOdMpB2njX6LiJgw+7b6BEPWw==", "dev": true, "requires": { - "@lerna/batch-packages": "^3.1.2", - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/has-npm-version": "^3.3.0", - "@lerna/npm-conf": "^3.4.1", - "@lerna/npm-install": "^3.3.0", - "@lerna/rimraf-dir": "^3.3.0", - "@lerna/run-lifecycle": "^3.4.1", - "@lerna/run-parallel-batches": "^3.0.0", - "@lerna/symlink-binary": "^3.3.0", - "@lerna/symlink-dependencies": "^3.3.0", - "@lerna/validation-error": "^3.0.0", + "@lerna/batch-packages": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/has-npm-version": "3.13.0", + "@lerna/npm-install": "3.13.0", + "@lerna/package-graph": "3.13.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.13.0", + "@lerna/run-lifecycle": "3.13.0", + "@lerna/run-parallel-batches": "3.13.0", + "@lerna/symlink-binary": "3.13.0", + "@lerna/symlink-dependencies": "3.13.0", + "@lerna/validation-error": "3.13.0", "dedent": "^0.7.0", "get-port": "^3.2.0", "multimatch": "^2.1.0", - "npm-package-arg": "^6.0.0", + "npm-package-arg": "^6.1.0", "npmlog": "^4.1.2", "p-finally": "^1.0.0", "p-map": "^1.2.0", @@ -101,40 +4633,40 @@ }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/changed": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.4.1.tgz", - "integrity": "sha512-gT7fhl4zQWyGETDO4Yy5wsFnqNlBSsezncS1nkMW1uO6jwnolwYqcr1KbrMR8HdmsZBn/00Y0mRnbtbpPPey8w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.13.1.tgz", + "integrity": "sha512-BRXitEJGOkoudbxEewW7WhjkLxFD+tTk4PrYpHLyCBk63pNTWtQLRE6dc1hqwh4emwyGncoyW6RgXfLgMZgryw==", "dev": true, "requires": { - "@lerna/collect-updates": "^3.3.2", - "@lerna/command": "^3.3.0", - "@lerna/listable": "^3.0.0", - "@lerna/output": "^3.0.0", - "@lerna/version": "^3.4.1" + "@lerna/collect-updates": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/listable": "3.13.0", + "@lerna/output": "3.13.0", + "@lerna/version": "3.13.1" } }, "@lerna/check-working-tree": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.3.0.tgz", - "integrity": "sha512-oeEP1dNhiiKUaO0pmcIi73YXJpaD0n5JczNctvVNZ8fGZmrALZtEnmC28o6Z7JgQaqq5nd2kO7xbnjoitrC51g==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.13.0.tgz", + "integrity": "sha512-dsdO15NXX5To+Q53SYeCrBEpiqv4m5VkaPZxbGQZNwoRen1MloXuqxSymJANQn+ZLEqarv5V56gydebeROPH5A==", "dev": true, "requires": { - "@lerna/describe-ref": "^3.3.0", - "@lerna/validation-error": "^3.0.0" + "@lerna/describe-ref": "3.13.0", + "@lerna/validation-error": "3.13.0" } }, "@lerna/child-process": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.3.0.tgz", - "integrity": "sha512-q2d/OPlNX/cBXB6Iz1932RFzOmOHq6ZzPjqebkINNaTojHWuuRpvJJY4Uz3NGpJ3kEtPDvBemkZqUBTSO5wb1g==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.13.0.tgz", + "integrity": "sha512-0iDS8y2jiEucD4fJHEzKoc8aQJgm7s+hG+0RmDNtfT0MM3n17pZnf5JOMtS1FJp+SEXOjMKQndyyaDIPFsnp6A==", "dev": true, "requires": { "chalk": "^2.3.1", @@ -152,9 +4684,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -205,20 +4737,10 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "supports-color": { @@ -233,27 +4755,28 @@ } }, "@lerna/clean": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.3.2.tgz", - "integrity": "sha512-mvqusgSp2ou5SGqQgTEoTvGJpGfH4+L6XSeN+Ims+eNFGXuMazmKCf+rz2PZBMFufaHJ/Os+JF0vPCcWI1Fzqg==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.13.1.tgz", + "integrity": "sha512-myGIaXv7RUO2qCFZXvx8SJeI+eN6y9SUD5zZ4/LvNogbOiEIlujC5lUAqK65rAHayQ9ltSa/yK6Xv510xhZXZQ==", "dev": true, "requires": { - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/prompt": "^3.3.1", - "@lerna/rimraf-dir": "^3.3.0", + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/prompt": "3.13.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.13.0", "p-map": "^1.2.0", "p-map-series": "^1.0.0", "p-waterfall": "^1.0.0" } }, "@lerna/cli": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.2.0.tgz", - "integrity": "sha512-JdbLyTxHqxUlrkI+Ke+ltXbtyA+MPu9zR6kg/n8Fl6uaez/2fZWtReXzYi8MgLxfUFa7+1OHWJv4eAMZlByJ+Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.13.0.tgz", + "integrity": "sha512-HgFGlyCZbYaYrjOr3w/EsY18PdvtsTmDfpUQe8HwDjXlPeCCUgliZjXLOVBxSjiOvPeOSwvopwIHKWQmYbwywg==", "dev": true, "requires": { - "@lerna/global-options": "^3.1.3", + "@lerna/global-options": "3.13.0", "dedent": "^0.7.0", "npmlog": "^4.1.2", "yargs": "^12.0.1" @@ -283,23 +4806,14 @@ "which": "^1.2.9" } }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -316,6 +4830,15 @@ "locate-path": "^3.0.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -342,31 +4865,37 @@ } }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -382,19 +4911,19 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^2.0.0", + "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", @@ -404,35 +4933,35 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" + "yargs-parser": "^11.1.1" } } } }, "@lerna/collect-updates": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.3.2.tgz", - "integrity": "sha512-9WyBJI2S5sYgEZEScu525Lbi6nknNrdBKop35sCDIC9y6AIGvH6Dr5tkTd+Kg3n1dE+kHwW/xjERkx3+h7th3w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.13.0.tgz", + "integrity": "sha512-uR3u6uTzrS1p46tHQ/mlHog/nRJGBqskTHYYJbgirujxm6FqNh7Do+I1Q/7zSee407G4lzsNxZdm8IL927HemQ==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/describe-ref": "^3.3.0", + "@lerna/child-process": "3.13.0", + "@lerna/describe-ref": "3.13.0", "minimatch": "^3.0.4", "npmlog": "^4.1.2", "slash": "^1.0.0" } }, "@lerna/command": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.3.0.tgz", - "integrity": "sha512-NTOkLEKlWcBLHSvUr9tzVpV7RJ4GROLeOuZ6RfztGOW/31JPSwVVBD2kPifEXNZunldOx5GVWukR+7+NpAWhsg==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.13.1.tgz", + "integrity": "sha512-SYWezxX+iheWvzRoHCrbs8v5zHPaxAx3kWvZhqi70vuGsdOVAWmaG4IvHLn11ztS+Vpd5PM+ztBWSbnykpLFKQ==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/package-graph": "^3.1.2", - "@lerna/project": "^3.0.0", - "@lerna/validation-error": "^3.0.0", - "@lerna/write-log-file": "^3.0.0", + "@lerna/child-process": "3.13.0", + "@lerna/package-graph": "3.13.0", + "@lerna/project": "3.13.1", + "@lerna/validation-error": "3.13.0", + "@lerna/write-log-file": "3.13.0", "dedent": "^0.7.0", "execa": "^1.0.0", "is-ci": "^1.0.10", @@ -477,38 +5006,29 @@ "pump": "^3.0.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/conventional-commits": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.4.1.tgz", - "integrity": "sha512-3NETrA58aUkaEW3RdwdJ766Bg9NVpLzb26mtdlsJQcvB5sQBWH5dJSHIVQH1QsGloBeH2pE/mDUEVY8ZJXuR4w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.13.0.tgz", + "integrity": "sha512-BeAgcNXuocmLhPxnmKU2Vy8YkPd/Uo+vu2i/p3JGsUldzrPC8iF3IDxH7fuXpEFN2Nfogu7KHachd4tchtOppA==", "dev": true, "requires": { - "@lerna/validation-error": "^3.0.0", - "conventional-changelog-angular": "^5.0.1", - "conventional-changelog-core": "^3.1.0", - "conventional-recommended-bump": "^4.0.1", + "@lerna/validation-error": "3.13.0", + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-core": "^3.1.6", + "conventional-recommended-bump": "^4.0.4", "fs-extra": "^7.0.0", "get-stream": "^4.0.0", - "npm-package-arg": "^6.0.0", + "npm-package-arg": "^6.1.0", "npmlog": "^4.1.2", + "pify": "^3.0.0", "semver": "^5.5.0" }, "dependencies": { @@ -521,40 +5041,32 @@ "pump": "^3.0.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/create": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.4.1.tgz", - "integrity": "sha512-l+4t2SRO5nvW0MNYY+EWxbaMHsAN8bkWH3nyt7EzhBjs4+TlRAJRIEqd8o9NWznheE3pzwczFz1Qfl3BWbyM5A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.13.1.tgz", + "integrity": "sha512-pLENMXgTkQuvKxAopjKeoLOv9fVUCnpTUD7aLrY5d95/1xqSZlnsOcQfUYcpMf3GpOvHc8ILmI5OXkPqjAf54g==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/command": "^3.3.0", - "@lerna/npm-conf": "^3.4.1", - "@lerna/validation-error": "^3.0.0", - "camelcase": "^4.1.0", + "@lerna/child-process": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/npm-conf": "3.13.0", + "@lerna/validation-error": "3.13.0", + "camelcase": "^5.0.0", "dedent": "^0.7.0", "fs-extra": "^7.0.0", "globby": "^8.0.1", "init-package-json": "^1.10.3", - "npm-package-arg": "^6.0.0", + "npm-package-arg": "^6.1.0", + "p-reduce": "^1.0.0", + "pacote": "^9.5.0", "pify": "^3.0.0", "semver": "^5.5.0", "slash": "^1.0.0", @@ -564,21 +5076,21 @@ }, "dependencies": { "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -596,9 +5108,9 @@ } }, "spdx-license-ids": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", - "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "validate-npm-package-license": { @@ -625,9 +5137,9 @@ } }, "@lerna/create-symlink": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.3.0.tgz", - "integrity": "sha512-0lb88Nnq1c/GG+fwybuReOnw3+ah4dB81PuWwWwuqUNPE0n50qUf/M/7FfSb5JEh/93fcdbZI0La8t3iysNW1w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.13.0.tgz", + "integrity": "sha512-PTvg3jAAJSAtLFoZDsuTMv1wTOC3XYIdtg54k7uxIHsP8Ztpt+vlilY/Cni0THAqEMHvfiToel76Xdta4TU21Q==", "dev": true, "requires": { "cmd-shim": "^2.0.2", @@ -636,155 +5148,210 @@ } }, "@lerna/describe-ref": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.3.0.tgz", - "integrity": "sha512-4t7M4OupnYMSPNLrLUau8qkS+dgLEi4w+DkRkV0+A+KNYga1W0jVgNLPIIsxta7OHfodPkCNAqZCzNCw/dmAwA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.13.0.tgz", + "integrity": "sha512-UJefF5mLxLae9I2Sbz5RLYGbqbikRuMqdgTam0MS5OhXnyuuKYBUpwBshCURNb1dPBXTQhSwc7+oUhORx8ojCg==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", + "@lerna/child-process": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-sIoMjsm3NVxvmt6ofx8Uu/2fxgldQqLl0zmC9X1xW00j831o5hBffx1EoKj9CnmaEvoSP6j/KFjxy2RWjebCIg==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.13.1.tgz", + "integrity": "sha512-cKqmpONO57mdvxtp8e+l5+tjtmF04+7E+O0QEcLcNUAjC6UR2OSM77nwRCXDukou/1h72JtWs0jjcdYLwAmApg==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/command": "^3.3.0", - "@lerna/validation-error": "^3.0.0", + "@lerna/child-process": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/validation-error": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/exec": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.3.2.tgz", - "integrity": "sha512-mN6vGxNir7JOGvWLwKr3DW3LNy1ecCo2ziZj5rO9Mw5Rew3carUu1XLmhF/4judtsvXViUY+rvGIcqHe0vvb+w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.13.1.tgz", + "integrity": "sha512-I34wEP9lrAqqM7tTXLDxv/6454WFzrnXDWpNDbiKQiZs6SIrOOjmm6I4FiQsx+rU3o9d+HkC6tcUJRN5mlJUgA==", "dev": true, "requires": { - "@lerna/batch-packages": "^3.1.2", - "@lerna/child-process": "^3.3.0", - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/run-parallel-batches": "^3.0.0", - "@lerna/validation-error": "^3.0.0" + "@lerna/batch-packages": "3.13.0", + "@lerna/child-process": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/run-parallel-batches": "3.13.0", + "@lerna/validation-error": "3.13.0" } }, "@lerna/filter-options": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.3.2.tgz", - "integrity": "sha512-0WHqdDgAnt5WKoByi1q+lFw8HWt5tEKP2DnLlGqWv3YFwVF5DsPRlO7xbzjY9sJgvyJtZcnkMtccdBPFhGGyIQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.13.0.tgz", + "integrity": "sha512-SRp7DCo9zrf+7NkQxZMkeyO1GRN6GICoB9UcBAbXhLbWisT37Cx5/6+jh49gYB63d/0/WYHSEPMlheUrpv1Srw==", "dev": true, "requires": { - "@lerna/collect-updates": "^3.3.2", - "@lerna/filter-packages": "^3.0.0", + "@lerna/collect-updates": "3.13.0", + "@lerna/filter-packages": "3.13.0", "dedent": "^0.7.0" } }, "@lerna/filter-packages": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.0.0.tgz", - "integrity": "sha512-zwbY1J4uRjWRZ/FgYbtVkq7I3Nduwsg2V2HwLKSzwV2vPglfGqgovYOVkND6/xqe2BHwDX4IyA2+e7OJmLaLSA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.13.0.tgz", + "integrity": "sha512-RWiZWyGy3Mp7GRVBn//CacSnE3Kw82PxE4+H6bQ3pDUw/9atXn7NRX+gkBVQIYeKamh7HyumJtyOKq3Pp9BADQ==", "dev": true, "requires": { - "@lerna/validation-error": "^3.0.0", + "@lerna/validation-error": "3.13.0", "multimatch": "^2.1.0", "npmlog": "^4.1.2" } }, "@lerna/get-npm-exec-opts": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0.tgz", - "integrity": "sha512-arcYUm+4xS8J3Palhl+5rRJXnZnFHsLFKHBxznkPIxjwGQeAEw7df38uHdVjEQ+HNeFmHnBgSqfbxl1VIw5DHg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", + "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", "dev": true, "requires": { "npmlog": "^4.1.2" } }, + "@lerna/get-packed": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.13.0.tgz", + "integrity": "sha512-EgSim24sjIjqQDC57bgXD9l22/HCS93uQBbGpkzEOzxAVzEgpZVm7Fm1t8BVlRcT2P2zwGnRadIvxTbpQuDPTg==", + "dev": true, + "requires": { + "fs-extra": "^7.0.0", + "ssri": "^6.0.1", + "tar": "^4.4.8" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "@lerna/github-client": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.13.1.tgz", + "integrity": "sha512-iPLUp8FFoAKGURksYEYZzfuo9TRA+NepVlseRXFaWlmy36dCQN20AciINpoXiXGoHcEUHXUKHQvY3ARFdMlf3w==", + "dev": true, + "requires": { + "@lerna/child-process": "3.13.0", + "@octokit/plugin-enterprise-rest": "^2.1.1", + "@octokit/rest": "^16.16.0", + "git-url-parse": "^11.1.2", + "npmlog": "^4.1.2" + } + }, "@lerna/global-options": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.1.3.tgz", - "integrity": "sha512-LVeZU/Zgc0XkHdGMRYn+EmHfDmmYNwYRv3ta59iCVFXLVp7FRFWF7oB1ss/WRa9x/pYU0o6L8as/5DomLUGASA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", + "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", "dev": true }, "@lerna/has-npm-version": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.3.0.tgz", - "integrity": "sha512-GX7omRep1eBRZHgjZLRw3MpBJSdA5gPZFz95P7rxhpvsiG384Tdrr/cKFMhm0A09yq27Tk/nuYTaZIj7HsVE6g==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.13.0.tgz", + "integrity": "sha512-Oqu7DGLnrMENPm+bPFGOHnqxK8lCnuYr6bk3g/CoNn8/U0qgFvHcq6Iv8/Z04TsvleX+3/RgauSD2kMfRmbypg==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", + "@lerna/child-process": "3.13.0", "semver": "^5.5.0" }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/import": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.3.1.tgz", - "integrity": "sha512-2OzTQDkYKbBPpyP2iOI1sWfcvMjNLjjHjmREq/uOWJaSIk5J3Ukt71OPpcOHh4V2CBOlXidCcO+Hyb4FVIy8fw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.13.1.tgz", + "integrity": "sha512-A1Vk1siYx1XkRl6w+zkaA0iptV5TIynVlHPR9S7NY0XAfhykjztYVvwtxarlh6+VcNrO9We6if0+FXCrfDEoIg==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/command": "^3.3.0", - "@lerna/prompt": "^3.3.1", - "@lerna/validation-error": "^3.0.0", + "@lerna/child-process": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/prompt": "3.13.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/validation-error": "3.13.0", "dedent": "^0.7.0", "fs-extra": "^7.0.0", "p-map-series": "^1.0.0" } }, "@lerna/init": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.3.0.tgz", - "integrity": "sha512-HvgRLkIG6nDIeAO6ix5sUVIVV+W9UMk2rSSmFT66CDOefRi7S028amiyYnFUK1QkIAaUbVUyOnYaErtbJwICuw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.13.1.tgz", + "integrity": "sha512-M59WACqim8WkH5FQEGOCEZ89NDxCKBfFTx4ZD5ig3LkGyJ8RdcJq5KEfpW/aESuRE9JrZLzVr0IjKbZSxzwEMA==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/command": "^3.3.0", + "@lerna/child-process": "3.13.0", + "@lerna/command": "3.13.1", "fs-extra": "^7.0.0", "p-map": "^1.2.0", "write-json-file": "^2.3.0" } }, "@lerna/link": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.3.0.tgz", - "integrity": "sha512-8CeXzGL7okrsVXsy2sHXI2KuBaczw3cblAnA2+FJPUqSKMPNbUTRzeU3bOlCjYtK0LbxC4ngENJTL3jJ8RaYQQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.13.1.tgz", + "integrity": "sha512-N3h3Fj1dcea+1RaAoAdy4g2m3fvU7m89HoUn5X/Zcw5n2kPoK8kTO+NfhNAatfRV8VtMXst8vbNrWQQtfm0FFw==", "dev": true, "requires": { - "@lerna/command": "^3.3.0", - "@lerna/package-graph": "^3.1.2", - "@lerna/symlink-dependencies": "^3.3.0", + "@lerna/command": "3.13.1", + "@lerna/package-graph": "3.13.0", + "@lerna/symlink-dependencies": "3.13.0", "p-map": "^1.2.0", "slash": "^1.0.0" } }, "@lerna/list": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.3.2.tgz", - "integrity": "sha512-XXEVy7w+i/xx8NeJmGirw4upEoEF9OfD6XPLjISNQc24VgQV+frXdVJ02QcP7Y/PkY1rdIVrOjvo3ipKVLUxaQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.13.1.tgz", + "integrity": "sha512-635iRbdgd9gNvYLLIbYdQCQLr+HioM5FGJLFS0g3DPGygr6iDR8KS47hzCRGH91LU9NcM1mD1RoT/AChF+QbiA==", "dev": true, "requires": { - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/listable": "^3.0.0", - "@lerna/output": "^3.0.0" + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/listable": "3.13.0", + "@lerna/output": "3.13.0" } }, "@lerna/listable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.0.0.tgz", - "integrity": "sha512-HX/9hyx1HLg2kpiKXIUc1EimlkK1T58aKQ7ovO7rQdTx9ForpefoMzyLnHE1n4XrUtEszcSWJIICJ/F898M6Ag==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.13.0.tgz", + "integrity": "sha512-liYJ/WBUYP4N4MnSVZuLUgfa/jy3BZ02/1Om7xUY09xGVSuNVNEeB8uZUMSC+nHqFHIsMPZ8QK9HnmZb1E/eTA==", "dev": true, "requires": { + "@lerna/batch-packages": "3.13.0", "chalk": "^2.3.1", "columnify": "^1.5.4" }, @@ -799,9 +5366,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -827,9 +5394,9 @@ } }, "@lerna/log-packed": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.0.4.tgz", - "integrity": "sha512-vVQHgMagE2wnbxhNY9nFkdu+Cx2TsyWalkJfkxbNzmo6gOCrDsxCBDj9vTEV8Q+4aWx0C0Bsc0sB2Eb8y/+ofA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.13.0.tgz", + "integrity": "sha512-Rmjrcz+6aM6AEcEVWmurbo8+AnHOvYtDpoeMMJh9IZ9SmZr2ClXzmD7wSvjTQc8BwOaiWjjC/ukcT0UYA2m7wg==", "dev": true, "requires": { "byte-size": "^4.0.3", @@ -839,9 +5406,9 @@ } }, "@lerna/npm-conf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.4.1.tgz", - "integrity": "sha512-i9G6DnbCqiAqxKx2rSXej/n14qxlV/XOebL6QZonxJKzNTB+Q2wglnhTXmfZXTPJfoqimLaY4NfAEtbOXRWOXQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.13.0.tgz", + "integrity": "sha512-Jg2kANsGnhg+fbPEzE0X9nX5oviEAvWj0nYyOkcE+cgWuT7W0zpnPXC4hA4C5IPQGhwhhh0IxhWNNHtjTuw53g==", "dev": true, "requires": { "config-chain": "^1.1.11", @@ -849,104 +5416,181 @@ } }, "@lerna/npm-dist-tag": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.3.0.tgz", - "integrity": "sha512-EtZJXzh3w5tqXEev+EBBPrWKWWn0WgJfxm4FihfS9VgyaAW8udIVZHGkIQ3f+tBtupcAzA9Q8cQNUkGF2efwmA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.13.0.tgz", + "integrity": "sha512-mcuhw34JhSRFrbPn0vedbvgBTvveG52bR2lVE3M3tfE8gmR/cKS/EJFO4AUhfRKGCTFn9rjaSEzlFGYV87pemQ==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/get-npm-exec-opts": "^3.0.0", + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.9.0", "npmlog": "^4.1.2" } }, "@lerna/npm-install": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.3.0.tgz", - "integrity": "sha512-WoVvKdS8ltROTGSNQwo6NDq0YKnjwhvTG4li1okcN/eHKOS3tL9bxbgPx7No0wOq5DKBpdeS9KhAfee6LFAZ5g==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.13.0.tgz", + "integrity": "sha512-qNyfts//isYQxore6fsPorNYJmPVKZ6tOThSH97tP0aV91zGMtrYRqlAoUnDwDdAjHPYEM16hNujg2wRmsqqIw==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/get-npm-exec-opts": "^3.0.0", + "@lerna/child-process": "3.13.0", + "@lerna/get-npm-exec-opts": "3.13.0", "fs-extra": "^7.0.0", - "npm-package-arg": "^6.0.0", + "npm-package-arg": "^6.1.0", "npmlog": "^4.1.2", "signal-exit": "^3.0.2", "write-pkg": "^3.1.0" } }, "@lerna/npm-publish": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.3.1.tgz", - "integrity": "sha512-bVTlWIcBL6Zpyzqvr9C7rxXYcoPw+l7IPz5eqQDNREj1R39Wj18OWB2KTJq8l7LIX7Wf4C2A1uT5hJaEf9BuvA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.13.0.tgz", + "integrity": "sha512-y4WO0XTaf9gNRkI7as6P2ItVDOxmYHwYto357fjybcnfXgMqEA94c3GJ++jU41j0A9vnmYC6/XxpTd9sVmH9tA==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/get-npm-exec-opts": "^3.0.0", - "@lerna/has-npm-version": "^3.3.0", - "@lerna/log-packed": "^3.0.4", + "@lerna/run-lifecycle": "3.13.0", + "figgy-pudding": "^3.5.1", "fs-extra": "^7.0.0", + "libnpmpublish": "^1.1.1", "npmlog": "^4.1.2", - "p-map": "^1.2.0" + "pify": "^3.0.0", + "read-package-json": "^2.0.13" } }, "@lerna/npm-run-script": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.3.0.tgz", - "integrity": "sha512-YqDguWZzp4jIomaE4aWMUP7MIAJAFvRAf6ziQLpqwoQskfWLqK5mW0CcszT1oLjhfb3cY3MMfSTFaqwbdKmICg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.13.0.tgz", + "integrity": "sha512-hiL3/VeVp+NFatBjkGN8mUdX24EfZx9rQlSie0CMgtjc7iZrtd0jCguLomSCRHYjJuvqgbp+LLYo7nHVykfkaQ==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", - "@lerna/get-npm-exec-opts": "^3.0.0", + "@lerna/child-process": "3.13.0", + "@lerna/get-npm-exec-opts": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/output": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.0.0.tgz", - "integrity": "sha512-EFxnSbO0zDEVKkTKpoCUAFcZjc3gn3DwPlyTDxbeqPU7neCfxP4rA4+0a6pcOfTlRS5kLBRMx79F2TRCaMM3DA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", + "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", "dev": true, "requires": { "npmlog": "^4.1.2" } }, - "@lerna/package": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.0.0.tgz", - "integrity": "sha512-djzEJxzn212wS8d9znBnlXkeRlPL7GqeAYBykAmsuq51YGvaQK67Umh5ejdO0uxexF/4r7yRwgrlRHpQs8Rfqg==", + "@lerna/pack-directory": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.13.1.tgz", + "integrity": "sha512-kXnyqrkQbCIZOf1054N88+8h0ItC7tUN5v9ca/aWpx298gsURpxUx/1TIKqijL5TOnHMyIkj0YJmnH/PyBVLKA==", "dev": true, "requires": { - "npm-package-arg": "^6.0.0", + "@lerna/get-packed": "3.13.0", + "@lerna/package": "3.13.0", + "@lerna/run-lifecycle": "3.13.0", + "figgy-pudding": "^3.5.1", + "npm-packlist": "^1.4.1", + "npmlog": "^4.1.2", + "tar": "^4.4.8", + "temp-write": "^3.4.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "@lerna/package": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.13.0.tgz", + "integrity": "sha512-kSKO0RJQy093BufCQnkhf1jB4kZnBvL7kK5Ewolhk5gwejN+Jofjd8DGRVUDUJfQ0CkW1o6GbUeZvs8w8VIZDg==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "npm-package-arg": "^6.1.0", "write-pkg": "^3.1.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "@lerna/package-graph": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.1.2.tgz", - "integrity": "sha512-9wIWb49I1IJmyjPdEVZQ13IAi9biGfH/OZHOC04U2zXGA0GLiY+B3CAx6FQvqkZ8xEGfqzmXnv3LvZ0bQfc1aQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.13.0.tgz", + "integrity": "sha512-3mRF1zuqFE1HEFmMMAIggXy+f+9cvHhW/jzaPEVyrPNLKsyfJQtpTNzeI04nfRvbAh+Gd2aNksvaW/w3xGJnnw==", "dev": true, "requires": { - "@lerna/validation-error": "^3.0.0", - "npm-package-arg": "^6.0.0", + "@lerna/validation-error": "3.13.0", + "npm-package-arg": "^6.1.0", "semver": "^5.5.0" }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "@lerna/project": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.0.0.tgz", - "integrity": "sha512-XhDFVfqj79jG2Speggd15RpYaE8uiR25UKcQBDmumbmqvTS7xf2cvl2pq2UTvDafaJ0YwFF3xkxQZeZnFMwdkw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.13.1.tgz", + "integrity": "sha512-/GoCrpsCCTyb9sizk1+pMBrIYchtb+F1uCOn3cjn9yenyG/MfYEnlfrbV5k/UDud0Ei75YBLbmwCbigHkAKazQ==", "dev": true, "requires": { - "@lerna/package": "^3.0.0", - "@lerna/validation-error": "^3.0.0", - "cosmiconfig": "^5.0.2", + "@lerna/package": "3.13.0", + "@lerna/validation-error": "3.13.0", + "cosmiconfig": "^5.1.0", "dedent": "^0.7.0", "dot-prop": "^4.2.0", "glob-parent": "^3.1.0", @@ -958,6 +5602,18 @@ "write-json-file": "^2.3.0" }, "dependencies": { + "cosmiconfig": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.0", + "parse-json": "^4.0.0" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -983,6 +5639,16 @@ "is-extglob": "^2.1.0" } }, + "js-yaml": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -1020,9 +5686,9 @@ } }, "@lerna/prompt": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.3.1.tgz", - "integrity": "sha512-eJhofrUCUaItMIH6et8kI7YqHfhjWqGZoTsE+40NRCfAraOMWx+pDzfRfeoAl3qeRAH2HhNj1bkYn70FbUOxuQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.13.0.tgz", + "integrity": "sha512-P+lWSFokdyvYpkwC3it9cE0IF2U5yy2mOUbGvvE4iDb9K7TyXGE+7lwtx2thtPvBAfIb7O13POMkv7df03HJeA==", "dev": true, "requires": { "inquirer": "^6.2.0", @@ -1030,51 +5696,64 @@ } }, "@lerna/publish": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.4.3.tgz", - "integrity": "sha512-baeRL8xmOR25p86cAaS9mL0jdRzdv4dUo04PlK2Wes+YlL705F55cSXeC9npNie+9rGwFyLzCTQe18WdbZyLuw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.13.1.tgz", + "integrity": "sha512-KhCJ9UDx76HWCF03i5TD7z5lX+2yklHh5SyO8eDaLptgdLDQ0Z78lfGj3JhewHU2l46FztmqxL/ss0IkWHDL+g==", "dev": true, "requires": { - "@lerna/batch-packages": "^3.1.2", - "@lerna/check-working-tree": "^3.3.0", - "@lerna/child-process": "^3.3.0", - "@lerna/collect-updates": "^3.3.2", - "@lerna/command": "^3.3.0", - "@lerna/describe-ref": "^3.3.0", - "@lerna/get-npm-exec-opts": "^3.0.0", - "@lerna/npm-conf": "^3.4.1", - "@lerna/npm-dist-tag": "^3.3.0", - "@lerna/npm-publish": "^3.3.1", - "@lerna/output": "^3.0.0", - "@lerna/prompt": "^3.3.1", - "@lerna/run-lifecycle": "^3.4.1", - "@lerna/run-parallel-batches": "^3.0.0", - "@lerna/validation-error": "^3.0.0", - "@lerna/version": "^3.4.1", + "@lerna/batch-packages": "3.13.0", + "@lerna/check-working-tree": "3.13.0", + "@lerna/child-process": "3.13.0", + "@lerna/collect-updates": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/describe-ref": "3.13.0", + "@lerna/log-packed": "3.13.0", + "@lerna/npm-conf": "3.13.0", + "@lerna/npm-dist-tag": "3.13.0", + "@lerna/npm-publish": "3.13.0", + "@lerna/output": "3.13.0", + "@lerna/pack-directory": "3.13.1", + "@lerna/prompt": "3.13.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/run-lifecycle": "3.13.0", + "@lerna/run-parallel-batches": "3.13.0", + "@lerna/validation-error": "3.13.0", + "@lerna/version": "3.13.1", + "figgy-pudding": "^3.5.1", "fs-extra": "^7.0.0", - "libnpmaccess": "^3.0.0", - "npm-package-arg": "^6.0.0", - "npm-registry-fetch": "^3.8.0", + "libnpmaccess": "^3.0.1", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.9.0", "npmlog": "^4.1.2", "p-finally": "^1.0.0", "p-map": "^1.2.0", "p-pipe": "^1.2.0", "p-reduce": "^1.0.0", + "pacote": "^9.5.0", "semver": "^5.5.0" }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, + "@lerna/pulse-till-done": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", + "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, "@lerna/resolve-symlink": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.3.0.tgz", - "integrity": "sha512-KmoPDcFJ2aOK2inYHbrsiO9SodedUj0L1JDvDgirVNIjMUaQe2Q6Vi4Gh+VCJcyB27JtfHioV9R2NxU72Pk2hg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.13.0.tgz", + "integrity": "sha512-Lc0USSFxwDxUs5JvIisS8JegjA6SHSAWJCMvi2osZx6wVRkEDlWG2B1JAfXUzCMNfHoZX0/XX9iYZ+4JIpjAtg==", "dev": true, "requires": { "fs-extra": "^7.0.0", @@ -1083,48 +5762,50 @@ } }, "@lerna/rimraf-dir": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.3.0.tgz", - "integrity": "sha512-vSqOcZ4kZduiSprbt+y40qziyN3VKYh+ygiCdnbBbsaxpdKB6CfrSMUtrLhVFrqUfBHIZRzHIzgjTdtQex1KLw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.13.0.tgz", + "integrity": "sha512-kte+pMemulre8cmPqljxIYjCmdLByz8DgHBHXB49kz2EiPf8JJ+hJFt0PzEubEyJZ2YE2EVAx5Tv5+NfGNUQyQ==", "dev": true, "requires": { - "@lerna/child-process": "^3.3.0", + "@lerna/child-process": "3.13.0", "npmlog": "^4.1.2", "path-exists": "^3.0.0", "rimraf": "^2.6.2" } }, "@lerna/run": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.3.2.tgz", - "integrity": "sha512-cruwRGZZWnQ5I0M+AqcoT3Xpq2wj3135iVw4n59/Op6dZu50sMFXZNLiTTTZ15k8rTKjydcccJMdPSpTHbH7/A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.13.1.tgz", + "integrity": "sha512-nv1oj7bsqppWm1M4ifN+/IIbVu9F4RixrbQD2okqDGYne4RQPAXyb5cEZuAzY/wyGTWWiVaZ1zpj5ogPWvH0bw==", "dev": true, "requires": { - "@lerna/batch-packages": "^3.1.2", - "@lerna/command": "^3.3.0", - "@lerna/filter-options": "^3.3.2", - "@lerna/npm-run-script": "^3.3.0", - "@lerna/output": "^3.0.0", - "@lerna/run-parallel-batches": "^3.0.0", - "@lerna/validation-error": "^3.0.0", + "@lerna/batch-packages": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/filter-options": "3.13.0", + "@lerna/npm-run-script": "3.13.0", + "@lerna/output": "3.13.0", + "@lerna/run-parallel-batches": "3.13.0", + "@lerna/timer": "3.13.0", + "@lerna/validation-error": "3.13.0", "p-map": "^1.2.0" } }, "@lerna/run-lifecycle": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.4.1.tgz", - "integrity": "sha512-N/hi2srM9A4BWEkXccP7vCEbf4MmIuALF00DTBMvc0A/ccItwUpl3XNuM7+ADDRK0mkwE3hDw89lJ3A7f8oUQw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.13.0.tgz", + "integrity": "sha512-oyiaL1biZdjpmjh6X/5C4w07wNFyiwXSSHH5GQB4Ay4BPwgq9oNhCcxRoi0UVZlZ1YwzSW8sTwLgj8emkIo3Yg==", "dev": true, "requires": { - "@lerna/npm-conf": "^3.4.1", - "npm-lifecycle": "^2.0.0", + "@lerna/npm-conf": "3.13.0", + "figgy-pudding": "^3.5.1", + "npm-lifecycle": "^2.1.0", "npmlog": "^4.1.2" } }, "@lerna/run-parallel-batches": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz", - "integrity": "sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.13.0.tgz", + "integrity": "sha512-bICFBR+cYVF1FFW+Tlm0EhWDioTUTM6dOiVziDEGE1UZha1dFkMYqzqdSf4bQzfLS31UW/KBd/2z8jy2OIjEjg==", "dev": true, "requires": { "p-map": "^1.2.0", @@ -1132,108 +5813,64 @@ } }, "@lerna/symlink-binary": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.3.0.tgz", - "integrity": "sha512-zRo6CimhvH/VJqCFl9T4IC6syjpWyQIxEfO2sBhrapEcfwjtwbhoGgKwucsvt4rIpFazCw63jQ/AXMT27KUIHg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.13.0.tgz", + "integrity": "sha512-obc4Y6jxywkdaCe+DB0uTxYqP0IQ8mFWvN+k/YMbwH4G2h7M7lCBWgPy8e7xw/50+1II9tT2sxgx+jMus1sTJg==", "dev": true, "requires": { - "@lerna/create-symlink": "^3.3.0", - "@lerna/package": "^3.0.0", + "@lerna/create-symlink": "3.13.0", + "@lerna/package": "3.13.0", "fs-extra": "^7.0.0", - "p-map": "^1.2.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "p-map": "^1.2.0" } }, "@lerna/symlink-dependencies": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.3.0.tgz", - "integrity": "sha512-IRngSNCmuD5uBKVv23tHMvr7Mplti0lKHilFKcvhbvhAfu6m/Vclxhkfs/uLyHzG+DeRpl/9o86SQET3h4XDhg==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.13.0.tgz", + "integrity": "sha512-7CyN5WYEPkbPLbqHBIQg/YiimBzb5cIGQB0E9IkLs3+racq2vmUNQZn38LOaazQacAA83seB+zWSxlI6H+eXSg==", "dev": true, "requires": { - "@lerna/create-symlink": "^3.3.0", - "@lerna/resolve-symlink": "^3.3.0", - "@lerna/symlink-binary": "^3.3.0", + "@lerna/create-symlink": "3.13.0", + "@lerna/resolve-symlink": "3.13.0", + "@lerna/symlink-binary": "3.13.0", "fs-extra": "^7.0.0", "p-finally": "^1.0.0", "p-map": "^1.2.0", "p-map-series": "^1.0.0" } }, + "@lerna/timer": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", + "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", + "dev": true + }, "@lerna/validation-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.0.0.tgz", - "integrity": "sha512-5wjkd2PszV0kWvH+EOKZJWlHEqCTTKrWsvfHnHhcUaKBe/NagPZFWs+0xlsDPZ3DJt5FNfbAPAnEBQ05zLirFA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", + "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", "dev": true, "requires": { "npmlog": "^4.1.2" } }, "@lerna/version": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.4.1.tgz", - "integrity": "sha512-oefNaQLBJSI2WLZXw5XxDXk4NyF5/ct0V9ys/J308NpgZthPgwRPjk9ZR0o1IOxW1ABi6z3E317W/dxHDjvAkg==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.13.1.tgz", + "integrity": "sha512-WpfKc5jZBBOJ6bFS4atPJEbHSiywQ/Gcd+vrwaEGyQHWHQZnPTvhqLuq3q9fIb9sbuhH5pSY6eehhuBrKqTnjg==", "dev": true, "requires": { - "@lerna/batch-packages": "^3.1.2", - "@lerna/check-working-tree": "^3.3.0", - "@lerna/child-process": "^3.3.0", - "@lerna/collect-updates": "^3.3.2", - "@lerna/command": "^3.3.0", - "@lerna/conventional-commits": "^3.4.1", - "@lerna/output": "^3.0.0", - "@lerna/prompt": "^3.3.1", - "@lerna/run-lifecycle": "^3.4.1", - "@lerna/validation-error": "^3.0.0", + "@lerna/batch-packages": "3.13.0", + "@lerna/check-working-tree": "3.13.0", + "@lerna/child-process": "3.13.0", + "@lerna/collect-updates": "3.13.0", + "@lerna/command": "3.13.1", + "@lerna/conventional-commits": "3.13.0", + "@lerna/github-client": "3.13.1", + "@lerna/output": "3.13.0", + "@lerna/prompt": "3.13.0", + "@lerna/run-lifecycle": "3.13.0", + "@lerna/validation-error": "3.13.0", "chalk": "^2.3.1", "dedent": "^0.7.0", "minimatch": "^3.0.4", @@ -1257,9 +5894,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -1274,9 +5911,9 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "supports-color": { @@ -1291,9 +5928,9 @@ } }, "@lerna/write-log-file": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.0.0.tgz", - "integrity": "sha512-SfbPp29lMeEVOb/M16lJwn4nnx5y+TwCdd7Uom9umd7KcZP0NOvpnX0PHehdonl7TyHZ1Xx2maklYuCLbQrd/A==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", + "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", "dev": true, "requires": { "npmlog": "^4.1.2", @@ -1311,9 +5948,220 @@ } }, "@nodelib/fs.stat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", - "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@octokit/endpoint": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.2.3.tgz", + "integrity": "sha512-yUPCt4vMIOclox13CUxzuKiPJIFo46b/6GhUnUTw5QySczN1L0DtSxgmIZrZV4SAb9EyAqrceoyrWoYVnfF2AA==", + "dev": true, + "requires": { + "deepmerge": "3.2.0", + "is-plain-object": "^2.0.4", + "universal-user-agent": "^2.0.1", + "url-template": "^2.0.8" + } + }, + "@octokit/plugin-enterprise-rest": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.2.2.tgz", + "integrity": "sha512-CTZr64jZYhGWNTDGlSJ2mvIlFsm9OEO3LqWn9I/gmoHI4jRBp4kpHoFYNemG4oA75zUAcmbuWblb7jjP877YZw==", + "dev": true + }, + "@octokit/request": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.4.2.tgz", + "integrity": "sha512-lxVlYYvwGbKSHXfbPk5vxEA8w4zHOH1wobado4a9EfsyD3Cbhuhus1w0Ye9Ro0eMubGO8kNy5d+xNFisM3Tvaw==", + "dev": true, + "requires": { + "@octokit/endpoint": "^3.2.0", + "deprecation": "^1.0.1", + "is-plain-object": "^2.0.4", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^2.0.1" + } + }, + "@octokit/rest": { + "version": "16.23.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.23.2.tgz", + "integrity": "sha512-ZxiZMaCuqBG/IsbgNRVfGwYsvBb5DjHuMGjJgOrinT+/b+1j1U7PiGyRkHDJdjTGA6N/PsMC2lP2ZybX9579iA==", + "dev": true, + "requires": { + "@octokit/request": "2.4.2", + "atob-lite": "^2.0.0", + "before-after-hook": "^1.4.0", + "btoa-lite": "^1.0.0", + "deprecation": "^1.0.1", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", + "universal-user-agent": "^2.0.0", + "url-template": "^2.0.8" + } + }, + "@types/babel__core": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.1.tgz", + "integrity": "sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/babel__traverse": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", + "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz", + "integrity": "sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", "dev": true }, "JSONStream": { @@ -1355,9 +6203,9 @@ }, "dependencies": { "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true } } @@ -1378,47 +6226,18 @@ } }, "agentkeepalive": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.1.tgz", - "integrity": "sha512-Cte/sTY9/XcygXjJ0q58v//SnEQ7ViWExKyJpLJlLqomDbQyMLh6Is4KuWJ/wmxzhiwkGRple7Gqv1zf6Syz5w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { "humanize-ms": "^1.2.1" } }, - "ajv": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", - "integrity": "sha1-6yhAdG6dxIvV4GOjbj/UAMXqtak=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -1723,12 +6542,12 @@ } }, "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "^2.0.0" } }, "aproba": { @@ -1785,7 +6604,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -1859,14 +6678,29 @@ "dev": true }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } } }, + "async-each": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", + "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", + "dev": true, + "optional": true + }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -1885,6 +6719,12 @@ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1916,7 +6756,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -1929,7 +6769,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -1944,31 +6784,46 @@ } } }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "dev": true + } } }, "babel-generator": { @@ -1987,24 +6842,26 @@ "trim-right": "^1.0.1" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "babel-jest": { + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", + "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.4" } }, - "babel-jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", - "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "babel-loader": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "dev": true, "requires": { - "babel-plugin-istanbul": "^4.1.6", - "babel-preset-jest": "^23.2.0" + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" } }, "babel-messages": { @@ -2029,42 +6886,27 @@ } }, "babel-plugin-jest-hoist": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", + "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, "babel-preset-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", - "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "version": "22.4.4", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", + "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-jest-hoist": "^22.4.4", "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -2206,6 +7048,25 @@ "tweetnacl": "^0.14.3" } }, + "before-after-hook": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", + "integrity": "sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -2216,9 +7077,9 @@ } }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "dev": true }, "brace-expansion": { @@ -2266,6 +7127,12 @@ "node-int64": "^0.4.0" } }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2291,11 +7158,76 @@ "dev": true }, "byte-size": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.3.tgz", - "integrity": "sha512-JGC3EV2bCzJH/ENSh3afyJrH4vwxbHTuO5ljLoI5+2iJOcEpMgP8T782jH9b5qGxf2mSUIp1lfGnfKNrRHpvVg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz", + "integrity": "sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==", "dev": true }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2327,18 +7259,35 @@ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, "callsites": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "camelcase-keys": { "version": "4.2.0", @@ -2359,13 +7308,19 @@ } } }, + "caniuse-lite": { + "version": "1.0.30000957", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz", + "integrity": "sha512-8wxNrjAzyiHcLXN/iunskqQnJquQQ6VX8JHfW5kLgAPRSiSuKZiNfmIkP5j7jgyXqAQBSoXyJxfnbCFS0ThSiQ==", + "dev": true + }, "capture-exit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", - "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "rsvp": "^3.3.3" + "rsvp": "^4.8.4" } }, "caseless": { @@ -2374,17 +7329,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", @@ -2403,9 +7347,9 @@ "dev": true }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, "ci-info": { @@ -2459,24 +7403,14 @@ "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, - "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "clone": { @@ -2562,6 +7496,18 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "compare-func": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", @@ -2583,6 +7529,12 @@ } } }, + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2596,11 +7548,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -2623,9 +7576,9 @@ "dev": true }, "conventional-changelog-angular": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.1.tgz", - "integrity": "sha512-q4ylJ68fWZDdrFC9z4zKcf97HW6hp7Mo2YlqD4owfXhecFKy/PJCU/1oVFF4TqochchChqmZ0Vb0e0g8/MKNlA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz", + "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -2633,42 +7586,102 @@ } }, "conventional-changelog-core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.1.0.tgz", - "integrity": "sha512-bcZkcFXkqVgG2W8m/1wjlp2wn/BKDcrPgw3/mvSEQtzs8Pax8JbAPFpEQReHY92+EKNNXC67wLA8y2xcNx0rDA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.1.6.tgz", + "integrity": "sha512-5teTAZOtJ4HLR6384h50nPAaKdDr+IaU0rnD2Gg2C3MS7hKsEPH8pZxrDNqam9eOSPQg9tET6uZY79zzgSz+ig==", "dev": true, "requires": { - "conventional-changelog-writer": "^4.0.0", - "conventional-commits-parser": "^3.0.0", + "conventional-changelog-writer": "^4.0.3", + "conventional-commits-parser": "^3.0.1", "dateformat": "^3.0.0", "get-pkg-repo": "^1.0.0", - "git-raw-commits": "^2.0.0", + "git-raw-commits": "2.0.0", "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.0", + "git-semver-tags": "^2.0.2", "lodash": "^4.2.1", "normalize-package-data": "^2.3.5", "q": "^1.5.1", - "read-pkg": "^1.1.0", - "read-pkg-up": "^1.0.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", "through2": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "conventional-changelog-preset-loader": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.1.tgz", - "integrity": "sha512-HiSfhXNzAzG9klIqJaA97MMiNBR4js+53g4Px0k7tgKeCNVXmrDrm+CY+nIqcmG5NVngEPf8rAr7iji1TWW7zg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.0.2.tgz", + "integrity": "sha512-pBY+qnUoJPXAXXqVGwQaVmcye05xi6z231QM98wHWamGAmu/ghkBprQAwmF5bdmyobdVxiLhPY3PrCfSeUNzRQ==", "dev": true }, "conventional-changelog-writer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.0.tgz", - "integrity": "sha512-hMZPe0AQ6Bi05epeK/7hz80xxk59nPA5z/b63TOHq2wigM0/akreOc8N4Jam5b9nFgKWX1e9PdPv2ewgW6bcfg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.3.tgz", + "integrity": "sha512-bIlpSiQtQZ1+nDVHEEh798Erj2jhN/wEjyw9sfxY9es6h7pREE5BNJjfv0hXGH/FTrAsEpHUq4xzK99eePpwuA==", "dev": true, "requires": { "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.0", + "conventional-commits-filter": "^2.0.1", "dateformat": "^3.0.0", - "handlebars": "^4.0.2", + "handlebars": "^4.1.0", "json-stringify-safe": "^5.0.1", "lodash": "^4.2.1", "meow": "^4.0.0", @@ -2677,18 +7690,54 @@ "through2": "^2.0.0" }, "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "optional": true + }, + "handlebars": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.3.tgz", + "integrity": "sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + } } } }, "conventional-commits-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.0.tgz", - "integrity": "sha512-Cfl0j1/NquB/TMVx7Wrmyq7uRM+/rPQbtVVGwzfkhZ6/yH6fcMmP0Q/9044TBZPTNdGzm46vXFXL14wbET0/Mg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz", + "integrity": "sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==", "dev": true, "requires": { "is-subset": "^0.1.1", @@ -2696,9 +7745,9 @@ } }, "conventional-commits-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", - "integrity": "sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz", + "integrity": "sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==", "dev": true, "requires": { "JSONStream": "^1.0.4", @@ -2711,17 +7760,17 @@ } }, "conventional-recommended-bump": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.1.tgz", - "integrity": "sha512-9waJvW01TUs4HQJ3khwGSSlTlKsY+5u7OrxHL+oWEoGNvaNO/0qL6qqnhS3J0Fq9fNKA9bmlf5cOXjCQoW+I4Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.4.tgz", + "integrity": "sha512-9mY5Yoblq+ZMqJpBzgS+RpSq+SUfP2miOR3H/NR9drGf08WCrY9B6HAGJZEm6+ThsVP917VHAahSOjM6k1vhPg==", "dev": true, "requires": { "concat-stream": "^1.6.0", - "conventional-changelog-preset-loader": "^2.0.1", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.0.0", - "git-raw-commits": "^2.0.0", - "git-semver-tags": "^2.0.0", + "conventional-changelog-preset-loader": "^2.0.2", + "conventional-commits-filter": "^2.0.1", + "conventional-commits-parser": "^3.0.1", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^2.0.2", "meow": "^4.0.0", "q": "^1.5.1" } @@ -2761,6 +7810,49 @@ "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==", "dev": true }, + "core-js-compat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", + "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "dev": true, + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", + "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000955", + "electron-to-chromium": "^1.3.122", + "node-releases": "^1.1.13" + } + }, + "core-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", + "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", + "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2802,15 +7894,15 @@ } }, "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", "dev": true }, "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { "cssom": "0.3.x" @@ -2936,13 +8028,27 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "dev": true + }, "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, "defaults": { @@ -3028,6 +8134,12 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, + "deprecation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-1.0.1.tgz", + "integrity": "sha512-ccVHpE72+tcIKaGMql33x5MAjKQIZrk+3x2GbJ7TeraUCZWHoT+KSZpoC+JQFsUBlSTXUrBaGiF0j6zVTepPLg==", + "dev": true + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -3053,10 +8165,10 @@ "wrappy": "1" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", "dev": true }, "dir-glob": { @@ -3105,9 +8217,9 @@ "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -3126,6 +8238,18 @@ "jsbn": "~0.1.0" } }, + "electron-to-chromium": { + "version": "1.3.122", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.122.tgz", + "integrity": "sha512-3RKoIyCN4DhP2dsmleuFvpJAIDOseWH88wFYBzb22CSwoFDSWRc4UAMfrtc9h8nBdJjTNIN3rogChgOy6eFInw==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -3184,9 +8308,9 @@ } }, "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, "es6-promisify": { @@ -3205,9 +8329,9 @@ "dev": true }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -3232,12 +8356,37 @@ } } }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -3251,27 +8400,54 @@ "dev": true }, "exec-sh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", - "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", - "dev": true, - "requires": { - "merge": "^1.2.0" - } + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "exit": { @@ -3291,7 +8467,7 @@ }, "expand-range": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { @@ -3299,17 +8475,17 @@ } }, "expect": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", - "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.7.1.tgz", + "integrity": "sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw==", "dev": true, "requires": { + "@jest/types": "^24.7.0", "ansi-styles": "^3.2.0", - "jest-diff": "^23.6.0", - "jest-get-type": "^22.1.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0" + "jest-get-type": "^24.3.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-regex-util": "^24.3.0" } }, "extend": { @@ -3348,17 +8524,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "extglob": { @@ -3376,23 +8541,17 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, "fast-glob": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.3.tgz", - "integrity": "sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", "dev": true, "requires": { "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.0.1", + "@nodelib/fs.stat": "^1.1.2", "glob-parent": "^3.1.0", "is-glob": "^4.0.0", - "merge2": "^1.2.1", + "merge2": "^1.2.3", "micromatch": "^3.1.10" }, "dependencies": { @@ -3645,9 +8804,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -3773,6 +8932,87 @@ "repeat-string": "^1.5.2" } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -3782,14 +9022,52 @@ "locate-path": "^2.0.0" } }, + "flow-bin": { + "version": "0.96.0", + "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.96.0.tgz", + "integrity": "sha512-OSxERs0EdhVxEVCst/HmlT/RcnXsQQIRqcfK9J9wC8/93JQj+xQz4RtlsmYe1PSRYaozuDLyPS5pIA81Zwzaww==", + "dev": true + }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "for-in": { @@ -3844,9 +9122,9 @@ } }, "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -3863,6 +9141,12 @@ "minipass": "^2.2.1" } }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -3882,9 +9166,9 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { @@ -3910,7 +9194,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -3934,7 +9218,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -3970,7 +9254,7 @@ } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -4019,7 +9303,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -4039,12 +9323,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -4105,16 +9389,16 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -4137,7 +9421,7 @@ "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.2.4", "bundled": true, "dev": true, "optional": true, @@ -4148,18 +9432,18 @@ } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.10.3", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -4176,13 +9460,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.5", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true, @@ -4257,12 +9541,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -4292,16 +9576,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -4318,7 +9602,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true, "optional": true @@ -4369,17 +9653,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -4390,12 +9674,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -4404,7 +9688,7 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } @@ -4467,9 +9751,9 @@ } }, "genfun": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", - "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "get-caller-file": { @@ -4638,9 +9922,9 @@ } }, "git-semver-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.0.tgz", - "integrity": "sha512-lSgFc3zQTul31nFje2Q8XdNcTOI6B4I3mJRPCgFzHQQLfxfqdWTYzdtCaynkK5Xmb2wQlSJoKolhXJ1VhKROnQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.2.tgz", + "integrity": "sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w==", "dev": true, "requires": { "meow": "^4.0.0", @@ -4648,13 +9932,32 @@ }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "dev": true, + "requires": { + "git-up": "^4.0.0" + } + }, "gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", @@ -4710,13 +10013,13 @@ "dev": true }, "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "dev": true, "requires": { "array-union": "^1.0.1", - "dir-glob": "^2.0.0", + "dir-glob": "2.0.0", "fast-glob": "^2.0.2", "glob": "^7.1.2", "ignore": "^3.3.5", @@ -4737,31 +10040,22 @@ "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", "dev": true, "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -4804,6 +10098,21 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } } } }, @@ -4903,16 +10212,6 @@ } } }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -5112,10 +10411,13 @@ } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "iferr": { "version": "0.1.5", @@ -5138,6 +10440,16 @@ "minimatch": "^3.0.4" } }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -5199,24 +10511,88 @@ } }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.0", + "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.1.0", + "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "invariant": { @@ -5229,9 +10605,9 @@ } }, "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "ip": { @@ -5255,6 +10631,16 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5371,9 +10757,9 @@ } }, "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-glob": { @@ -5467,6 +10853,15 @@ "has": "^1.0.1" } }, + "is-ssh": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -5515,6 +10910,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5543,22 +10944,192 @@ "dev": true }, "istanbul-api": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", - "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.1.tgz", + "integrity": "sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==", "dev": true, "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.1", - "istanbul-lib-hook": "^1.2.2", - "istanbul-lib-instrument": "^1.10.2", - "istanbul-lib-report": "^1.1.5", - "istanbul-lib-source-maps": "^1.2.6", - "istanbul-reports": "^1.5.1", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.1.0", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", + "minimatch": "^3.0.4", "once": "^1.4.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "istanbul-lib-coverage": { @@ -5568,12 +11139,12 @@ "dev": true }, "istanbul-lib-hook": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", - "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", + "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", "dev": true, "requires": { - "append-transform": "^0.4.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { @@ -5592,388 +11163,1887 @@ } }, "istanbul-lib-report": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", - "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", + "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" }, "dependencies": { "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "pify": "^3.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", - "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", + "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==", "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.1", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, "istanbul-reports": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", - "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", + "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "handlebars": "^4.1.0" } }, "jest": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", - "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", + "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", "dev": true, "requires": { - "import-local": "^1.0.0", - "jest-cli": "^23.6.0" + "import-local": "^2.0.0", + "jest-cli": "^24.7.1" }, "dependencies": { - "jest-cli": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", - "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", + "locate-path": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "jest-cli": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.7.1.tgz", + "integrity": "sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ==", + "dev": true, + "requires": { + "@jest/core": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", "chalk": "^2.0.1", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "import-local": "^1.0.0", - "is-ci": "^1.0.10", - "istanbul-api": "^1.3.1", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-source-maps": "^1.2.4", - "jest-changed-files": "^23.4.2", - "jest-config": "^23.6.0", - "jest-environment-jsdom": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve-dependencies": "^23.6.0", - "jest-runner": "^23.6.0", - "jest-runtime": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "jest-watcher": "^23.4.0", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "node-notifier": "^5.2.1", - "prompts": "^0.1.9", - "realpath-native": "^1.0.0", - "rimraf": "^2.5.4", - "slash": "^1.0.0", - "string-length": "^2.0.0", - "strip-ansi": "^4.0.0", - "which": "^1.2.12", - "yargs": "^11.0.0" + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" } } } }, "jest-changed-files": { - "version": "23.4.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", - "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.7.0.tgz", + "integrity": "sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw==", "dev": true, "requires": { + "@jest/types": "^24.7.0", + "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", - "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.7.1.tgz", + "integrity": "sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^23.6.0", + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.7.1", + "@jest/types": "^24.7.0", + "babel-jest": "^24.7.1", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^23.4.0", - "jest-environment-node": "^23.4.0", - "jest-get-type": "^22.1.0", - "jest-jasmine2": "^23.6.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "pretty-format": "^23.6.0" + "jest-environment-jsdom": "^24.7.1", + "jest-environment-node": "^24.7.1", + "jest-get-type": "^24.3.0", + "jest-jasmine2": "^24.7.1", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.7.0", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "babel-jest": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.7.1.tgz", + "integrity": "sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg==", + "dev": true, + "requires": { + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz", + "integrity": "sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.0.0", + "test-exclude": "^5.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", + "integrity": "sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "jest-diff": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", - "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz", + "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==", "dev": true, "requires": { "chalk": "^2.0.1", - "diff": "^3.2.0", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" } }, "jest-docblock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", - "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", - "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.7.1.tgz", + "integrity": "sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA==", "dev": true, "requires": { + "@jest/types": "^24.7.0", "chalk": "^2.0.1", - "pretty-format": "^23.6.0" + "jest-get-type": "^24.3.0", + "jest-util": "^24.7.1", + "pretty-format": "^24.7.0" } }, "jest-environment-jsdom": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", - "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz", + "integrity": "sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg==", "dev": true, "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0", + "@jest/environment": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0", + "jest-util": "^24.7.1", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", - "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.7.1.tgz", + "integrity": "sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA==", "dev": true, "requires": { - "jest-mock": "^23.2.0", - "jest-util": "^23.4.0" + "@jest/environment": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/types": "^24.7.0", + "jest-mock": "^24.7.0", + "jest-util": "^24.7.1" } }, "jest-get-type": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", "dev": true }, "jest-haste-map": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", - "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.7.1.tgz", + "integrity": "sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw==", "dev": true, "requires": { + "@jest/types": "^24.7.0", + "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-docblock": "^23.2.0", - "jest-serializer": "^23.0.1", - "jest-worker": "^23.2.0", - "micromatch": "^2.3.11", - "sane": "^2.0.0" + "jest-serializer": "^24.4.0", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "jest-jasmine2": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", - "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz", + "integrity": "sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w==", "dev": true, "requires": { - "babel-traverse": "^6.0.0", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^23.6.0", - "is-generator-fn": "^1.0.0", - "jest-diff": "^23.6.0", - "jest-each": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "pretty-format": "^23.6.0" + "expect": "^24.7.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.7.1", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "pretty-format": "^24.7.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", + "dev": true, + "requires": { + "@babel/types": "^7.4.0" + } + }, + "@babel/template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" + } + }, + "@babel/traverse": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "jest-leak-detector": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", - "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz", + "integrity": "sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ==", "dev": true, "requires": { - "pretty-format": "^23.6.0" + "pretty-format": "^24.7.0" } }, "jest-matcher-utils": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", - "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", - "pretty-format": "^23.6.0" + "jest-diff": "^24.7.0", + "jest-get-type": "^24.3.0", + "pretty-format": "^24.7.0" } }, "jest-message-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", - "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz", + "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.35", + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", - "micromatch": "^2.3.11", - "slash": "^1.0.0", + "micromatch": "^3.1.10", + "slash": "^2.0.0", "stack-utils": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } } }, "jest-mock": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", - "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.7.0.tgz", + "integrity": "sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, "jest-regex-util": { - "version": "23.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", - "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", "dev": true }, "jest-resolve": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", - "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", + "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", "dev": true, "requires": { + "@jest/types": "^24.7.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", - "realpath-native": "^1.0.0" + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", - "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz", + "integrity": "sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg==", "dev": true, "requires": { - "jest-regex-util": "^23.3.0", - "jest-snapshot": "^23.6.0" + "@jest/types": "^24.7.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.7.1" } }, "jest-runner": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", - "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.7.1.tgz", + "integrity": "sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw==", "dev": true, "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.7.1", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "chalk": "^2.4.2", "exit": "^0.1.2", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-docblock": "^23.2.0", - "jest-haste-map": "^23.6.0", - "jest-jasmine2": "^23.6.0", - "jest-leak-detector": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-runtime": "^23.6.0", - "jest-util": "^23.4.0", - "jest-worker": "^23.2.0", + "graceful-fs": "^4.1.15", + "jest-config": "^24.7.1", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.7.1", + "jest-jasmine2": "^24.7.1", + "jest-leak-detector": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", + "jest-runtime": "^24.7.1", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } }, "jest-runtime": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", - "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.7.1.tgz", + "integrity": "sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A==", "dev": true, "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.1.6", + "@jest/console": "^24.7.1", + "@jest/environment": "^24.7.1", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/yargs": "^12.0.2", "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", "exit": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-config": "^23.6.0", - "jest-haste-map": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-regex-util": "^23.3.0", - "jest-resolve": "^23.6.0", - "jest-snapshot": "^23.6.0", - "jest-util": "^23.4.0", - "jest-validate": "^23.6.0", - "micromatch": "^2.3.11", - "realpath-native": "^1.0.0", - "slash": "^1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "^2.1.0", - "yargs": "^11.0.0" + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.7.1", + "jest-haste-map": "^24.7.1", + "jest-message-util": "^24.7.1", + "jest-mock": "^24.7.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.7.1", + "jest-snapshot": "^24.7.1", + "jest-util": "^24.7.1", + "jest-validate": "^24.7.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" }, "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -5983,53 +13053,115 @@ } }, "jest-serializer": { - "version": "23.0.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", - "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", "dev": true }, "jest-snapshot": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", - "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", + "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", "dev": true, "requires": { - "babel-types": "^6.0.0", + "@babel/types": "^7.0.0", + "@jest/types": "^24.7.0", "chalk": "^2.0.1", - "jest-diff": "^23.6.0", - "jest-matcher-utils": "^23.6.0", - "jest-message-util": "^23.4.0", - "jest-resolve": "^23.6.0", + "expect": "^24.7.1", + "jest-diff": "^24.7.0", + "jest-matcher-utils": "^24.7.0", + "jest-message-util": "^24.7.1", + "jest-resolve": "^24.7.1", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^23.6.0", + "pretty-format": "^24.7.0", "semver": "^5.5.0" }, "dependencies": { + "@babel/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true } } }, "jest-util": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", - "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.7.1.tgz", + "integrity": "sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A==", "dev": true, "requires": { - "callsites": "^2.0.0", + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.7.1", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "callsites": "^3.0.0", "chalk": "^2.0.1", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "jest-message-util": "^23.4.0", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", "mkdirp": "^0.5.1", - "slash": "^1.0.0", + "slash": "^2.0.0", "source-map": "^0.6.0" }, "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6039,37 +13171,67 @@ } }, "jest-validate": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", - "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.7.0.tgz", + "integrity": "sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA==", "dev": true, "requires": { + "@jest/types": "^24.7.0", + "camelcase": "^5.0.0", "chalk": "^2.0.1", - "jest-get-type": "^22.1.0", + "jest-get-type": "^24.3.0", "leven": "^2.1.0", - "pretty-format": "^23.6.0" + "pretty-format": "^24.7.0" } }, "jest-watcher": { - "version": "23.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", - "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.7.1.tgz", + "integrity": "sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw==", "dev": true, "requires": { + "@jest/test-result": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/yargs": "^12.0.9", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", + "jest-util": "^24.7.1", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", "dev": true, "requires": { - "merge-stream": "^1.0.1" + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -6129,7 +13291,7 @@ }, "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, @@ -6145,24 +13307,12 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -6200,25 +13350,18 @@ } }, "kleur": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", - "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "left-pad": { @@ -6228,26 +13371,26 @@ "dev": true }, "lerna": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.4.3.tgz", - "integrity": "sha512-tWq1LvpHqkyB+FaJCmkEweivr88yShDMmauofPVdh0M5gU1cVucszYnIgWafulKYu2LMQ3IfUMUU5Pp3+MvADQ==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.13.1.tgz", + "integrity": "sha512-7kSz8LLozVsoUNTJzJzy+b8TnV9YdviR2Ee2PwGZSlVw3T1Rn7kOAPZjEi+3IWnOPC96zMPHVmjCmzQ4uubalw==", "dev": true, "requires": { - "@lerna/add": "^3.4.1", - "@lerna/bootstrap": "^3.4.1", - "@lerna/changed": "^3.4.1", - "@lerna/clean": "^3.3.2", - "@lerna/cli": "^3.2.0", - "@lerna/create": "^3.4.1", - "@lerna/diff": "^3.3.0", - "@lerna/exec": "^3.3.2", - "@lerna/import": "^3.3.1", - "@lerna/init": "^3.3.0", - "@lerna/link": "^3.3.0", - "@lerna/list": "^3.3.2", - "@lerna/publish": "^3.4.3", - "@lerna/run": "^3.3.2", - "@lerna/version": "^3.4.1", + "@lerna/add": "3.13.1", + "@lerna/bootstrap": "3.13.1", + "@lerna/changed": "3.13.1", + "@lerna/clean": "3.13.1", + "@lerna/cli": "3.13.0", + "@lerna/create": "3.13.1", + "@lerna/diff": "3.13.1", + "@lerna/exec": "3.13.1", + "@lerna/import": "3.13.1", + "@lerna/init": "3.13.1", + "@lerna/link": "3.13.1", + "@lerna/list": "3.13.1", + "@lerna/publish": "3.13.1", + "@lerna/run": "3.13.1", + "@lerna/version": "3.13.1", "import-local": "^1.0.0", "npmlog": "^4.1.2" } @@ -6269,9 +13412,9 @@ } }, "libnpmaccess": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.0.tgz", - "integrity": "sha512-SiE4AZAzMpD7pmmXHfgD7rof8QIQGoKaeyAS8exgx2CKA6tzRTbRljq1xM4Tgj8/tIg+KBJPJWkR0ifqKT3irQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", + "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -6294,16 +13437,46 @@ "requires": { "pump": "^3.0.0" } + } + } + }, + "libnpmpublish": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-1.1.1.tgz", + "integrity": "sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g==", + "dev": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.8.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "pump": "^3.0.0" } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -6328,6 +13501,34 @@ } } }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -6350,6 +13551,24 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -6375,10 +13594,10 @@ "lodash._reinterpolate": "~3.0.0" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, "loose-envify": { @@ -6410,6 +13629,12 @@ "yallist": "^2.1.2" } }, + "macos-release": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", + "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", + "dev": true + }, "make-dir": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", @@ -6446,80 +13671,15 @@ "ssri": "^6.0.0" }, "dependencies": { - "cacache": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", - "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true } } }, @@ -6533,9 +13693,9 @@ } }, "map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" @@ -6569,12 +13729,22 @@ "dev": true }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } } }, "meow": { @@ -6660,12 +13830,6 @@ } } }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", @@ -6749,9 +13913,9 @@ } }, "minipass": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", - "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -6765,22 +13929,40 @@ "dev": true }, "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } }, "minizlib": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz", - "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "requires": { "minipass": "^2.2.1" } }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", @@ -6832,9 +14014,9 @@ } }, "mri": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.1.tgz", - "integrity": "sha1-haom09ru7t+A3FmEr5XMXKXK2fE=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", "dev": true }, "ms": { @@ -6914,12 +14096,24 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", @@ -6951,141 +14145,11 @@ "which": "1" }, "dependencies": { - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - } - } - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "semver": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true } } }, @@ -7095,26 +14159,42 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-notifier": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", - "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", "dev": true, "requires": { "growly": "^1.3.0", + "is-wsl": "^1.1.0", "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" }, "dependencies": { "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, + "node-releases": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.14.tgz", + "integrity": "sha512-d58EpVZRhQE60kWiWUaaPlK9dyC4zg3ZoMcHcky2d4hDksyQj0rUozwInOl0C66mBsqo01Tuns8AvxnL5S7PKg==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -7145,10 +14225,16 @@ "remove-trailing-separator": "^1.0.1" } }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "dev": true }, "npm-lifecycle": { @@ -7203,17 +14289,17 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true } } }, "npm-packlist": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz", - "integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "dev": true, "requires": { "ignore-walk": "^3.0.1", @@ -7221,19 +14307,20 @@ } }, "npm-pick-manifest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", - "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", "dev": true, "requires": { + "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" } }, "npm-registry-fetch": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz", - "integrity": "sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz", + "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==", "dev": true, "requires": { "JSONStream": "^1.3.4", @@ -7245,9 +14332,9 @@ }, "dependencies": { "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -7284,9 +14371,9 @@ "dev": true }, "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", + "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", "dev": true }, "oauth-sign": { @@ -7383,6 +14470,12 @@ } } }, + "octokit-pagination-methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7440,14 +14533,24 @@ "dev": true }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", + "dev": true, + "requires": { + "macos-release": "^2.0.0", + "windows-release": "^3.1.0" } }, "os-tmpdir": { @@ -7472,6 +14575,15 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -7479,9 +14591,9 @@ "dev": true }, "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { @@ -7527,9 +14639,9 @@ "dev": true }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "p-waterfall": { @@ -7542,98 +14654,70 @@ } }, "pacote": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.0.tgz", - "integrity": "sha512-AFXaSWhOtQf3jHqEvg+ZYH/dfT8TKq6TKspJ4qEFwVVuh5aGvMIk6SNF8vqfzz+cBceDIs9drOcpBbrPai7i+g==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.0.tgz", + "integrity": "sha512-aUplXozRbzhaJO48FaaeClmN+2Mwt741MC6M3bevIGZwdCaP7frXzbUOfOWa91FPHoLITzG0hYaKY363lxO3bg==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "figgy-pudding": "^3.2.1", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", "make-fetch-happen": "^4.0.1", "minimatch": "^3.0.4", - "minipass": "^2.3.3", + "minipass": "^2.3.5", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "npm-registry-fetch": "^3.0.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", + "protoduck": "^5.0.1", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "cacache": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", - "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "yallist": "^3.0.2" } }, "safe-buffer": { @@ -7643,47 +14727,39 @@ "dev": true }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, "tar": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", - "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true - } } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } @@ -7726,6 +14802,28 @@ "error-ex": "^1.2.0" } }, + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -7814,6 +14912,15 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -7848,42 +14955,51 @@ "dev": true }, "prettier": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.6.tgz", - "integrity": "sha512-p5eqCNiohWZN++7aJXUVj0JgLqHCPLf9GLIcLBHGNWs4Y9FJOPs6+KNO2WT0udJIQJTbeZFrJkjzjcb8fkAYYQ==", + "version": "1.16.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", + "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", "dev": true }, "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", + "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" + "@jest/types": "^24.7.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true } } }, "pretty-quick": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.6.0.tgz", - "integrity": "sha512-bnCmsPy98ERD7VWBO+0y1OGWLfx/DPUjNFN2ZRVyxuGBiic1BXAGgjHsTKgBIbPISdqpP6KBEmRV0Lir4xu/BA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-1.10.0.tgz", + "integrity": "sha512-uNvm2N3UWmnZRZrClyQI45hIbV20f5BpSyZY51Spbvn4APp9+XLyX4bCjWRGT3fGyVyQ/2/iw7dbQq1UUaq7SQ==", "dev": true, "requires": { "chalk": "^2.3.0", "execa": "^0.8.0", "find-up": "^2.1.0", "ignore": "^3.3.7", - "mri": "^1.1.0" + "mri": "^1.1.0", + "multimatch": "^3.0.0" }, "dependencies": { + "array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true + }, "execa": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", @@ -7898,6 +15014,18 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } + }, + "multimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", + "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", + "dev": true, + "requires": { + "array-differ": "^2.0.3", + "array-union": "^1.0.2", + "arrify": "^1.0.1", + "minimatch": "^3.0.4" + } } } }, @@ -7930,13 +15058,13 @@ } }, "prompts": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", - "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", "dev": true, "requires": { - "kleur": "^2.0.1", - "sisteransi": "^0.1.1" + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" } }, "promzard": { @@ -7954,13 +15082,19 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", + "dev": true + }, "protoduck": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", - "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "dev": true, "requires": { - "genfun": "^4.0.1" + "genfun": "^5.0.0" } }, "pseudomap": { @@ -7976,9 +15110,9 @@ "dev": true }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -7994,6 +15128,18 @@ "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { @@ -8045,6 +15191,12 @@ } } }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -8077,9 +15229,9 @@ } }, "read-package-tree": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", - "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.2.tgz", + "integrity": "sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -8158,10 +15310,322 @@ "once": "^1.3.0" } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "optional": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, "realpath-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", - "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { "util.promisify": "^1.0.0" @@ -8177,6 +15641,21 @@ "strip-indent": "^2.0.0" } }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -8202,6 +15681,12 @@ "safe-regex": "^1.1.0" } }, + "regexp-tree": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.5.tgz", + "integrity": "sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -8282,23 +15767,31 @@ } }, "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.13.1" + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } } }, "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" } }, "require-directory": { @@ -8315,7 +15808,7 @@ }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -8362,29 +15855,35 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", "dev": true }, "run-async": { @@ -8412,9 +15911,9 @@ } }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -8442,20 +15941,20 @@ "dev": true }, "sane": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", - "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { + "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^1.2.0", - "exec-sh": "^0.2.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.18.0" + "walker": "~1.0.5" }, "dependencies": { "arr-diff": { @@ -8809,9 +16308,9 @@ "dev": true }, "sisteransi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", - "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", "dev": true }, "slash": { @@ -8827,9 +16326,9 @@ "dev": true }, "smart-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", - "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", "dev": true }, "snapdragon": { @@ -8941,23 +16440,23 @@ } }, "socks": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", - "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", "dev": true, "requires": { "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "smart-buffer": "4.0.2" } }, "socks-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "~4.2.1", + "socks": "~2.3.2" } }, "sort-keys": { @@ -8989,12 +16488,21 @@ } }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "source-map-url": { @@ -9079,6 +16587,15 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", @@ -9113,9 +16630,9 @@ "dev": true }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -9204,12 +16721,11 @@ "dev": true }, "strong-log-transformer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.0.0.tgz", - "integrity": "sha512-FQmNqAXJgOX8ygOcvPLlGWBNT41mvNJ9ALoYf0GTwVt9t30mGTqpmp/oJx5gLcu52DXK10kS7dVWhx8aPXDTlg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "requires": { - "byline": "^5.0.0", "duplexer": "^0.1.1", "minimist": "^1.2.0", "through": "^2.3.4" @@ -9217,7 +16733,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -9301,13 +16817,45 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "tmp": { @@ -9464,39 +17012,25 @@ "dev": true }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz", + "integrity": "sha512-GpKo28q/7Bm5BcX9vOu4S46FwisbPbAmkkqPnGIpKvKTM96I85N6XHQV+k4I6FA2wxgLhcsSyHoNhzucwCflvA==", "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "commander": "~2.20.0", + "source-map": "~0.6.1" }, "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } + "optional": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "uid-number": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", @@ -9509,6 +17043,34 @@ "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -9545,23 +17107,32 @@ } }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, + "universal-user-agent": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", + "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", + "dev": true, + "requires": { + "os-name": "^3.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9614,22 +17185,12 @@ } } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } + "optional": true }, "urix": { "version": "0.1.0", @@ -9637,6 +17198,12 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, "use": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", @@ -9671,9 +17238,9 @@ } }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "validate-npm-package-license": { @@ -9724,24 +17291,6 @@ "makeerror": "1.0.x" } }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "^0.2.0", - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -9764,17 +17313,6 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "whatwg-mimetype": { @@ -9818,12 +17356,50 @@ "string-width": "^1.0.2 || 2" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "windows-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", "dev": true, - "optional": true + "requires": { + "execa": "^0.10.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } }, "wordwrap": { "version": "0.0.3", @@ -9927,12 +17503,6 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -9952,66 +17522,78 @@ "dev": true }, "yargs": { - "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "locate-path": "^3.0.0" } }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" } } } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "dependencies": { "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true } } diff --git a/package.json b/package.json index 690c19af3d..f4a5458672 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "url": "https://github.com/getinsomnia/insomnia" }, "scripts": { - "bootstrap": "npm install && lerna bootstrap && lerna run bootstrap", + "bootstrap": "npm install && lerna bootstrap && lerna run --parallel --stream bootstrap", "publish": "lerna publish", "clean": "lerna clean --yes && rimraf node_modules", - "test": "lerna run test --stream", - "app-start": "lerna run start --stream --scope=insomnia-app", - "app-build": "lerna run build --stream --scope=insomnia-app", - "app-package": "lerna run package --stream --scope=insomnia-app", + "test": "lerna run --stream --parallel test", + "app-start": "lerna run start --stream --parallel --bail", + "app-build": "lerna run build --stream --parallel --bail", + "app-package": "lerna run package --stream --parallel --bail", "format-code": "prettier --write \"**/*.js\"" }, "husky": { @@ -23,11 +23,22 @@ } }, "devDependencies": { + "@babel/cli": "^7.4.3", + "@babel/core": "^7.4.3", + "@babel/plugin-proposal-decorators": "^7.4.0", + "@babel/preset-env": "^7.4.3", + "@babel/preset-flow": "^7.0.0", + "@babel/preset-react": "^7.0.0", + "babel-eslint": "^8.2.3", + "babel-jest": "^22.4.3", + "babel-loader": "^8.0.5", + "flow-bin": "^0.96.0", "husky": "^1.0.0-rc.9", - "jest": "^23.6.0", - "lerna": "^3.4.3", - "prettier": "^1.13.6", - "pretty-quick": "^1.6.0", - "rimraf": "^2.6.2" - } + "jest": "^24.7.1", + "lerna": "^3.13.1", + "prettier": "^1.16.4", + "pretty-quick": "^1.10.0", + "rimraf": "^2.6.3" + }, + "dependencies": {} } diff --git a/packages/insomnia-app/.babelrc b/packages/insomnia-app/.babelrc index c1ecbfe87e..3390f36eee 100644 --- a/packages/insomnia-app/.babelrc +++ b/packages/insomnia-app/.babelrc @@ -1,11 +1,16 @@ { "presets": [ - "react", - "flow" + "@babel/preset-react", + "@babel/preset-flow" ], "plugins": [ - "transform-object-rest-spread", - "transform-decorators-legacy" + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + ["@babel/plugin-proposal-class-properties", { "loose" : true }] ], "env": { "development": { @@ -16,13 +21,15 @@ "test": { "presets": [ [ - "env", { - "targets": { - "node": "8.4" + "@babel/preset-env", + { + "targets": { + "node": "10" + } } - } ], - "flow" // We need to add this again because it has to run before es2015 + // We need to add this again because it has to run before es2015 + "@babel/preset-flow" ] } } diff --git a/packages/insomnia-app/.eslintrc b/packages/insomnia-app/.eslintrc index b0485470b7..518e4c3bcd 100644 --- a/packages/insomnia-app/.eslintrc +++ b/packages/insomnia-app/.eslintrc @@ -36,8 +36,10 @@ "indent": "off", "no-var": "error", "no-duplicate-imports": "off", + "flowtype/space-after-type-colon": "off", "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", + "space-in-parens": "off", "space-before-function-paren": [ "error", { diff --git a/packages/insomnia-app/app/__jest__/before-each.js b/packages/insomnia-app/app/__jest__/before-each.js index 20ab20dd16..9742eb88cf 100644 --- a/packages/insomnia-app/app/__jest__/before-each.js +++ b/packages/insomnia-app/app/__jest__/before-each.js @@ -1,7 +1,10 @@ import * as db from '../common/database'; import * as models from '../models'; +import * as fetch from '../account/fetch'; export async function globalBeforeEach() { // Setup the local database in case it's used + + fetch.setup('insomnia-tests', 'http://localhost:8000'); await db.init(models.types(), { inMemoryOnly: true }, true); } diff --git a/packages/insomnia-app/app/__mocks__/node-forge.js b/packages/insomnia-app/app/__mocks__/node-forge.js index 3beb06b124..90850d1607 100644 --- a/packages/insomnia-app/app/__mocks__/node-forge.js +++ b/packages/insomnia-app/app/__mocks__/node-forge.js @@ -9,14 +9,10 @@ module.exports = { jsbn: forge.jsbn, util: forge.util, pkcs5: { - pbkdf2() {}, + pbkdf2: forge.pkcs5.pbkdf2, }, md: { - sha256: { - create() { - return 'TODO'; - }, - }, + sha256: forge.md.sha256, }, rsa: { setPublicKey() { diff --git a/packages/insomnia-app/app/account/__tests__/crypt.test.js b/packages/insomnia-app/app/account/__tests__/crypt.test.js new file mode 100644 index 0000000000..f87f6921f5 --- /dev/null +++ b/packages/insomnia-app/app/account/__tests__/crypt.test.js @@ -0,0 +1,102 @@ +import * as crypt from '../crypt'; + +describe('crypt', () => { + describe('deriveKey()', () => { + it('derives a key properly', async () => { + const result = await crypt.deriveKey('Password', 'email', 'salt'); + const expected = 'fb058595c02ae9660ed7098273bf50e49407942ecc437bf317638d76c4578eae'; + + expect(result).toBe(expected); + }); + }); + + describe('AES', () => { + it('encrypts and decrypts', () => { + const key = { + kty: 'oct', + alg: 'A256GCM', + ext: true, + key_ops: ['encrypt', 'decrypt'], + k: '5hs1f2xuiNPHUp11i6SWlsqYpWe_hWPcEKucZlwBfFE', + }; + + const resultEncrypted = crypt.encryptAES(key, 'Hello World!', 'additional data'); + const resultDecrypted = crypt.decryptAES(key, resultEncrypted); + + expect(resultDecrypted).toEqual('Hello World!'); + }); + }); + + describe('AES Buffer', () => { + it('encrypts and decrypts', () => { + const key = { + kty: 'oct', + alg: 'A256GCM', + ext: true, + key_ops: ['encrypt', 'decrypt'], + k: '5hs1f2xuiNPHUp11i6SWlsqYpWe_hWPcEKucZlwBfFE', + }; + + const resultEncrypted = crypt.encryptAESBuffer(key, Buffer.from('Hello World!', 'utf8')); + const resultDecrypted = crypt.decryptAESToBuffer(key, resultEncrypted); + + expect(resultDecrypted).toEqual(Buffer.from('Hello World!', 'utf8')); + }); + }); + + describe('RSA', () => { + it('encrypts and decrypts', () => { + const privateKey = { + alg: 'RSA-OAEP-256', + kty: 'RSA', + key_ops: ['decrypt'], + ext: true, + d: + 'UkouuQID2o9Q6VyiRMmK8ETPsAHWEL2HMYwy34c4nTpM7KfqlNeMzs6HmbuEfx-bwUvTqOO4Tz7FZw4ILD6s5sE9' + + 'xqIxmV-fIiqiBI4aWKozxgf9OJZWKqru3loSd923O3fI3oa9ZCTaKc1U0bYOB-XP2Q_hB2M64Hb63-McXAM0RQwN' + + 'R5vh_TweqcaBiXAyhuYl2NarOwrbSlSttkhZzy4i-otulPGkW61I5rNflsSmnYEijmD7zl9EouEOYcHlJGmNLHjG' + + 'nHlb-avvwvER5NZVDwd6vT61QR1wwpnYSjVH_Z_OrqJu8U2J64J_MaZPJog3KbPYqZnGcxJ9ldnSYQ', + dp: + 'SnO3kTAogveLWkqSuDVxQLOo4QXEq-Us_lM00dfGIuZrfWnyqOd6_NJKu-G62PCQgUMBy7r_f3N3sOseRVl_5fy3' + + 'kd21n7WmnQcMGBm-VRathT0nOz-fhzbwCJwtuI1g36YtaCQEQiC4pYxMYmXaX1WGPhL4rGSNz5SMHrPvyTU', + dq: + 'eaK2-w2Jb7rWWYhLon-RKlzWXTPHjnt1JfLkD_D12FNE6KAcbyIETDid8_sXnqj3oCr3HrO-AuNI87zZJ4UVsy2J' + + 'mvNNVFTn0s8R6TZ9_o9LCXBdBcRST5qpAax0t-duHRaKMuWPG3xAb2Uub6T42C7yd-mpOIRo7uSHFGQGzWk', + e: 'AQAB', + n: + '5wOecCVWaDB2s-ybsCp1BskBW5fj3iH4xja5hNTfW_s-ERgbEoBA_PSF60PC1se4r_oWwFBfIRL9OUTYwYOuQOuC' + + 'rgd7ODa_YBeOjzHUA1b0K5kWXaqPxkmN8kJPISyLdLjCCOwHtTFnqxL9JjnU4aIxy4OU1S5KR6v-XVeLOZtUOm4k' + + 'AhLVfmdzYB1nZmq9xH1O8_acIUoWDbAWX6fIXhPhn7jCuCO4WZQVDxZ5_bc27UVhR4VYe2Our7aESUQ5ZyMtYNym' + + 'o9Oy0y_m3OS6W_JR_feXBbxRCBuGf7fjnvV9ohx1ZqLpJFx9_xL7naoVCQhBDfVE31iYz3L6KTIhFQ', + p: + '_Pyx-puBM_BQubDg8BZsrssgmECHuieKEwlR19fckczS4dlgQVUemUTr-RqmItj7k-WMG7mWuRgbIrGO1sigpuDy' + + 'uKWkg3KyqoeIvgsaJV05xu8pneVblTXJSCtNMXvYMa6mPNYudUSy8-TlLyLg_w5lUnuA8Mq8xehzCsPrM-0', + q: + '6cPuxuW0zaMIVAJpOcLf5D0dA-mLXxmmJoMDodamM7t7_oGYgFR3Os9gtB5TYxsUjjRCWGkDy7ru8arcbTNCnNFd' + + 'PAayzTdWCW-GBs3xswggjmugGupjOnrtD-N1_fG040Ka8UqwMyI1lUapxaKhViR9TNYUz6EAOjxycf8MTMk', + qi: + 'FMVx12_ioueu052xgFxWdIS_lImUGTrw8Iiw_kp-KKsONtofs91A5GVRtyg_wdXpG2qyomaet1hTlHhLnoI23L2a' + + 'EkQ87SokIpoR9lR8jfIRwLwKKXMc33_bRRQXvWop0yvTzmSGaC0gULcqj0OHiUR1u9Ver1ZvgGz2jh4mP_E', + }; + + const publicKey = { + alg: 'RSA-OAEP-256', + kty: 'RSA', + key_ops: ['encrypt'], + e: 'AQAB', + n: + '5wOecCVWaDB2s-ybsCp1BskBW5fj3iH4xja5hNTfW_s-ERgbEoBA_PSF60PC1se4r_oWwFBfIRL9OUTYwYOuQO' + + 'uCrgd7ODa_YBeOjzHUA1b0K5kWXaqPxkmN8kJPISyLdLjCCOwHtTFnqxL9JjnU4aIxy4OU1S5KR6v-XVeLOZtU' + + 'Om4kAhLVfmdzYB1nZmq9xH1O8_acIUoWDbAWX6fIXhPhn7jCuCO4WZQVDxZ5_bc27UVhR4VYe2Our7aESUQ5Zy' + + 'MtYNymo9Oy0y_m3OS6W_JR_feXBbxRCBuGf7fjnvV9ohx1ZqLpJFx9_xL7naoVCQhBDfVE31iYz3L6KTIhFQ', + }; + + const resultEncrypted = crypt.encryptRSAWithJWK(publicKey, 'aaaaaaaaa'); + const resultDecrypted = crypt.decryptRSAWithJWK(privateKey, resultEncrypted); + + const expectedDecrypted = 'aaaaaaaaa'; + + expect(resultDecrypted.toString()).toEqual(expectedDecrypted); + }); + }); +}); diff --git a/packages/insomnia-app/app/sync/crypt.js b/packages/insomnia-app/app/account/crypt.js similarity index 79% rename from packages/insomnia-app/app/sync/crypt.js rename to packages/insomnia-app/app/account/crypt.js index 91451068d4..d86b0121b0 100644 --- a/packages/insomnia-app/app/sync/crypt.js +++ b/packages/insomnia-app/app/account/crypt.js @@ -1,6 +1,6 @@ import HKDF from 'hkdf'; import srp from 'srp-js'; -import * as forge from 'node-forge'; +import forge from 'node-forge'; const DEFAULT_BYTE_LENGTH = 32; const DEFAULT_PBKDF2_ITERATIONS = 1e5; // 100,000 @@ -64,9 +64,32 @@ export function decryptRSAWithJWK(privateJWK, encryptedBlob) { return decodeURIComponent(decrypted); } -export function recryptRSAWithJWK(privateJWK, publicJWK, encryptedBlob) { - const decrypted = decryptRSAWithJWK(privateJWK, encryptedBlob); - return encryptRSAWithJWK(publicJWK, decrypted); +/** + * Encrypt data using symmetric key + * + * @param jwkOrKey JWK or string representing symmetric key + * @param buff data to encrypt + * @param additionalData any additional public data to attach + * @returns {{iv, t, d, ad}} + */ +export function encryptAESBuffer(jwkOrKey, buff, additionalData = '') { + // TODO: Add assertion checks for JWK + const rawKey = typeof jwkOrKey === 'string' ? jwkOrKey : _b64UrlToHex(jwkOrKey.k); + const key = forge.util.hexToBytes(rawKey); + + const iv = forge.random.getBytesSync(12); + const cipher = forge.cipher.createCipher('AES-GCM', key); + + cipher.start({ additionalData, iv, tagLength: 128 }); + cipher.update(forge.util.createBuffer(buff)); + cipher.finish(); + + return { + iv: forge.util.bytesToHex(iv), + t: forge.util.bytesToHex(cipher.mode.tag), + ad: forge.util.bytesToHex(additionalData), + d: forge.util.bytesToHex(cipher.output), + }; } /** @@ -95,8 +118,8 @@ export function encryptAES(jwkOrKey, plaintext, additionalData = '') { return { iv: forge.util.bytesToHex(iv), t: forge.util.bytesToHex(cipher.mode.tag), - d: forge.util.bytesToHex(cipher.output), ad: forge.util.bytesToHex(additionalData), + d: forge.util.bytesToHex(cipher.output), }; } @@ -104,10 +127,10 @@ export function encryptAES(jwkOrKey, plaintext, additionalData = '') { * Decrypt AES using a key * * @param jwkOrKey JWK or string representing symmetric key - * @param message + * @param encryptedResult encryption data * @returns String */ -export function decryptAES(jwkOrKey, message) { +export function decryptAES(jwkOrKey, encryptedResult) { // TODO: Add assertion checks for JWK const rawKey = typeof jwkOrKey === 'string' ? jwkOrKey : _b64UrlToHex(jwkOrKey.k); const key = forge.util.hexToBytes(rawKey); @@ -118,13 +141,13 @@ export function decryptAES(jwkOrKey, message) { const decipher = forge.cipher.createDecipher('AES-GCM', key); decipher.start({ - iv: forge.util.hexToBytes(message.iv), - tagLength: message.t.length * 4, - tag: forge.util.hexToBytes(message.t), - additionalData: forge.util.hexToBytes(message.ad), + iv: forge.util.hexToBytes(encryptedResult.iv), + tagLength: encryptedResult.t.length * 4, + tag: forge.util.hexToBytes(encryptedResult.t), + additionalData: forge.util.hexToBytes(encryptedResult.ad), }); - decipher.update(forge.util.createBuffer(forge.util.hexToBytes(message.d))); + decipher.update(forge.util.createBuffer(forge.util.hexToBytes(encryptedResult.d))); if (decipher.finish()) { return decodeURIComponent(decipher.output.toString()); @@ -134,21 +157,35 @@ export function decryptAES(jwkOrKey, message) { } /** - * Generate a random salt in hex - * + * Decrypts AES using a key to buffer + * @param jwkOrKey + * @param encryptedResult * @returns {string} */ -export function getRandomHex(bytes = DEFAULT_BYTE_LENGTH) { - return forge.util.bytesToHex(forge.random.getBytesSync(bytes)); -} +export function decryptAESToBuffer(jwkOrKey, encryptedResult) { + // TODO: Add assertion checks for JWK + const rawKey = typeof jwkOrKey === 'string' ? jwkOrKey : _b64UrlToHex(jwkOrKey.k); + const key = forge.util.hexToBytes(rawKey); -/** - * Generate a random account Id - * - * @returns {string} - */ -export function generateAccountId() { - return `act_${getRandomHex(DEFAULT_BYTE_LENGTH)}`; + // ~~~~~~~~~~~~~~~~~~~~ // + // Decrypt with AES-GCM // + // ~~~~~~~~~~~~~~~~~~~~ // + + const decipher = forge.cipher.createDecipher('AES-GCM', key); + decipher.start({ + iv: forge.util.hexToBytes(encryptedResult.iv), + tagLength: encryptedResult.t.length * 4, + tag: forge.util.hexToBytes(encryptedResult.t), + additionalData: forge.util.hexToBytes(encryptedResult.ad), + }); + + decipher.update(forge.util.createBuffer(forge.util.hexToBytes(encryptedResult.d))); + + if (decipher.finish()) { + return Buffer.from(forge.util.bytesToHex(decipher.output), 'hex'); + } else { + throw new Error('Failed to decrypt data'); + } } /** @@ -264,7 +301,7 @@ export async function generateKeyPairJWK() { * @param rawEmail * @returns {Promise} */ -function _hkdfSalt(rawSalt, rawEmail) { +async function _hkdfSalt(rawSalt, rawEmail) { return new Promise(resolve => { const hkdf = new HKDF('sha256', rawSalt, rawEmail); hkdf.derive('', DEFAULT_BYTE_LENGTH, buffer => resolve(buffer.toString('hex'))); diff --git a/packages/insomnia-app/app/account/fetch.js b/packages/insomnia-app/app/account/fetch.js new file mode 100644 index 0000000000..8928361ceb --- /dev/null +++ b/packages/insomnia-app/app/account/fetch.js @@ -0,0 +1,104 @@ +import { delay } from '../common/misc'; +import { parse as urlParse } from 'url'; +import zlib from 'zlib'; + +let _userAgent = ''; +let _baseUrl = ''; +let _commandListeners = []; + +export function setup(userAgent, baseUrl) { + _userAgent = userAgent; + _baseUrl = baseUrl; +} + +export function onCommand(callback) { + _commandListeners.push(callback); +} + +export async function post(path, obj, sessionId, compressBody = false) { + return _fetch('POST', path, obj, sessionId, compressBody); +} + +export async function put(path, obj, sessionId, compressBody = false) { + return _fetch('PUT', path, obj, sessionId, compressBody); +} + +export async function get(path, sessionId) { + return _fetch('GET', path, null, sessionId); +} + +async function _fetch(method, path, obj, sessionId, compressBody = false, retries = 0) { + if (sessionId === undefined) { + throw new Error(`No session ID provided to ${method}:${path}`); + } + + const config = { + method: method, + headers: {}, + }; + + // Set some client information + if (_userAgent) { + config.headers['X-Insomnia-Client'] = _userAgent; + } + + if (obj && compressBody) { + config.body = zlib.gzipSync(JSON.stringify(obj)); + config.headers['Content-Type'] = 'application/json'; + config.headers['Content-Encoding'] = 'gzip'; + } else if (obj) { + config.body = JSON.stringify(obj); + config.headers['Content-Type'] = 'application/json'; + } + + if (sessionId) { + config.headers['X-Session-Id'] = sessionId; + } + + let response; + const url = _getUrl(path); + try { + response = await window.fetch(url, config); + + // Exponential backoff for 502 errors + if (response.status === 502 && retries < 5) { + retries++; + await delay(retries * 200); + return this._fetch(method, path, obj, sessionId, compressBody, retries); + } + } catch (err) { + throw new Error(`Failed to fetch '${url}'`); + } + const uri = response.headers.get('x-insomnia-command'); + uri && _notifyCommandListeners(uri); + + if (!response.ok) { + const err = new Error(`Response ${response.status} for ${path}`); + err.message = await response.text(); + err.statusCode = response.status; + throw err; + } + + if (response.headers.get('content-type') === 'application/json' || path.match(/\.json$/)) { + return response.json(); + } else { + return response.text(); + } +} + +function _getUrl(path) { + if (!_baseUrl) { + throw new Error('API base URL not configured!'); + } + + return `${_baseUrl}${path}`; +} + +function _notifyCommandListeners(uri) { + const parsed = urlParse(uri, true); + + const command = `${parsed.hostname}${parsed.pathname}`; + const args = JSON.parse(JSON.stringify(parsed.query)); + + _commandListeners.map(fn => fn(command, args)); +} diff --git a/packages/insomnia-app/app/sync/session.js b/packages/insomnia-app/app/account/session.js similarity index 52% rename from packages/insomnia-app/app/sync/session.js rename to packages/insomnia-app/app/account/session.js index 88b06db8ae..e5a2a671ca 100644 --- a/packages/insomnia-app/app/sync/session.js +++ b/packages/insomnia-app/app/account/session.js @@ -1,6 +1,22 @@ -import srp from 'srp-js'; +import * as srp from 'srp-js'; import * as crypt from './crypt'; -import * as util from '../common/fetch'; +import * as fetch from './fetch'; + +const loginCallbacks = []; + +function _callCallbacks() { + const loggedIn = isLoggedIn(); + console.log('[session] Sync state changed loggedIn=' + loggedIn); + for (const cb of loginCallbacks) { + if (typeof cb === 'function') { + cb(loggedIn); + } + } +} + +export function onLoginLogout(callback) { + loginCallbacks.push(callback); +} /** Create a new session for the user */ export async function login(rawEmail, rawPassphrase) { @@ -15,7 +31,7 @@ export async function login(rawEmail, rawPassphrase) { // Fetch Salt and Submit A To Server // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // - const { saltKey, saltAuth } = await util.post('/auth/login-s', { email }); + const { saltKey, saltAuth } = await fetch.post('/auth/login-s', { email }, null); const authSecret = await crypt.deriveKey(passphrase, email, saltKey); const secret1 = await crypt.srpGenKey(); const c = new srp.Client( @@ -26,10 +42,14 @@ export async function login(rawEmail, rawPassphrase) { Buffer.from(secret1, 'hex'), ); const srpA = c.computeA().toString('hex'); - const { sessionStarterId, srpB } = await util.post('/auth/login-a', { - srpA, - email, - }); + const { sessionStarterId, srpB } = await fetch.post( + '/auth/login-a', + { + srpA, + email, + }, + null, + ); // ~~~~~~~~~~~~~~~~~~~~~ // // Compute and Submit M1 // @@ -37,10 +57,14 @@ export async function login(rawEmail, rawPassphrase) { c.setB(Buffer.from(srpB, 'hex')); const srpM1 = c.computeM1().toString('hex'); - const { srpM2 } = await util.post('/auth/login-m1', { - srpM1, - sessionStarterId, - }); + const { srpM2 } = await fetch.post( + '/auth/login-m1', + { + srpM1, + sessionStarterId, + }, + null, + ); // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Verify Server Identity M2 // @@ -64,7 +88,7 @@ export async function login(rawEmail, rawPassphrase) { accountId, firstName, lastName, - } = await whoami(sessionId); + } = await _whoami(sessionId); const derivedSymmetricKey = await crypt.deriveKey(passphrase, email, saltEnc); const symmetricKeyStr = await crypt.decryptAES(derivedSymmetricKey, JSON.parse(encSymmetricKey)); @@ -80,83 +104,16 @@ export async function login(rawEmail, rawPassphrase) { JSON.parse(publicKey), JSON.parse(encPrivateKey), ); -} -export function syncCreateResourceGroup(parentResourceId, name, encSymmetricKey) { - return util.post('/api/resource_groups', { - parentResourceId, - name, - encSymmetricKey, - }); -} - -export function syncGetResourceGroup(id) { - return util.get(`/api/resource_groups/${id}`); -} - -export function syncPull(body) { - return util.post('/sync/pull', body); -} - -export function syncPush(body) { - return util.post('/sync/push', body); -} - -export function syncResetData() { - return util.post('/auth/reset'); -} - -export function syncFixDupes(resourceGroupIds) { - return util.post('/sync/fix-dupes', { ids: resourceGroupIds }); -} - -export function unshareWithAllTeams(resourceGroupId) { - return util.put(`/api/resource_groups/${resourceGroupId}/unshare`); -} - -export async function shareWithTeam(resourceGroupId, teamId, rawPassphrase) { - // Ask the server what we need to do to invite the member - const instructions = await util.post(`/api/resource_groups/${resourceGroupId}/share-a`, { - teamId, - }); - - // Compute keys necessary to invite the member - const passPhrase = _sanitizePassphrase(rawPassphrase); - const { email, saltEnc, encPrivateKey, encSymmetricKey } = await whoami(); - const secret = await crypt.deriveKey(passPhrase, email, saltEnc); - let symmetricKey; - try { - symmetricKey = crypt.decryptAES(secret, JSON.parse(encSymmetricKey)); - } catch (err) { - throw new Error('Invalid password'); - } - const privateKey = crypt.decryptAES(JSON.parse(symmetricKey), JSON.parse(encPrivateKey)); - const privateKeyJWK = JSON.parse(privateKey); - const resourceGroupSymmetricKey = crypt.decryptRSAWithJWK( - privateKeyJWK, - instructions.encSymmetricKey, - ); - - // Build the invite data request - const newKeys = {}; - for (const accountId of Object.keys(instructions.keys)) { - const accountPublicKeyJWK = JSON.parse(instructions.keys[accountId]); - newKeys[accountId] = crypt.encryptRSAWithJWK(accountPublicKeyJWK, resourceGroupSymmetricKey); - } - - // Actually share it with the team - await util.post(`/api/resource_groups/${resourceGroupId}/share-b`, { - teamId, - keys: newKeys, - }); + _callCallbacks(); } export function getPublicKey() { - return getSessionData().publicKey; + return _getSessionData().publicKey; } export function getPrivateKey() { - const { symmetricKey, encPrivateKey } = getSessionData(); + const { symmetricKey, encPrivateKey } = _getSessionData(); const privateKeyStr = crypt.decryptAES(symmetricKey, encPrivateKey); return JSON.parse(privateKeyStr); } @@ -165,39 +122,39 @@ export function getCurrentSessionId() { if (window) { return window.localStorage.getItem('currentSessionId'); } else { - return false; + return ''; } } export function getAccountId() { - return getSessionData().accountId; + return _getSessionData().accountId; } export function getEmail() { - return getSessionData().email; + return _getSessionData().email; } export function getFirstName() { - return getSessionData().firstName; + return _getSessionData().firstName; } -export function getFullName() { - const { firstName, lastName } = getSessionData(); - return `${firstName || ''} ${lastName || ''}`.trim(); +/** Check if we (think) we have a session */ +export function isLoggedIn() { + return !!getCurrentSessionId(); } -/** - * get Data about the current session - * @returns Object - */ -export function getSessionData() { - const sessionId = getCurrentSessionId(); - if (!sessionId || !window) { - return {}; +/** Log out and delete session data */ +export async function logout() { + try { + await fetch.post('/auth/logout', null, getCurrentSessionId()); + } catch (e) { + // Not a huge deal if this fails, but we don't want it to prevent the + // user from signing out. + console.warn('Failed to logout', e); } - const dataStr = window.localStorage.getItem(getSessionKey(sessionId)); - return JSON.parse(dataStr); + _unsetSessionData(); + _callCallbacks(); } /** Set data for the new session and store it encrypted with the sessionId */ @@ -222,57 +179,48 @@ export function setSessionData( lastName: lastName, }); - window.localStorage.setItem(getSessionKey(sessionId), dataStr); + window.localStorage.setItem(_getSessionKey(sessionId), dataStr); // NOTE: We're setting this last because the stuff above might fail window.localStorage.setItem('currentSessionId', sessionId); } -/** Unset the session data (log out) */ -export function unsetSessionData() { - const sessionId = getCurrentSessionId(); - window.localStorage.removeItem(getSessionKey(sessionId)); - window.localStorage.removeItem(`currentSessionId`); -} - -/** Check if we (think) we have a session */ -export function isLoggedIn() { - return getCurrentSessionId(); -} - -/** Log out and delete session data */ -export async function logout() { - try { - await util.post('/auth/logout'); - } catch (e) { - // Not a huge deal if this fails, but we don't want it to prevent the - // user from signing out. - console.warn('Failed to logout', e); - } - - unsetSessionData(); -} - export async function listTeams() { - return util.get('/api/teams'); + return fetch.get('/api/teams', getCurrentSessionId()); } export async function endTrial() { - await util.put('/api/billing/end-trial'); -} - -export function whoami(sessionId = null) { - return util.get('/auth/whoami', sessionId); -} - -export function getSessionKey(sessionId) { - return `session__${(sessionId || '').slice(0, 10)}`; + await fetch.put('/api/billing/end-trial', getCurrentSessionId()); } // ~~~~~~~~~~~~~~~~ // // Helper Functions // // ~~~~~~~~~~~~~~~~ // +function _whoami(sessionId = null) { + return fetch.get('/auth/whoami', sessionId || getCurrentSessionId()); +} + +function _getSessionData() { + const sessionId = getCurrentSessionId(); + if (!sessionId || !window) { + return {}; + } + + const dataStr = window.localStorage.getItem(_getSessionKey(sessionId)); + return JSON.parse(dataStr); +} + +function _unsetSessionData() { + const sessionId = getCurrentSessionId(); + window.localStorage.removeItem(_getSessionKey(sessionId)); + window.localStorage.removeItem(`currentSessionId`); +} + +function _getSessionKey(sessionId) { + return `session__${(sessionId || '').slice(0, 10)}`; +} + function _getSrpParams() { return srp.params[2048]; } diff --git a/packages/insomnia-app/app/common/__tests__/import.test.js b/packages/insomnia-app/app/common/__tests__/import.test.js index 2c137fef69..1793476be6 100644 --- a/packages/insomnia-app/app/common/__tests__/import.test.js +++ b/packages/insomnia-app/app/common/__tests__/import.test.js @@ -2,10 +2,11 @@ import * as models from '../../models'; import * as importUtil from '../import'; import { getAppVersion } from '../constants'; import { globalBeforeEach } from '../../__jest__/before-each'; +import YAML from 'yaml'; -describe('exportHAR()', () => { +describe('exportWorkspacesHAR() and exportRequestsHAR()', () => { beforeEach(globalBeforeEach); - it('exports a single workspace as an HTTP Archive', async () => { + it('exports a single workspace and some requests only as an HTTP Archive', async () => { const wrk1 = await models.workspace.create({ _id: 'wrk_1', name: 'Workspace 1', @@ -52,10 +53,11 @@ describe('exportHAR()', () => { }); const includePrivateDocs = true; - const json = await importUtil.exportHAR(wrk1, includePrivateDocs); - const data = JSON.parse(json); - expect(data).toMatchObject({ + // Test export whole workspace. + const exportWorkspacesJson = await importUtil.exportWorkspacesHAR(wrk1, includePrivateDocs); + const exportWorkspacesData = JSON.parse(exportWorkspacesJson); + expect(exportWorkspacesData).toMatchObject({ log: { entries: [ { @@ -70,7 +72,24 @@ describe('exportHAR()', () => { ], }, }); - expect(data.log.entries.length).toBe(2); + expect(exportWorkspacesData.log.entries.length).toBe(2); + + // Test export some requests only. + const exportRequestsJson = await importUtil.exportRequestsHAR([req1], includePrivateDocs); + const exportRequestsData = JSON.parse(exportRequestsJson); + expect(exportRequestsData).toMatchObject({ + log: { + entries: [ + { + request: { + headers: [{ name: 'X-Environment', value: 'private1' }], + }, + comment: req1.name, + }, + ], + }, + }); + expect(exportRequestsData.log.entries.length).toBe(1); }); it('exports all workspaces as an HTTP Archive', async () => { const wrk1 = await models.workspace.create({ @@ -132,39 +151,47 @@ describe('exportHAR()', () => { }); const includePrivateDocs = false; - const json = await importUtil.exportHAR(null, includePrivateDocs); + const json = await importUtil.exportWorkspacesHAR(null, includePrivateDocs); const data = JSON.parse(json); expect(data).toMatchObject({ log: { - entries: [ - { - request: { + entries: expect.arrayContaining([ + expect.objectContaining({ + request: expect.objectContaining({ headers: [{ name: 'X-Environment', value: 'public1' }], - }, + }), comment: 'Request 1', - }, - { - request: { + }), + expect.objectContaining({ + request: expect.objectContaining({ headers: [{ name: 'X-Environment', value: 'base2' }], - }, + }), comment: 'Request 2', - }, - ], + }), + ]), }, }); }); }); -describe('exportJSON()', () => { +describe('export', () => { beforeEach(globalBeforeEach); - it('exports all workspaces', async () => { + it('exports all workspaces and some requests only', async () => { const w = await models.workspace.create({ name: 'Workspace' }); const jar = await models.cookieJar.getOrCreateForParentId(w._id); const r1 = await models.request.create({ - name: 'Request', + name: 'Request 1', parentId: w._id, }); + const f2 = await models.requestGroup.create({ + name: 'Folder 2', + parentId: w._id, + }); + const r2 = await models.request.create({ + name: 'Request 2', + parentId: f2._id, + }); const eBase = await models.environment.getOrCreateForWorkspace(w); const ePub = await models.environment.create({ name: 'Public', @@ -176,18 +203,56 @@ describe('exportJSON()', () => { parentId: eBase._id, }); - const json = await importUtil.exportJSON(); - const data = JSON.parse(json); + // Test export whole workspace. + const exportedWorkspacesJson = await importUtil.exportWorkspacesData(null, false, 'json'); + const exportedWorkspacesYaml = await importUtil.exportWorkspacesData(null, false, 'yaml'); + const exportWorkspacesDataJson = JSON.parse(exportedWorkspacesJson); + const exportWorkspacesDataYaml = YAML.parse(exportedWorkspacesYaml); - expect(data._type).toBe('export'); - expect(data.__export_format).toBe(3); - expect(data.__export_date).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/); - expect(data.__export_source).toBe(`insomnia.desktop.app:v${getAppVersion()}`); - expect(data.resources[0]._id).toBe(w._id); - expect(data.resources[1]._id).toBe(eBase._id); - expect(data.resources[2]._id).toBe(jar._id); - expect(data.resources[3]._id).toBe(r1._id); - expect(data.resources[4]._id).toBe(ePub._id); - expect(data.resources.length).toBe(5); + // Ensure JSON is the same as YAML + expect(exportWorkspacesDataJson.resources).toEqual(exportWorkspacesDataYaml.resources); + + expect(exportWorkspacesDataJson).toMatchObject({ + _type: 'export', + __export_format: 4, + __export_date: expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/), + __export_source: `insomnia.desktop.app:v${getAppVersion()}`, + resources: expect.arrayContaining([ + expect.objectContaining({ _id: w._id }), + expect.objectContaining({ _id: eBase._id }), + expect.objectContaining({ _id: jar._id }), + expect.objectContaining({ _id: r1._id }), + expect.objectContaining({ _id: f2._id }), + expect.objectContaining({ _id: r2._id }), + expect.objectContaining({ _id: ePub._id }), + ]), + }); + expect(exportWorkspacesDataJson.resources.length).toBe(7); + + // Test export some requests only. + const exportRequestsJson = await importUtil.exportRequestsData([r1], false, 'json'); + const exportRequestsYaml = await importUtil.exportRequestsData([r1], false, 'yaml'); + const exportRequestsDataJSON = JSON.parse(exportRequestsJson); + const exportRequestsDataYAML = YAML.parse(exportRequestsYaml); + + expect(exportRequestsDataJSON).toMatchObject({ + _type: 'export', + __export_format: 4, + __export_date: expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/), + __export_source: `insomnia.desktop.app:v${getAppVersion()}`, + resources: expect.arrayContaining([ + expect.objectContaining({ _id: w._id }), + expect.objectContaining({ _id: eBase._id }), + expect.objectContaining({ _id: jar._id }), + expect.objectContaining({ _id: r1._id }), + expect.objectContaining({ _id: ePub._id }), + ]), + }); + + expect(exportRequestsDataJSON.resources.length).toBe(5); + expect(exportRequestsDataYAML.resources.length).toBe(5); + + // Ensure JSON and YAML are the same + expect(exportRequestsDataJSON.resources).toEqual(exportRequestsDataYAML.resources); }); }); diff --git a/packages/insomnia-app/app/common/__tests__/misc.test.js b/packages/insomnia-app/app/common/__tests__/misc.test.js index 172e3a3bab..00aa6b06e9 100644 --- a/packages/insomnia-app/app/common/__tests__/misc.test.js +++ b/packages/insomnia-app/app/common/__tests__/misc.test.js @@ -171,3 +171,25 @@ describe('fuzzyMatchAll()', () => { expect(misc.fuzzyMatchAll('wrong this ou', ['testing', 'this', 'out'])).toEqual(null); }); }); + +describe('chunkArray()', () => { + it('works with exact divisor', () => { + const chunks = misc.chunkArray([1, 2, 3, 4, 5, 6], 3); + expect(chunks).toEqual([[1, 2, 3], [4, 5, 6]]); + }); + + it('works with weird divisor', () => { + const chunks = misc.chunkArray([1, 2, 3, 4, 5, 6], 4); + expect(chunks).toEqual([[1, 2, 3, 4], [5, 6]]); + }); + + it('works with empty', () => { + const chunks = misc.chunkArray([], 4); + expect(chunks).toEqual([]); + }); + + it('works with less than one chunk', () => { + const chunks = misc.chunkArray([1, 2], 4); + expect(chunks).toEqual([[1, 2]]); + }); +}); diff --git a/packages/insomnia-app/app/common/constants.js b/packages/insomnia-app/app/common/constants.js index acc42e5f75..eea65f0eb0 100644 --- a/packages/insomnia-app/app/common/constants.js +++ b/packages/insomnia-app/app/common/constants.js @@ -57,7 +57,6 @@ export function getClientString() { // Global Stuff export const DB_PERSIST_INTERVAL = 1000 * 60 * 60 * 2; // Compact every couple hour export const DEBOUNCE_MILLIS = 100; -export const MAX_RESPONSES = 20; export const REQUEST_TIME_TO_SHOW_COUNTER = 1; // Seconds export const GA_ID = 'UA-86416787-1'; export const GA_LOCATION = 'https://desktop.insomnia.rest/'; @@ -69,6 +68,12 @@ export const FLEXIBLE_URL_REGEX = /^(http|https):\/\/[\wàâäèéêëîïôóœ export const CHECK_FOR_UPDATES_INTERVAL = 1000 * 60 * 60 * 3; // 3 hours export const PLUGIN_PATH = path.join(getDataDirectory(), 'plugins'); +// Available editor key maps +export const EDITOR_KEY_MAP_DEFAULT = 'default'; +export const EDITOR_KEY_MAP_EMACS = 'emacs'; +export const EDITOR_KEY_MAP_SUBLIME = 'sublime'; +export const EDITOR_KEY_MAP_VIM = 'vim'; + // Hotkeys export const MNEMONIC_SYM = isMac() ? '' : '&'; export const CTRL_SYM = isMac() ? '⌃' : 'Ctrl'; @@ -82,6 +87,9 @@ export const UPDATE_CHANNEL_BETA = 'beta'; export const UPDATE_URL_MAC = 'https://updates.insomnia.rest/builds/check/mac'; export const UPDATE_URL_WINDOWS = 'https://updates.insomnia.rest/updates/win'; +// API +export const API_BASE_URL = 'https://api.insomnia.rest'; + // UI Stuff export const MAX_SIDEBAR_REMS = 45; export const MIN_SIDEBAR_REMS = 0.75; diff --git a/packages/insomnia-app/app/common/database.js b/packages/insomnia-app/app/common/database.js index 586c821a3f..45074e6580 100644 --- a/packages/insomnia-app/app/common/database.js +++ b/packages/insomnia-app/app/common/database.js @@ -77,8 +77,12 @@ export async function init(types: Array, config: Object = {}, forceReset delete db._empty; electron.ipcMain.on('db.fn', async (e, fnName, replyChannel, ...args) => { - const result = await database[fnName](...args); - e.sender.send(replyChannel, result); + try { + const result = await database[fnName](...args); + e.sender.send(replyChannel, null, result); + } catch (err) { + e.sender.send(replyChannel, { message: err.message, stack: err.stack }); + } }); // NOTE: Only repair the DB if we're not running in memory. Repairing here causes tests to @@ -345,7 +349,13 @@ export const insert = (database.insert = async function( if (db._empty) return _send('insert', ...arguments); return new Promise(async (resolve, reject) => { - const docWithDefaults = await models.initModel(doc.type, doc); + let docWithDefaults; + try { + docWithDefaults = await models.initModel(doc.type, doc); + } catch (err) { + return reject(err); + } + db[doc.type].insert(docWithDefaults, (err, newDoc) => { if (err) { return reject(err); @@ -366,7 +376,13 @@ export const update = (database.update = async function( if (db._empty) return _send('update', ...arguments); return new Promise(async (resolve, reject) => { - const docWithDefaults = await models.initModel(doc.type, doc); + let docWithDefaults; + try { + docWithDefaults = await models.initModel(doc.type, doc); + } catch (err) { + return reject(err); + } + db[doc.type].update({ _id: docWithDefaults._id }, docWithDefaults, err => { if (err) { return reject(err); @@ -433,6 +449,31 @@ export const removeWhere = (database.removeWhere = async function( await database.flushChanges(flushId); }); +export const batchModifyDocs = (database.batchModifyDocs = async function(operations: { + upsert: Array, + remove: Array, +}): Promise { + if (db._empty) return _send('batchModifyDocs', ...arguments); + + const flushId = await bufferChanges(); + + const promisesUpserted = []; + const promisesDeleted = []; + for (const doc: BaseModel of operations.upsert) { + promisesUpserted.push(upsert(doc, true)); + } + + for (const doc: BaseModel of operations.remove) { + promisesDeleted.push(unsafeRemove(doc, true)); + } + + // Perform from least to most dangerous + await Promise.all(promisesUpserted); + await Promise.all(promisesDeleted); + + await flushChanges(flushId); +}); + // ~~~~~~~~~~~~~~~~~~~ // // DEFAULT MODEL STUFF // // ~~~~~~~~~~~~~~~~~~~ // @@ -595,8 +636,12 @@ async function _send(fnName: string, ...args: Array): Promise { return new Promise((resolve, reject) => { const replyChannel = `db.fn.reply:${uuid.v4()}`; electron.ipcRenderer.send('db.fn', fnName, replyChannel, ...args); - electron.ipcRenderer.once(replyChannel, (e, result) => { - resolve(result); + electron.ipcRenderer.once(replyChannel, (e, err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } }); }); } diff --git a/packages/insomnia-app/app/common/fetch.js b/packages/insomnia-app/app/common/fetch.js deleted file mode 100644 index 4b4ebc1a9e..0000000000 --- a/packages/insomnia-app/app/common/fetch.js +++ /dev/null @@ -1,87 +0,0 @@ -import 'whatwg-fetch'; -import { parse as urlParse } from 'url'; -import { getClientString } from './constants'; -import * as session from '../sync/session'; -import * as zlib from 'zlib'; - -let commandListeners = []; - -export function onCommand(callback) { - commandListeners.push(callback); -} - -export function offCommand(callback) { - commandListeners = commandListeners.filter(l => l !== callback); -} - -export function post(path, obj) { - return _fetch('POST', path, obj); -} - -export function get(path, sessionId = null) { - return _fetch('GET', path, null, sessionId); -} - -export function del(path, sessionId = null) { - return _fetch('DELETE', path, null, sessionId); -} - -export function put(path, sessionId = null) { - return _fetch('PUT', path, null, sessionId); -} - -export function rawFetch(...args) { - return window.fetch(...args); -} - -async function _fetch(method, path, obj, sessionId = null) { - const config = { - method: method, - headers: new window.Headers(), - }; - - // Set some client information - config.headers.set('X-Insomnia-Client', getClientString()); - - if (obj) { - config.body = zlib.gzipSync(JSON.stringify(obj)); - config.headers.set('Content-Type', 'application/json'); - config.headers.set('Content-Encoding', 'gzip'); - } - - sessionId = sessionId || session.getCurrentSessionId(); - if (sessionId) { - config.headers.set('X-Session-Id', sessionId); - } - - const response = await window.fetch(_getUrl(path), config); - const uri = response.headers.get('x-insomnia-command'); - uri && _notifyCommandListeners(uri); - - if (!response.ok) { - const err = new Error(`Response ${response.status} for ${path}`); - err.message = await response.text(); - err.statusCode = response.status; - throw err; - } - - if (response.headers.get('content-type') === 'application/json' || path.match(/\.json$/)) { - return response.json(); - } else { - return response.text(); - } -} - -function _getUrl(path) { - const baseUrl = process.env.INSOMNIA_SYNC_URL || 'https://api.insomnia.rest'; - return `${baseUrl}${path}`; -} - -function _notifyCommandListeners(uri) { - const parsed = urlParse(uri, true); - - const command = `${parsed.hostname}${parsed.pathname}`; - const args = JSON.parse(JSON.stringify(parsed.query)); - - commandListeners.map(fn => fn(command, args)); -} diff --git a/packages/insomnia-app/app/common/har.js b/packages/insomnia-app/app/common/har.js index 4065bd38dc..39bd1dcf3b 100644 --- a/packages/insomnia-app/app/common/har.js +++ b/packages/insomnia-app/app/common/har.js @@ -441,21 +441,25 @@ function getResponseContent(response: ResponseModel): HarContent { } function getResponseHeaders(response: ResponseModel): Array { - return response.headers.filter(header => header.name).map(h => { - return { - name: h.name, - value: h.value, - }; - }); + return response.headers + .filter(header => header.name) + .map(h => { + return { + name: h.name, + value: h.value, + }; + }); } function getRequestHeaders(renderedRequest: RenderedRequest): Array { - return renderedRequest.headers.filter(header => header.name).map(header => { - return { - name: header.name, - value: header.value, - }; - }); + return renderedRequest.headers + .filter(header => header.name) + .map(header => { + return { + name: header.name, + value: header.value, + }; + }); } function getRequestQueryString(renderedRequest: RenderedRequest): Array { diff --git a/packages/insomnia-app/app/common/import.js b/packages/insomnia-app/app/common/import.js index 2efb03e6f5..1f5f39b97f 100644 --- a/packages/insomnia-app/app/common/import.js +++ b/packages/insomnia-app/app/common/import.js @@ -1,5 +1,6 @@ // @flow import { convert } from 'insomnia-importers'; +import clone from 'clone'; import * as db from './database'; import * as har from './har'; import type { BaseModel } from '../models/index'; @@ -7,13 +8,13 @@ import * as models from '../models/index'; import { getAppVersion } from './constants'; import { showModal } from '../ui/components/modals/index'; import AlertModal from '../ui/components/modals/alert-modal'; -import * as fetch from './fetch'; import fs from 'fs'; import type { Workspace } from '../models/workspace'; import type { Environment } from '../models/environment'; import { fnOrString, generateId } from './misc'; +import YAML from 'yaml'; -const EXPORT_FORMAT = 3; +const EXPORT_FORMAT = 4; const EXPORT_TYPE_REQUEST = 'request'; const EXPORT_TYPE_REQUEST_GROUP = 'request_group'; @@ -35,7 +36,7 @@ const MODELS = { export async function importUri(workspaceId: string | null, uri: string): Promise { let rawText; if (uri.match(/^(http|https):\/\//)) { - const response = await fetch.rawFetch(uri); + const response = await window.fetch(uri); rawText = await response.text(); } else if (uri.match(/^(file):\/\//)) { const path = uri.replace(/^(file):\/\//, ''); @@ -188,52 +189,81 @@ export async function importRaw( }; } -export async function exportHAR( +export async function exportWorkspacesHAR( parentDoc: BaseModel | null = null, includePrivateDocs: boolean = false, ): Promise { - let workspaces; - if (parentDoc) { - workspaces = [parentDoc]; - } else { - workspaces = await models.workspace.all(); + const docs: Array = await getDocWithDescendants(parentDoc, includePrivateDocs); + const requests: Array = docs.filter(doc => doc.type === models.request.type); + return exportRequestsHAR(requests, includePrivateDocs); +} + +export async function exportRequestsHAR( + requests: Array, + includePrivateDocs: boolean = false, +): Promise { + const workspaces: Array = []; + const mapRequestIdToWorkspace: Object = {}; + const workspaceLookup: Object = {}; + for (const request of requests) { + const ancestors: Array = await db.withAncestors(request, [ + models.workspace.type, + models.requestGroup.type, + ]); + const workspace = ancestors.find(ancestor => ancestor.type === models.workspace.type); + mapRequestIdToWorkspace[request._id] = workspace; + if (workspace == null || workspaceLookup.hasOwnProperty(workspace._id)) { + continue; + } + workspaceLookup[workspace._id] = true; + workspaces.push(workspace); } - const workspaceEnvironmentLookup = {}; - for (let workspace of workspaces) { + const mapWorkspaceIdToEnvironmentId: Object = {}; + for (const workspace of workspaces) { const workspaceMeta = await models.workspaceMeta.getByParentId(workspace._id); let environmentId = workspaceMeta ? workspaceMeta.activeEnvironmentId : null; const environment = await models.environment.getById(environmentId || 'n/a'); if (!environment || (environment.isPrivate && !includePrivateDocs)) { environmentId = 'n/a'; } - workspaceEnvironmentLookup[workspace._id] = environmentId; + mapWorkspaceIdToEnvironmentId[workspace._id] = environmentId; } - const requests = []; - for (let workspace of workspaces) { - const docs: Array = await getDocWithDescendants(workspace, includePrivateDocs); - const workspaceRequests = docs - .filter(d => d.type === models.request.type) - .sort((a: Object, b: Object) => (a.metaSortKey < b.metaSortKey ? -1 : 1)) - .map((request: BaseModel) => { - return { - requestId: request._id, - environmentId: workspaceEnvironmentLookup[workspace._id], - }; - }); - - requests.push(...workspaceRequests); + requests = requests.sort((a: Object, b: Object) => (a.metaSortKey < b.metaSortKey ? -1 : 1)); + const harRequests: Array = []; + for (const request of requests) { + const workspace = mapRequestIdToWorkspace[request._id]; + if (workspace == null) { + // Workspace not found for request, so don't export it. + continue; + } + const environmentId = mapWorkspaceIdToEnvironmentId[workspace._id]; + harRequests.push({ + requestId: request._id, + environmentId: environmentId, + }); } - const data = await har.exportHar(requests); + const data = await har.exportHar(harRequests); return JSON.stringify(data, null, '\t'); } -export async function exportJSON( - parentDoc: BaseModel | null = null, - includePrivateDocs: boolean = false, +export async function exportWorkspacesData( + parentDoc: BaseModel | null, + includePrivateDocs: boolean, + format: 'json' | 'yaml', +): Promise { + const docs: Array = await getDocWithDescendants(parentDoc, includePrivateDocs); + const requests: Array = docs.filter(doc => doc.type === models.request.type); + return exportRequestsData(requests, includePrivateDocs, format); +} + +export async function exportRequestsData( + requests: Array, + includePrivateDocs: boolean, + format: 'json' | 'yaml', ): Promise { const data = { _type: 'export', @@ -243,18 +273,49 @@ export async function exportJSON( resources: [], }; - const docs: Array = await getDocWithDescendants(parentDoc, includePrivateDocs); + const docs: Array = []; + const workspaces: Array = []; + const mapTypeAndIdToDoc: Object = {}; + for (const req of requests) { + const ancestors: Array = clone(await db.withAncestors(req)); + for (const ancestor of ancestors) { + const key = ancestor.type + '___' + ancestor._id; + if (mapTypeAndIdToDoc.hasOwnProperty(key)) { + continue; + } + mapTypeAndIdToDoc[key] = ancestor; + docs.push(ancestor); + if (ancestor.type === models.workspace.type) { + workspaces.push(ancestor); + } + } + } + + for (const workspace of workspaces) { + const descendants: Array = (await db.withDescendants(workspace)).filter(d => { + // Only interested in these additional model types. + return d.type === models.cookieJar.type || d.type === models.environment.type; + }); + docs.push(...descendants); + } data.resources = docs - .filter( - d => - // Only export these model types - d.type === models.request.type || - d.type === models.requestGroup.type || - d.type === models.workspace.type || - d.type === models.cookieJar.type || - d.type === models.environment.type, - ) + .filter(d => { + // Only export these model types. + if ( + !( + d.type === models.request.type || + d.type === models.requestGroup.type || + d.type === models.workspace.type || + d.type === models.cookieJar.type || + d.type === models.environment.type + ) + ) { + return false; + } + // BaseModel doesn't have isPrivate, so cast it first. + return !(d: Object).isPrivate || includePrivateDocs; + }) .map((d: Object) => { if (d.type === models.workspace.type) { d._type = EXPORT_TYPE_WORKSPACE; @@ -273,7 +334,13 @@ export async function exportJSON( return d; }); - return JSON.stringify(data, null, '\t'); + if (format.toLowerCase() === 'yaml') { + return YAML.stringify(data); + } else if (format.toLowerCase() === 'json') { + return JSON.stringify(data); + } else { + throw new Error(`Invalid export format ${format}. Must be "json" or "yaml"`); + } } async function getDocWithDescendants( diff --git a/packages/insomnia-app/app/common/misc.js b/packages/insomnia-app/app/common/misc.js index bda01c2889..a098b76a3e 100644 --- a/packages/insomnia-app/app/common/misc.js +++ b/packages/insomnia-app/app/common/misc.js @@ -339,3 +339,12 @@ export function getDataDirectory(): string { const { app } = electron.remote || electron; return process.env.INSOMNIA_DATA_PATH || app.getPath('userData'); } + +export function chunkArray(arr: Array, chunkSize: number): Array> { + const chunks = []; + for (let i = 0, j = arr.length; i < j; i += chunkSize) { + chunks.push(arr.slice(i, i + chunkSize)); + } + + return chunks; +} diff --git a/packages/insomnia-app/app/main.development.js b/packages/insomnia-app/app/main.development.js index ddc0d2c5b0..8dcf85e582 100644 --- a/packages/insomnia-app/app/main.development.js +++ b/packages/insomnia-app/app/main.development.js @@ -80,8 +80,19 @@ function _launchApp() { }); // Called when second instance launched with args (Windows) - app.makeSingleInstance(args => { - args.length && window.send('run-command', args[0]); + const gotTheLock = app.requestSingleInstanceLock(); + + if (!gotTheLock) { + console.error('[app] Failed to get instance lock'); + return; + } + + app.on('second-instance', (event, commandLine, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (window) { + if (window.isMinimized()) window.restore(); + window.focus(); + } }); // Handle URLs when app already open diff --git a/packages/insomnia-app/app/main/window-utils.js b/packages/insomnia-app/app/main/window-utils.js index 5310aded46..dc10f946f4 100644 --- a/packages/insomnia-app/app/main/window-utils.js +++ b/packages/insomnia-app/app/main/window-utils.js @@ -149,27 +149,27 @@ export function createWindow() { label: `${MNEMONIC_SYM}Actual Size`, accelerator: 'CmdOrCtrl+0', click: () => { - const window = BrowserWindow.getFocusedWindow(); - if (!window || !window.webContents) { + const w = BrowserWindow.getFocusedWindow(); + if (!w || !w.webContents) { return; } const zoomFactor = 1; - window.webContents.setZoomFactor(zoomFactor); + w.webContents.setZoomFactor(zoomFactor); saveZoomFactor(zoomFactor); }, }, { label: `Zoom ${MNEMONIC_SYM}In`, - accelerator: isMac() ? 'CmdOrCtrl+Plus' : 'CmdOrCtrl+=', + accelerator: 'CmdOrCtrl+=', click: () => { - const window = BrowserWindow.getFocusedWindow(); - if (!window || !window.webContents) { + const w = BrowserWindow.getFocusedWindow(); + if (!w || !w.webContents) { return; } const zoomFactor = Math.min(1.8, getZoomFactor() + 0.05); - window.webContents.setZoomFactor(zoomFactor); + w.webContents.setZoomFactor(zoomFactor); saveZoomFactor(zoomFactor); }, @@ -178,27 +178,16 @@ export function createWindow() { label: `Zoom ${MNEMONIC_SYM}Out`, accelerator: 'CmdOrCtrl+-', click: () => { - const window = BrowserWindow.getFocusedWindow(); - if (!window || !window.webContents) { + const w = BrowserWindow.getFocusedWindow(); + if (!w || !w.webContents) { return; } const zoomFactor = Math.max(0.5, getZoomFactor() - 0.05); - window.webContents.setZoomFactor(zoomFactor); + w.webContents.setZoomFactor(zoomFactor); saveZoomFactor(zoomFactor); }, }, - { - label: `Toggle ${MNEMONIC_SYM}Sidebar`, - click: () => { - const window = BrowserWindow.getFocusedWindow(); - if (!window || !window.webContents) { - return; - } - - window.webContents.send('toggle-sidebar'); - }, - }, { label: `Toggle ${MNEMONIC_SYM}DevTools`, click: () => mainWindow.toggleDevTools(), @@ -228,16 +217,17 @@ export function createWindow() { }, { label: `${MNEMONIC_SYM}Keyboard Shortcuts`, - click: (menuItem, window, e) => { - if (!window || !window.webContents) { + accelerator: 'CmdOrCtrl+Shift+?', + click: (menuItem, w, e) => { + if (!w || !w.webContents) { return; } - window.webContents.send('toggle-preferences-shortcuts'); + w.webContents.send('toggle-preferences-shortcuts'); }, }, { label: `Show App ${MNEMONIC_SYM}Data Folder`, - click: (menuItem, window, e) => { + click: (menuItem, w, e) => { const directory = misc.getDataDirectory(); shell.showItemInFolder(directory); }, @@ -317,12 +307,12 @@ export function createWindow() { { label: `${MNEMONIC_SYM}Reload Plugins`, click: () => { - const window = BrowserWindow.getFocusedWindow(); - if (!window || !window.webContents) { + const w = BrowserWindow.getFocusedWindow(); + if (!w || !w.webContents) { return; } - window.webContents.send('reload-plugins'); + w.webContents.send('reload-plugins'); }, }, ], diff --git a/packages/insomnia-app/app/models/client-certificate.js b/packages/insomnia-app/app/models/client-certificate.js index a9f599e039..2cbd7b8ad5 100644 --- a/packages/insomnia-app/app/models/client-certificate.js +++ b/packages/insomnia-app/app/models/client-certificate.js @@ -6,6 +6,7 @@ export const name = 'Client Certificate'; export const type = 'ClientCertificate'; export const prefix = 'crt'; export const canDuplicate = true; +export const canSync = false; type BaseClientCertificate = { parentId: string, diff --git a/packages/insomnia-app/app/models/cookie-jar.js b/packages/insomnia-app/app/models/cookie-jar.js index d39a884829..adc02cf630 100644 --- a/packages/insomnia-app/app/models/cookie-jar.js +++ b/packages/insomnia-app/app/models/cookie-jar.js @@ -1,4 +1,5 @@ // @flow +import crypto from 'crypto'; import * as db from '../common/database'; import type { BaseModel } from './index'; @@ -6,6 +7,7 @@ export const name = 'Cookie Jar'; export const type = 'CookieJar'; export const prefix = 'jar'; export const canDuplicate = true; +export const canSync = false; export type Cookie = { id: string, @@ -44,7 +46,7 @@ export function migrate(doc: CookieJar): CookieJar { return doc; } -export function create(patch: Object = {}) { +export async function create(patch: Object = {}) { if (!patch.parentId) { throw new Error(`New CookieJar missing \`parentId\`: ${JSON.stringify(patch)}`); } @@ -55,21 +57,30 @@ export function create(patch: Object = {}) { export async function getOrCreateForParentId(parentId: string) { const cookieJars = await db.find(type, { parentId }); if (cookieJars.length === 0) { - return create({ parentId }); + return create({ + parentId, + + // Deterministic ID. It helps reduce sync complexity since we won't have to + // de-duplicate environments. + _id: `${prefix}_${crypto + .createHash('sha1') + .update(parentId) + .digest('hex')}`, + }); } else { return cookieJars[0]; } } -export function all() { +export async function all(): Promise> { return db.all(type); } -export function getById(id: string) { +export async function getById(id: string) { return db.get(type, id); } -export function update(cookieJar: CookieJar, patch: Object = {}) { +export async function update(cookieJar: CookieJar, patch: Object = {}) { return db.docUpdate(cookieJar, patch); } diff --git a/packages/insomnia-app/app/models/environment.js b/packages/insomnia-app/app/models/environment.js index 22fa339b72..ee97d8740f 100644 --- a/packages/insomnia-app/app/models/environment.js +++ b/packages/insomnia-app/app/models/environment.js @@ -1,4 +1,5 @@ // @flow +import * as crypto from 'crypto'; import * as db from '../common/database'; import type { BaseModel } from './index'; import type { Workspace } from './workspace'; @@ -7,6 +8,7 @@ export const name = 'Environment'; export const type = 'Environment'; export const prefix = 'env'; export const canDuplicate = true; +export const canSync = true; type BaseEnvironment = { name: string, @@ -57,6 +59,13 @@ export async function getOrCreateForWorkspaceId(workspaceId: string): Promise { return all().map(model => model.type); } +export function canSync(d: BaseModel): boolean { + if ((d: any).isPrivate) { + return false; + } + + const m = getModel(d.type); + if (!m) { + return false; + } + + return m.canSync || false; +} + export function getModel(type: string): Object | null { return all().find(m => m.type === type) || null; } diff --git a/packages/insomnia-app/app/models/o-auth-2-token.js b/packages/insomnia-app/app/models/o-auth-2-token.js index 53f8ccde87..a33116b059 100644 --- a/packages/insomnia-app/app/models/o-auth-2-token.js +++ b/packages/insomnia-app/app/models/o-auth-2-token.js @@ -24,6 +24,7 @@ export const name = 'OAuth 2.0 Token'; export const type = 'OAuth2Token'; export const prefix = 'oa2'; export const canDuplicate = false; +export const canSync = false; export function init(): BaseOAuth2Token { return { diff --git a/packages/insomnia-app/app/models/plugin-data.js b/packages/insomnia-app/app/models/plugin-data.js index fd0d028e75..88671210f5 100644 --- a/packages/insomnia-app/app/models/plugin-data.js +++ b/packages/insomnia-app/app/models/plugin-data.js @@ -6,6 +6,7 @@ export const name = 'PluginData'; export const type = 'PluginData'; export const prefix = 'plg'; export const canDuplicate = false; +export const canSync = false; type BasePluginData = { plugin: string, diff --git a/packages/insomnia-app/app/models/request-group-meta.js b/packages/insomnia-app/app/models/request-group-meta.js index f921aa2d27..f7f2d82477 100644 --- a/packages/insomnia-app/app/models/request-group-meta.js +++ b/packages/insomnia-app/app/models/request-group-meta.js @@ -4,6 +4,7 @@ export const name = 'Folder Meta'; export const type = 'RequestGroupMeta'; export const prefix = 'fldm'; export const canDuplicate = false; +export const canSync = false; export function init() { return { diff --git a/packages/insomnia-app/app/models/request-group.js b/packages/insomnia-app/app/models/request-group.js index 907b8b7d3d..16919507d0 100644 --- a/packages/insomnia-app/app/models/request-group.js +++ b/packages/insomnia-app/app/models/request-group.js @@ -6,6 +6,7 @@ export const name = 'Folder'; export const type = 'RequestGroup'; export const prefix = 'fld'; export const canDuplicate = true; +export const canSync = true; type BaseRequestGroup = { name: string, diff --git a/packages/insomnia-app/app/models/request-meta.js b/packages/insomnia-app/app/models/request-meta.js index 17760f08bb..5cbe887e3a 100644 --- a/packages/insomnia-app/app/models/request-meta.js +++ b/packages/insomnia-app/app/models/request-meta.js @@ -5,6 +5,7 @@ export const name = 'Request Meta'; export const type = 'RequestMeta'; export const prefix = 'reqm'; export const canDuplicate = false; +export const canSync = false; export function init() { return { diff --git a/packages/insomnia-app/app/models/request-version.js b/packages/insomnia-app/app/models/request-version.js index 0a96be8df3..c8126f3606 100644 --- a/packages/insomnia-app/app/models/request-version.js +++ b/packages/insomnia-app/app/models/request-version.js @@ -6,6 +6,7 @@ export const name = 'Request Version'; export const type = 'RequestVersion'; export const prefix = 'rvr'; export const canDuplicate = false; +export const canSync = false; const FIELDS_TO_IGNORE = [ '_id', diff --git a/packages/insomnia-app/app/models/request.js b/packages/insomnia-app/app/models/request.js index 2d519d6021..13f2bc984f 100644 --- a/packages/insomnia-app/app/models/request.js +++ b/packages/insomnia-app/app/models/request.js @@ -32,6 +32,7 @@ export const name = 'Request'; export const type = 'Request'; export const prefix = 'req'; export const canDuplicate = true; +export const canSync = true; export type RequestAuthentication = Object; @@ -357,7 +358,7 @@ export function remove(request: Request): Promise { return db.remove(request); } -export function all() { +export async function all(): Promise> { return db.all(type); } diff --git a/packages/insomnia-app/app/models/response.js b/packages/insomnia-app/app/models/response.js index 08f76ed0a1..9407722f6b 100644 --- a/packages/insomnia-app/app/models/response.js +++ b/packages/insomnia-app/app/models/response.js @@ -8,7 +8,6 @@ import crypto from 'crypto'; import path from 'path'; import zlib from 'zlib'; import mkdirp from 'mkdirp'; -import { MAX_RESPONSES } from '../common/constants'; import * as db from '../common/database'; import { getDataDirectory } from '../common/misc'; @@ -16,6 +15,7 @@ export const name = 'Response'; export const type = 'Response'; export const prefix = 'res'; export const canDuplicate = false; +export const canSync = false; export type ResponseHeader = { name: string, @@ -97,7 +97,7 @@ export function getById(id: string) { return db.get(type, id); } -export function all() { +export async function all(): Promise> { return db.all(type); } @@ -123,7 +123,7 @@ export async function getLatestForRequest(requestId: string): Promise r._id); await db.removeWhere(type, { parentId, _id: { $nin: recentIds } }); diff --git a/packages/insomnia-app/app/models/settings.js b/packages/insomnia-app/app/models/settings.js index c1dfd93b81..c919974cae 100644 --- a/packages/insomnia-app/app/models/settings.js +++ b/packages/insomnia-app/app/models/settings.js @@ -23,6 +23,7 @@ type BaseSettings = { autoHideMenuBar: boolean, theme: string, maxRedirects: number, + maxHistoryResponses: number, pluginPath: string, nunjucksPowerUserMode: boolean, deviceId: string | null, @@ -35,6 +36,9 @@ type BaseSettings = { fontInterface: string | null, fontSize: number, fontVariantLigatures: boolean, + + // Feature flags + enableSyncBeta: boolean, hotKeyRegistry: hotkeys.HotKeyRegistry, }; @@ -44,6 +48,7 @@ export const name = 'Settings'; export const type = 'Settings'; export const prefix = 'set'; export const canDuplicate = false; +export const canSync = false; export function init(): BaseSettings { return { @@ -59,6 +64,7 @@ export function init(): BaseSettings { httpsProxy: '', noProxy: '', maxRedirects: -1, + maxHistoryResponses: 20, proxyEnabled: false, timeout: 0, validateSSL: true, @@ -77,6 +83,7 @@ export function init(): BaseSettings { fontInterface: null, fontSize: 13, fontVariantLigatures: false, + enableSyncBeta: false, hotKeyRegistry: hotkeys.newDefaultRegistry(), }; } diff --git a/packages/insomnia-app/app/models/stats.js b/packages/insomnia-app/app/models/stats.js index eb01e991cc..6691880269 100644 --- a/packages/insomnia-app/app/models/stats.js +++ b/packages/insomnia-app/app/models/stats.js @@ -6,6 +6,7 @@ export const name = 'Stats'; export const type = 'Stats'; export const prefix = 'sta'; export const canDuplicate = false; +export const canSync = false; type BaseStats = { currentLaunch: number | null, diff --git a/packages/insomnia-app/app/models/workspace-meta.js b/packages/insomnia-app/app/models/workspace-meta.js index dfeef9dcff..6c4171d989 100644 --- a/packages/insomnia-app/app/models/workspace-meta.js +++ b/packages/insomnia-app/app/models/workspace-meta.js @@ -11,6 +11,7 @@ export const name = 'Workspace Meta'; export const type = 'WorkspaceMeta'; export const prefix = 'wrkm'; export const canDuplicate = false; +export const canSync = false; type BaseWorkspaceMeta = { activeRequestId: string | null, diff --git a/packages/insomnia-app/app/models/workspace.js b/packages/insomnia-app/app/models/workspace.js index 2ab2aadaaf..1afb95320e 100644 --- a/packages/insomnia-app/app/models/workspace.js +++ b/packages/insomnia-app/app/models/workspace.js @@ -7,6 +7,7 @@ export const name = 'Workspace'; export const type = 'Workspace'; export const prefix = 'wrk'; export const canDuplicate = true; +export const canSync = true; type BaseWorkspace = { name: string, diff --git a/packages/insomnia-app/app/network/network.js b/packages/insomnia-app/app/network/network.js index 4886718c80..c9c045ecae 100644 --- a/packages/insomnia-app/app/network/network.js +++ b/packages/insomnia-app/app/network/network.js @@ -626,19 +626,21 @@ export async function _actuallySend( } // NOTE: This is last because headers might be modified multiple times - const headerStrings = headers.filter(h => h.name).map(h => { - const value = h.value || ''; - if (value === '') { - // Curl needs a semicolon suffix to send empty header values - return `${h.name};`; - } else if (value === DISABLE_HEADER_VALUE) { - // Tell Curl NOT to send the header if value is null - return `${h.name}:`; - } else { - // Send normal header value - return `${h.name}: ${value}`; - } - }); + const headerStrings = headers + .filter(h => h.name) + .map(h => { + const value = h.value || ''; + if (value === '') { + // Curl needs a semicolon suffix to send empty header values + return `${h.name};`; + } else if (value === DISABLE_HEADER_VALUE) { + // Tell Curl NOT to send the header if value is null + return `${h.name}:`; + } else { + // Send normal header value + return `${h.name}: ${value}`; + } + }); setOpt(Curl.option.HTTPHEADER, headerStrings); let responseBodyBytes = 0; diff --git a/packages/insomnia-app/app/network/o-auth-2/constants.js b/packages/insomnia-app/app/network/o-auth-2/constants.js index 68193fca0a..741d78a2d1 100644 --- a/packages/insomnia-app/app/network/o-auth-2/constants.js +++ b/packages/insomnia-app/app/network/o-auth-2/constants.js @@ -10,6 +10,7 @@ export const RESPONSE_TYPE_TOKEN = 'token'; export const RESPONSE_TYPE_ID_TOKEN_TOKEN = 'id_token token'; export const P_ACCESS_TOKEN = 'access_token'; +export const P_ID_TOKEN = 'id_token'; export const P_CLIENT_ID = 'client_id'; export const P_CLIENT_SECRET = 'client_secret'; export const P_AUDIENCE = 'audience'; diff --git a/packages/insomnia-app/app/network/o-auth-2/grant-implicit.js b/packages/insomnia-app/app/network/o-auth-2/grant-implicit.js index 979fe4e530..16677353ac 100644 --- a/packages/insomnia-app/app/network/o-auth-2/grant-implicit.js +++ b/packages/insomnia-app/app/network/o-auth-2/grant-implicit.js @@ -36,12 +36,17 @@ export default async function( const qs = buildQueryStringFromParams(params); const finalUrl = joinUrlAndQueryString(authorizationUrl, qs); - const redirectedTo = await authorizeUserInWindow(finalUrl, /(access_token=)/, /(error=)/); + const redirectedTo = await authorizeUserInWindow( + finalUrl, + /(access_token=|id_token=)/, + /(error=)/, + ); const fragment = redirectedTo.split('#')[1]; if (fragment) { - return responseToObject(fragment, [ + const results = responseToObject(fragment, [ c.P_ACCESS_TOKEN, + c.P_ID_TOKEN, c.P_TOKEN_TYPE, c.P_EXPIRES_IN, c.P_SCOPE, @@ -50,6 +55,9 @@ export default async function( c.P_ERROR_DESCRIPTION, c.P_ERROR_URI, ]); + results[c.P_ACCESS_TOKEN] = results[c.P_ACCESS_TOKEN] || results[c.P_ID_TOKEN]; + delete results[c.P_ID_TOKEN]; + return results; } else { // Bad redirect return {}; diff --git a/packages/insomnia-app/app/plugins/context/__fixtures__/basic-import.json b/packages/insomnia-app/app/plugins/context/__fixtures__/basic-import.json index df11e753b7..834dae6a62 100644 --- a/packages/insomnia-app/app/plugins/context/__fixtures__/basic-import.json +++ b/packages/insomnia-app/app/plugins/context/__fixtures__/basic-import.json @@ -1,37 +1,37 @@ { - "_type": "export", - "__export_format": 3, - "__export_date": "2017-11-24T16:14:14.805Z", - "__export_source": "insomnia.desktop.app:v5.12.0-beta.3", - "resources": [ - { - "_id": "wrk_imported_1", - "created": 888, + "_type": "export", + "__export_format": 4, + "__export_date": "2017-11-24T16:14:14.805Z", + "__export_source": "insomnia.desktop.app:v5.12.0-beta.3", + "resources": [ + { + "_id": "wrk_imported_1", + "created": 888, "modified": 999, - "description": "", - "name": "New", - "parentId": null, - "_type": "workspace" - }, - { - "_id": "req_imported_1", - "authentication": {}, - "body": {}, + "description": "", + "name": "New", + "parentId": null, + "_type": "workspace" + }, + { + "_id": "req_imported_1", + "authentication": {}, + "body": {}, "created": 111, "modified": 222, "metaSortKey": 0, - "description": "", - "headers": [], - "method": "GET", - "name": "Test", - "parameters": [], - "parentId": "wrk_imported_1", - "settingDisableRenderRequestBody": false, - "settingEncodeUrl": true, - "settingSendCookies": true, - "settingStoreCookies": true, - "url": "https://insomnia.rest", - "_type": "request" - } - ] + "description": "", + "headers": [], + "method": "GET", + "name": "Test", + "parameters": [], + "parentId": "wrk_imported_1", + "settingDisableRenderRequestBody": false, + "settingEncodeUrl": true, + "settingSendCookies": true, + "settingStoreCookies": true, + "url": "https://insomnia.rest", + "_type": "request" + } + ] } diff --git a/packages/insomnia-app/app/plugins/context/__tests__/data.test.js b/packages/insomnia-app/app/plugins/context/__tests__/data.test.js index a614c93126..83e36eeb5b 100644 --- a/packages/insomnia-app/app/plugins/context/__tests__/data.test.js +++ b/packages/insomnia-app/app/plugins/context/__tests__/data.test.js @@ -168,10 +168,10 @@ describe('app.export.*', () => { exportedData.__export_date = '2017-11-24T18:09:18.480Z'; expect(exportedData).toEqual({ __export_date: '2017-11-24T18:09:18.480Z', - __export_format: 3, + __export_format: 4, __export_source: `insomnia.desktop.app:v${getAppVersion()}`, _type: 'export', - resources: [ + resources: expect.arrayContaining([ { _id: 'wrk_1', _type: 'workspace', @@ -204,7 +204,7 @@ describe('app.export.*', () => { settingMaxTimelineDataSize: 1000, url: 'https://insomnia.rest', }, - ], + ]), }); }); diff --git a/packages/insomnia-app/app/plugins/context/data.js b/packages/insomnia-app/app/plugins/context/data.js index a92dee8871..8f62fd9fb2 100644 --- a/packages/insomnia-app/app/plugins/context/data.js +++ b/packages/insomnia-app/app/plugins/context/data.js @@ -1,5 +1,10 @@ // @flow -import { exportHAR, exportJSON, importRaw, importUri } from '../../common/import'; +import { + exportWorkspacesHAR, + exportWorkspacesData, + importRaw, + importUri, +} from '../../common/import'; export function init(): { import: Object, export: Object } { return { @@ -12,12 +17,14 @@ export function init(): { import: Object, export: Object } { }, }, export: { - async insomnia(options: { includePrivate?: boolean } = {}): Promise { + async insomnia( + options: { includePrivate?: boolean, format?: 'json' | 'yaml' } = {}, + ): Promise { options = options || {}; - return exportJSON(null, options.includePrivate); + return exportWorkspacesData(null, !!options.includePrivate, options.format || 'json'); }, async har(options: { includePrivate?: boolean } = {}): Promise { - return exportHAR(null, options.includePrivate); + return exportWorkspacesHAR(null, !!options.includePrivate); }, }, }; diff --git a/packages/insomnia-app/app/plugins/install.js b/packages/insomnia-app/app/plugins/install.js index 6d001904dc..fbb690b367 100644 --- a/packages/insomnia-app/app/plugins/install.js +++ b/packages/insomnia-app/app/plugins/install.js @@ -78,21 +78,23 @@ async function _isInsomniaPlugin(lookupName: string): Promise { }, }, (err, stdout, stderr) => { - if (err) { - reject(new Error(`${lookupName} npm error: ${err.message}`)); - return; - } - if (stderr) { - reject(new Error(`Yarn error ${stderr.toString('utf8')}`)); + reject(new Error(`Yarn error ${stderr.toString()}`)); return; } let yarnOutput; try { - yarnOutput = JSON.parse(stdout.toString('utf8')); - } catch (err) { - reject(new Error(`Yarn response not JSON: ${err.message}`)); + yarnOutput = JSON.parse(stdout.toString()); + } catch (ex) { + // Output is not JSON. Check if yarn/electron terminated with non-zero exit code. + // In certain environments electron can exit with error even if output is OK. + // Parsing is attemted before checking exit code as workaround for false errors. + if (err) { + reject(new Error(`${lookupName} npm error: ${err.message}`)); + } else { + reject(new Error(`Yarn response not JSON: ${ex.message}`)); + } return; } @@ -149,13 +151,16 @@ async function _installPluginToTmpDir(lookupName: string): Promise<{ tmpDir: str }, }, (err, stdout, stderr) => { - if (err) { + // Check yarn/electron process exit code. + // In certain environments electron can exit with error even if the command was perfomed sucesfully. + // Checking for sucess message in output is a workaround for false errors. + if (err && !stdout.toString().includes('success')) { reject(new Error(`${lookupName} install error: ${err.message}`)); return; } if (stderr) { - reject(new Error(`Yarn error ${stderr.toString('utf8')}`)); + reject(new Error(`Yarn error ${stderr.toString()}`)); return; } diff --git a/packages/insomnia-app/app/sync/__tests__/sync.test.js b/packages/insomnia-app/app/sync-legacy/__tests__/sync.test.js similarity index 88% rename from packages/insomnia-app/app/sync/__tests__/sync.test.js rename to packages/insomnia-app/app/sync-legacy/__tests__/sync.test.js index f1780c30b8..45d71e02fe 100644 --- a/packages/insomnia-app/app/sync/__tests__/sync.test.js +++ b/packages/insomnia-app/app/sync-legacy/__tests__/sync.test.js @@ -1,10 +1,11 @@ import * as sync from '../index'; -import * as session from '../session'; import * as models from '../../models'; import * as db from '../../common/database'; import * as syncStorage from '../storage'; -import * as crypt from '../crypt'; +import * as network from '../network'; import { globalBeforeEach } from '../../__jest__/before-each'; +import * as session from '../../account/session'; +import * as crypt from '../../account/crypt'; describe('Test push/pull behaviour', () => { beforeEach(async () => { @@ -59,16 +60,16 @@ describe('Test push/pull behaviour', () => { await sync.push(resourceRequest.resourceGroupId); // Force push rg_1 await sync.push(resourceRequest2.resourceGroupId); // Force push rg_2 - expect(session.syncPush.mock.calls.length).toBe(3); - expect(session.syncPush.mock.calls[0][0].length).toBe(2); - expect(session.syncPush.mock.calls[0][0][0].id).toBe('wrk_1'); - expect(session.syncPush.mock.calls[0][0][1].id).toBe('req_1'); - expect(session.syncPush.mock.calls[1][0].length).toBe(2); - expect(session.syncPush.mock.calls[1][0][0].id).toBe('wrk_1'); - expect(session.syncPush.mock.calls[1][0][1].id).toBe('req_1'); - expect(session.syncPush.mock.calls[2][0].length).toBe(2); - expect(session.syncPush.mock.calls[2][0][0].id).toBe('wrk_2'); - expect(session.syncPush.mock.calls[2][0][1].id).toBe('req_2'); + expect(network.syncPush.mock.calls.length).toBe(3); + expect(network.syncPush.mock.calls[0][0].length).toBe(2); + expect(network.syncPush.mock.calls[0][0][0].id).toBe('wrk_1'); + expect(network.syncPush.mock.calls[0][0][1].id).toBe('req_1'); + expect(network.syncPush.mock.calls[1][0].length).toBe(2); + expect(network.syncPush.mock.calls[1][0][0].id).toBe('wrk_1'); + expect(network.syncPush.mock.calls[1][0][1].id).toBe('req_1'); + expect(network.syncPush.mock.calls[2][0].length).toBe(2); + expect(network.syncPush.mock.calls[2][0][0].id).toBe('wrk_2'); + expect(network.syncPush.mock.calls[2][0][1].id).toBe('req_2'); }); it('Updates dirty flag for push response', async () => { @@ -78,7 +79,7 @@ describe('Test push/pull behaviour', () => { syncMode: syncStorage.SYNC_MODE_ON, }); - session.syncPush.mockReturnValueOnce({ + network.syncPush.mockReturnValueOnce({ updated: [], created: [{ id: request._id, version: 'new-version' }], removed: [], @@ -89,10 +90,10 @@ describe('Test push/pull behaviour', () => { await sync.push(resourceRequest.resourceGroupId); const resourceAfter = await syncStorage.getResourceByDocId(request._id); - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(2); - expect(session.syncPush.mock.calls[0][0][0].id).toBe('wrk_1'); - expect(session.syncPush.mock.calls[0][0][1].id).toBe('req_1'); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(2); + expect(network.syncPush.mock.calls[0][0][0].id).toBe('wrk_1'); + expect(network.syncPush.mock.calls[0][0][1].id).toBe('req_1'); expect(resourceBefore.dirty).toBe(true); expect(resourceAfter.dirty).toBe(false); }); @@ -122,7 +123,7 @@ describe('Test push/pull behaviour', () => { encContent: await sync.encryptDoc(resourceBefore.resourceGroupId, requestNew), }); - session.syncPull.mockReturnValueOnce({ + network.syncPull.mockReturnValueOnce({ updatedResources: [updatedResource], createdResources: [createdResourceNew], idsToPush: [], @@ -165,7 +166,7 @@ describe('Test push/pull behaviour', () => { lastEdited: resourceRequest.lastEdited - 1000, // Same edited time }); - session.syncPush.mockReturnValueOnce({ + network.syncPush.mockReturnValueOnce({ updated: [], created: [], removed: [], @@ -180,8 +181,8 @@ describe('Test push/pull behaviour', () => { const requestAfter = await models.request.getById(requestClient._id); // Assert - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(2); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(2); // Even when local wins, local resource gets the remove resource version expect(resourceAfter.version).toBe(resourceConflict.version); // Local resource gets marked as dirty so it's pushed right away @@ -202,7 +203,7 @@ describe('Test push/pull behaviour', () => { lastEdited: resourceRequest.lastEdited, // Same edited time }); - session.syncPush.mockReturnValueOnce({ + network.syncPush.mockReturnValueOnce({ updated: [], created: [], removed: [], @@ -217,8 +218,8 @@ describe('Test push/pull behaviour', () => { const requestAfter = await models.request.getById(requestClient._id); // Assert - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(2); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(2); // Even when local wins, local resource gets the remove resource version expect(resourceAfter.version).toBe(resourceConflict.version); // Local resource gets marked as dirty so it's pushed right away @@ -239,7 +240,7 @@ describe('Test push/pull behaviour', () => { lastEdited: resourceRequest.lastEdited + 1000, }); - session.syncPush.mockReturnValueOnce({ + network.syncPush.mockReturnValueOnce({ updated: [], created: [], removed: [], @@ -254,8 +255,8 @@ describe('Test push/pull behaviour', () => { const requestAfter = await models.request.getById(requestClient._id); // Assert - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(2); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(2); expect(resourceAfter.lastEdited).toBeGreaterThan(resourceRequest.lastEdited); expect(resourceAfter.version).toBe(resourceConflict.version); // Local resource gets marked as dirty so it's pushed right away @@ -365,10 +366,10 @@ describe('Integration tests for creating Resources and pushing', () => { expect(_decryptResource(resource).url).toBe('https://google.com'); expect(resource.removed).toBe(false); - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(6); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(6); - expect(session.syncPull.mock.calls).toEqual([]); + expect(network.syncPull.mock.calls).toEqual([]); }); it('Resources revived on DB change', async () => { @@ -425,10 +426,10 @@ describe('Integration tests for creating Resources and pushing', () => { expect(_decryptResource(updatedResource).name).toBe('New Name'); expect(resource.removed).toBe(false); - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(5); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(5); - expect(session.syncPull.mock.calls).toEqual([]); + expect(network.syncPull.mock.calls).toEqual([]); }); it('Resources removed on DB change', async () => { @@ -448,10 +449,10 @@ describe('Integration tests for creating Resources and pushing', () => { expect(resource.removed).toBe(false); expect(updatedResource.removed).toBe(true); - expect(session.syncPush.mock.calls.length).toBe(1); - expect(session.syncPush.mock.calls[0][0].length).toBe(5); + expect(network.syncPush.mock.calls.length).toBe(1); + expect(network.syncPush.mock.calls[0][0].length).toBe(5); - expect(session.syncPull.mock.calls).toEqual([]); + expect(network.syncPull.mock.calls).toEqual([]); }); }); @@ -508,7 +509,7 @@ async function _setSessionData() { async function _setupSessionMocks() { const resourceGroups = {}; - session.syncCreateResourceGroup = jest.fn((parentId, name, _) => { + network.syncCreateResourceGroup = jest.fn((parentId, name, _) => { const id = `rg_${Object.keys(resourceGroups).length + 1}`; // Generate a public key and use a symmetric equal to it's Id for @@ -530,7 +531,7 @@ async function _setupSessionMocks() { return resourceGroups[id]; }); - session.syncGetResourceGroup = jest.fn(id => { + network.syncGetResourceGroup = jest.fn(id => { if (resourceGroups[id]) { return resourceGroups[id]; } @@ -540,14 +541,14 @@ async function _setupSessionMocks() { throw err; }); - session.syncPull = jest.fn(body => ({ + network.syncPull = jest.fn(body => ({ updatedResources: [], createdResources: [], idsToPush: [], idsToRemove: [], })); - session.syncPush = jest.fn(body => ({ + network.syncPush = jest.fn(body => ({ conflicts: [], updated: [], created: [], diff --git a/packages/insomnia-app/app/sync/index.js b/packages/insomnia-app/app/sync-legacy/index.js similarity index 94% rename from packages/insomnia-app/app/sync/index.js rename to packages/insomnia-app/app/sync-legacy/index.js index c30a8e6e1b..17920554ec 100644 --- a/packages/insomnia-app/app/sync/index.js +++ b/packages/insomnia-app/app/sync-legacy/index.js @@ -1,11 +1,19 @@ import * as db from '../common/database'; import * as models from '../models'; -import * as crypt from './crypt'; -import * as session from './session'; import * as store from './storage'; import * as misc from '../common/misc'; import Logger from './logger'; import * as zlib from 'zlib'; +import { + syncCreateResourceGroup, + syncFixDupes, + syncGetResourceGroup, + syncPull, + syncPush, + syncResetData, +} from './network'; +import * as crypt from '../account/crypt'; +import * as session from '../account/session'; export const START_DELAY = 1e3; export const PULL_PERIOD = 15e3; @@ -32,7 +40,19 @@ let _writeChangesInterval = null; let _pendingDBChanges = {}; let _isInitialized = false; +// Used to mark whether or not the new sync system is enabled +let _disabledForSession = false; + +export function disableForSession() { + _disabledForSession = true; +} + export async function init() { + if (_disabledForSession) { + logger.debug('Legacy sync is disabled for current session'); + return; + } + if (_isInitialized) { logger.debug('Already enabled'); return; @@ -42,8 +62,8 @@ export async function init() { _isInitialized = true; db.onChange(async changes => { // To help prevent bugs, put Workspaces first - const sortedChanges = changes.sort( - ([event, doc, fromSync]) => (doc.type === models.workspace.type ? 1 : -1), + const sortedChanges = changes.sort(([event, doc, fromSync]) => + doc.type === models.workspace.type ? 1 : -1, ); for (const [event, doc, fromSync] of sortedChanges) { @@ -154,7 +174,7 @@ export async function fixDuplicateResourceGroups() { // Fix duplicates const ids = resources.map(r => r.resourceGroupId); - const { deleteResourceGroupIds } = await session.syncFixDupes(ids); + const { deleteResourceGroupIds } = await syncFixDupes(ids); for (const idToDelete of deleteResourceGroupIds) { await store.removeResourceGroup(idToDelete); @@ -187,6 +207,11 @@ export async function writePendingChanges() { } export async function push(resourceGroupId = null) { + if (_disabledForSession) { + logger.debug('Legacy sync is disabled for current session'); + return; + } + if (!session.isLoggedIn()) { return; } @@ -199,7 +224,7 @@ export async function push(resourceGroupId = null) { } if (!allDirtyResources.length) { - logger.debug('No changes to push'); + // No changes to push return; } @@ -223,7 +248,7 @@ export async function push(resourceGroupId = null) { let responseBody; try { - responseBody = await session.syncPush(dirtyResources); + responseBody = await syncPush(dirtyResources); } catch (e) { logger.error('Failed to push changes', e); return; @@ -298,6 +323,11 @@ export async function push(resourceGroupId = null) { } export async function pull(resourceGroupId = null, createMissingResources = true) { + if (_disabledForSession) { + logger.debug('Legacy sync is disabled for current session'); + return; + } + if (!session.isLoggedIn()) { return; } @@ -337,11 +367,13 @@ export async function pull(resourceGroupId = null, createMissingResources = true blacklist: blacklistedResourceGroupIds, }; - logger.debug(`Pulling with ${resources.length} resources`); + if (resources.length) { + logger.debug(`Pulling with ${resources.length} resources`); + } let responseBody; try { - responseBody = await session.syncPull(body); + responseBody = await syncPull(body); } catch (e) { logger.error('Failed to sync changes', e, body); return; @@ -535,7 +567,7 @@ export async function resetLocalData() { } export async function resetRemoteData() { - await session.syncResetData(); + await syncResetData(); } // ~~~~~~~ // @@ -587,7 +619,7 @@ export async function fetchResourceGroup(resourceGroupId, invalidateCache = fals if (!resourceGroup) { try { - resourceGroup = await session.syncGetResourceGroup(resourceGroupId); + resourceGroup = await syncGetResourceGroup(resourceGroupId); } catch (e) { if (e.statusCode === 404) { await store.removeResourceGroup(resourceGroupId); @@ -716,7 +748,7 @@ export async function createResourceGroup(parentId, name) { // Create the new ResourceGroup let resourceGroup; try { - resourceGroup = await session.syncCreateResourceGroup(parentId, name, encRGSymmetricJWK); + resourceGroup = await syncCreateResourceGroup(parentId, name, encRGSymmetricJWK); } catch (e) { logger.error(`Failed to create ResourceGroup: ${e}`); throw e; @@ -802,8 +834,8 @@ export async function getOrCreateAllActiveResources(resourceGroupId = null) { } // Make sure Workspace is first, because the loop below depends on it - const modelTypes = Object.keys(WHITE_LIST).sort( - (a, b) => (a.type === models.workspace.type ? 1 : -1), + const modelTypes = Object.keys(WHITE_LIST).sort((a, b) => + a.type === models.workspace.type ? 1 : -1, ); let created = 0; diff --git a/packages/insomnia-app/app/sync/logger.js b/packages/insomnia-app/app/sync-legacy/logger.js similarity index 100% rename from packages/insomnia-app/app/sync/logger.js rename to packages/insomnia-app/app/sync-legacy/logger.js diff --git a/packages/insomnia-app/app/sync-legacy/network.js b/packages/insomnia-app/app/sync-legacy/network.js new file mode 100644 index 0000000000..d19cc35290 --- /dev/null +++ b/packages/insomnia-app/app/sync-legacy/network.js @@ -0,0 +1,76 @@ +import * as fetch from '../account/fetch'; +import * as session from '../account/session'; +import * as crypt from '../account/crypt'; + +export async function syncCreateResourceGroup(parentResourceId, name, encSymmetricKey) { + return fetch.post( + '/api/resource_groups', + { + parentResourceId, + name, + encSymmetricKey, + }, + session.getCurrentSessionId(), + ); +} + +export async function syncGetResourceGroup(id) { + return fetch.get(`/api/resource_groups/${id}`, session.getCurrentSessionId()); +} + +export async function syncPull(body) { + return fetch.post('/sync/pull', body, session.getCurrentSessionId(), true); +} + +export async function syncPush(body) { + return fetch.post('/sync/push', body, session.getCurrentSessionId(), true); +} + +export async function syncResetData() { + return fetch.post('/auth/reset', session.getCurrentSessionId()); +} + +export async function syncFixDupes(resourceGroupIds) { + return fetch.post('/sync/fix-dupes', { ids: resourceGroupIds }, session.getCurrentSessionId()); +} + +export async function unshareWithAllTeams(resourceGroupId) { + return fetch.put( + `/api/resource_groups/${resourceGroupId}/unshare`, + session.getCurrentSessionId(), + ); +} + +export async function shareWithTeam(resourceGroupId, teamId) { + // Ask the server what we need to do to invite the member + const instructions = await fetch.post( + `/api/resource_groups/${resourceGroupId}/share-a`, + { + teamId, + }, + session.getCurrentSessionId(), + ); + + const privateKeyJWK = session.getPrivateKey(); + const resourceGroupSymmetricKey = crypt.decryptRSAWithJWK( + privateKeyJWK, + instructions.encSymmetricKey, + ); + + // Build the invite data request + const newKeys = {}; + for (const accountId of Object.keys(instructions.keys)) { + const accountPublicKeyJWK = JSON.parse(instructions.keys[accountId]); + newKeys[accountId] = crypt.encryptRSAWithJWK(accountPublicKeyJWK, resourceGroupSymmetricKey); + } + + // Actually share it with the team + await fetch.post( + `/api/resource_groups/${resourceGroupId}/share-b`, + { + teamId, + keys: newKeys, + }, + session.getCurrentSessionId(), + ); +} diff --git a/packages/insomnia-app/app/sync/storage.js b/packages/insomnia-app/app/sync-legacy/storage.js similarity index 100% rename from packages/insomnia-app/app/sync/storage.js rename to packages/insomnia-app/app/sync-legacy/storage.js diff --git a/packages/insomnia-app/app/sync/__tests__/crypt.test.js b/packages/insomnia-app/app/sync/__tests__/crypt.test.js deleted file mode 100644 index 181cf5fe26..0000000000 --- a/packages/insomnia-app/app/sync/__tests__/crypt.test.js +++ /dev/null @@ -1,33 +0,0 @@ -import * as crypt from '../crypt'; -import { globalBeforeEach } from '../../__jest__/before-each'; - -describe('deriveKey()', () => { - beforeEach(globalBeforeEach); - it('derives a key properly', async () => { - const result = await crypt.deriveKey('Password', 'email', 'salt'); - - const expected = ''; - - expect(result).toBe(expected); - }); -}); - -describe('encryptRSA', () => { - beforeEach(globalBeforeEach); - it('encrypts and decrypts', () => { - const resultEncrypted = crypt.encryptAES('rawkey', 'Hello World!', 'additional data'); - const resultDecrypted = crypt.decryptAES('rawkey', resultEncrypted); - - const expectedEncrypted = { - ad: '6164646974696f6e616c2064617461', - d: '48656c6c6f253230576f726c6421', - iv: '616161616161616161616161', - t: '746167', - }; - - const expectedDecrypted = 'Hello World!'; - - expect(resultEncrypted).toEqual(expectedEncrypted); - expect(resultDecrypted).toEqual(expectedDecrypted); - }); -}); diff --git a/packages/insomnia-app/app/sync/delta/__tests__/diff.test.js b/packages/insomnia-app/app/sync/delta/__tests__/diff.test.js new file mode 100644 index 0000000000..8e2398c9cc --- /dev/null +++ b/packages/insomnia-app/app/sync/delta/__tests__/diff.test.js @@ -0,0 +1,70 @@ +import { diff, __internal } from '../diff'; + +describe('diff()', () => { + it('creates block map', () => { + const result = __internal.getBlockMap('Hello World!!', 3); + expect(result).toEqual({ + dbc2d1fed0dc37a70aea0f376958c802eddc0559: [ + { + start: 0, + len: 3, + hash: 'dbc2d1fed0dc37a70aea0f376958c802eddc0559', + }, + ], + '263b8ac41bd2ffb775af535c54d8b0a0e6b9e743': [ + { + start: 3, + len: 3, + hash: '263b8ac41bd2ffb775af535c54d8b0a0e6b9e743', + }, + ], + '3603dd999f7dd952041d3bdb27f74e511cfd6b2a': [ + { + start: 6, + len: 3, + hash: '3603dd999f7dd952041d3bdb27f74e511cfd6b2a', + }, + ], + c20d168802bbae1c84f90b9b0495e0d918da3aea: [ + { + start: 9, + len: 3, + hash: 'c20d168802bbae1c84f90b9b0495e0d918da3aea', + }, + ], + '0ab8318acaf6e678dd02e2b5c343ed41111b393d': [ + { + start: 12, + len: 1, + hash: '0ab8318acaf6e678dd02e2b5c343ed41111b393d', + }, + ], + }); + }); + + it('creates operations', () => { + // hel|lo |Wor|ld!|! + const result = diff('Hello World!!', 'Hello there World!!', 3); + expect(result).toEqual([ + { type: 'COPY', start: 0, len: 6 }, + { type: 'INSERT', content: 'there ' }, + { type: 'COPY', start: 6, len: 7 }, + ]); + }); + + it('creates operations 2', () => { + const result2 = diff( + 'Hello, this is a pretty long sentence about not much at all.', + 'Hello, this is a pretty short sentence.', + 2, + ); + expect(result2).toEqual([ + { len: 24, start: 0, type: 'COPY' }, + { content: 'shor', type: 'INSERT' }, + { len: 2, start: 42, type: 'COPY' }, + { content: 's', type: 'INSERT' }, + { len: 7, start: 30, type: 'COPY' }, + { content: '.', type: 'INSERT' }, + ]); + }); +}); diff --git a/packages/insomnia-app/app/sync/delta/__tests__/patch.test.js b/packages/insomnia-app/app/sync/delta/__tests__/patch.test.js new file mode 100644 index 0000000000..0a2624ed06 --- /dev/null +++ b/packages/insomnia-app/app/sync/delta/__tests__/patch.test.js @@ -0,0 +1,38 @@ +import { diff } from '../diff'; +import { patch } from '../patch'; + +describe('patch()', () => { + it('works on many examples', () => { + const things = [ + [ + 'Hello, this is a pretty long sentence about not much at all.', + 'Hello, this is a pretty short sentence.', + ], + ['xxxxxxxxxxyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzz', 'abc'], + ['xyz', 'xyz'], + ]; + + for (const thing of things) { + // Test 100 chunk sizes + for (let i = 1; i < 5; i++) { + // Test both directions + for (let j = 0; j < 2; j++) { + let a, b; + if (j === 0) { + a = thing[0]; + b = thing[1]; + } else { + a = thing[1]; + b = thing[0]; + } + + // Diff the result + const diffResult = diff(a, b, i * 5); + + // Use the diff to patch it and make sure it equals the same + expect(patch(a, diffResult)).toBe(b); + } + } + } + }); +}); diff --git a/packages/insomnia-app/app/sync/delta/diff.js b/packages/insomnia-app/app/sync/delta/diff.js new file mode 100644 index 0000000000..60533ff793 --- /dev/null +++ b/packages/insomnia-app/app/sync/delta/diff.js @@ -0,0 +1,130 @@ +// @flow +import crypto from 'crypto'; + +type InsertOperation = {| + type: 'INSERT', + content: string, +|}; + +type CopyOperation = {| + type: 'COPY', + start: number, + len: number, +|}; + +export type Operation = InsertOperation | CopyOperation; + +type Block = {| + start: number, + len: number, + hash: string, +|}; + +export function diff(source: string, target: string, blockSize: number): Array { + const operations: Array = []; + + const sourceBlockMap = getBlockMap(source, blockSize); + + // Iterate over source blocks in order and match them to target + let lastTargetMatch = 0; + for (let targetPosition = 0; targetPosition < target.length; ) { + const targetBlock = getBlock(target, targetPosition, blockSize); + const sourceBlocks = sourceBlockMap[targetBlock.hash] || []; + + if (sourceBlocks.length === 0) { + targetPosition++; + continue; + } + + // TODO: Try all blocks + const sourceBlock = sourceBlocks[0]; + + // Try to match as far as possible + let sourceIndex = sourceBlock.start + sourceBlock.len; + let targetIndex = targetBlock.start + targetBlock.len; + + while (targetIndex < target.length && sourceIndex < source.length) { + if (source[sourceIndex] === target[targetIndex]) { + targetIndex++; + sourceIndex++; + } else { + break; + } + } + + while ( + source[sourceIndex++] === target[targetIndex] && + targetIndex < target.length && + sourceIndex < source.length + ) { + targetIndex++; + } + + sourceIndex--; + + // Found unknown bytes, INSERT them + if (targetBlock.start > lastTargetMatch) { + operations.push({ + type: 'INSERT', + content: target.slice(lastTargetMatch, targetBlock.start), + }); + } + + // Source block found in target + operations.push({ + type: 'COPY', + start: sourceBlock.start, + len: sourceIndex - sourceBlock.start, + }); + + targetPosition = lastTargetMatch = targetIndex; + } + + // Add the target suffix if there's still some left + if (lastTargetMatch < target.length) { + operations.push({ + type: 'INSERT', + content: target.slice(lastTargetMatch), + }); + } + + return operations; +} + +function getBlock(value: string, start: number, blockSize: number): Block { + if (start >= value.length) { + throw new Error('Invalid block index'); + } + + const blockSlice = value.slice(start, start + blockSize); + return { + start, + len: blockSlice.length, + hash: crypto + .createHash('sha1') + .update(blockSlice) + .digest('hex'), + }; +} + +function getBlockMap(value: string, blockSize: number): { [string]: Block } { + const map = {}; + + for (let i = 0; i < value.length; ) { + const block = getBlock(value, i, blockSize); + + if (map[block.hash]) { + map[block.hash].push(block); + } else { + map[block.hash] = [block]; + } + + i += block.len; + } + + return map; +} + +export const __internal = { + getBlockMap, +}; diff --git a/packages/insomnia-app/app/sync/delta/patch.js b/packages/insomnia-app/app/sync/delta/patch.js new file mode 100644 index 0000000000..c5356182c8 --- /dev/null +++ b/packages/insomnia-app/app/sync/delta/patch.js @@ -0,0 +1,16 @@ +// @flow +import type { Operation } from './diff'; + +export function patch(a: string, operations: Array): string { + let result = ''; + + for (const op of operations) { + if (op.type === 'COPY') { + result += a.slice(op.start, op.start + op.len); + } else if (op.type === 'INSERT') { + result += op.content; + } + } + + return result; +} diff --git a/packages/insomnia-app/app/sync/lib/__tests__/deterministicStringify.test.js b/packages/insomnia-app/app/sync/lib/__tests__/deterministicStringify.test.js new file mode 100644 index 0000000000..2cced0085e --- /dev/null +++ b/packages/insomnia-app/app/sync/lib/__tests__/deterministicStringify.test.js @@ -0,0 +1,40 @@ +import { deterministicStringify } from '../deterministicStringify'; + +describe('deterministicStringify()', () => { + it('sorts object keys', () => { + const result = deterministicStringify({ + c: 'c', + a: 'a', + b: 'b', + }); + + expect(result).toBe('{"a":"a","b":"b","c":"c"}'); + }); + + it('works recursively', () => { + const result = deterministicStringify({ + arr: [{ b: 'b', a: 'a' }], + obj: { + obj2: { b: 'b', a: 'a' }, + }, + }); + + expect(result).toBe('{"arr":[{"a":"a","b":"b"}],"obj":{"obj2":{"a":"a","b":"b"}}}'); + }); + + it('works with strange types', () => { + const sDate = deterministicStringify(new Date(1541178019555)); + expect(sDate).toBe('"2018-11-02T17:00:19.555Z"'); + + const sNull = deterministicStringify(null); + expect(sNull).toBe('null'); + }); + + it('skips non-json types', () => { + const sFunc = deterministicStringify({ + a: [0, () => null], + fn: () => null, + }); + expect(sFunc).toBe('{"a":[0]}'); + }); +}); diff --git a/packages/insomnia-app/app/sync/lib/deterministicStringify.js b/packages/insomnia-app/app/sync/lib/deterministicStringify.js new file mode 100644 index 0000000000..661d29ea3d --- /dev/null +++ b/packages/insomnia-app/app/sync/lib/deterministicStringify.js @@ -0,0 +1,30 @@ +// @flow + +export function deterministicStringify(value: any): string { + const t = Object.prototype.toString.call(value); + if (t === '[object Object]') { + const pairs = []; + for (const key of Object.keys(value).sort()) { + const k = deterministicStringify(key); + const v = deterministicStringify(value[key]); + if (v !== '' && k !== '') { + pairs.push(`${k}:${v}`); + } + } + return `{${pairs.join(',')}}`; + } else if (t === '[object Array]') { + const items = []; + for (const v of value) { + const vStr = deterministicStringify(v); + if (vStr !== '') { + items.push(vStr); + } + } + return `[${items.join(',')}]`; + } + + const str = JSON.stringify(value); + + // Only return valid stringifyable things + return str === undefined ? '' : str; +} diff --git a/packages/insomnia-app/app/sync/store/__tests__/index.test.js b/packages/insomnia-app/app/sync/store/__tests__/index.test.js new file mode 100644 index 0000000000..6f348a495b --- /dev/null +++ b/packages/insomnia-app/app/sync/store/__tests__/index.test.js @@ -0,0 +1,66 @@ +import Store from '../index'; +import MemoryDriver from '../drivers/memory-driver'; + +describe('store', () => { + for (const Driver of [MemoryDriver]) { + describe(Driver.name, () => { + it('supports CRUD operations', async () => { + const s = new Store(new Driver()); + + expect(await s.hasItem('404')).toBe(false); + expect(await s.getItem('404')).toBe(null); + + expect(await s.setItem('foo', 'bar')).toBe(undefined); + expect(await s.getItem('foo')).toBe('bar'); + + expect(await s.setItem('null', null)).toBe(undefined); + expect(await s.getItem('null')).toBe(null); + + expect(await s.setItem('obj', { foo: 'bar' })).toBe(undefined); + expect(await s.getItem('obj')).toEqual({ foo: 'bar' }); + + expect(await s.removeItem('foo')).toBe(undefined); + expect(await s.hasItem('foo')).toBe(false); + expect(await s.getItem('foo')).toBe(null); + }); + + it('clears all values', async () => { + const s = new Store(new Driver()); + + await s.setItem('a', 'aaa'); + await s.setItem('b', 'bbb'); + await s.clear(); + + expect(await s.hasItem('a')).toBe(false); + expect(await s.hasItem('b')).toBe(false); + }); + + it('stores buffers directly', async () => { + const s = new Store(new Driver()); + + await s.setItem('buff', Buffer.from(`{"hi": "there"}`, 'utf8')); + await s.setItem('json', { hi: 'there' }); + + expect(await s.getItem('buff')).toEqual({ hi: 'there' }); + expect(await s.getItem('json')).toEqual({ hi: 'there' }); + + expect((await s._driver.getItem('buff')).toString('utf8')).toEqual(`{"hi": "there"}`); + expect((await s._driver.getItem('json')).toString('utf8')).toEqual(`{\n "hi": "there"\n}`); + }); + }); + } + + it('supports hooks', async () => { + const s = new Store(new MemoryDriver(), [ + { + // Just some dumb hooks to test with + read: (ext, buff) => Buffer.from(buff.toString('utf8').replace('WORLD', 'World')), + write: (ext, buff) => Buffer.from(buff.toString('utf8').replace('World', 'WORLD')), + }, + ]); + + await s.setItem('foo', { Hello: 'World!' }); + expect((await s._driver.getItem('foo')).toString('utf8')).toBe('{\n "Hello": "WORLD!"\n}'); + expect(await s.getItem('foo')).toEqual({ Hello: 'World!' }); + }); +}); diff --git a/packages/insomnia-app/app/sync/store/drivers/base.js b/packages/insomnia-app/app/sync/store/drivers/base.js new file mode 100644 index 0000000000..92586768b7 --- /dev/null +++ b/packages/insomnia-app/app/sync/store/drivers/base.js @@ -0,0 +1,17 @@ +// @flow + +export interface BaseDriver { + constructor(config: { [string]: any }): void; + + hasItem(key: string): Promise; + + setItem(key: string, value: Buffer): Promise; + + getItem(key: string): Promise; + + removeItem(key: string): Promise; + + keys(prefix: string, recursive: boolean): Promise>; + + clear(): Promise; +} diff --git a/packages/insomnia-app/app/sync/store/drivers/file-system-driver.js b/packages/insomnia-app/app/sync/store/drivers/file-system-driver.js new file mode 100644 index 0000000000..d5a79382e3 --- /dev/null +++ b/packages/insomnia-app/app/sync/store/drivers/file-system-driver.js @@ -0,0 +1,150 @@ +// @flow +import fs from 'fs'; +import path from 'path'; +import mkdirp from 'mkdirp'; +import type { BaseDriver } from './base'; + +export default class FileSystemDriver implements BaseDriver { + _directory: string; + + constructor(config: { directory: string }) { + this._directory = config.directory; + console.log(`[FileSystemDriver] Initialized in "${this._directory}"`); + } + + async hasItem(key: string): Promise { + return new Promise((resolve, reject) => { + fs.stat(this._getKeyPath(key), (err, result) => { + if (err && err.code === 'ENOENT') { + resolve(false); + } else if (err) { + reject(err); + } else { + resolve(true); + } + }); + }); + } + + setItem(key: string, value: Buffer): Promise { + return new Promise((resolve, reject) => { + const finalPath = this._getKeyPath(key); + + // Temp path contains randomness to avoid race-condition collisions. This + // doesn't actually avoid race conditions but at least it won't fail. + const tmpPath = `${finalPath}.${Math.random()}.tmp`; + + // This method implements atomic writes by first writing to a temporary + // file (non-atomic) then renaming the file to the final value (atomic) + fs.writeFile(tmpPath, value, 'utf8', err => { + if (err) { + return reject(err); + } + fs.rename(tmpPath, finalPath, err => { + if (err) { + return reject(err); + } + resolve(); + }); + }); + }); + } + + getItem(key: string): Promise { + return new Promise((resolve, reject) => { + fs.readFile(this._getKeyPath(key), (err, data) => { + if (err && err.code === 'ENOENT') { + resolve(null); + } else if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); + } + + removeItem(key: string): Promise { + return new Promise((resolve, reject) => { + fs.unlink(this._getKeyPath(key), err => { + if (err && err.code === 'ENOENT') { + resolve(); + } else if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + + clear(): Promise { + return new Promise((resolve, reject) => { + fs.readdir(this._directory, (err, names) => { + if (err) { + return reject(err); + } + + for (const name of names) { + fs.unlinkSync(this._getKeyPath(name)); + } + + resolve(); + }); + }); + } + + async keys(prefix: string, recursive: boolean): Promise> { + const next = dir => { + return new Promise(async (resolve, reject) => { + let keys: Array = []; + let names = []; + try { + names = fs.readdirSync(dir); + } catch (err) { + if (err.code !== 'ENOENT') { + reject(err); + } + } + + for (const name of names) { + if (name.indexOf('.') === 0) { + // Skip any non-vcs files + continue; + } + + const p = path.join(dir, name); + const isDir = fs.statSync(p).isDirectory(); + if (isDir && recursive) { + const more = await next(p); + keys = [...keys, ...more]; + } else if (!recursive && isDir) { + keys.push(p); + } else if (!isDir) { + keys.push(p); + } + } + + resolve(keys); + }); + }; + + const rawKeys = await next(this._getKeyPath(prefix)); + + const keys = []; + for (const rawKey of rawKeys) { + keys.push(rawKey.substring(this._directory.length)); + } + + return keys; + } + + _getKeyPath(key: string): string { + const p = path.join(this._directory, key); + + // Create base directory + mkdirp.sync(path.dirname(p)); + + return p; + } +} diff --git a/packages/insomnia-app/app/sync/store/drivers/memory-driver.js b/packages/insomnia-app/app/sync/store/drivers/memory-driver.js new file mode 100644 index 0000000000..b083c6d631 --- /dev/null +++ b/packages/insomnia-app/app/sync/store/drivers/memory-driver.js @@ -0,0 +1,63 @@ +// @flow + +import type { BaseDriver } from './base'; + +export default class MemoryDriver implements BaseDriver { + _db: { [string]: Buffer }; + + constructor() { + this._init(); + } + + async hasItem(key: string): Promise { + return this._db[String(key)] instanceof Buffer; + } + + async setItem(key: string, value: Buffer): Promise { + this._db[String(key)] = value; + } + + async getItem(key: string): Promise { + let value = null; + + if (await this.hasItem(key)) { + value = this._db[key]; + } + + return value; + } + + async removeItem(key: string): Promise { + delete this._db[String(key)]; + } + + async clear(): Promise { + this._init(); + } + + async keys(prefix: string, recursive: boolean): Promise> { + const keys = []; + const baseLevels = prefix.split('/').length; + + for (const key of Object.keys(this._db)) { + if (key.indexOf(prefix) !== 0) { + continue; + } + + const levels = key.split('/').length; + const isOnSameLevel = levels === baseLevels; + + if (!recursive && !isOnSameLevel) { + continue; + } + + keys.push(key); + } + + return keys; + } + + _init() { + this._db = {}; + } +} diff --git a/packages/insomnia-app/app/sync/store/hooks/__tests__/compress.test.js b/packages/insomnia-app/app/sync/store/hooks/__tests__/compress.test.js new file mode 100644 index 0000000000..dc91c6991c --- /dev/null +++ b/packages/insomnia-app/app/sync/store/hooks/__tests__/compress.test.js @@ -0,0 +1,20 @@ +import hook from '../compress'; + +describe('compress hook', () => { + it('compresses non-extension keys', async () => { + const compressed = await hook.write('', 'hello'); + const uncompressed = await hook.read('', compressed); + expect(uncompressed.toString()).toBe('hello'); + }); + + it('writes raw data for extensions', async () => { + const compressed = await hook.write('.json', 'hello'); + expect(compressed.toString('base64')).toBe('hello'); + }); + + it('reads compressed data', async () => { + const data = Buffer.from('hello', 'utf8'); + const compressed = await hook.read('.json', data); + expect(compressed.toString('utf8')).toBe('hello'); + }); +}); diff --git a/packages/insomnia-app/app/sync/store/hooks/compress.js b/packages/insomnia-app/app/sync/store/hooks/compress.js new file mode 100644 index 0000000000..1d70d92c4e --- /dev/null +++ b/packages/insomnia-app/app/sync/store/hooks/compress.js @@ -0,0 +1,40 @@ +// @flow +import type { HookFn } from '../index'; +import zlib from 'zlib'; + +const read: HookFn = async function read(extension: string, value: Buffer): Promise { + if (extension) { + return value; + } + + return new Promise((resolve, reject) => { + zlib.gunzip(value, (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); +}; + +const write: HookFn = async function read(extension: string, value: Buffer): Promise { + if (extension) { + return value; + } + + return new Promise((resolve, reject) => { + zlib.gzip(value, (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); +}; + +export default { + read, + write, +}; diff --git a/packages/insomnia-app/app/sync/store/index.js b/packages/insomnia-app/app/sync/store/index.js new file mode 100644 index 0000000000..a7cecadb50 --- /dev/null +++ b/packages/insomnia-app/app/sync/store/index.js @@ -0,0 +1,101 @@ +// @flow + +import path from 'path'; +import type { BaseDriver } from './drivers/base'; + +// Can't really make this any more specific unfortunately +type JSONValue = any; +export type HookFn = (extension: string, value: Buffer) => Promise; +export type Hook = { read: HookFn, write: HookFn }; + +export default class Store { + _driver: BaseDriver; + _hooks: Array; + + constructor(driver: BaseDriver, hooks?: Array) { + this._driver = driver; + this._hooks = hooks || []; + } + + async hasItem(key: string): Promise { + return this._driver.hasItem(key); + } + + async setItem(key: string, value: JSONValue | Buffer): Promise { + const ext = path.extname(key); + let serializedValue; + try { + serializedValue = await this._serialize(ext, value); + } catch (err) { + throw new Error(`Failed to serialize key=${key} err=${err}`); + } + + return this._driver.setItem(key, serializedValue); + } + + async setItemRaw(key: string, value: Buffer): Promise { + return this._driver.setItem(key, value); + } + + async getItem(key: string): Promise { + const rawValue = await this.getItemRaw(key); + if (rawValue === null) { + return null; + } + + const ext = path.extname(key); + + let value; + try { + // Without the `await` here, the catch won't get called + value = await this._deserialize(ext, rawValue); + } catch (err) { + console.log('Failed to deserialize', rawValue.toString('base64')); + throw new Error(`Failed to deserialize key=${key} err=${err}`); + } + + return value; + } + + async getItemRaw(key: string): Promise { + return this._driver.getItem(key); + } + + async removeItem(key: string): Promise { + return this._driver.removeItem(key); + } + + async keys(prefix: string, recursive: boolean = true): Promise> { + return this._driver.keys(prefix, recursive); + } + + async clear(): Promise { + return this._driver.clear(); + } + + async _serialize(ext: string, raw: JSONValue | Buffer): Promise { + let buff = raw instanceof Buffer ? raw : Buffer.from(JSON.stringify(raw, null, 2), 'utf8'); + + for (const hook of this._hooks) { + if (!hook.write) { + continue; + } + + buff = await hook.write(ext, buff); + } + + return buff; + } + + async _deserialize(ext: string, value: Buffer): Promise { + for (const hook of this._hooks) { + if (!hook.read) { + continue; + } + + value = await hook.read(ext, value); + } + + return JSON.parse(value.toString('utf8')); + } +} diff --git a/packages/insomnia-app/app/sync/types.js b/packages/insomnia-app/app/sync/types.js new file mode 100644 index 0000000000..496e9321fc --- /dev/null +++ b/packages/insomnia-app/app/sync/types.js @@ -0,0 +1,100 @@ +// @flow + +export type Team = { + id: string, + name: string, +}; + +export type Project = { + id: string, + name: string, + rootDocumentId: string, +}; + +export type DocumentKey = string; +export type BlobId = string; + +export type Head = {| + branch: string, +|}; + +export type SnapshotStateEntry = {| + key: DocumentKey, + blob: BlobId, + name: string, +|}; + +export type SnapshotState = Array; +export type SnapshotStateMap = { [DocumentKey]: SnapshotStateEntry }; +export type SnapshotId = string; + +export type Snapshot = {| + id: SnapshotId, + created: Date, + parent: string, + author: string, + name: string, + description: string, + state: Array, +|}; + +export type Branch = {| + name: string, + created: Date, + modified: Date, + snapshots: Array, +|}; + +export type StageEntryDelete = {| + deleted: true, + key: string, + name: string, + blobId: string, +|}; + +export type StageEntryAdd = {| + added: true, + key: string, + name: string, + blobId: string, + blobContent: string, +|}; + +export type StageEntryModify = {| + modified: true, + key: string, + name: string, + blobId: string, + blobContent: string, +|}; + +export type StageEntry = StageEntryDelete | StageEntryAdd | StageEntryModify; + +export type MergeConflict = {| + name: string, + key: DocumentKey, + message: string, + mineBlob: BlobId | null, + theirsBlob: BlobId | null, + choose: BlobId | null, +|}; + +export type Stage = { + [DocumentKey]: StageEntry, +}; + +export type StatusCandidate = {| + key: DocumentKey, + name: string, + document: Object, +|}; + +export type StatusCandidateMap = { [DocumentKey]: StatusCandidate }; + +export type Status = {| + key: string, + stage: Stage, + unstaged: { + [DocumentKey]: StageEntry, + }, +|}; diff --git a/packages/insomnia-app/app/sync/vcs/__tests__/index.test.js b/packages/insomnia-app/app/sync/vcs/__tests__/index.test.js new file mode 100644 index 0000000000..118cd7a2bb --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/__tests__/index.test.js @@ -0,0 +1,678 @@ +import VCS from '../index'; +import MemoryDriver from '../../store/drivers/memory-driver'; + +function newDoc(id) { + return { id }; +} + +async function vcs(branch) { + const v = new VCS(new MemoryDriver()); + await v.switchProject('workspace_1', 'Test Workspace'); + await v.checkout([], branch); + return v; +} + +describe('VCS', () => { + beforeEach(() => { + let ts = 1000000000000; + Date.now = jest.fn(() => ts++); + }); + + describe('status()', () => { + it('returns status with no commits', async () => { + const v = await vcs('master'); + const status = await v.status( + [ + { + key: 'foo', + name: 'Foo', + document: newDoc('bar'), + }, + { + key: 'baz', + name: 'Baz', + document: newDoc('qux'), + }, + ], + {}, + ); + + expect(status).toEqual({ + key: '0cffac636df909fb4f8e9a25570e5012846b46fd', + stage: {}, + unstaged: { + foo: { + added: true, + key: 'foo', + blobContent: '{"id":"bar"}', + blobId: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + name: 'Foo', + }, + baz: { + added: true, + key: 'baz', + blobContent: '{"id":"qux"}', + blobId: 'dc61fb5cb183286293dc7f0e8499b4e1e09eef05', + name: 'Baz', + }, + }, + }); + }); + + it('returns add/modify/delete operations', async () => { + const v = await vcs('master'); + + const status1 = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + { key: 'c', name: 'C', document: newDoc('ccc') }, + ], + {}, + ); + expect(Object.keys(status1.unstaged)).toEqual(['a', 'b', 'c']); + + await v.stage(status1.stage, [ + status1.unstaged['a'], + status1.unstaged['b'], + status1.unstaged['c'], + ]); + + await v.takeSnapshot(status1.stage, 'Add a/b/c'); + const history = await v.getHistory(); + expect(history.length).toBe(1); + expect(history).toEqual([ + { + created: expect.any(Date), + description: '', + author: '', + id: 'a5fb7270c060c0387967c6db725fdf07e9594911', + name: 'Add a/b/c', + parent: '0000000000000000000000000000000000000000', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + { + blob: '8ce1aded8fa999d1c5632ff993b56dd9aa1f4880', + key: 'b', + name: 'B', + }, + { + blob: 'ce29c03e80866a215004d55f160a9a7b510ceacb', + key: 'c', + name: 'C', + }, + ], + }, + ]); + + // Should get every operation type + const status = await v.status( + [ + { key: 'notA', name: 'Not A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + { key: 'c', name: 'C', document: newDoc('modified') }, + { key: 'd', name: 'D', document: newDoc('ddd') }, + ], + {}, + ); + + expect(status).toEqual({ + key: '80834d815272c73192291477f70dce8a7c8bc424', + stage: {}, + unstaged: { + a: { + deleted: true, + blobId: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + notA: { + added: true, + key: 'notA', + name: 'Not A', + blobId: '210be55f7998bb55805f9d65c5345103e7957929', + blobContent: '{"id":"aaa"}', + }, + c: { + modified: true, + key: 'c', + name: 'C', + blobId: 'c32090250612936632fa4a3127507aa0694ba375', + blobContent: '{"id":"modified"}', + }, + d: { + added: true, + key: 'd', + name: 'D', + blobId: 'd4d10ce251d7184fa14587796aed6e06c549f7a4', + blobContent: '{"id":"ddd"}', + }, + }, + }); + + const newStage = await v.stage(status.stage, [ + status.unstaged['a'], + status.unstaged['notA'], + status.unstaged['c'], + status.unstaged['d'], + ]); + + const status2 = await v.status( + [ + { key: 'notA', name: 'Not A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + { key: 'c', name: 'C', document: newDoc('modified') }, + { key: 'd', name: 'D', document: newDoc('ddd') }, + ], + newStage, + ); + + expect(status2).toEqual({ + key: '4a0e8fd9ee30acb9c8ff4eb2f73e413ff7175a8c', + stage: { + a: { + deleted: true, + blobId: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + notA: { + added: true, + blobId: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'notA', + name: 'Not A', + blobContent: '{"id":"aaa"}', + }, + c: { + modified: true, + blobId: 'c32090250612936632fa4a3127507aa0694ba375', + key: 'c', + name: 'C', + blobContent: '{"id":"modified"}', + }, + d: { + added: true, + blobId: 'd4d10ce251d7184fa14587796aed6e06c549f7a4', + key: 'd', + name: 'D', + blobContent: '{"id":"ddd"}', + }, + }, + unstaged: {}, + }); + }); + + it('can appear both staged and unstaged', async () => { + const v = await vcs('master'); + + const status = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + ], + {}, + ); + const stage = await v.stage(status.stage, [status.unstaged['a']]); + + const status2 = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('modified') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + ], + stage, + ); + + expect(status2).toEqual({ + key: '886337817e3c1ff7df3fcfa7c30192eb854b45cf', + stage: { + a: { + added: true, + blobId: '210be55f7998bb55805f9d65c5345103e7957929', + name: 'A', + key: 'a', + blobContent: '{"id":"aaa"}', + }, + }, + unstaged: { + a: { + added: true, + blobId: 'c32090250612936632fa4a3127507aa0694ba375', + key: 'a', + name: 'A', + blobContent: '{"id":"modified"}', + }, + b: { + added: true, + blobId: '8ce1aded8fa999d1c5632ff993b56dd9aa1f4880', + name: 'B', + key: 'b', + blobContent: '{"id":"bbb"}', + }, + }, + }); + }); + + it('should not show committed entities', async () => { + const v = await vcs('master'); + + const status = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + const stage2 = await v.stage(status.stage, [status.unstaged['foo']]); + await v.takeSnapshot(stage2, 'Add foo'); + + const status2 = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + expect(status2).toEqual({ + key: 'ca455b43c1e992812d81032e79e037a8db85fa8b', + stage: {}, + unstaged: {}, + }); + }); + }); + + describe('stage()', () => { + it('stages entity', async () => { + const v = await vcs('master'); + + const status = await v.status( + [ + { key: 'foo', name: 'Foo', document: newDoc('bar') }, + { key: 'baz', name: 'Baz', document: newDoc('qux') }, + ], + {}, + ); + + const stage = await v.stage(status.stage, [status.unstaged['foo']]); + expect(stage).toEqual({ + foo: { + key: 'foo', + name: 'Foo', + blobContent: '{"id":"bar"}', + blobId: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + added: true, + }, + }); + + const status2 = await v.status( + [ + { key: 'foo', name: 'Foo', document: newDoc('bar') }, + { key: 'baz', name: 'Baz', document: newDoc('qux') }, + ], + stage, + ); + expect(status2).toEqual({ + key: '19c281e6bbbebec0143491bf14f9a013a4114125', + stage: { + foo: { + name: 'Foo', + key: 'foo', + blobContent: '{"id":"bar"}', + blobId: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + added: true, + }, + }, + unstaged: { + baz: { + key: 'baz', + name: 'Baz', + blobContent: '{"id":"qux"}', + blobId: 'dc61fb5cb183286293dc7f0e8499b4e1e09eef05', + added: true, + }, + }, + }); + }); + }); + + describe('takeSnapshot()', () => { + it('commits basic entity', async () => { + const v = await vcs('master'); + + const status = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + const stage = await v.stage(status.stage, [status.unstaged['foo']]); + await v.takeSnapshot(stage, 'Add foo'); + + const history = await v.getHistory(); + expect(history).toEqual([ + { + id: '24b4888f4cecc5a1ac272eb1641cb5aa102c1675', + author: '', + created: expect.any(Date), + name: 'Add foo', + description: '', + parent: '0000000000000000000000000000000000000000', + state: [ + { + blob: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + key: 'foo', + name: 'Foo', + }, + ], + }, + ]); + }); + + it('commits deleted entity', async () => { + const v = await vcs('master'); + + const status = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + const stage = await v.stage(status.stage, [status.unstaged['foo']]); + await v.takeSnapshot(stage, 'Add foo'); + + const history = await v.getHistory(); + expect(history).toEqual([ + { + id: '365c4341f6d57e18994df2429387b78f2c9a31cb', + author: '', + created: expect.any(Date), + name: 'Add foo', + description: '', + parent: '0000000000000000000000000000000000000000', + state: [ + { + blob: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + key: 'foo', + name: 'Foo', + }, + ], + }, + ]); + + const status2 = await v.status([], {}); + const stage2 = await v.stage(status2.stage, [status2.unstaged['foo']]); + await v.takeSnapshot(stage2, 'Delete foo'); + const history2 = await v.getHistory(); + + expect(history2).toEqual([ + { + id: '365c4341f6d57e18994df2429387b78f2c9a31cb', + author: '', + created: expect.any(Date), + name: 'Add foo', + description: '', + parent: '0000000000000000000000000000000000000000', + state: [ + { + blob: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + key: 'foo', + name: 'Foo', + }, + ], + }, + { + id: '42f5b05d004f99e875a7eb3fe24ad7f94ad3e0c5', + author: '', + created: expect.any(Date), + name: 'Delete foo', + description: '', + parent: '365c4341f6d57e18994df2429387b78f2c9a31cb', + state: [], + }, + ]); + }); + }); + + describe('getBranches()', () => { + it('lists branches', async () => { + const v = await vcs('master'); + + await v.checkout([], 'branch-1'); + await v.checkout([], 'branch-2'); + + const branches = await v.getBranches(); + expect(branches).toEqual(['master', 'branch-1', 'branch-2']); + }); + }); + + describe('removeBranch()', () => { + it('cannot remove empty branch', async () => { + const v = await vcs('master'); + + let didError = false; + try { + await v.removeBranch(); + } catch (err) { + didError = true; + } + + expect(didError).toBe(true); + }); + + it('cannot remove current branch', async () => { + const v = await vcs('master'); + + let didError = false; + try { + await v.removeBranch('master'); + } catch (err) { + didError = true; + } + + expect(didError).toBe(true); + }); + + it('remove branch', async () => { + const v = await vcs('master'); + + // Add something to master + const status1 = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + const stage1 = await v.stage(status1.stage, [status1.unstaged['foo']]); + await v.takeSnapshot(stage1, 'Add foo'); + + // Checkout branch + await v.checkout([], 'new-branch'); + expect(await v.getBranches()).toEqual(['master', 'new-branch']); + + // Back to master and delete other branch + await v.checkout([], 'master'); + await v.removeBranch('new-branch'); + expect(await v.getBranches()).toEqual(['master']); + }); + }); + + describe('fork()', () => { + it('forks to a new branch', async () => { + const v = await vcs('master'); + + // Add something to master + const status1 = await v.status([{ key: 'foo', name: 'Foo', document: newDoc('bar') }], {}); + const stage1 = await v.stage(status1.stage, [status1.unstaged['foo']]); + await v.takeSnapshot(stage1, 'Add foo'); + + // Checkout branch + await v.fork('new-branch'); + await v.checkout([], 'new-branch'); + const history = await v.getHistory(); + expect(await v.getBranch()).toBe('new-branch'); + expect(history).toEqual([ + { + created: expect.any(Date), + id: 'e1afd0f5607d8da06b4360eb22d41650262f6dc5', + author: '', + parent: '0000000000000000000000000000000000000000', + name: 'Add foo', + description: '', + state: [ + { + blob: 'b933e3dbd1d218e2763de8e3ece6147527d046af', + key: 'foo', + name: 'Foo', + }, + ], + }, + ]); + }); + }); + + const name = 'merge()'; + describe(name, () => { + it('performs fast-forward merge', async () => { + const v = await vcs('master'); + + const status1 = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + ], + {}, + ); + const stage1 = await v.stage(status1.stage, [status1.unstaged['a'], status1.unstaged['b']]); + await v.takeSnapshot(stage1, 'Add A and B'); + expect((await v.getHistory())[0].state).toEqual([ + expect.objectContaining({ key: 'a' }), + expect.objectContaining({ key: 'b' }), + ]); + + await v.fork('feature-a'); + await v.checkout([], 'feature-a'); + const status2 = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbbbbbb') }, + { key: 'c', name: 'C', document: newDoc('ccc') }, + ], + status1.stage, + ); + const stage2 = await v.stage(status2.stage, [status2.unstaged['b'], status2.unstaged['c']]); + await v.takeSnapshot(stage2, 'Add C, modify B'); + expect((await v.getHistory())[1].state).toEqual( + expect.arrayContaining([ + expect.objectContaining({ key: 'a' }), + expect.objectContaining({ key: 'b' }), + expect.objectContaining({ key: 'c' }), + ]), + ); + }); + + it('merges even if no common root', async () => { + const v = await vcs('master'); + + const status1 = await v.status( + [ + { key: 'a', name: 'A', document: newDoc('aaa') }, + { key: 'b', name: 'B', document: newDoc('bbb') }, + ], + {}, + ); + const stage1 = await v.stage(status1.stage, [status1.unstaged['a'], status1.unstaged['b']]); + await v.takeSnapshot(stage1, 'message'); + }); + + it('does something', async () => { + const v = await vcs('master'); + + // Add a file to master + expect(await v.getBranch()).toBe('master'); + const status1 = await v.status([{ key: 'a', name: 'A', document: newDoc('aaa') }], {}); + const stage = await v.stage(status1.stage, [status1.unstaged['a']]); + await v.takeSnapshot(stage, 'Add A'); + expect(await v.getHistory()).toEqual([ + { + id: 'c0b75a0cb27c946e376326b963ce544af08b680a', + author: '', + created: expect.any(Date), + parent: '0000000000000000000000000000000000000000', + name: 'Add A', + description: '', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + ], + }, + ]); + + // Checkout new branch and add file + await v.fork('new-branch'); + await v.checkout([], 'new-branch'); + expect(await v.getBranch()).toBe('new-branch'); + + const status2 = await v.status([{ key: 'b', name: 'B', document: newDoc('bbb') }], {}); + const stage2 = await v.stage(status2.stage, [status2.unstaged['b']]); + await v.takeSnapshot(stage2, 'Add B'); + expect(await v.getHistory()).toEqual([ + { + id: 'c0b75a0cb27c946e376326b963ce544af08b680a', + author: '', + created: expect.any(Date), + parent: '0000000000000000000000000000000000000000', + name: 'Add A', + description: '', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + ], + }, + { + id: 'b0fb09c8ac80b34f94dc6751da6b5aa634682f45', + author: '', + created: expect.any(Date), + parent: 'c0b75a0cb27c946e376326b963ce544af08b680a', + name: 'Add B', + description: '', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + { + blob: '8ce1aded8fa999d1c5632ff993b56dd9aa1f4880', + key: 'b', + name: 'B', + }, + ], + }, + ]); + + // Merge new branch back into master + await v.checkout([], 'master'); + expect(await v.getBranch()).toBe('master'); + await v.merge([], 'new-branch'); + expect(await v.getHistory()).toEqual([ + { + id: 'c0b75a0cb27c946e376326b963ce544af08b680a', + author: '', + created: expect.any(Date), + parent: '0000000000000000000000000000000000000000', + name: 'Add A', + description: '', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + ], + }, + { + id: 'b0fb09c8ac80b34f94dc6751da6b5aa634682f45', + author: '', + created: expect.any(Date), + parent: 'c0b75a0cb27c946e376326b963ce544af08b680a', + name: 'Add B', + description: '', + state: [ + { + blob: '210be55f7998bb55805f9d65c5345103e7957929', + key: 'a', + name: 'A', + }, + { + blob: '8ce1aded8fa999d1c5632ff993b56dd9aa1f4880', + key: 'b', + name: 'B', + }, + ], + }, + ]); + }); + }); +}); diff --git a/packages/insomnia-app/app/sync/vcs/__tests__/paths.test.js b/packages/insomnia-app/app/sync/vcs/__tests__/paths.test.js new file mode 100644 index 0000000000..ddb5afa7f6 --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/__tests__/paths.test.js @@ -0,0 +1,15 @@ +import * as paths from '../paths'; + +describe('paths', () => { + it('successes', async () => { + expect(paths.projectBase('p1')).toBe('/projects/p1/'); + expect(paths.head('p1')).toBe('/projects/p1/head.json'); + expect(paths.project('p1')).toBe('/projects/p1/meta.json'); + expect(paths.blobs('p1')).toBe('/projects/p1/blobs/'); + expect(paths.blob('p1', 'b1c1c2')).toBe('/projects/p1/blobs/b1/c1c2'); + expect(paths.snapshots('p1')).toBe('/projects/p1/snapshots/'); + expect(paths.snapshot('p1', 's1')).toBe('/projects/p1/snapshots/s1.json'); + expect(paths.branches('p1')).toBe('/projects/p1/branches/'); + expect(paths.branch('p1', 'master')).toBe('/projects/p1/branches/master.json'); + }); +}); diff --git a/packages/insomnia-app/app/sync/vcs/__tests__/util.test.js b/packages/insomnia-app/app/sync/vcs/__tests__/util.test.js new file mode 100644 index 0000000000..6a1bb2be44 --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/__tests__/util.test.js @@ -0,0 +1,893 @@ +import { + combinedMapKeys, + compareBranches, + generateCandidateMap, + generateSnapshotStateMap, + getRootSnapshot, + getStagable, + hashDocument, + preMergeCheck, + stateDelta, + threeWayMerge, + updateStateWithConflictResolutions, +} from '../util'; + +describe('util', () => { + describe('generateSnapshotStateMap()', () => { + it('generates from simple states', async () => { + const snapshot = newSnapshot(1, [ + newStateEntry('doc_1', 'blob_1'), + newStateEntry('doc_2', 'blob_2'), + ]); + + const map = generateSnapshotStateMap(snapshot); + expect(Object.keys(map).sort()).toEqual(['doc_1', 'doc_2']); + }); + + it('works with duplicates', async () => { + const snapshot = newSnapshot(1, [ + newStateEntry('doc_1', 'blob_1'), + newStateEntry('doc_2', 'blob_2'), + newStateEntry('doc_2', 'blob_2'), + newStateEntry('doc_2', 'blob_2'), + ]); + + const map = generateSnapshotStateMap(snapshot); + expect(Object.keys(map).sort()).toEqual(['doc_1', 'doc_2']); + }); + + it('works with null snapshots', async () => { + const map = generateSnapshotStateMap(null); + expect(map).toEqual({}); + }); + }); + + describe('generateCandidateMap()', () => { + it('generates from simple candidates', async () => { + const candidates = [ + newCandidate('doc_2', 2), + newCandidate('doc_1', 1), + newCandidate('doc_2', 2), + ]; + + const map = generateCandidateMap(candidates); + expect(Object.keys(map).sort()).toEqual(['doc_1', 'doc_2']); + }); + }); + + describe('combineMapKeys()', () => { + it('generates from simple states', async () => { + const map1 = generateSnapshotStateMap( + newSnapshot(1, [newStateEntry('doc_1', 'blob_1'), newStateEntry('doc_2', 'blob_2')]), + ); + const map2 = generateSnapshotStateMap( + newSnapshot(1, [newStateEntry('doc_4', 'blob_4'), newStateEntry('doc_1', 'blob_1')]), + ); + const map3 = generateSnapshotStateMap(newSnapshot(1, [])); + + const keys = combinedMapKeys(map1, map2, map3); + expect(keys.sort()).toEqual(['doc_1', 'doc_2', 'doc_4']); + }); + }); + + describe('threeWayMerge()', () => { + const A1 = { key: 'a', blob: 'a.1', name: '' }; + const A2 = { key: 'a', blob: 'a.2', name: '' }; + const A3 = { key: 'a', blob: 'a.3', name: '' }; + const B1 = { key: 'b', blob: 'b.1', name: '' }; + const B2 = { key: 'b', blob: 'b.2', name: '' }; + const C1 = { key: 'c', blob: 'c.1', name: '' }; + + it('does nothing with empty states', () => { + const newState = threeWayMerge([], [], []); + expect(newState).toEqual({ + conflicts: [], + state: [], + }); + }); + + it('adds new object from other', () => { + const root = [A1]; + const trunk = [A1]; + const other = [A1, B1]; + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A1, B1], + }); + }); + + it('removes object from trunk', () => { + const root = [A1, C1]; + const trunk = [A1, C1]; + const other = [A1]; + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A1], + }); + }); + + it('removes object from both', () => { + const root = [A1, C1]; + const trunk = [A1]; + const other = [A1]; + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A1], + }); + }); + + it('modifies object from other', () => { + const root = [A1]; + const trunk = [A1]; + const other = [A2]; + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A2], + }); + }); + + it('modifies object from trunk', () => { + const root = [A1]; + const trunk = [A2]; + const other = [A1]; + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A2], + }); + }); + + it('conflicts when both modify', () => { + const root = [A1]; + const trunk = [A2]; + const other = [A3]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [ + { + key: A2.key, + name: A2.name, + choose: A3.blob, + mineBlob: A2.blob, + theirsBlob: A3.blob, + message: 'both modified', + }, + ], + state: [A2], + }); + }); + + it('works if both add the same document', () => { + const root = [A1]; + const trunk = [A1, B1]; + const other = [A1, B1]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: [A1, B1], + }); + }); + + it('conflicts if both add the same document but different', () => { + const root = [A1]; + const trunk = [A1, B1]; + const other = [A1, B2]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [ + { + key: B1.key, + name: B1.name, + choose: B2.blob, + mineBlob: B1.blob, + theirsBlob: B2.blob, + message: 'both added', + }, + ], + state: [A1, B1], + }); + }); + + it('conflicts if modified in trunk and deleted in other', () => { + const root = [A1, B1]; + const trunk = [A1, B2]; + const other = [A1]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [ + { + key: B1.key, + name: B1.name, + choose: B2.blob, + mineBlob: B2.blob, + theirsBlob: null, + message: 'they deleted and you modified', + }, + ], + state: [A1, B2], + }); + }); + + it('conflicts if modified in other and deleted in trunk', () => { + const root = [A1, B1]; + const trunk = [A1]; + const other = [A1, B2]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [ + { + key: B1.key, + name: B1.name, + choose: B2.blob, + mineBlob: null, + theirsBlob: B2.blob, + message: 'you deleted and they modified', + }, + ], + state: [A1, B2], + }); + }); + + it('works with no root state', () => { + const root = []; + const trunk = [A1, C1]; + const other = [A1, B2]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [], + state: expect.arrayContaining([A1, B2, C1]), + }); + }); + + it('works with no root state and conflict', () => { + const root = []; + const trunk = [A1]; + const other = [A2]; + + expect(threeWayMerge(root, trunk, other)).toEqual({ + conflicts: [ + { + key: A1.key, + name: A1.name, + choose: A2.blob, + mineBlob: A1.blob, + theirsBlob: A2.blob, + message: 'both added', + }, + ], + state: [A1], + }); + }); + }); + + describe('stateDelta()', () => { + const A1 = { key: 'a', blob: 'a.1', name: '' }; + const A2 = { key: 'a', blob: 'a.2', name: '' }; + const B1 = { key: 'b', blob: 'b.1', name: '' }; + const B2 = { key: 'b', blob: 'b.2', name: '' }; + const C1 = { key: 'c', blob: 'c.1', name: '' }; + + it('modifies an entry', () => { + const base = [A1]; + const dsrd = [A2]; + + expect(stateDelta(base, dsrd)).toEqual({ + add: [], + update: [A2], + remove: [], + }); + }); + + it('adds an entry', () => { + const base = []; + const dsrd = [B1]; + + expect(stateDelta(base, dsrd)).toEqual({ + add: [B1], + update: [], + remove: [], + }); + }); + + it('deletes an entry', () => { + const base = [A1]; + const dsrd = []; + + expect(stateDelta(base, dsrd)).toEqual({ + add: [], + update: [], + remove: [A1], + }); + }); + + it('complex combo', () => { + const base = [A1, B1, C1]; + const dsrd = [B2, C1]; + + expect(stateDelta(base, dsrd)).toEqual({ + add: [], + update: [B2], + remove: [A1], + }); + }); + + it('invalid duplicate key state', () => { + const base = [A1, A2]; + const dsrd = [A2]; + + expect(stateDelta(base, dsrd)).toEqual({ + add: [], + update: [], + remove: [], + }); + }); + }); + + describe('getStagable()', () => { + const A1 = { key: 'a', blob: '1932cc749f57a77ba4a231d62559c47ee931ee2c', name: '' }; + const A2 = { key: 'a', blob: 'cf2ec18c2e686b4c966725f30050120d42d4b2e5', name: '' }; + const B1 = { key: 'b', blob: '05ab2ec03c7e32eff27305b4a11c573a3843fa01', name: '' }; + const B2 = { key: 'b', blob: 'eb157a78ebd367a004c5a32a18d6d8c18e60ce00', name: '' }; + const C1 = { key: 'c', blob: 'db7d35b96291b823e674bf23ac59e6e116b1890e', name: '' }; + const DA1 = { key: 'a', document: { id: 'a', v: 1 }, name: '' }; + const DA2 = { key: 'a', document: { id: 'a', v: 2 }, name: '' }; + const DB1 = { key: 'b', document: { id: 'b', v: 1 }, name: '' }; + const DB2 = { key: 'b', document: { id: 'b', v: 2 }, name: '' }; + const DC1 = { key: 'c', document: { id: 'c', v: 1 }, name: '' }; + + it('works with empty state', () => { + const state = []; + const dsrd = [DA1]; + + expect(getStagable(state, dsrd)).toEqual([ + { + blobContent: '{"id":"a","v":1}', + blobId: A1.blob, + key: 'a', + name: '', + added: true, + }, + ]); + }); + + it('stays the same', () => { + const state = [A1, B1, C1]; + const dsrd = [DA1, DB1, DC1]; + + expect(getStagable(state, dsrd)).toEqual([]); + }); + + it('adds a document', () => { + const state = [A1]; + const dsrd = [DA1, DB1]; + + expect(getStagable(state, dsrd)).toEqual([ + { + key: 'b', + blobId: B1.blob, + blobContent: '{"id":"b","v":1}', + name: '', + added: true, + }, + ]); + }); + + it('modifies a document', () => { + const state = [B1]; + const dsrd = [DB2]; + + expect(getStagable(state, dsrd)).toEqual([ + { + key: 'b', + blobId: B2.blob, + blobContent: '{"id":"b","v":2}', + name: '', + modified: true, + }, + ]); + }); + + it('deletes a document', () => { + const state = [B1]; + const dsrd = []; + + expect(getStagable(state, dsrd)).toEqual([ + { + key: 'b', + blobId: '05ab2ec03c7e32eff27305b4a11c573a3843fa01', + name: '', + deleted: true, + }, + ]); + }); + + it('does a lot of things', () => { + const state = [A1, C1]; + const dsrd = [DA2, DB1]; + + expect(getStagable(state, dsrd)).toEqual([ + { + blobContent: '{"id":"a","v":2}', + blobId: A2.blob, + key: 'a', + modified: true, + name: '', + }, + { + key: 'c', + blobId: 'db7d35b96291b823e674bf23ac59e6e116b1890e', + name: '', + deleted: true, + }, + { + key: 'b', + blobId: B1.blob, + blobContent: '{"id":"b","v":1}', + name: '', + added: true, + }, + ]); + }); + }); + + describe('getRootSnapshot()', () => { + it('works with empty states', () => { + const a = newBranch([]); + const b = newBranch([]); + + expect(getRootSnapshot(a, b)).toBeNull(); + }); + + it('works with different states', () => { + const a = newBranch(['s1', 's2']); + const b = newBranch(['s3', 's5']); + + expect(getRootSnapshot(a, b)).toBeNull(); + }); + + it('works with same states', () => { + const a = newBranch(['s1', 's2', 's3']); + const b = newBranch(['s1', 's2', 's3']); + + expect(getRootSnapshot(a, b)).toBe('s3'); + }); + + it('works with subset', () => { + const a = newBranch(['s1']); + const b = newBranch(['s1', 's2', 's3']); + + expect(getRootSnapshot(a, b)).toBe('s1'); + expect(getRootSnapshot(b, a)).toBe('s1'); + }); + + it('works with missing middle', () => { + const a = newBranch(['s1', 's3', 's4']); + const b = newBranch(['s1', 's2', 's3', 's6']); + + expect(getRootSnapshot(a, b)).toBe('s3'); + expect(getRootSnapshot(b, a)).toBe('s3'); + }); + + it('works with missing middle', () => { + const a = newBranch(['s1', 's3']); + const b = newBranch(['s1', 's2', 's3']); + + expect(getRootSnapshot(a, b)).toBe('s3'); + expect(getRootSnapshot(b, a)).toBe('s3'); + }); + }); + + describe('updateStateWithConflictResolutions()', () => { + const A1 = { key: 'a', blob: '1932cc749f57a77ba4a231d62559c47ee931ee2c', name: '' }; + const A2 = { key: 'a', blob: 'cf2ec18c2e686b4c966725f30050120d42d4b2e5', name: '' }; + const B1 = { key: 'b', blob: '05ab2ec03c7e32eff27305b4a11c573a3843fa01', name: '' }; + const C1 = { key: 'c', blob: 'db7d35b96291b823e674bf23ac59e6e116b1890e', name: '' }; + const D1 = { key: 'd', blob: 'f23ac59e6e11db7d35b96291b823e674b6b1890e', name: '' }; + const E1 = { key: 'e', blob: '1db7d35b96291f23ac59e6e1b823e674b6b1890e', name: '' }; + const F1 = { key: 'f', blob: '6291b823e674b6b137172d35b9f23ac59e6e190e', name: '' }; + + it('does it', () => { + const state = [A1, B1, E1, F1]; + const conflicts = [ + { + key: A1.key, + name: A1.name, + mineBlob: A1.blob, + theirsBlob: A2.blob, + choose: A1.blob, + }, + { + key: B1.key, + name: B1.name, + mineBlob: B1.blob, + theirsBlob: null, + choose: null, + }, + { + key: C1.key, + name: C1.name, + mineBlob: null, + theirsBlob: C1.blob, + choose: C1.blob, + }, + { + key: D1.key, + name: D1.name, + mineBlob: D1.blob, + theirsBlob: null, + choose: null, + }, + ]; + + expect(updateStateWithConflictResolutions(state, conflicts)).toEqual([A1, E1, F1, C1]); + }); + }); + + describe('preMergeCheck()', () => { + const A1 = { key: 'a', blob: '1932cc749f57a77ba4a231d62559c47ee931ee2c', name: '' }; + const A2 = { key: 'a', blob: 'cf2ec18c2e686b4c966725f30050120d42d4b2e5', name: '' }; + const B1 = { key: 'b', blob: '05ab2ec03c7e32eff27305b4a11c573a3843fa01', name: '' }; + const B2 = { key: 'b', blob: 'eb157a78ebd367a004c5a32a18d6d8c18e60ce00', name: '' }; + const DA1 = { key: 'a', document: { id: 'a', v: 1 }, name: '' }; + const DA2 = { key: 'a', document: { id: 'a', v: 2 }, name: '' }; + const DB1 = { key: 'b', document: { id: 'b', v: 1 }, name: '' }; + const DC1 = { key: 'c', document: { id: 'c', v: 1 }, name: '' }; + + it('no changes', () => { + const trunk = [A1]; + const other = [A1]; + const cands = [DA1]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [], + }); + }); + + it('candidates same as trunk but not other', () => { + const trunk = [A1, B1]; + const other = [A2, B2]; + const cands = [DA1, DB1]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [], + }); + }); + + it('candidate does not exist but trunk and other do', () => { + const trunk = [A1]; + const other = [A1]; + const cands = []; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [], + }); + }); + + it('candidate different than trunk and other does not exist', () => { + const trunk = [A1]; + const other = []; + const cands = [DA2]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [DA2], + dirty: [], + }); + }); + + it('candidate different than other and trunk does not exist', () => { + const trunk = []; + const other = [A1]; + const cands = [DA2]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [DA2], + dirty: [], + }); + }); + + it('candidate modified but trunk and other are same', () => { + const trunk = [A1]; + const other = [A1]; + const cands = [DA2]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [DA2], + }); + }); + + it('candidate not same as trunk but same as other', () => { + const trunk = [A1]; + const other = [A2]; + const cands = [DA2]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [], + }); + }); + + it('candidate not same as other but same as trunk', () => { + const trunk = [A1]; + const other = [A2]; + const cands = [DA1]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [], + }); + }); + + it('candidate not same as trunk and not in other', () => { + const trunk = [A1]; + const other = []; + const cands = [DA2]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [DA2], + dirty: [], + }); + }); + + it('candidate outside of history', () => { + const trunk = [A1]; + const other = [A2]; + const cands = [DC1]; + + expect(preMergeCheck(trunk, other, cands)).toEqual({ + conflicts: [], + dirty: [DC1], + }); + }); + }); + + describe('compareBranches()', () => { + it('empty states are the same', () => { + const a = newBranch([]); + const b = newBranch([]); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 0, + }); + }); + + it('works with other empty', () => { + const a = newBranch([]); + const b = newBranch(['1']); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 1, + }); + }); + + it('works with both null', () => { + const a = null; + const b = null; + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 0, + }); + }); + + it('works with null', () => { + const a = null; + const b = newBranch(['1']); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 1, + }); + }); + + it('works with other null', () => { + const a = newBranch(['1']); + const b = null; + expect(compareBranches(a, b)).toEqual({ + ahead: 1, + behind: 0, + }); + }); + + it('works with one empty', () => { + const a = newBranch(['1']); + const b = newBranch([]); + expect(compareBranches(a, b)).toEqual({ + ahead: 1, + behind: 0, + }); + }); + + it('same states are the same', () => { + const a = newBranch(['1']); + const b = newBranch(['1']); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 0, + }); + }); + + it('same final states are the same', () => { + const a = newBranch(['1', '2']); + const b = newBranch(['0', '2']); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 0, + }); + }); + + it('subset of B is ahead', () => { + const a = newBranch(['1', '2', '3']); + const b = newBranch(['0', '2']); + expect(compareBranches(a, b)).toEqual({ + ahead: 1, + behind: 0, + }); + }); + + it('subset of A is behind', () => { + const a = newBranch(['1', '2']); + const b = newBranch(['0', '2', '3']); + expect(compareBranches(a, b)).toEqual({ + ahead: 0, + behind: 1, + }); + }); + + it('states have diverged', () => { + const a = newBranch(['1', '2', '3', '5']); + const b = newBranch(['0', '2', '3', '4']); + expect(compareBranches(a, b)).toEqual({ + ahead: 1, + behind: 1, + }); + }); + + it('states have diverged scenario 2', () => { + const a = newBranch(['1', '2', '3', '5', '9']); + const b = newBranch(['0', '2', '3', '4', '8', '11']); + expect(compareBranches(a, b)).toEqual({ + ahead: 2, + behind: 3, + }); + }); + }); + + describe('hashDocument()', () => { + it('ignore object key order', () => { + const result1 = hashDocument({ c: 'c', a: 'a', b: 'b' }); + const result2 = hashDocument({ a: 'a', b: 'b', c: 'c' }); + + expect(result1.hash).toBe(result2.hash); + expect(result1.hash).toBe('fed03259e8027e1fab2e2e57b402671bef7f3eb9'); + expect(result2.hash).toBe('fed03259e8027e1fab2e2e57b402671bef7f3eb9'); + expect(result1.content.toString('utf8')).toBe('{"a":"a","b":"b","c":"c"}'); + expect(result2.content.toString('utf8')).toBe('{"a":"a","b":"b","c":"c"}'); + }); + + it('works on recursive things', () => { + const result1 = hashDocument({ + arr: [{ b: 'b', a: 'a' }], + obj: { + obj2: { b: 'b', a: 'a' }, + }, + }); + + const result2 = hashDocument({ + arr: [{ b: 'b', a: 'a' }], + obj: { + obj2: { a: 'a', b: 'b' }, + }, + }); + + expect(result1.hash).toBe(result2.hash); + expect(result1.hash).toBe('7eaaa8a03bada54b403aeada681aad6892a28ab3'); + expect(result2.hash).toBe('7eaaa8a03bada54b403aeada681aad6892a28ab3'); + expect(result1.content.toString('utf8')).toBe( + '{"arr":[{"a":"a","b":"b"}],"obj":{"obj2":{"a":"a","b":"b"}}}', + ); + expect(result2.content.toString('utf8')).toBe( + '{"arr":[{"a":"a","b":"b"}],"obj":{"obj2":{"a":"a","b":"b"}}}', + ); + }); + + it('array order matters', () => { + const result1 = hashDocument(['c', 'a', 'b']); + const result2 = hashDocument(['a', 'b', 'c']); + + expect(result1.hash).not.toBe(result2.hash); + expect(result1.hash).toBe('edf94aad27c26bdcfe7477e0ed68991cbaedf8d8'); + expect(result2.hash).toBe('e13460afb1e68af030bb9bee8344c274494661fa'); + expect(result1.content.toString('utf8')).toBe('["c","a","b"]'); + expect(result2.content.toString('utf8')).toBe('["a","b","c"]'); + }); + + it('works with strange types', () => { + const sDate1 = hashDocument(new Date(1541178019555)); + const sDate2 = hashDocument('2018-11-02T17:00:19.555Z'); + + expect(sDate1.hash).toBe(sDate2.hash); + expect(sDate1.hash).toBe('ec0a18c47fb39de00204c57b5b492fd408394a01'); + expect(sDate2.hash).toBe('ec0a18c47fb39de00204c57b5b492fd408394a01'); + expect(sDate1.content.toString('utf8')).toBe('"2018-11-02T17:00:19.555Z"'); + expect(sDate2.content.toString('utf8')).toBe('"2018-11-02T17:00:19.555Z"'); + + const sNull2 = hashDocument('null'); + expect(sNull2.hash).toBe('8c1030365643f1f4b7f00e3d88c0a3c555522b60'); + expect(sNull2.content.toString('utf8')).toBe('"null"'); + }); + + it('skips non-json types', () => { + const sFunc1 = hashDocument({ + a: [0, () => null], + fn: () => null, + }); + + const sFunc2 = hashDocument({ + a: [0], + }); + + expect(sFunc1.hash).toBe(sFunc2.hash); + expect(sFunc1.hash).toBe('38b742facb1034438d82cf1e294d9e71051bf120'); + expect(sFunc2.hash).toBe('38b742facb1034438d82cf1e294d9e71051bf120'); + expect(sFunc1.content.toString('utf8')).toBe('{"a":[0]}'); + expect(sFunc2.content.toString('utf8')).toBe('{"a":[0]}'); + }); + + it('fails on undefined', () => { + try { + hashDocument(undefined); + hashDocument(); + } catch (err) { + return; + } + throw new Error('Expected hashDocument(undefined) to fail'); + }); + + it('ignores object keys that do not matter', () => { + const result1 = hashDocument({ a: 'a', modified: 456 }); + const result2 = hashDocument({ a: 'a', modified: 123 }); + const result3 = hashDocument({ a: 'b', modified: 123 }); + + expect(result1.hash).toBe(result2.hash); + expect(result1.hash).not.toBe(result3.hash); + }); + }); +}); + +function newSnapshot(n, state) { + return { + id: `snapshot_${n}`, + created: new Date(), + parent: '00000', + author: 'author_1', + name: `Snapshot ${n}`, + description: `Test snapshot #${n}`, + state, + }; +} + +function newStateEntry(key, blob) { + return { + key, + blob, + name: `Blob ${key}.${blob}`, + }; +} + +function newCandidate(key, n) { + return { + key, + name: `Candidate ${n}`, + content: `Content for candidate ${key}.${n}`, + }; +} + +function newBranch(snapshots) { + return { + name: '', + created: new Date(0), + modified: new Date(0), + snapshots, + }; +} diff --git a/packages/insomnia-app/app/sync/vcs/index.js b/packages/insomnia-app/app/sync/vcs/index.js new file mode 100644 index 0000000000..4329d0b8cf --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/index.js @@ -0,0 +1,1448 @@ +// @flow + +import type { BaseDriver } from '../store/drivers/base'; +import path from 'path'; +import clone from 'clone'; +import Store from '../store'; +import crypto from 'crypto'; +import compress from '../store/hooks/compress'; +import * as paths from './paths'; +import type { + Branch, + DocumentKey, + Head, + MergeConflict, + Project, + Snapshot, + SnapshotState, + Stage, + StageEntry, + Status, + StatusCandidate, + Team, +} from '../types'; +import { + compareBranches, + generateCandidateMap, + getRootSnapshot, + getStagable, + hashDocument, + preMergeCheck, + stateDelta, + threeWayMerge, + updateStateWithConflictResolutions, +} from './util'; +import { chunkArray, generateId } from '../../common/misc'; +import * as crypt from '../../account/crypt'; +import * as session from '../../account/session'; +import * as fetch from '../../account/fetch'; + +const EMPTY_HASH = crypto + .createHash('sha1') + .digest('hex') + .replace(/./g, '0'); + +type ConflictHandler = (conflicts: Array) => Promise>; + +export default class VCS { + _store: Store; + _driver: BaseDriver; + _project: Project | null; + _conflictHandler: ?ConflictHandler; + + constructor(driver: BaseDriver, conflictHandler?: ConflictHandler) { + this._store = new Store(driver, [compress]); + this._conflictHandler = conflictHandler; + this._driver = driver; + + // To be set later + this._project = null; + } + + currentProjectId(): string | null { + return this._project ? this._project.id : null; + } + + newInstance(): VCS { + const newVCS: VCS = (Object.assign({}, this): any); + Object.setPrototypeOf(newVCS, VCS.prototype); + return newVCS; + } + + async setProject(project: Project): Promise { + this._project = project; + console.log(`[sync] Activate project ${project.id}`); + + // Store it because it might not be yet + await this._storeProject(project); + } + + async removeProjectsForRoot(rootDocumentId: string): Promise { + const all = await this._allProjects(); + const toRemove = all.filter(p => p.rootDocumentId === rootDocumentId); + for (const project of toRemove) { + await this._removeProject(project); + } + } + + async switchProject(rootDocumentId: string, name: string): Promise { + const project = await this._getOrCreateProject(rootDocumentId, name); + await this.setProject(project); + return project; + } + + async teams(): Promise> { + return this._queryTeams(); + } + + async projectTeams(): Promise> { + return this._queryProjectTeams(); + } + + async localProjects(): Promise> { + return this._allProjects(); + } + + async remoteProjects(): Promise> { + return this._queryProjects(); + } + + async blobFromLastSnapshot(key: string): Promise { + const branch = await this._getCurrentBranch(); + const snapshot = await this._getLatestSnapshot(branch.name); + if (!snapshot) { + return null; + } + + const entry = snapshot.state.find(e => e.key === key); + if (!entry) { + return null; + } + + return this._getBlob(entry.blob); + } + + async status(candidates: Array, baseStage: Stage): Promise { + const stage = clone(baseStage); + const branch = await this._getCurrentBranch(); + const snapshot: Snapshot | null = await this._getLatestSnapshot(branch.name); + const state = snapshot ? snapshot.state : []; + + const unstaged: { [DocumentKey]: StageEntry } = {}; + for (const entry of getStagable(state, candidates)) { + const { key } = entry; + const stageEntry = stage[key]; + + if (!stageEntry || stageEntry.blobId !== entry.blobId) { + unstaged[key] = entry; + } + } + + return { + stage, + unstaged, + key: hashDocument({ stage, unstaged }).hash, + }; + } + + async stage(stage: Stage, stageEntries: Array): Promise { + const blobsToStore: { [string]: string } = {}; + for (const entry of stageEntries) { + stage[entry.key] = entry; + + // Only store blobs if we're not deleting it + if (entry.added || entry.modified) { + blobsToStore[entry.blobId] = entry.blobContent; + } + } + + await this._storeBlobs(blobsToStore); + + return stage; + } + + async unstage(stage: Stage, stageEntries: Array): Promise { + for (const entry of stageEntries) { + delete stage[entry.key]; + } + + return stage; + } + + static validateBranchName(branchName: string): string { + if (!branchName.match(/^[a-zA-Z0-9][a-zA-Z0-9-_.]{3,}$/)) { + return 'Branch names can only contain letters, numbers, - and _'; + } + + return ''; + } + + async compareRemoteBranch(): Promise<{ ahead: number, behind: number }> { + const localBranch = await this._getCurrentBranch(); + const remoteBranch = await this._queryBranch(localBranch.name); + return compareBranches(localBranch, remoteBranch); + } + + async fork(newBranchName: string): Promise { + const errMsg = VCS.validateBranchName(newBranchName); + if (errMsg) { + throw new Error(errMsg); + } + + if (await this._getBranch(newBranchName)) { + throw new Error('Branch already exists by name ' + newBranchName); + } + + const newBranch: Branch = { + name: newBranchName, + created: new Date(), + modified: new Date(), + snapshots: (await this._getCurrentBranch()).snapshots, + }; + + await this._storeBranch(newBranch); + } + + async removeRemoteBranch(branchName: string): Promise { + if (branchName === 'master') { + throw new Error('Cannot delete master branch'); + } + + await this._queryRemoveBranch(branchName); + } + + async removeBranch(branchName: string): Promise { + const branchToDelete = await this._assertBranch(branchName); + const currentBranch = await this._getCurrentBranch(); + + if (branchToDelete.name === 'master') { + throw new Error('Cannot delete master branch'); + } + + if (branchToDelete.name === currentBranch.name) { + throw new Error('Cannot delete currently-active branch'); + } + + await this._removeBranch(branchToDelete); + } + + async checkout( + candidates: Array, + branchName: string, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + const branchCurrent = await this._getCurrentBranch(); + const latestSnapshotCurrent: Snapshot | null = await this._getLatestSnapshot( + branchCurrent.name, + ); + const latestStateCurrent = latestSnapshotCurrent ? latestSnapshotCurrent.state : []; + + const branchNext = await this._getOrCreateBranch(branchName); + const latestSnapshotNext: Snapshot | null = await this._getLatestSnapshot(branchNext.name); + const latestStateNext = latestSnapshotNext ? latestSnapshotNext.state : []; + + // Perform pre-checkout checks + const { conflicts, dirty } = preMergeCheck(latestStateCurrent, latestStateNext, candidates); + if (conflicts.length) { + throw new Error('Please snapshot current changes before switching branches'); + } + + await this._storeHead({ branch: branchNext.name }); + + const dirtyMap = generateCandidateMap(dirty); + const delta = stateDelta(latestStateCurrent, latestStateNext); + + // Filter out things that should stay dirty + const add = delta.add.filter(e => !dirtyMap[e.key]); + const update = delta.update.filter(e => !dirtyMap[e.key]); + const remove = delta.remove.filter(e => !dirtyMap[e.key]); + const upsert = [...add, ...update]; + + // Remove all dirty items from the delta so we keep them around + return { + upsert: await this._getBlobs(upsert.map(e => e.blob)), + remove: await this._getBlobs(remove.map(e => e.blob)), + }; + } + + async handleAnyConflicts( + conflicts: Array, + errorMsg: string, + ): Promise> { + if (conflicts.length === 0) { + return conflicts; + } + + if (!this._conflictHandler) { + throw new Error(errorMsg); + } + + return this._conflictHandler(conflicts); + } + + async allDocuments(): Promise { + const branch = await this._getCurrentBranch(); + const snapshot: Snapshot | null = await this._getLatestSnapshot(branch.name); + if (!snapshot) { + throw new Error('Failed to get latest snapshot for all documents'); + } + + return this._getBlobs(snapshot.state.map(s => s.blob)); + } + + async rollbackToLatest( + candidates: Array, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + const branch = await this._getCurrentBranch(); + const latestSnapshot = await this._getLatestSnapshot(branch.name); + if (!latestSnapshot) { + throw new Error('No snapshots to rollback to'); + } + + return this.rollback(latestSnapshot.id, candidates); + } + + async rollback( + snapshotId: string, + candidates: Array, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + const rollbackSnapshot: Snapshot | null = await this._getSnapshot(snapshotId); + if (rollbackSnapshot === null) { + throw new Error(`Failed to find snapshot by id ${snapshotId}`); + } + + const potentialNewState: SnapshotState = candidates.map(c => ({ + key: c.key, + blob: hashDocument(c.document).hash, + name: c.name, + })); + + const delta = stateDelta(potentialNewState, rollbackSnapshot.state); + + // We need to treat removals of candidates differently because they may not + // yet have been stored as blobs. + const remove = []; + for (const e of delta.remove) { + const c = candidates.find(c => c.key === e.key); + if (!c) { + // Should never happen + throw new Error('Failed to find removal in candidates'); + } + remove.push(c.document); + } + + const upsert = [...delta.update, ...delta.add]; + return { + upsert: await this._getBlobs(upsert.map(e => e.blob)), + remove, + }; + } + + async getHistoryCount(): Promise { + const branch = await this._getCurrentBranch(); + return branch.snapshots.length; + } + + async getHistory(): Promise> { + const branch = await this._getCurrentBranch(); + const snapshots = []; + for (const id of branch.snapshots) { + const snapshot = await this._getSnapshot(id); + if (snapshot === null) { + throw new Error(`Failed to get snapshot id=${id}`); + } + + snapshots.push(snapshot); + } + + return snapshots; + } + + async getBranch(): Promise { + const branch = await this._getCurrentBranch(); + return branch.name; + } + + async getRemoteBranches(): Promise> { + const branches = await this._queryBranches(); + return branches.map(b => b.name); + } + + async getBranches(): Promise> { + const branches = await this._getBranches(); + return branches.map(b => b.name); + } + + async merge( + candidates: Array, + otherBranchName: string, + snapshotMessage?: string, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + const branch = await this._getCurrentBranch(); + return this._merge(candidates, branch.name, otherBranchName, snapshotMessage); + } + + async takeSnapshot(stage: Stage, name: string): Promise { + const branch: Branch = await this._getCurrentBranch(); + const parent: Snapshot | null = await this._getLatestSnapshot(branch.name); + + if (!name) { + throw new Error('Snapshot must have a message'); + } + + // Ensure there is something on the stage + if (Object.keys(stage).length === 0) { + throw new Error('Snapshot does not have any changes'); + } + + const newState: SnapshotState = []; + + // Add everything from the old state + for (const entry of parent ? parent.state : []) { + // Don't add anything that's in the stage (this covers deleted things too :]) + if (stage[entry.key]) { + continue; + } + + newState.push(entry); + } + + // Add the rest of the staged items + for (const key of Object.keys(stage)) { + const entry = stage[key]; + if (entry.deleted) { + continue; + } + + const { name, blobId: blob } = entry; + newState.push({ key, name, blob }); + } + + await this._createSnapshotFromState(branch, newState, name); + } + + async pull( + candidates: Array, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + await this._getOrCreateRemoteProject(); + + const localBranch = await this._getCurrentBranch(); + const tmpBranchForRemote = await this._fetch(localBranch.name + '.hidden', localBranch.name); + + // Merge branch and ensure that we use the remote's history when merging + const message = `Synced latest changes from ${localBranch.name}`; + const delta = await this._merge( + candidates, + localBranch.name, + tmpBranchForRemote.name, + message, + true, + ); + + // Remove tmp branch + await this._removeBranch(tmpBranchForRemote); + + return delta; + } + + async shareWithTeam(teamId: string): Promise { + const { memberKeys, projectKey } = await this._queryProjectShareInstructions(teamId); + const { privateKey } = this._assertSession(); + const symmetricKey = crypt.decryptRSAWithJWK(privateKey, projectKey.encSymmetricKey); + + const keys = []; + for (const { accountId, publicKey } of memberKeys) { + const encSymmetricKey = crypt.encryptRSAWithJWK(JSON.parse(publicKey), symmetricKey); + keys.push({ accountId, encSymmetricKey }); + } + + await this._queryProjectShare(teamId, keys); + } + + async unShareWithTeam(): Promise { + await this._queryProjectUnShare(); + } + + async _getOrCreateRemoteProject(): Promise { + const localProject = await this._assertProject(); + let project = await this._queryProject(); + if (!project) { + project = await this._queryCreateProject(localProject.rootDocumentId, localProject.name); + } + + await this._storeProject(project); + return project; + } + + async push(): Promise { + await this._getOrCreateRemoteProject(); + const branch = await this._getCurrentBranch(); + + // Check branch history to make sure there are no conflicts + let lastMatchingIndex = 0; + const remoteBranch: Branch | null = await this._queryBranch(branch.name); + const remoteBranchSnapshots = remoteBranch ? remoteBranch.snapshots : []; + for (; lastMatchingIndex < remoteBranchSnapshots.length; lastMatchingIndex++) { + if (remoteBranchSnapshots[lastMatchingIndex] !== branch.snapshots[lastMatchingIndex]) { + throw new Error('Remote history conflict. Please pull latest changes and try again'); + } + } + + // Get the remaining snapshots to push + const snapshotIdsToPush = branch.snapshots.slice(lastMatchingIndex); + if (snapshotIdsToPush.length === 0) { + throw new Error('Already up to date'); + } + + // Gather a list of snapshot state entries to push + const allBlobIds = new Set(); + const snapshots = []; + for (const id of snapshotIdsToPush) { + const snapshot = await this._assertSnapshot(id); + snapshots.push(snapshot); + + for (const entry of snapshot.state) { + allBlobIds.add(entry.blob); + } + } + + // Figure out which blobs the backend is missing + const missingIds = await this._queryBlobsMissing(Array.from(allBlobIds)); + await this._queryPushBlobs(missingIds); + await this._queryPushSnapshots(snapshots); + } + + async _fetch(localBranchName: string, remoteBranchName: string): Promise { + const remoteBranch: Branch | null = await this._queryBranch(remoteBranchName); + if (!remoteBranch) { + throw new Error(`The remote branch "${remoteBranchName}" does not exist`); + } + + // Fetch snapshots and blobs from remote branch + let snapshotsToFetch: Array = []; + for (const snapshotId of remoteBranch.snapshots) { + const localSnapshot = await this._getSnapshot(snapshotId); + if (!localSnapshot) { + snapshotsToFetch.push(snapshotId); + } + } + + // Find blobs to fetch + const blobsToFetch = new Set(); + const snapshots = await this._querySnapshots(snapshotsToFetch); + for (const snapshot of snapshots) { + for (const { blob } of snapshot.state) { + const hasBlob = await this._hasBlob(blob); + if (hasBlob) { + continue; + } + + blobsToFetch.add(blob); + } + } + + // Fetch and store the blobs + const ids = Array.from(blobsToFetch); + const blobs = await this._queryBlobs(ids); + await this._storeBlobsBuffer(blobs); + + // Store the snapshots + await this._storeSnapshots(snapshots); + + // Create the new branch and save it + const branch = clone(remoteBranch); + branch.created = branch.modified = new Date(); + branch.name = localBranchName; + await this._storeBranch(branch); + + return branch; + } + + async _merge( + candidates: Array, + trunkBranchName: string, + otherBranchName: string, + snapshotMessage?: string, + useOtherBranchHistory?: boolean, + ): Promise<{ + upsert: Array, + remove: Array, + }> { + const branchOther = await this._assertBranch(otherBranchName); + const latestSnapshotOther: Snapshot | null = await this._getLatestSnapshot(branchOther.name); + + const branchTrunk = await this._assertBranch(trunkBranchName); + const rootSnapshotId = getRootSnapshot(branchTrunk, branchOther); + const rootSnapshot: Snapshot | null = await this._getSnapshot(rootSnapshotId || 'n/a'); + const latestSnapshotTrunk: Snapshot | null = await this._getLatestSnapshot(branchTrunk.name); + const latestStateTrunk = latestSnapshotTrunk ? latestSnapshotTrunk.state : []; + const latestStateOther = latestSnapshotOther ? latestSnapshotOther.state : []; + + // Perform pre-merge checks + const { conflicts: preConflicts, dirty } = preMergeCheck( + latestStateTrunk, + latestStateOther, + candidates, + ); + + if (preConflicts.length) { + console.log('[sync] Merge failed', preConflicts); + throw new Error('Please snapshot current changes before merging'); + } + + const shouldDoNothing1 = latestSnapshotOther && latestSnapshotOther.id === rootSnapshotId; + const shouldDoNothing2 = branchOther.snapshots.length === 0; + const shouldFastForward1 = + rootSnapshot && (!latestSnapshotTrunk || rootSnapshot.id === latestSnapshotTrunk.id); + const shouldFastForward2 = branchTrunk.snapshots.length === 0; + + if (shouldDoNothing1 || shouldDoNothing2) { + console.log('[sync] Nothing to merge'); + } else if (shouldFastForward1 || shouldFastForward2) { + console.log('[sync] Performing fast-forward merge'); + branchTrunk.snapshots = branchOther.snapshots; + await this._storeBranch(branchTrunk); + } else { + const rootState = rootSnapshot ? rootSnapshot.state : []; + + console.log('[sync] Performing 3-way merge'); + const { state: stateBeforeConflicts, conflicts: mergeConflicts } = threeWayMerge( + rootState, + latestStateTrunk, + latestStateOther, + ); + + // Update state with conflict resolutions applied + const conflictResolutions = await this.handleAnyConflicts(mergeConflicts, ''); + const state = updateStateWithConflictResolutions(stateBeforeConflicts, conflictResolutions); + + // Sometimes we want to merge into trunk but keep the other branch's history + if (useOtherBranchHistory) { + branchTrunk.snapshots = branchOther.snapshots; + } + + const snapshotName = snapshotMessage || `Merged branch ${branchOther.name}`; + await this._createSnapshotFromState(branchTrunk, state, snapshotName); + } + + const newLatestSnapshot = await this._getLatestSnapshot(branchTrunk.name); + const newLatestSnapshotState = newLatestSnapshot ? newLatestSnapshot.state : []; + + const { add, update, remove } = stateDelta(latestStateTrunk, newLatestSnapshotState); + const upsert = [...add, ...update]; + + // Remove all dirty items from the delta so we keep them around + const dirtyMap = generateCandidateMap(dirty); + return { + upsert: await this._getBlobs(upsert.filter(e => !dirtyMap[e.key]).map(e => e.blob)), + remove: await this._getBlobs(remove.filter(e => !dirtyMap[e.key]).map(e => e.blob)), + }; + } + + async _createSnapshotFromState( + branch: Branch, + state: SnapshotState, + name: string, + ): Promise { + const parentId = branch.snapshots.length + ? branch.snapshots[branch.snapshots.length - 1] + : EMPTY_HASH; + + // Create the snapshot + const id = _generateSnapshotID(parentId, this._projectId(), state); + const snapshot: Snapshot = { + id, + name, + state, + author: '', // Will be set when pushed + parent: parentId, + created: new Date(), + description: '', + }; + + // Update the branch history + branch.modified = new Date(); + branch.snapshots.push(snapshot.id); + + await this._storeBranch(branch); + await this._storeSnapshot(snapshot); + console.log(`[sync] Created snapshot '${name}' on ${branch.name}`); + + return snapshot; + } + + async _runGraphQL(query: string, variables: { [string]: any }, name: string): Promise { + const { sessionId } = this._assertSession(); + const { data, errors } = await fetch.post('/graphql?' + name, { query, variables }, sessionId); + + if (errors && errors.length) { + throw new Error(`Failed to query ${name}`); + } + + return data; + } + + async _queryBlobsMissing(ids: Array): Promise> { + const { blobsMissing } = await this._runGraphQL( + ` + query ($projectId: ID!, $ids: [ID!]!) { + blobsMissing(project: $projectId, ids: $ids) { + missing + } + } + `, + { + ids, + projectId: this._projectId(), + }, + 'missingBlobs', + ); + + return blobsMissing.missing; + } + + async _queryBranches(): Promise> { + const { branches } = await this._runGraphQL( + ` + query ($projectId: ID!) { + branches(project: $projectId) { + created + modified + name + snapshots + } + }`, + { + projectId: this._projectId(), + }, + 'branches', + ); + + // TODO: Fix server returning null instead of empty list + return branches || []; + } + + async _queryRemoveBranch(branchName: string): Promise { + await this._runGraphQL( + ` + mutation ($projectId: ID!, $branch: String!) { + branchRemove(project: $projectId, name: $branch) + }`, + { + projectId: this._projectId(), + branch: branchName, + }, + 'removeBranch', + ); + } + + async _queryBranch(branchName: string): Promise { + const { branch } = await this._runGraphQL( + ` + query ($projectId: ID!, $branch: String!) { + branch(project: $projectId, name: $branch) { + created + modified + name + snapshots + } + }`, + { + projectId: this._projectId(), + branch: branchName, + }, + 'branch', + ); + + return branch; + } + + async _querySnapshots(allIds: Array): Promise> { + let allSnapshots = []; + for (const ids of chunkArray(allIds, 20)) { + const { snapshots } = await this._runGraphQL( + ` + query ($ids: [ID!]!, $projectId: ID!) { + snapshots(ids: $ids, project: $projectId) { + id + parent + created + author + name + description + state { + blob + key + name + } + } + }`, + { + ids, + projectId: this._projectId(), + }, + 'snapshots', + ); + allSnapshots = [...allSnapshots, ...snapshots]; + } + + return allSnapshots; + } + + async _queryPushSnapshots(allSnapshots: Array): Promise { + const { accountId } = this._assertSession(); + + for (const snapshots of chunkArray(allSnapshots, 20)) { + // This bit of logic fills in any missing author IDs from times where + // the user created snapshots while not logged in + for (const snapshot of snapshots) { + if (snapshot.author === '') { + snapshot.author = accountId; + } + } + + const branch = await this._getCurrentBranch(); + const { snapshotsCreate } = await this._runGraphQL( + ` + mutation ($projectId: ID!, $snapshots: [SnapshotInput!]!, $branchName: String!) { + snapshotsCreate(project: $projectId, snapshots: $snapshots, branch: $branchName) { + id + } + } + `, + { + branchName: branch.name, + projectId: this._projectId(), + snapshots, + }, + 'snapshotsPush', + ); + + console.log('[sync] Pushed snapshots', snapshotsCreate.map(s => s.id).join(', ')); + } + } + + async _queryBlobs(allIds: Array): Promise<{ [string]: Buffer }> { + const symmetricKey = await this._getProjectSymmetricKey(); + const result = {}; + + for (const ids of chunkArray(allIds, 50)) { + const { blobs } = await this._runGraphQL( + ` + query ($ids: [ID!]!, $projectId: ID!) { + blobs(ids: $ids, project: $projectId) { + id + content + } + }`, + { + ids, + projectId: this._projectId(), + }, + 'blobs', + ); + + for (const blob of blobs) { + const encryptedResult = JSON.parse(blob.content); + result[blob.id] = crypt.decryptAESToBuffer(symmetricKey, encryptedResult); + } + } + + return result; + } + + async _queryPushBlobs(allIds: Array): Promise { + const symmetricKey = await this._getProjectSymmetricKey(); + + const next = async (items: Array<{ id: string, content: string }>) => { + const encodedBlobs = items.map(i => ({ + id: i.id, + content: i.content, + })); + + const { blobsCreate } = await this._runGraphQL( + ` + mutation ($projectId: ID!, $blobs: [BlobInput!]!) { + blobsCreate(project: $projectId, blobs: $blobs) { + count + } + } + `, + { + blobs: encodedBlobs, + projectId: this._projectId(), + }, + 'blobsCreate', + ); + + return blobsCreate.count; + }; + + // Push each missing blob in batches of 2MB max + let count = 0; + let batch = []; + let batchSizeBytes = 0; + const maxBatchSize = 1024 * 1024 * 2; // 2 MB + const maxBatchCount = 200; + for (let i = 0; i < allIds.length; i++) { + const id = allIds[i]; + const content = await this._getBlobRaw(id); + if (content === null) { + throw new Error(`Failed to get blob id=${id}`); + } + + const encryptedResult = crypt.encryptAESBuffer(symmetricKey, content); + batch.push({ id, content: JSON.stringify(encryptedResult, null, 2) }); + + batchSizeBytes += content.length; + const isLastId = i === allIds.length - 1; + if (batchSizeBytes > maxBatchSize || isLastId || batch.length >= maxBatchCount) { + count += await next(batch); + const batchSizeMB = Math.round((batchSizeBytes / 1024) * 100) / 100; + console.log(`[sync] Uploaded ${count}/${allIds.length} blobs in batch ${batchSizeMB} KB`); + batch = []; + batchSizeBytes = 0; + } + } + + console.log(`[sync] Finished uploading ${count}/${allIds.length} blobs`); + } + + async _queryProjectKey(): Promise { + const { projectKey } = await this._runGraphQL( + ` + query ($projectId: ID!) { + projectKey(projectId: $projectId) { + encSymmetricKey + } + } + `, + { + projectId: this._projectId(), + }, + 'projectKey', + ); + + return projectKey.encSymmetricKey; + } + + async _queryTeams(): Promise> { + const { teams } = await this._runGraphQL( + ` + query { + teams { + id + name + } + } + `, + {}, + 'teams', + ); + + return teams; + } + + async _queryProjectUnShare(): Promise { + await this._runGraphQL( + ` + mutation ($id: ID!) { + projectUnShare(id: $id) { + id + } + } + `, + { + id: this._projectId(), + }, + 'projectUnShare', + ); + } + + async _queryProjectShare( + teamId: string, + keys: Array<{ accountId: string, encSymmetricKey: string }>, + ): Promise { + await this._runGraphQL( + ` + mutation ($id: ID!, $teamId: ID!, $keys: [ProjectShareKeyInput!]!) { + projectShare(teamId: $teamId, id: $id, keys: $keys) { + id + } + } + `, + { + keys, + teamId, + id: this._projectId(), + }, + 'projectShare', + ); + } + + async _queryProjectShareInstructions( + teamId: string, + ): Promise<{ + teamId: string, + projectKey: { + encSymmetricKey: string, + }, + memberKeys: Array<{ + accountId: string, + publicKey: string, + }>, + }> { + const { projectShareInstructions } = await this._runGraphQL( + ` + query ($id: ID!, $teamId: ID!) { + projectShareInstructions(teamId: $teamId, id: $id) { + teamId + projectKey { + encSymmetricKey + } + memberKeys { + accountId + publicKey + } + } + } + `, + { + id: this._projectId(), + teamId: teamId, + }, + 'projectShareInstructions', + ); + + return projectShareInstructions; + } + + async _queryProjects(): Promise> { + const { projects } = await this._runGraphQL( + ` + query { + projects { + id + name + rootDocumentId + } + } + `, + {}, + 'projects', + ); + + return projects; + } + + async _queryProject(): Promise { + const { project } = await this._runGraphQL( + ` + query ($id: ID!) { + project(id: $id) { + id + name + rootDocumentId + } + } + `, + { + id: this._projectId(), + }, + 'project', + ); + + return project; + } + + async _queryProjectTeams(): Promise> { + const run = async () => { + const { project } = await this._runGraphQL( + ` + query ($id: ID!) { + project(id: $id) { + teams { + id + name + } + } + } + `, + { + id: this._projectId(), + }, + 'project.teams', + ); + return project; + }; + + let project = await run(); + + // Retry once if project doesn't exist yet + if (project === null) { + await this._getOrCreateRemoteProject(); + project = await run(); + } + + return project.teams; + } + + async _queryCreateProject(workspaceId: string, workspaceName: string): Promise { + const { publicKey } = this._assertSession(); + + // Generate symmetric key for ResourceGroup + const symmetricKey = await crypt.generateAES256Key(); + const symmetricKeyStr = JSON.stringify(symmetricKey); + + // Encrypt the symmetric key with Account public key + const encSymmetricKey = crypt.encryptRSAWithJWK(publicKey, symmetricKeyStr); + + const { projectCreate } = await this._runGraphQL( + ` + mutation ($rootDocumentId: ID!, $name: String!, $id: ID!, $key: String!) { + projectCreate(name: $name, id: $id, rootDocumentId: $rootDocumentId, encSymmetricKey: $key) { + id + name + rootDocumentId + } + } + `, + { + id: this._projectId(), + rootDocumentId: workspaceId, + name: workspaceName, + key: encSymmetricKey, + }, + 'createProject', + ); + + return projectCreate; + } + + async _getProject(): Promise { + return this._store.getItem(paths.project(this._projectId())); + } + + async _getProjectById(id: string): Promise { + return this._store.getItem(paths.project(id)); + } + + async _getProjectSymmetricKey(): Promise { + const { privateKey } = this._assertSession(); + const encSymmetricKey = await this._queryProjectKey(); + const symmetricKeyStr = crypt.decryptRSAWithJWK(privateKey, encSymmetricKey); + return JSON.parse(symmetricKeyStr); + } + + async _assertProject(): Promise { + const project = await this._getProject(); + if (project === null) { + throw new Error('Failed to find local project id=' + this._projectId()); + } + + return project; + } + + async _storeProject(project: Project): Promise { + return this._store.setItem(paths.project(project.id), project); + } + + async _getHead(): Promise { + const head = await this._store.getItem(paths.head(this._projectId())); + if (head === null) { + await this._storeHead({ branch: 'master' }); + return this._getHead(); + } + + return head; + } + + async _getCurrentBranch(): Promise { + const head = await this._getHead(); + return this._getOrCreateBranch(head.branch); + } + + _assertSession(): {| + accountId: string, + sessionId: string, + privateKey: Object, + publicKey: Object, + |} { + if (!session.isLoggedIn()) { + throw new Error('Not logged in'); + } + + return { + accountId: session.getAccountId(), + sessionId: session.getCurrentSessionId(), + privateKey: session.getPrivateKey(), + publicKey: session.getPublicKey(), + }; + } + + async _assertBranch(branchName: string): Promise { + const branch = await this._getBranch(branchName); + if (branch === null) { + throw new Error(`Branch does not exist with name ${branchName}`); + } + + return branch; + } + + _projectId(): string { + if (this._project === null) { + throw new Error('No active project'); + } + + return this._project.id; + } + + async _getBranch(name: string, projectId?: string): Promise { + const pId = projectId || this._projectId(); + const p = paths.branch(pId, name); + return this._store.getItem(p); + } + + async _getBranches(projectId?: string): Promise> { + const branches = []; + const pId = projectId || this._projectId(); + for (const p of await this._store.keys(paths.branches(pId))) { + const b = await this._store.getItem(p); + if (b === null) { + // Should never happen + throw new Error(`Failed to get branch path=${p}`); + } + + branches.push(b); + } + + return branches; + } + + async _getOrCreateBranch(name: string): Promise { + if (!name) { + throw new Error('No branch name specified for get-or-create operation'); + } + + const branch = await this._getBranch(name); + + if (branch === null) { + await this._storeBranch({ + name, + created: new Date(), + modified: new Date(), + snapshots: [], + }); + + return this._getOrCreateBranch(name); + } + + return branch; + } + + async _getOrCreateProject(rootDocumentId: string, name: string): Promise { + if (!rootDocumentId) { + throw new Error('No root document ID supplied for project'); + } + + if (!name) { + throw new Error('No name supplied for project'); + } + + // First, try finding the project + const projects = await this._allProjects(); + let matchedProjects = projects.filter(p => p.rootDocumentId === rootDocumentId); + + // If there is more than one project for root, try pruning unused ones by branch activity + if (matchedProjects.length > 1) { + for (const p of matchedProjects) { + const branches = await this._getBranches(p.id); + if (!branches.find(b => b.snapshots.length > 0)) { + await this._removeProject(p); + matchedProjects = matchedProjects.filter(({ id }) => id !== p.id); + console.log(`[sync] Remove inactive project for root ${rootDocumentId}`); + } + } + } + + // If there are still too many, error out + if (matchedProjects.length > 1) { + console.log('[sync] Multiple projects matched for root', { + projects, + matchedProjects, + rootDocumentId, + }); + throw new Error('More than one project matched query'); + } + + let project: Project | null = matchedProjects[0] || null; + + // If we still don't have a project, create one + if (!project) { + const id = generateId('prj'); + project = { id, name, rootDocumentId }; + await this._storeProject(project); + } + + return project; + } + + async _allProjects(): Promise> { + const projects = []; + const basePath = paths.projects(); + const keys = await this._store.keys(basePath, false); + for (const key of keys) { + const id = path.basename(key); + const p: Project | null = await this._getProjectById(id); + if (p === null) { + // Folder exists but project meta file is gone + continue; + } + + projects.push(p); + } + + return projects; + } + + async _assertSnapshot(id: string): Promise { + const snapshot = await this._store.getItem(paths.snapshot(this._projectId(), id)); + if (snapshot && typeof snapshot.created === 'string') { + snapshot.created = new Date(snapshot.created); + } + + if (!snapshot) { + throw new Error(`Failed to find snapshot id=${id}`); + } + + return snapshot; + } + + async _getSnapshot(id: string): Promise { + const snapshot = await this._store.getItem(paths.snapshot(this._projectId(), id)); + if (snapshot && typeof snapshot.created === 'string') { + snapshot.created = new Date(snapshot.created); + } + + return snapshot; + } + + async _getLatestSnapshot(branchName: string): Promise { + const branch = await this._getOrCreateBranch(branchName); + const snapshots = branch ? branch.snapshots : []; + const parentId = snapshots.length ? snapshots[snapshots.length - 1] : EMPTY_HASH; + return this._getSnapshot(parentId); + } + + async _storeSnapshot(snapshot: Snapshot): Promise { + return this._store.setItem(paths.snapshot(this._projectId(), snapshot.id), snapshot); + } + + async _storeSnapshots(snapshots: Array): Promise { + const promises = []; + for (const snapshot of snapshots) { + const p = paths.snapshot(this._projectId(), snapshot.id); + promises.push(this._store.setItem(p, snapshot)); + } + + await Promise.all(promises); + } + + async _storeBranch(branch: Branch): Promise { + const errMsg = VCS.validateBranchName(branch.name); + if (errMsg) { + throw new Error(errMsg); + } + + branch.modified = new Date(); + return this._store.setItem(paths.branch(this._projectId(), branch.name.toLowerCase()), branch); + } + + async _removeBranch(branch: Branch): Promise { + return this._store.removeItem(paths.branch(this._projectId(), branch.name)); + } + + async _removeProject(project: Project): Promise { + return this._store.removeItem(paths.project(project.id)); + } + + async _storeHead(head: Head): Promise { + await this._store.setItem(paths.head(this._projectId()), head); + } + + async _getBlob(id: string): Promise { + const p = paths.blob(this._projectId(), id); + return this._store.getItem(p); + } + + async _getBlobs(ids: Array): Promise> { + const promises = []; + for (const id of ids) { + promises.push(this._getBlob(id)); + } + + return Promise.all(promises); + } + + async _storeBlob(id: string, content: Object | null): Promise { + return this._store.setItem(paths.blob(this._projectId(), id), content); + } + + async _storeBlobs(map: { [string]: string }): Promise { + const promises = []; + for (const id of Object.keys(map)) { + const buff = Buffer.from(map[id], 'utf8'); + promises.push(this._storeBlob(id, buff)); + } + + await Promise.all(promises); + } + + async _storeBlobsBuffer(map: { [string]: Buffer }): Promise { + const promises = []; + for (const id of Object.keys(map)) { + const p = paths.blob(this._projectId(), id); + promises.push(this._store.setItemRaw(p, map[id])); + } + + await Promise.all(promises); + } + + async _getBlobRaw(id: string): Promise { + return this._store.getItemRaw(paths.blob(this._projectId(), id)); + } + + async _hasBlob(id: string): Promise { + return this._store.hasItem(paths.blob(this._projectId(), id)); + } +} + +/** Generate snapshot ID from hashing parent, project, and state together */ +function _generateSnapshotID(parentId: string, projectId: string, state: SnapshotState): string { + const hash = crypto + .createHash('sha1') + .update(projectId) + .update(parentId); + + const newState = [...state].sort((a, b) => (a.blob > b.blob ? 1 : -1)); + + for (const entry of newState) { + hash.update(entry.blob); + } + + return hash.digest('hex'); +} diff --git a/packages/insomnia-app/app/sync/vcs/paths.js b/packages/insomnia-app/app/sync/vcs/paths.js new file mode 100644 index 0000000000..ddb3f39ed1 --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/paths.js @@ -0,0 +1,42 @@ +// @flow + +export function projects(): string { + return `/projects/`; +} + +export function projectBase(projectId: string): string { + return `${projects()}${projectId}/`; +} + +export function head(projectId: string): string { + return `${projectBase(projectId)}head.json`; +} + +export function project(projectId: string): string { + return `${projectBase(projectId)}meta.json`; +} + +export function blobs(projectId: string): string { + return `${projectBase(projectId)}blobs/`; +} + +export function blob(projectId: string, blobId: string): string { + const subPath = `${blobId.slice(0, 2)}/${blobId.slice(2)}`; + return `${blobs(projectId)}${subPath}`; +} + +export function snapshots(projectId: string): string { + return `${projectBase(projectId)}snapshots/`; +} + +export function snapshot(projectId: string, snapshotId: string): string { + return `${snapshots(projectId)}${snapshotId}.json`; +} + +export function branches(projectId: string): string { + return `${projectBase(projectId)}branches/`; +} + +export function branch(projectId: string, branchName: string): string { + return `${branches(projectId)}${branchName}.json`; +} diff --git a/packages/insomnia-app/app/sync/vcs/util.js b/packages/insomnia-app/app/sync/vcs/util.js new file mode 100644 index 0000000000..559df617b8 --- /dev/null +++ b/packages/insomnia-app/app/sync/vcs/util.js @@ -0,0 +1,478 @@ +// @flow +import clone from 'clone'; +import crypto from 'crypto'; +import { deterministicStringify } from '../lib/deterministicStringify'; +import type { + Branch, + DocumentKey, + MergeConflict, + Snapshot, + SnapshotState, + SnapshotStateEntry, + SnapshotStateMap, + StageEntry, + StatusCandidate, + StatusCandidateMap, +} from '../types'; + +export function generateSnapshotStateMap(snapshot: Snapshot | null): SnapshotStateMap { + if (!snapshot) { + return {}; + } + + return generateStateMap(snapshot.state); +} + +export function generateStateMap(state: SnapshotState | null): SnapshotStateMap { + if (!state) { + return {}; + } + + const map = {}; + for (const entry of state) { + map[entry.key] = entry; + } + return map; +} + +export function generateCandidateMap(candidates: Array): StatusCandidateMap { + const map = {}; + for (const candidate of candidates) { + map[candidate.key] = candidate; + } + return map; +} + +export function combinedMapKeys( + ...maps: Array +): Array { + const keyMap = {}; + for (const map of maps) { + for (const key of Object.keys(map)) { + keyMap[key] = true; + } + } + + return Object.keys(keyMap); +} + +export function threeWayMerge( + root: SnapshotState, + trunk: SnapshotState, + other: SnapshotState, +): { state: SnapshotState, conflicts: Array } { + const stateRoot = generateStateMap(root); + const stateTrunk = generateStateMap(trunk); + const stateOther = generateStateMap(other); + const allKeys = combinedMapKeys(stateRoot, stateTrunk, stateOther); + + const newState: SnapshotState = []; + const conflicts: Array = []; + + for (const key of allKeys) { + const root = stateRoot[key] || null; + const trunk = stateTrunk[key] || null; + const other = stateOther[key] || null; + + // This condition tree checks every possible case that root, trunk, other can be in + // separately. YES, it could be simplified but we want to expand every case to make + // it as bulletproof and readable as possible. + // + // Here are the possible combinations: + // root => [ exists, missing ] + // trunk => [ exists, missing, modified ] + // other => [ exists, missing, modified ] + // + // Therefore, the total number of cases is equal to 2 * 3! = 12 + + // ~~~~~~~~~~ // + // Unmodified // + // ~~~~~~~~~~ // + + // (1/12) + // Unmodified + if (root && trunk && other && root.blob === trunk.blob && root.blob === other.blob) { + newState.push(trunk); + continue; + } + + // ~~~~~~~~~ // + // Deletions // + // ~~~~~~~~~ // + + // (2/12) + // Deleted in both + if (root && trunk === null && other === null) { + continue; + } + + // (3/12) + // Deleted in trunk + if (root && trunk === null && other && other.blob === root.blob) { + continue; + } + + // (4/12) + // Deleted in other + if (root && trunk && other === null && trunk.blob === root.blob) { + continue; + } + + // ~~~~~~~~~ // + // Additions // + // ~~~~~~~~~ // + + // (5/12) + // Added in both + if (root === null && trunk && other) { + if (trunk.blob !== other.blob) { + conflicts.push({ + key, + name: other.name, + message: 'both added', + mineBlob: trunk.blob, + theirsBlob: other.blob, + choose: other.blob, + }); + } + + newState.push(trunk || other); + continue; + } + + // (6/12) + // Added in trunk + if (root === null && trunk && other === null) { + newState.push(trunk); + continue; + } + + // (7/12) + // Added in other + if (root === null && trunk === null && other) { + newState.push(other); + continue; + } + + // ~~~~~~~~~~~~~ // + // Modifications // + // ~~~~~~~~~~~~~ // + + // (8/12) + // Modified in both + if (root && trunk && other && root.blob !== trunk.blob && root.blob !== other.blob) { + if (trunk.blob !== other.blob) { + conflicts.push({ + key, + name: other.name, + message: 'both modified', + mineBlob: trunk.blob, + theirsBlob: other.blob, + choose: other.blob, + }); + } + + newState.push(trunk); + continue; + } + + // (9/12) + // Modified in trunk + if (root && trunk && other && root.blob !== trunk.blob && root.blob === other.blob) { + newState.push(trunk); + continue; + } + + // (10/12) + // Modified in other + if (root && trunk && other && root.blob === trunk.blob && root.blob !== other.blob) { + newState.push(other); + continue; + } + + // ~~~~~~ // + // Combos // + // ~~~~~~ // + + // (11/12) + // Deleted in trunk and modified in other + if (root && trunk === null && other && other.blob !== root.blob) { + conflicts.push({ + key, + name: other.name, + message: 'you deleted and they modified', + mineBlob: null, + theirsBlob: other.blob, + choose: other.blob, + }); + newState.push(other); + continue; + } + + // (12/12) + // Deleted in other and modified in trunk + if (root && trunk && other === null && trunk.blob !== root.blob) { + conflicts.push({ + key, + name: root.name, + message: 'they deleted and you modified', + mineBlob: trunk.blob, + theirsBlob: null, + choose: trunk.blob, + }); + newState.push(trunk); + continue; + } + + // This should never actually happen, but let's error just to be safe + throw new Error('3-way merge hit impossible state'); + } + + return { + state: newState, + conflicts: conflicts, + }; +} + +export function compareBranches( + a: Branch | null, + b: Branch | null, +): { ahead: number, behind: number } { + const snapshotsA = a ? a.snapshots : []; + const snapshotsB = b ? b.snapshots : []; + const latestA = snapshotsA[snapshotsA.length - 1] || null; + const latestB = snapshotsB[snapshotsB.length - 1] || null; + + const result = { + ahead: 0, + behind: 0, + }; + + if (latestA === latestB) { + return result; + } + + if (latestA === null) { + result.behind = snapshotsB.length; + return result; + } + + if (latestB === null) { + result.ahead = snapshotsA.length; + return result; + } + + const root = getRootSnapshot(a, b); + if (root === null) { + return result; + } + + const indexOfRootInA = snapshotsA.indexOf(root); + const indexOfRootInB = snapshotsB.indexOf(root); + + result.ahead = snapshotsA.length - indexOfRootInA - 1; + result.behind = snapshotsB.length - indexOfRootInB - 1; + + return result; +} + +export function stateDelta( + base: SnapshotState, + desired: SnapshotState, +): { + add: Array, + update: Array, + remove: Array, +} { + const result = { + add: [], + update: [], + remove: [], + }; + + const stateMapStart = generateStateMap(base); + const stateMapFinish = generateStateMap(desired); + + for (const key of combinedMapKeys(stateMapStart, stateMapFinish)) { + const start = stateMapStart[key]; + const finish = stateMapFinish[key]; + + if (!start && finish) { + result.add.push(finish); + continue; + } + + if (start && !finish) { + result.remove.push(start); + continue; + } + + if (start && finish && start.blob !== finish.blob) { + result.update.push(finish); + continue; + } + } + + return result; +} + +export function getStagable( + state: SnapshotState, + candidates: Array, +): Array { + const stagable: Array = []; + + const stateMap = generateStateMap(state); + const candidateMap = generateCandidateMap(candidates); + for (const key of combinedMapKeys(stateMap, candidateMap)) { + const entry = stateMap[key]; + const candidate = candidateMap[key]; + + if (!entry && candidate) { + const { name, document } = candidate; + const { hash: blobId, content: blobContent } = hashDocument(document); + stagable.push({ key, name, blobId, blobContent, added: true }); + continue; + } + + if (entry && !candidate) { + const { name, blob: blobId } = entry; + stagable.push({ key, name, blobId, deleted: true }); + continue; + } + + if (entry && candidate) { + const { document, name } = candidate; + const { hash: blobId, content: blobContent } = hashDocument(document); + if (entry.blob !== blobId) { + stagable.push({ key, name, blobId, blobContent, modified: true }); + } + continue; + } + } + + return stagable; +} + +export function getRootSnapshot(a: Branch | null, b: Branch | null): string | null { + const snapshotsA = a ? a.snapshots : []; + const snapshotsB = b ? b.snapshots : []; + + let rootSnapshotId = ''; + for (let ai = snapshotsA.length - 1; ai >= 0; ai--) { + for (let bi = snapshotsB.length - 1; bi >= 0; bi--) { + if (snapshotsA[ai] === snapshotsB[bi]) { + return snapshotsA[ai]; + } + } + } + return rootSnapshotId || null; +} + +export function preMergeCheck( + trunkState: SnapshotState, + otherState: SnapshotState, + candidates: Array, +): { + conflicts: Array, + dirty: Array, +} { + const result = { + conflicts: [], + dirty: [], + }; + + const trunkMap = generateStateMap(trunkState); + const otherMap = generateStateMap(otherState); + + for (const candidate of candidates) { + const { key } = candidate; + const trunk = trunkMap[key]; + const other = otherMap[key]; + + // Candidate is not in trunk or other (not yet in version control) + if (!trunk && !other) { + result.dirty.push(candidate); + continue; + } + + const { hash: blobId } = hashDocument(candidate.document); + + // Candidate is same as trunk (unchanged) so anything goes + if (trunk && trunk.blob === blobId) { + continue; + } + + // Candidate is the same as trunk (nothing to do) + if (trunk && blobId === trunk.blob) { + continue; + } + + // Candidate is the same as other (would update to same value) + if (other && blobId === other.blob) { + continue; + } + + // Candidate is different but trunk and other are the same (preserve safe change) + if ( + other && + trunk && + other.blob === trunk.blob && + blobId !== other.blob && + blobId !== trunk.blob + ) { + result.dirty.push(candidate); + continue; + } + + // All other cases result in conflict + result.conflicts.push(candidate); + } + + return result; +} + +export function hashDocument(doc: Object): { content: string, hash: string } { + if (!doc) { + throw new Error('Cannot hash undefined value'); + } + + // Remove fields we don't care about for sync purposes + const newDoc = clone(doc); + delete newDoc.modified; + + const content = deterministicStringify(newDoc); + const hash = crypto + .createHash('sha1') + .update(content) + .digest('hex'); + + return { hash, content }; +} + +export function updateStateWithConflictResolutions( + state: SnapshotState, + conflicts: Array, +): SnapshotState { + const newStateMap = generateStateMap(state); + for (const { choose, key, name } of conflicts) { + const stateEntry = state.find(e => e.key === key); + + // Not in the state, but we choose the conflict + if (!stateEntry && choose !== null) { + newStateMap[key] = { key, name, blob: choose }; + continue; + } + + // Add the conflict + if (choose !== null) { + newStateMap[key] = { ...stateEntry, blob: choose }; + continue; + } + + // Chose to delete it, so don't add to state + delete newStateMap[key]; + } + + return Object.keys(newStateMap).map(k => newStateMap[k]); +} diff --git a/packages/insomnia-app/app/templating/utils.js b/packages/insomnia-app/app/templating/utils.js index 5aa4f30f36..6a5fcae2f4 100644 --- a/packages/insomnia-app/app/templating/utils.js +++ b/packages/insomnia-app/app/templating/utils.js @@ -1,7 +1,18 @@ // @flow +import type { PluginArgumentEnumOption } from './extensions'; + export type NunjucksParsedTagArg = { - type: 'string' | 'number' | 'boolean' | 'number' | 'variable' | 'expression', + type: + | 'string' + | 'number' + | 'boolean' + | 'number' + | 'variable' + | 'expression' + | 'enum' + | 'file' + | 'model', value: string | number | boolean, defaultValue?: string | number | boolean, forceVariable?: boolean, @@ -11,6 +22,10 @@ export type NunjucksParsedTagArg = { quotedBy?: '"' | "'", validate?: (value: any) => string, hide?: (Array) => boolean, + model?: string, + options?: Array, + itemTypes?: Array, + extensions?: Array, }; export type NunjucksParsedTag = { @@ -172,7 +187,8 @@ export function getDefaultFill(name: string, args: Array): switch (argDefinition.type) { case 'enum': const { defaultValue, options } = argDefinition; - const value = defaultValue !== undefined ? defaultValue : options[0].value; + const fallback = options && options.length ? options[0].value : ''; + const value = defaultValue !== undefined ? String(defaultValue) : String(fallback); return `'${value}'`; case 'number': return `${parseFloat(argDefinition.defaultValue) || 0}`; diff --git a/packages/insomnia-app/app/ui/components/base/dropdown/dropdown.js b/packages/insomnia-app/app/ui/components/base/dropdown/dropdown.js index 490609e684..55aa5616ab 100644 --- a/packages/insomnia-app/app/ui/components/base/dropdown/dropdown.js +++ b/packages/insomnia-app/app/ui/components/base/dropdown/dropdown.js @@ -147,7 +147,7 @@ class Dropdown extends PureComponent { this._dropdownList.style.minWidth = 'initial'; this._dropdownList.style.maxWidth = 'initial'; - const screenMargin = 5; + const screenMargin = 6; const { right, wide } = this.props; if (right || wide) { @@ -350,7 +350,11 @@ class Dropdown extends PureComponent { finalChildren = [ dropdownButtons[0], ReactDOM.createPortal( -
+
{ + input: ?HTMLInputElement; + + _setRef(n: ?HTMLInputElement) { + this.input = n; + } + + _update() { + if (this.input) { + this.input.indeterminate = this.props.indeterminate; + } + } + + componentDidMount() { + this._update(); + } + + componentDidUpdate() { + this._update(); + } + + render() { + const { + indeterminate, // eslint-disable-line no-unused-vars + ...otherProps + } = this.props; + + return ; + } +} + +export default IndeterminateCheckbox; diff --git a/packages/insomnia-app/app/ui/components/base/modal.js b/packages/insomnia-app/app/ui/components/base/modal.js index 8a5cc906be..3980ae9321 100644 --- a/packages/insomnia-app/app/ui/components/base/modal.js +++ b/packages/insomnia-app/app/ui/components/base/modal.js @@ -77,7 +77,7 @@ class Modal extends PureComponent { this._node = n; } - show() { + show(options) { const { freshState } = this.props; const { forceRefreshCounter } = this.state; @@ -91,6 +91,9 @@ class Modal extends PureComponent { return; } + // Allow instance-based onHide method + this.onHide = options ? options.onHide : null; + setTimeout(() => this._node && this._node.focus()); } @@ -109,6 +112,7 @@ class Modal extends PureComponent { hide() { this.setState({ open: false }); this.props.onHide && this.props.onHide(); + this.onHide && this.onHide(); } render() { @@ -140,6 +144,7 @@ class Modal extends PureComponent { tabIndex="-1" className={classes} style={styles} + aria-hidden={!open} onClick={this._handleClick}>
diff --git a/packages/insomnia-app/app/ui/components/base/prompt-button.js b/packages/insomnia-app/app/ui/components/base/prompt-button.js index b5be183870..009cf391c0 100644 --- a/packages/insomnia-app/app/ui/components/base/prompt-button.js +++ b/packages/insomnia-app/app/ui/components/base/prompt-button.js @@ -81,7 +81,10 @@ class PromptButton extends PureComponent { const { state } = this.state; - const finalConfirmMessage = (confirmMessage || 'Click to confirm').trim(); + const finalConfirmMessage = (typeof confirmMessage === 'string' + ? confirmMessage + : 'Click to confirm' + ).trim(); const finalDoneMessage = doneMessage || 'Done'; let innerMsg; diff --git a/packages/insomnia-app/app/ui/components/codemirror/code-editor.js b/packages/insomnia-app/app/ui/components/codemirror/code-editor.js index 59f7f5d954..6c67593e15 100644 --- a/packages/insomnia-app/app/ui/components/codemirror/code-editor.js +++ b/packages/insomnia-app/app/ui/components/codemirror/code-editor.js @@ -10,7 +10,8 @@ import { showModal } from '../modals/index'; import FilterHelpModal from '../modals/filter-help-modal'; import * as misc from '../../../common/misc'; import prettify from 'insomnia-prettify'; -import { DEBOUNCE_MILLIS, isMac } from '../../../common/constants'; +import { DEBOUNCE_MILLIS, EDITOR_KEY_MAP_VIM, isMac } from '../../../common/constants'; +import { keyboardKeys as keyCodes } from '../../../common/keyboard-keys'; import './base-imports'; import { getTagDefinitions } from '../../../templating/index'; import Dropdown from '../base/dropdown/dropdown'; @@ -235,6 +236,7 @@ class CodeEditor extends React.Component { return; } + window.codeMirror = this.codeMirror; editorStates[uniquenessKey] = { scroll: this.codeMirror.getScrollInfo(), selections: this.codeMirror.listSelections(), @@ -287,6 +289,7 @@ class CodeEditor extends React.Component { this.codeMirror.on('blur', this._codemirrorBlur); this.codeMirror.on('paste', this._codemirrorPaste); this.codeMirror.on('scroll', this._codemirrorScroll); + this.codeMirror.on('keyHandled', this._codemirrorKeyHandled); // Prevent these things if we're type === "password" this.codeMirror.on('copy', this._codemirrorPreventWhenTypePassword); @@ -664,6 +667,18 @@ class CodeEditor extends React.Component { this._persistState(); } + _codemirrorKeyHandled(codeMirror, keyName, event) { + const { keyMap } = this.props; + const { keyCode } = event; + + const isVimKeyMap = keyMap === EDITOR_KEY_MAP_VIM; + const pressedEscape = keyCode === keyCodes.esc.keyCode; + + if (isVimKeyMap && pressedEscape) { + event.stopPropagation(); + } + } + _codemirrorValueBeforeChange(doc, change) { // If we're in single-line mode, merge all changed lines into one if (this.props.singleLine && change.text && change.text.length > 1) { diff --git a/packages/insomnia-app/app/ui/components/cookie-list.js b/packages/insomnia-app/app/ui/components/cookie-list.js index edd8f6dc4c..e4be1fd213 100644 --- a/packages/insomnia-app/app/ui/components/cookie-list.js +++ b/packages/insomnia-app/app/ui/components/cookie-list.js @@ -88,7 +88,7 @@ class CookieList extends React.PureComponent { this._handleDeleteCookie(cookie)} title="Delete cookie"> diff --git a/packages/insomnia-app/app/ui/components/dropdowns/auth-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/auth-dropdown.js index 31023bb532..dc88f5d2dd 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/auth-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/auth-dropdown.js @@ -69,12 +69,12 @@ class AuthDropdown extends React.PureComponent { } renderAuthType(type: string, nameOverride: string | null = null) { - const {authentication} = this.props.request; + const { authentication } = this.props.request; const currentType = authentication.type || AUTH_NONE; return ( - {currentType === type ? : }{' '} + {currentType === type ? : }{' '} {nameOverride || getAuthTypeName(type, true)} ); diff --git a/packages/insomnia-app/app/ui/components/dropdowns/environments-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/environments-dropdown.js index 19e3469d36..844307c4e2 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/environments-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/environments-dropdown.js @@ -93,15 +93,14 @@ class EnvironmentsDropdown extends React.PureComponent {
- {!activeEnvironment && - subEnvironments.length > 0 && ( - - - - )} + {!activeEnvironment && subEnvironments.length > 0 && ( + + + + )}
{activeEnvironment && activeEnvironment.color && diff --git a/packages/insomnia-app/app/ui/components/dropdowns/response-history-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/response-history-dropdown.js index 992420609d..44d7319325 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/response-history-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/response-history-dropdown.js @@ -40,7 +40,7 @@ class ResponseHistoryDropdown extends PureComponent { } renderDropdownItem(response, i) { - const { activeResponse } = this.props; + const { activeResponse, requestMethod } = this.props; const activeResponseId = activeResponse ? activeResponse._id : 'n/a'; const active = response._id === activeResponseId; const message = @@ -59,7 +59,7 @@ class ResponseHistoryDropdown extends PureComponent { statusCode={response.statusCode} statusMessage={response.statusMessage || null} /> - + {!response.requestVersionId && } @@ -116,6 +116,7 @@ ResponseHistoryDropdown.propTypes = { handleDeleteResponse: PropTypes.func.isRequired, onChange: PropTypes.func.isRequired, requestId: PropTypes.string.isRequired, + requestMethod: PropTypes.string.isRequired, responses: PropTypes.arrayOf(PropTypes.object).isRequired, // Optional diff --git a/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.js index 27272cccee..953340fe00 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/sync-dropdown.js @@ -1,218 +1,464 @@ // @flow import * as React from 'react'; import autobind from 'autobind-decorator'; +import classnames from 'classnames'; import { Dropdown, DropdownButton, DropdownDivider, DropdownItem } from '../base/dropdown'; -import { showModal } from '../modals'; -import * as syncStorage from '../../../sync/storage'; -import * as session from '../../../sync/session'; -import * as sync from '../../../sync'; -import WorkspaceShareSettingsModal from '../modals/workspace-share-settings-modal'; -import SetupSyncModal from '../modals/setup-sync-modal'; import type { Workspace } from '../../../models/workspace'; +import { showAlert, showModal } from '../modals'; +import SyncStagingModal from '../modals/sync-staging-modal'; +import { batchModifyDocs } from '../../../common/database'; +import HelpTooltip from '../help-tooltip'; +import Link from '../base/link'; +import SyncHistoryModal from '../modals/sync-history-modal'; +import SyncShareModal from '../modals/sync-share-modal'; +import SyncBranchesModal from '../modals/sync-branches-modal'; +import VCS from '../../../sync/vcs'; +import type { Snapshot, Status, StatusCandidate } from '../../../sync/types'; +import ErrorModal from '../modals/error-modal'; +import Tooltip from '../tooltip'; +import LoginModal from '../modals/login-modal'; +import * as session from '../../../account/session'; +import PromptButton from '../base/prompt-button'; + +// Stop refreshing if user hasn't been active in this long +const REFRESH_USER_ACTIVITY = 1000 * 60 * 10; + +// Refresh dropdown periodically +const REFRESH_PERIOD = 1000 * 60 * 1; type Props = { workspace: Workspace, + vcs: VCS, + syncItems: Array, // Optional className?: string, }; type State = { - loggedIn: boolean | null, - loading: boolean, - resourceGroupId: string | null, - syncMode: string | null, - syncPercent: number, - workspaceName: string, + currentBranch: string, + localBranches: Array, + compare: { + ahead: number, + behind: number, + }, + status: Status, + initializing: boolean, + historyCount: number, + loadingPull: boolean, + loadingPush: boolean, }; @autobind class SyncDropdown extends React.PureComponent { - _hasPrompted: boolean; - _isMounted: boolean; + checkInterval: IntervalID; + refreshOnNextSyncItems = false; + lastUserActivity = Date.now(); constructor(props: Props) { super(props); - - this._hasPrompted = false; - this._isMounted = false; - this.state = { - loggedIn: null, - loading: false, - resourceGroupId: null, - syncMode: null, - syncPercent: 0, - workspaceName: '', + localBranches: [], + currentBranch: '', + compare: { + ahead: 0, + behind: 0, + }, + historyCount: 0, + initializing: true, + loadingPull: false, + loadingPush: false, + status: { + key: 'n/a', + stage: {}, + unstaged: {}, + }, }; } - _handleShowShareSettings() { - showModal(WorkspaceShareSettingsModal, { workspace: this.props.workspace }); - } + async refreshMainAttributes(extraState?: Object = {}) { + const { vcs, syncItems } = this.props; + const localBranches = (await vcs.getBranches()).sort(); + const currentBranch = await vcs.getBranch(); + const historyCount = await vcs.getHistoryCount(); + const status = await vcs.status(syncItems, {}); - async _handleSyncResourceGroupId() { - const { resourceGroupId } = this.state; + const newState = { + status, + historyCount, + localBranches, + currentBranch, + ...extraState, + }; - // Set loading state - this.setState({ loading: true }); - - await sync.getOrCreateConfig(resourceGroupId); - await sync.pull(resourceGroupId); - await sync.push(resourceGroupId); - - await this._reloadData(); - - // Unset loading state - this.setState({ loading: false }); - } - - async _reloadData() { - const loggedIn = session.isLoggedIn(); - - if (loggedIn !== this.state.loggedIn) { - this.setState({ loggedIn }); + // Do the remote stuff + if (session.isLoggedIn()) { + try { + newState.compare = await vcs.compareRemoteBranch(); + } catch (err) { + console.log('Failed to compare remote branches', err.message); + } } - if (!loggedIn) { - return; - } + this.setState(newState); + } - // Get or create any related sync data - const { workspace } = this.props; - const { resourceGroupId } = await sync.getOrCreateResourceForDoc(workspace); - const config = await sync.getOrCreateConfig(resourceGroupId); + componentDidMount() { + this.setState({ initializing: true }); + this.refreshMainAttributes() + .catch(err => console.log('[sync_menu] Error refreshing sync state', err)) + .finally(() => this.setState({ initializing: false })); - // Analyze it - const dirty = await syncStorage.findDirtyResourcesForResourceGroup(resourceGroupId); - const all = await syncStorage.findResourcesForResourceGroup(resourceGroupId); - const numClean = all.length - dirty.length; - const syncPercent = all.length === 0 ? 100 : parseInt((numClean / all.length) * 1000) / 10; + // Refresh but only if the user has been active in the last n minutes + this.checkInterval = setInterval(async () => { + if (Date.now() - this.lastUserActivity < REFRESH_USER_ACTIVITY) { + await this.refreshMainAttributes(); + } + }, REFRESH_PERIOD); - if (this._isMounted) { - this.setState({ - resourceGroupId, - syncPercent, - syncMode: config.syncMode, - workspaceName: workspace.name, + document.addEventListener('mousemove', this._handleUserActivity); + } + + componentWillUnmount() { + clearInterval(this.checkInterval); + document.removeEventListener('mousemove', this._handleUserActivity); + } + + componentDidUpdate(prevProps: Props) { + const { vcs, syncItems } = this.props; + + // Update if new sync items + if (syncItems !== prevProps.syncItems) { + vcs.status(syncItems, {}).then(status => { + this.setState({ status }); }); + + if (this.refreshOnNextSyncItems) { + this.refreshMainAttributes(); + this.refreshOnNextSyncItems = false; + } } } - async _handleShowSyncModePrompt() { - showModal(SetupSyncModal, { - onSelectSyncMode: async syncMode => { - await this._reloadData(); + _handleUserActivity() { + this.lastUserActivity = Date.now(); + } + + _handleShowBranchesModal() { + showModal(SyncBranchesModal, { + onHide: this.refreshMainAttributes, + }); + } + + _handleShowStagingModal() { + showModal(SyncStagingModal, { + onSnapshot: async () => { + await this.refreshMainAttributes(); + }, + handlePush: async () => { + await this._handlePushChanges(); }, }); } - componentDidMount() { - this._isMounted = true; - syncStorage.onChange(this._reloadData); - this._reloadData(); + static _handleShowSharingModal() { + showModal(SyncShareModal); } - componentWillUnmount() { - syncStorage.offChange(this._reloadData); - this._isMounted = false; + static _handleShowLoginModal() { + showModal(LoginModal); } - componentDidUpdate() { - const { resourceGroupId, syncMode } = this.state; + async _handlePushChanges() { + const { vcs } = this.props; + this.setState({ loadingPush: true }); - if (!resourceGroupId) { - return; + try { + await vcs.push(); + } catch (err) { + showModal(ErrorModal, { + title: 'Push Error', + error: err, + message: 'Failed to push snapshots to remote', + }); } - // Sync has not yet been configured for this workspace, so prompt the user to do so - const isModeUnset = !syncMode || syncMode === syncStorage.SYNC_MODE_UNSET; - if (isModeUnset && !this._hasPrompted) { - this._hasPrompted = true; - this._handleShowSyncModePrompt(); + await this.refreshMainAttributes({ loadingPush: false }); + } + + async _handlePullChanges() { + const { vcs, syncItems } = this.props; + + this.setState({ loadingPull: true }); + try { + const delta = await vcs.pull(syncItems); + await batchModifyDocs(delta); + this.refreshOnNextSyncItems = true; + } catch (err) { + showModal(ErrorModal, { + title: 'Pull Error', + error: err, + message: 'Failed to pull snapshots from remote', + }); + } + this.setState({ loadingPull: false }); + } + + async _handleRollback(snapshot: Snapshot) { + const { vcs, syncItems } = this.props; + const delta = await vcs.rollback(snapshot.id, syncItems); + await batchModifyDocs(delta); + this.refreshOnNextSyncItems = true; + } + + async _handleRevert() { + const { vcs, syncItems } = this.props; + + try { + const delta = await vcs.rollbackToLatest(syncItems); + await batchModifyDocs(delta); + } catch (err) { + showModal(ErrorModal, { + title: 'Revert Error', + error: err, + message: 'Failed to revert changes', + }); } } - _getSyncDescription(syncMode: string | null, syncPercentage: number) { - let el = null; - if (syncMode === syncStorage.SYNC_MODE_NEVER) { - el = Sync Disabled; - } else if (syncPercentage === 100) { - el = Sync Up To Date; - } else if (syncMode === syncStorage.SYNC_MODE_OFF) { - el = ( - - Sync Required - - ); - } else if (syncMode === syncStorage.SYNC_MODE_ON) { - el = Sync Pending; - } else if (!syncMode || syncMode === syncStorage.SYNC_MODE_UNSET) { - el = ( - - Configure Sync - + _handleShowHistoryModal() { + showModal(SyncHistoryModal, { + handleRollback: this._handleRollback, + }); + } + + async _handleOpen() { + await this.refreshMainAttributes(); + } + + async _handleSwitchBranch(branch: string) { + const { vcs, syncItems } = this.props; + try { + const delta = await vcs.checkout(syncItems, branch); + await batchModifyDocs(delta); + } catch (err) { + showAlert({ + title: 'Branch Switch Error', + message: err.message, + }); + } + + // We can't refresh now because we won't yet have the new syncItems + this.refreshOnNextSyncItems = true; + + // Still need to do this in case sync items don't change + this.setState({ currentBranch: branch }); + } + + renderBranch(branch: string) { + const { currentBranch } = this.state; + + const icon = + branch === currentBranch ? : ; + + const isCurrentBranch = branch === currentBranch; + return ( + this._handleSwitchBranch(branch)} + className={classnames({ bold: isCurrentBranch })} + title={isCurrentBranch ? null : `Switch to "${branch}"`}> + {icon} + {branch} + + ); + } + + renderButton() { + const { + currentBranch, + compare: { ahead, behind }, + initializing, + status, + loadingPull, + loadingPush, + } = this.state; + const canPush = ahead > 0; + const canPull = behind > 0; + const canCreateSnapshot = + Object.keys(status.stage).length > 0 || Object.keys(status.unstaged).length > 0; + + const loadIcon = ; + + const pullToolTipMsg = canPull + ? `There ${behind === 1 ? 'is' : 'are'} ${behind} snapshot${behind === 1 ? '' : 's'} to pull` + : 'No changes to pull'; + + const pushToolTipMsg = canPush + ? `There ${ahead === 1 ? 'is' : 'are'} ${ahead} snapshot${ahead === 1 ? '' : 's'} to push` + : 'No changes to push'; + + const snapshotToolTipMsg = canCreateSnapshot ? 'Local changes made' : 'No local changes made'; + + if (currentBranch !== null) { + return ( + +
+ {' '} + {initializing ? 'Initializing...' : currentBranch} +
+
+ + + + + {/* Only show cloud icons if logged in */} + {session.isLoggedIn() && ( + + {loadingPull ? ( + loadIcon + ) : ( + + + + )} + + {loadingPush ? ( + loadIcon + ) : ( + + + + )} + + )} +
+
); + } else { + return Sync; } - - return el; } render() { - const { className } = this.props; - const { resourceGroupId, loading, loggedIn } = this.state; - - // Don't show the sync menu unless we're logged in - if (!loggedIn) { + if (!session.isLoggedIn()) { return null; } - if (!resourceGroupId) { - return ( -
- -
- ); - } else { - const { syncMode, syncPercent } = this.state; - return ( -
- - - {this._getSyncDescription(syncMode, syncPercent)} - - Workspace Synced {syncPercent}% + const { className } = this.props; + const { + localBranches, + currentBranch, + status, + historyCount, + loadingPull, + loadingPush, + compare: { ahead, behind }, + } = this.state; - - - Change Sync Mode + const canCreateSnapshot = + Object.keys(status.stage).length > 0 || Object.keys(status.unstaged).length > 0; + + const visibleBranches = localBranches.filter(b => !b.match(/\.hidden$/)); + + return ( +
+ + {this.renderButton()} + + + Insomnia Sync{' '} + + Sync and collaborate on workspaces{' '} + + +
+ Documentation +
+ +
+
+ + {!session.isLoggedIn() && ( + + Log In + )} - {/* SYNCED */} + + + Share Settings + - {syncMode !== syncStorage.SYNC_MODE_NEVER ? ( - - {loading ? ( - - ) : ( - - )} - Sync Now - - ) : null} + + + Branches + - {syncMode !== syncStorage.SYNC_MODE_NEVER ? ( - - - Share Settings - - ) : null} -
-
- ); - } + Local Branches + {visibleBranches.map(this.renderBranch)} + + {currentBranch} + + + + History + + + + + Revert Changes + + + + + Create Snapshot + + + + {loadingPull ? ( + + Pulling Snapshots... + + ) : ( + + Pull {behind || ''} Snapshot + {behind === 1 ? '' : 's'} + + )} + + + + {loadingPush ? ( + + Pushing Snapshots... + + ) : ( + + Push {ahead || ''} Snapshot + {ahead === 1 ? '' : 's'} + + )} + +
+
+ ); } } diff --git a/packages/insomnia-app/app/ui/components/dropdowns/sync-legacy-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/sync-legacy-dropdown.js new file mode 100644 index 0000000000..3520ae6198 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/dropdowns/sync-legacy-dropdown.js @@ -0,0 +1,219 @@ +// @flow +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import { Dropdown, DropdownButton, DropdownDivider, DropdownItem } from '../base/dropdown'; +import { showModal } from '../modals'; +import * as syncStorage from '../../../sync-legacy/storage'; +import * as sync from '../../../sync-legacy'; +import WorkspaceShareSettingsModal from '../modals/workspace-share-settings-modal'; +import SetupSyncModal from '../modals/setup-sync-modal'; +import type { Workspace } from '../../../models/workspace'; +import * as session from '../../../account/session'; + +type Props = { + workspace: Workspace, + + // Optional + className?: string, +}; + +type State = { + loggedIn: boolean | null, + loading: boolean, + resourceGroupId: string | null, + syncMode: string | null, + syncPercent: number, + workspaceName: string, +}; + +@autobind +class SyncLegacyDropdown extends React.PureComponent { + _hasPrompted: boolean; + _isMounted: boolean; + + constructor(props: Props) { + super(props); + + this._hasPrompted = false; + this._isMounted = false; + + this.state = { + loggedIn: null, + loading: false, + resourceGroupId: null, + syncMode: null, + syncPercent: 0, + workspaceName: '', + }; + } + + _handleShowShareSettings() { + showModal(WorkspaceShareSettingsModal, { workspace: this.props.workspace }); + } + + async _handleSyncResourceGroupId() { + const { resourceGroupId } = this.state; + + // Set loading state + this.setState({ loading: true }); + + await sync.getOrCreateConfig(resourceGroupId); + await sync.pull(resourceGroupId); + await sync.push(resourceGroupId); + + await this._reloadData(); + + // Unset loading state + this.setState({ loading: false }); + } + + async _reloadData() { + const loggedIn = session.isLoggedIn(); + + if (loggedIn !== this.state.loggedIn) { + this.setState({ loggedIn }); + } + + if (!loggedIn) { + return; + } + + // Get or create any related sync data + const { workspace } = this.props; + const { resourceGroupId } = await sync.getOrCreateResourceForDoc(workspace); + const config = await sync.getOrCreateConfig(resourceGroupId); + + // Analyze it + const dirty = await syncStorage.findDirtyResourcesForResourceGroup(resourceGroupId); + const all = await syncStorage.findResourcesForResourceGroup(resourceGroupId); + const numClean = all.length - dirty.length; + const syncPercent = all.length === 0 ? 100 : parseInt((numClean / all.length) * 1000) / 10; + + if (this._isMounted) { + this.setState({ + resourceGroupId, + syncPercent, + syncMode: config.syncMode, + workspaceName: workspace.name, + }); + } + } + + async _handleShowSyncModePrompt() { + showModal(SetupSyncModal, { + onSelectSyncMode: async syncMode => { + await this._reloadData(); + }, + }); + } + + componentDidMount() { + this._isMounted = true; + syncStorage.onChange(this._reloadData); + this._reloadData(); + } + + componentWillUnmount() { + syncStorage.offChange(this._reloadData); + this._isMounted = false; + } + + componentDidUpdate() { + const { resourceGroupId, syncMode } = this.state; + + if (!resourceGroupId) { + return; + } + + // Sync has not yet been configured for this workspace, so prompt the user to do so + const isModeUnset = !syncMode || syncMode === syncStorage.SYNC_MODE_UNSET; + if (isModeUnset && !this._hasPrompted) { + this._hasPrompted = true; + this._handleShowSyncModePrompt(); + } + } + + _getSyncDescription(syncMode: string | null, syncPercentage: number) { + let el = null; + if (syncMode === syncStorage.SYNC_MODE_NEVER) { + el = Sync Disabled; + } else if (syncPercentage === 100) { + el = Sync Up To Date; + } else if (syncMode === syncStorage.SYNC_MODE_OFF) { + el = ( + + Sync Required + + ); + } else if (syncMode === syncStorage.SYNC_MODE_ON) { + el = Sync Pending; + } else if (!syncMode || syncMode === syncStorage.SYNC_MODE_UNSET) { + el = ( + + Configure Sync + + ); + } + + return el; + } + + render() { + const { className } = this.props; + const { resourceGroupId, loading, loggedIn } = this.state; + + // Don't show the sync menu unless we're logged in + if (!loggedIn) { + return null; + } + + if (!resourceGroupId) { + return ( +
+ +
+ ); + } else { + const { syncMode, syncPercent } = this.state; + return ( +
+ + + {this._getSyncDescription(syncMode, syncPercent)} + + Workspace Synced {syncPercent}% + + + + Change Sync Mode + + + {/* SYNCED */} + + {syncMode !== syncStorage.SYNC_MODE_NEVER ? ( + + {loading ? ( + + ) : ( + + )} + Sync Now + + ) : null} + + {syncMode !== syncStorage.SYNC_MODE_NEVER ? ( + + + Share Settings + + ) : null} + +
+ ); + } + } +} + +export default SyncLegacyDropdown; diff --git a/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js index 6850972f6c..fda48fe61c 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js @@ -1,7 +1,7 @@ -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; +// @flow +import * as React from 'react'; import autobind from 'autobind-decorator'; -import * as classnames from 'classnames'; +import classnames from 'classnames'; import Dropdown from '../base/dropdown/dropdown'; import DropdownDivider from '../base/dropdown/dropdown-divider'; import DropdownButton from '../base/dropdown/dropdown-button'; @@ -10,32 +10,59 @@ import DropdownHint from '../base/dropdown/dropdown-hint'; import SettingsModal, { TAB_INDEX_EXPORT } from '../modals/settings-modal'; import * as models from '../../../models'; import { getAppVersion } from '../../../common/constants'; -import { showModal, showPrompt } from '../modals/index'; +import { showAlert, showModal, showPrompt } from '../modals'; import Link from '../base/link'; import WorkspaceSettingsModal from '../modals/workspace-settings-modal'; import WorkspaceShareSettingsModal from '../modals/workspace-share-settings-modal'; -import * as session from '../../../sync/session'; import LoginModal from '../modals/login-modal'; import Tooltip from '../tooltip'; import KeydownBinder from '../keydown-binder'; import { hotKeyRefs } from '../../../common/hotkeys'; import { executeHotKey } from '../../../common/hotkeys-listener'; +import type { Workspace } from '../../../models/workspace'; +import type { HotKeyRegistry } from '../../../common/hotkeys'; +import SyncShareModal from '../modals/sync-share-modal'; +import * as db from '../../../common/database'; +import VCS from '../../../sync/vcs'; +import HelpTooltip from '../help-tooltip'; +import type { Project } from '../../../sync/types'; +import * as sync from '../../../sync-legacy/index'; +import PromptButton from '../base/prompt-button'; +import * as session from '../../../account/session'; + +type Props = { + isLoading: boolean, + handleSetActiveWorkspace: (id: string) => void, + workspaces: Array, + unseenWorkspaces: Array, + activeWorkspace: Workspace, + hotKeyRegistry: HotKeyRegistry, + enableSyncBeta: boolean, + vcs: VCS | null, + + // Optional + className?: string, +}; + +type State = { + remoteProjects: Array, + localProjects: Array, + pullingProjects: { [string]: boolean }, +}; @autobind -class WorkspaceDropdown extends PureComponent { - constructor(props) { +class WorkspaceDropdown extends React.PureComponent { + _dropdown: ?Dropdown; + + constructor(props: Props) { super(props); this.state = { - loggedIn: false, + remoteProjects: [], + localProjects: [], + pullingProjects: {}, }; } - async _handleDropdownOpen() { - if (this.state.loggedIn !== session.isLoggedIn()) { - this.setState({ loggedIn: session.isLoggedIn() }); - } - } - async _handleDropdownHide() { // Mark all unseen workspace as seen for (const workspace of this.props.unseenWorkspaces) { @@ -46,36 +73,95 @@ class WorkspaceDropdown extends PureComponent { } } - _setDropdownRef(n) { + async _handleDropdownOpen() { + this._refreshRemoteWorkspaces(); + } + + async _refreshRemoteWorkspaces() { + const { vcs } = this.props; + if (!vcs) { + return; + } + + if (!session.isLoggedIn()) { + return; + } + + const remoteProjects = await vcs.remoteProjects(); + const localProjects = await vcs.localProjects(); + this.setState({ remoteProjects, localProjects }); + } + + async _handlePullRemoteWorkspace(project: Project) { + const { vcs } = this.props; + if (!vcs) { + throw new Error('VCS is not defined'); + } + + this.setState(state => ({ + pullingProjects: { ...state.pullingProjects, [project.id]: true }, + })); + + try { + // Clone old VCS so we don't mess anything up while working on other projects + const newVCS = vcs.newInstance(); + + // Remove all projects for workspace first + await newVCS.removeProjectsForRoot(project.rootDocumentId); + + // Set project, checkout master, and pull + await newVCS.setProject(project); + await newVCS.checkout([], 'master'); + await newVCS.pull([]); // There won't be any existing docs since it's a new pull + + const flushId = await db.bufferChanges(); + for (const doc of await newVCS.allDocuments()) { + await db.upsert(doc); + } + await db.flushChanges(flushId); + + // handleSetActiveWorkspace(project.rootDocumentId); + vcs.setProject(project); + await this._refreshRemoteWorkspaces(); + } catch (err) { + this._dropdown && this._dropdown.hide(); + showAlert({ + title: 'Pull Error', + message: `Failed to pull workspace. ${err.message}`, + }); + } + + this.setState(state => ({ + pullingProjects: { ...state.pullingProjects, [project.id]: false }, + })); + } + + _setDropdownRef(n: ?Dropdown) { this._dropdown = n; } - _handleShowLogin() { - showModal(LoginModal); + static async _handleLogout() { + await sync.logout(); } - _handleShowExport() { + static _handleShowExport() { showModal(SettingsModal, TAB_INDEX_EXPORT); } - _handleShowSettings() { + static _handleShowSettings() { showModal(SettingsModal); } - _handleShowWorkspaceSettings() { - showModal(WorkspaceSettingsModal, { - workspace: this.props.activeWorkspace, - }); + static _handleShowWorkspaceSettings() { + showModal(WorkspaceSettingsModal); } _handleShowShareSettings() { - showModal(WorkspaceShareSettingsModal, { - workspace: this.props.activeWorkspace, - }); - } - - _handleSwitchWorkspace(workspaceId) { - this.props.handleSetActiveWorkspace(workspaceId); + if (this.props.enableSyncBeta) { + showModal(SyncShareModal); + } else { + showModal(WorkspaceShareSettingsModal); + } } _handleWorkspaceCreate() { @@ -91,12 +177,23 @@ class WorkspaceDropdown extends PureComponent { }); } - _handleKeydown(e) { + _handleKeydown(e: KeyboardEvent) { executeHotKey(e, hotKeyRefs.TOGGLE_MAIN_MENU, () => { this._dropdown && this._dropdown.toggle(true); }); } + componentDidUpdate(prevProps: Props) { + // Reload workspaces if we just got a new VCS instance + if (this.props.vcs && !prevProps.vcs) { + this._refreshRemoteWorkspaces(); + } + } + + componentDidMount() { + this._refreshRemoteWorkspaces(); + } + render() { const { className, @@ -105,9 +202,23 @@ class WorkspaceDropdown extends PureComponent { unseenWorkspaces, isLoading, hotKeyRegistry, + handleSetActiveWorkspace, + enableSyncBeta, ...other } = this.props; + const { remoteProjects, localProjects, pullingProjects } = this.state; + + const missingRemoteProjects = remoteProjects.filter(({ id, rootDocumentId }) => { + const localProjectExists = localProjects.find(p => p.id === id); + const workspaceExists = workspaces.find(w => w._id === rootDocumentId); + + // Mark as missing if: + // - the project doesn't yet exists locally + // - the project exists locally but somehow the workspace doesn't anymore + return !(workspaceExists && localProjectExists); + }); + const nonActiveWorkspaces = workspaces .filter(w => w._id !== activeWorkspace._id) .sort((w1, w2) => w1.name.localeCompare(w2.name)); @@ -116,7 +227,8 @@ class WorkspaceDropdown extends PureComponent { const unseenWorkspacesMessage = (
- The following workspaces were added
+ The following workspaces were added +
{addedWorkspaceNames}
); @@ -145,7 +257,7 @@ class WorkspaceDropdown extends PureComponent { {activeWorkspace.name} - + Workspace Settings @@ -159,10 +271,10 @@ class WorkspaceDropdown extends PureComponent { {nonActiveWorkspaces.map(w => { const isUnseen = !!unseenWorkspaces.find(v => v._id === w._id); return ( - + To {w.name} {isUnseen && ( - + )} @@ -171,28 +283,59 @@ class WorkspaceDropdown extends PureComponent { })} - New Workspace + Create Workspace + {missingRemoteProjects.length > 0 && ( + + Remote Workspaces{' '} + + These workspaces have been shared with you via Insomnia Sync and do not yet exist on + your machine. + + + )} + + {missingRemoteProjects.map(p => ( + this._handlePullRemoteWorkspace(p)}> + {pullingProjects[p.id] ? ( + + ) : ( + + )} + Pull {p.name} + + ))} + Insomnia Version {getAppVersion()} - + Preferences - + Import/Export {/* Not Logged In */} - {!this.state.loggedIn && ( - + {session.isLoggedIn() ? ( + + Logout + + ) : ( + showModal(LoginModal)}> Log In )} - {!this.state.loggedIn && ( + {!session.isLoggedIn() && ( { } _handleEditPrivateKey() { - const { - handleRender, - handleGetRenderContext, - request, - } = this.props; + const { handleRender, handleGetRenderContext, request } = this.props; const { authentication } = request; @@ -171,7 +167,7 @@ class AsapAuth extends React.PureComponent { }, )}>
@@ -188,30 +184,30 @@ class AsapAuth extends React.PureComponent {
- {fields} - - - - + {fields} + + + +
- - -
- -
-
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/auth-wrapper.js b/packages/insomnia-app/app/ui/components/editors/auth/auth-wrapper.js index b8c2b22c30..3960ed1018 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/auth-wrapper.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/auth-wrapper.js @@ -160,7 +160,7 @@ class AuthWrapper extends React.PureComponent { /> ); } else if (authentication.type === AUTH_NETRC) { - return ; + return ; } else if (authentication.type === AUTH_ASAP) { return ( { return (

- -
-
+ +
+
Select an auth type from above

@@ -187,11 +187,7 @@ class AuthWrapper extends React.PureComponent { } render() { - return ( -
- {this.renderEditor()} -
- ); + return
{this.renderEditor()}
; } } diff --git a/packages/insomnia-app/app/ui/components/editors/auth/aws-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/aws-auth.js index 891f103fd2..3ee105185d 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/aws-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/aws-auth.js @@ -97,53 +97,53 @@ class AWSAuth extends React.PureComponent {
- {this.renderRow('accessKeyId', 'Access Key ID', this._handleChangeAccessKeyId)} - {this.renderRow( - 'secretAccessKey', - 'Secret Access Key', - this._handleChangeSecretAccessKey, - )} - {this.renderRow( - 'region', - 'Region', - this._handleChangeRegion, - 'will be calculated from hostname or host or use \'us-east-1\' if not given', - )} - {this.renderRow( - 'service', - 'Service', - this._handleChangeService, - 'will be calculated from hostname or host if not given', - )} - {this.renderRow( - 'sessionToken', - 'Session Token', - this._handleChangeSessionToken, - 'Optional token used for multi-factor authentication', - )} - - - - + {this.renderRow('accessKeyId', 'Access Key ID', this._handleChangeAccessKeyId)} + {this.renderRow( + 'secretAccessKey', + 'Secret Access Key', + this._handleChangeSecretAccessKey, + )} + {this.renderRow( + 'region', + 'Region', + this._handleChangeRegion, + "will be calculated from hostname or host or use 'us-east-1' if not given", + )} + {this.renderRow( + 'service', + 'Service', + this._handleChangeService, + 'will be calculated from hostname or host if not given', + )} + {this.renderRow( + 'sessionToken', + 'Session Token', + this._handleChangeSessionToken, + 'Optional token used for multi-factor authentication', + )} + + + +
- - -
- -
-
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/basic-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/basic-auth.js index bd5cdb63a5..26ecba5306 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/basic-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/basic-auth.js @@ -10,7 +10,7 @@ import type { Request, RequestAuthentication } from '../../../../models/request' type Props = { handleRender: Function, handleGetRenderContext: Function, - handleUpdateSettingsShowPasswords: (boolean) => Promise, + handleUpdateSettingsShowPasswords: boolean => Promise, nunjucksPowerUserMode: boolean, onChange: (Request, RequestAuthentication) => Promise, request: Request, @@ -54,78 +54,78 @@ class BasicAuth extends React.PureComponent {
- - - - - - - - - - - - + + + + + + + + + + + +
- - -
- -
-
- - -
- -
-
- - -
- -
-
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/bearer-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/bearer-auth.js index ab9473f2fa..881bce582b 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/bearer-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/bearer-auth.js @@ -51,82 +51,82 @@ class BearerAuth extends React.PureComponent {
- - - - - - - - - - - - + + + + + + + + + + + +
- - -
- -
-
- - -
- -
-
- - -
- -
-
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/digest-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/digest-auth.js index f7a861acae..7d48208e1e 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/digest-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/digest-auth.js @@ -11,7 +11,7 @@ import type { Request, RequestAuthentication } from '../../../../models/request' type Props = { handleRender: Function, handleGetRenderContext: Function, - handleUpdateSettingsShowPasswords: (boolean) => Promise, + handleUpdateSettingsShowPasswords: boolean => Promise, nunjucksPowerUserMode: boolean, onChange: (Request, RequestAuthentication) => Promise, request: Request, @@ -55,78 +55,78 @@ class DigestAuth extends React.PureComponent {
- - - - - - - - - - - - + + + + + + + + + + + +
- - -
- -
-
- - -
- -
-
- - -
- -
-
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/ntlm-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/ntlm-auth.js index 32fbad752e..cf067b2e60 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/ntlm-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/ntlm-auth.js @@ -10,7 +10,7 @@ import type { Settings } from '../../../../models/settings'; type Props = { handleRender: Function, handleGetRenderContext: Function, - handleUpdateSettingsShowPasswords: (boolean) => Promise, + handleUpdateSettingsShowPasswords: boolean => Promise, nunjucksPowerUserMode: boolean, onChange: (Request, RequestAuthentication) => Promise, request: Request, @@ -54,78 +54,78 @@ class NTLMAuth extends React.PureComponent {
- - - - - - - - - - - - + + + + + + + + + + + +
- - -
- -
-
- - -
- -
-
- - -
- -
-
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
diff --git a/packages/insomnia-app/app/ui/components/editors/auth/o-auth-2-auth.js b/packages/insomnia-app/app/ui/components/editors/auth/o-auth-2-auth.js index 3e10c2ea5d..de3950a51b 100644 --- a/packages/insomnia-app/app/ui/components/editors/auth/o-auth-2-auth.js +++ b/packages/insomnia-app/app/ui/components/editors/auth/o-auth-2-auth.js @@ -31,7 +31,7 @@ import type { Settings } from '../../../../models/settings'; type Props = { handleRender: Function, handleGetRenderContext: Function, - handleUpdateSettingsShowPasswords: (boolean) => Promise, + handleUpdateSettingsShowPasswords: boolean => Promise, nunjucksPowerUserMode: boolean, onChange: (Request, RequestAuthentication) => Promise, request: Request, @@ -456,7 +456,8 @@ class OAuth2Auth extends React.PureComponent { return ( - (expires ) + (expires + ) ); } @@ -586,8 +587,8 @@ class OAuth2Auth extends React.PureComponent { ? 'Refreshing...' : 'Fetching...' : tok - ? 'Refresh Token' - : 'Fetch Tokens'} + ? 'Refresh Token' + : 'Fetch Tokens'}
diff --git a/packages/insomnia-app/app/ui/components/editors/body/body-editor.js b/packages/insomnia-app/app/ui/components/editors/body/body-editor.js index 6791aa70fd..8ccebfd69b 100644 --- a/packages/insomnia-app/app/ui/components/editors/body/body-editor.js +++ b/packages/insomnia-app/app/ui/components/editors/body/body-editor.js @@ -14,7 +14,12 @@ import { CONTENT_TYPE_GRAPHQL, getContentTypeFromHeaders, } from '../../../../common/constants'; -import type { Request, RequestBody, RequestBodyParameter, RequestHeader } from '../../../../models/request'; +import type { + Request, + RequestBody, + RequestBodyParameter, + RequestHeader, +} from '../../../../models/request'; import { newBodyFile, newBodyForm, diff --git a/packages/insomnia-app/app/ui/components/editors/body/graph-ql-editor.js b/packages/insomnia-app/app/ui/components/editors/body/graph-ql-editor.js index 0b0c7ccb37..fe3d87410d 100644 --- a/packages/insomnia-app/app/ui/components/editors/body/graph-ql-editor.js +++ b/packages/insomnia-app/app/ui/components/editors/body/graph-ql-editor.js @@ -68,7 +68,6 @@ class GraphQLEditor extends React.PureComponent { _isMounted: boolean; _queryEditor: null | CodeMirror; _schemaFetchTimeout: TimeoutID; - _highlightTimeout: TimeoutID; constructor(props: Props) { super(props); @@ -338,7 +337,7 @@ class GraphQLEditor extends React.PureComponent { } } - _getOperations() { + _getOperations(): Array { if (!this._documentAST) { return []; } @@ -347,12 +346,6 @@ class GraphQLEditor extends React.PureComponent { } _handleBodyChange(query: string, variables: ?Object, operationName: ?string): void { - try { - this._documentAST = parse(query); - } catch (e) { - this._documentAST = null; - } - const body: GraphQLBody = { query }; if (variables) { @@ -363,13 +356,27 @@ class GraphQLEditor extends React.PureComponent { body.operationName = operationName; } + const newContent = GraphQLEditor._graphQLToString(body); + + // This method gets called a lot so make sure we only do something if the + // new body has actually changed. + if (this.props.content === newContent) { + return; + } + this.setState({ variablesSyntaxError: '', body, }); - this.props.onChange(GraphQLEditor._graphQLToString(body)); + this.props.onChange(newContent); this._highlightOperation(body.operationName || null); + + try { + this._documentAST = parse(query); + } catch (e) { + this._documentAST = null; + } } _handleQueryChange(query: string): void { @@ -551,23 +558,22 @@ class GraphQLEditor extends React.PureComponent { />
- {!hideSchemaFetchErrors && - schemaFetchError && ( -
-
- - - {' '} - -
- {schemaFetchError.message} -
+ {' '} +
- )} + {schemaFetchError.message} +
+
+ )}
{this.renderSchemaFetchMessage()} @@ -576,7 +582,8 @@ class GraphQLEditor extends React.PureComponent {

Query Variables - Variables to use in GraphQL query
(JSON format) + Variables to use in GraphQL query
+ (JSON format)
{variablesSyntaxError && ( {variablesSyntaxError} diff --git a/packages/insomnia-app/app/ui/components/error-boundary.js b/packages/insomnia-app/app/ui/components/error-boundary.js index 32c44d8a66..5fb91ba808 100644 --- a/packages/insomnia-app/app/ui/components/error-boundary.js +++ b/packages/insomnia-app/app/ui/components/error-boundary.js @@ -68,7 +68,7 @@ class SingleErrorBoundary extends React.PureComponent { } class ErrorBoundary extends React.PureComponent { - render() { + render(): React.Node { const { children, ...extraProps } = this.props; if (!children) { diff --git a/packages/insomnia-app/app/ui/components/export-requests/request-group-row.js b/packages/insomnia-app/app/ui/components/export-requests/request-group-row.js new file mode 100644 index 0000000000..5ba9f115e4 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/export-requests/request-group-row.js @@ -0,0 +1,84 @@ +// @flow +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import classnames from 'classnames'; +import type { RequestGroup } from '../../../models/request-group'; + +type Props = { + // Required. + handleSetRequestGroupCollapsed: Function, + handleSetItemSelected: Function, + isCollapsed: boolean, + totalRequests: number, + selectedRequests: number, + requestGroup: RequestGroup, + + // Optional. + children?: React.Node, +}; + +@autobind +class RequestGroupRow extends React.PureComponent { + checkbox: HTMLInputElement; + + setCheckboxRef(checkbox: ?HTMLInputElement) { + if (checkbox != null) { + this.checkbox = checkbox; + } + } + + handleCollapse() { + const { requestGroup, handleSetRequestGroupCollapsed, isCollapsed } = this.props; + handleSetRequestGroupCollapsed(requestGroup._id, !isCollapsed); + } + + handleSelect(e: SyntheticEvent) { + const el = e.currentTarget; + let value = el.checked; + const { handleSetItemSelected, requestGroup } = this.props; + return handleSetItemSelected(requestGroup._id, value); + } + + render() { + const { children, requestGroup, isCollapsed, totalRequests, selectedRequests } = this.props; + + let folderIconClass = 'fa-folder'; + + folderIconClass += isCollapsed ? '' : '-open'; + + const isSelected = selectedRequests === totalRequests; + if (this.checkbox != null) { + // Partial or indeterminate checkbox. + this.checkbox.indeterminate = selectedRequests > 0 && selectedRequests < totalRequests; + } + + return ( +
  • +
    +
    + +
    + +
    + +
      + {!isCollapsed ? children : null} +
    +
  • + ); + } +} + +export default RequestGroupRow; diff --git a/packages/insomnia-app/app/ui/components/export-requests/request-row.js b/packages/insomnia-app/app/ui/components/export-requests/request-row.js new file mode 100644 index 0000000000..c41a5e0086 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/export-requests/request-row.js @@ -0,0 +1,40 @@ +// @flow +import React, { PureComponent } from 'react'; +import autobind from 'autobind-decorator'; +import MethodTag from '../tags/method-tag'; +import type { Request } from '../../../models/request'; + +type Props = { + handleSetItemSelected: Function, + isSelected: boolean, + request: Request, +}; + +@autobind +class RequestRow extends PureComponent { + handleSelect(e: SyntheticEvent) { + const el = e.currentTarget; + let value = el.checked; + const { handleSetItemSelected, request } = this.props; + return handleSetItemSelected(request._id, value); + } + + render() { + const { request, isSelected } = this.props; + return ( +
  • +
    +
    + +
    + +
    +
  • + ); + } +} + +export default RequestRow; diff --git a/packages/insomnia-app/app/ui/components/export-requests/tree.js b/packages/insomnia-app/app/ui/components/export-requests/tree.js new file mode 100644 index 0000000000..0e0dbf9ca3 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/export-requests/tree.js @@ -0,0 +1,66 @@ +// @flow +import * as React from 'react'; +import RequestRow from './request-row'; +import RequestGroupRow from './request-group-row'; +import * as models from '../../../models/index'; +import type { Node } from '../modals/export-requests-modal'; +import type { Request } from '../../../models/request'; +import type { RequestGroup } from '../../../models/request-group'; + +type Props = { + root: ?Node, + handleSetRequestGroupCollapsed: Function, + handleSetItemSelected: Function, +}; + +class Tree extends React.PureComponent { + renderChildren(node: ?Node) { + if (node == null) { + return null; + } + + if (node.doc.type === models.request.type) { + // Directly cast to Request will result in error, so cast it to any first. + const request: Request = ((node.doc: any): Request); + return ( + + ); + } + + if (node.totalRequests === 0) { + // Don't show empty folders. + return null; + } + + const children = node.children.map(child => this.renderChildren(child)); + + // Directly cast to RequestGroup will result in error, so cast it to any first. + const requestGroup: RequestGroup = ((node.doc: any): RequestGroup); + return ( + + ); + } + + render() { + const { root } = this.props; + return ( +
      {this.renderChildren(root)}
    + ); + } +} + +export default Tree; diff --git a/packages/insomnia-app/app/ui/components/key-value-editor/row.js b/packages/insomnia-app/app/ui/components/key-value-editor/row.js index a71002bbea..56667d7c8e 100644 --- a/packages/insomnia-app/app/ui/components/key-value-editor/row.js +++ b/packages/insomnia-app/app/ui/components/key-value-editor/row.js @@ -376,7 +376,7 @@ class KeyValueEditorRow extends PureComponent { @@ -474,9 +474,9 @@ const dragTarget = { }, hover(props, monitor, component) { if (isAbove(monitor, component)) { - component.decoratedComponentInstance.setDragDirection(1); + component.setDragDirection(1); } else { - component.decoratedComponentInstance.setDragDirection(-1); + component.setDragDirection(-1); } }, }; @@ -500,11 +500,11 @@ const source = DragSource('KEY_VALUE_EDITOR', dragSource, sourceCollect)(KeyValu const target = DropTarget('KEY_VALUE_EDITOR', dragTarget, targetCollect)(source); target.prototype.focusNameEnd = function() { - this.handler.component.decoratedComponentInstance.focusNameEnd(); + this.decoratedRef.current.decoratedRef.current.focusNameEnd(); }; target.prototype.focusValueEnd = function() { - this.handler.component.decoratedComponentInstance.focusValueEnd(); + this.decoratedRef.current.decoratedRef.current.focusValueEnd(); }; export default target; diff --git a/packages/insomnia-app/app/ui/components/modals/cookies-modal.js b/packages/insomnia-app/app/ui/components/modals/cookies-modal.js index 716b982856..b06924806f 100644 --- a/packages/insomnia-app/app/ui/components/modals/cookies-modal.js +++ b/packages/insomnia-app/app/ui/components/modals/cookies-modal.js @@ -125,7 +125,7 @@ class CookiesModal extends PureComponent { this.setState({ filter, visibleCookieIndexes }); } - _getVisibleCookies() { + _getVisibleCookies(): Array { const { cookieJar } = this.props; const { visibleCookieIndexes } = this.state; diff --git a/packages/insomnia-app/app/ui/components/modals/export-requests-modal.js b/packages/insomnia-app/app/ui/components/modals/export-requests-modal.js new file mode 100644 index 0000000000..1a1c852c13 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/export-requests-modal.js @@ -0,0 +1,217 @@ +// @flow +import React, { PureComponent } from 'react'; +import autobind from 'autobind-decorator'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import ModalFooter from '../base/modal-footer'; +import Tree from '../export-requests/tree'; +import type { Request } from '../../../models/request'; +import type { RequestGroup } from '../../../models/request-group'; +import * as models from '../../../models'; + +export type Node = { + doc: Request | RequestGroup, + children: Array, + collapsed: boolean, + totalRequests: number, + selectedRequests: number, +}; + +type Props = { + childObjects: Array, + handleExportRequestsToFile: Function, +}; + +type State = { + treeRoot: ?Node, +}; + +@autobind +class ExportRequestsModal extends PureComponent { + modal: Modal; + + constructor(props: Props) { + super(props); + this.state = { + treeRoot: null, + }; + } + + setModalRef(modal: ?Modal) { + if (modal != null) { + this.modal = modal; + } + } + + show() { + this.modal.show(); + this.createTree(); + } + + hide() { + this.modal.hide(); + } + + handleExport() { + const { treeRoot } = this.state; + if (treeRoot == null || treeRoot.selectedRequests === 0) { + return; + } + const exportedRequestIds = this.getSelectedRequestIds(treeRoot); + this.props.handleExportRequestsToFile(exportedRequestIds); + this.hide(); + } + + getSelectedRequestIds(node: Node): Array { + if (node.doc.type === models.request.type && node.selectedRequests === node.totalRequests) { + return [node.doc._id]; + } + const requestIds: Array = []; + for (const child of node.children) { + const reqIds = this.getSelectedRequestIds(child); + requestIds.push(...reqIds); + } + return requestIds; + } + + createTree() { + const { childObjects } = this.props; + const children: Array = childObjects.map(child => this.createNode(child)); + const totalRequests = children + .map(child => child.totalRequests) + .reduce((acc, totalRequests) => acc + totalRequests, 0); + const rootFolder: RequestGroup = Object.assign({}, models.requestGroup.init(), { + _id: 'all', + type: models.requestGroup.type, + name: 'All requests', + parentId: '', + modified: 0, + created: 0, + }); + this.setState({ + treeRoot: { + doc: rootFolder, + collapsed: false, + children: children, + totalRequests: totalRequests, + selectedRequests: totalRequests, // Default select all + }, + }); + } + + createNode(item: Object): Node { + const children: Array = item.children.map(child => this.createNode(child)); + let totalRequests = children + .map(child => child.totalRequests) + .reduce((acc, totalRequests) => acc + totalRequests, 0); + if (item.doc.type === models.request.type) { + totalRequests++; + } + return { + doc: item.doc, + collapsed: false, + children: children, + totalRequests: totalRequests, + selectedRequests: totalRequests, // Default select all + }; + } + + handleSetRequestGroupCollapsed(requestGroupId: string, isCollapsed: boolean) { + const { treeRoot } = this.state; + if (treeRoot == null) { + return; + } + const found = this.setRequestGroupCollapsed(treeRoot, isCollapsed, requestGroupId); + if (!found) { + return; + } + this.setState({ + treeRoot: { ...treeRoot }, + }); + } + + handleSetItemSelected(itemId: string, isSelected: boolean) { + const { treeRoot } = this.state; + if (treeRoot == null) { + return; + } + const found = this.setItemSelected(treeRoot, isSelected, itemId); + if (!found) { + return; + } + this.setState({ + treeRoot: { ...treeRoot }, + }); + } + + setRequestGroupCollapsed(node: Node, isCollapsed: boolean, requestGroupId: string): boolean { + if (node.doc.type !== models.requestGroup.type) { + return false; + } + if (node.doc._id === requestGroupId) { + node.collapsed = isCollapsed; + return true; + } + for (const child of node.children) { + const found = this.setRequestGroupCollapsed(child, isCollapsed, requestGroupId); + if (found) { + return true; + } + } + return false; + } + + setItemSelected(node: Node, isSelected: boolean, id?: string): boolean { + if (id == null || node.doc._id === id) { + // Switch the flags of all children in this subtree. + for (const child of node.children) { + this.setItemSelected(child, isSelected); + } + node.selectedRequests = isSelected ? node.totalRequests : 0; + return true; + } + + for (const child of node.children) { + const found = this.setItemSelected(child, isSelected, id); + if (found) { + node.selectedRequests = node.children + .map(ch => ch.selectedRequests) + .reduce((acc, selected) => acc + selected, 0); + return true; + } + } + return false; + } + + render() { + const { treeRoot } = this.state; + const isExportDisabled = treeRoot != null ? treeRoot.selectedRequests === 0 : false; + return ( + + Select Requests to Export + +
    + +
    +
    + +
    + + +
    +
    +
    + ); + } +} + +export default ExportRequestsModal; diff --git a/packages/insomnia-app/app/ui/components/modals/index.js b/packages/insomnia-app/app/ui/components/modals/index.js index 5224fda008..926573d8fa 100644 --- a/packages/insomnia-app/app/ui/components/modals/index.js +++ b/packages/insomnia-app/app/ui/components/modals/index.js @@ -40,5 +40,10 @@ export function hideAllModals() { } function _getModal(modalCls) { - return modals[modalCls.name]; + const m = modals[modalCls.name]; + if (!m) { + throw new Error('Modal was not registered with the app'); + } + + return m; } diff --git a/packages/insomnia-app/app/ui/components/modals/login-modal.js b/packages/insomnia-app/app/ui/components/modals/login-modal.js index 6c739e9616..668c0577a4 100644 --- a/packages/insomnia-app/app/ui/components/modals/login-modal.js +++ b/packages/insomnia-app/app/ui/components/modals/login-modal.js @@ -5,8 +5,8 @@ import Modal from '../base/modal'; import ModalBody from '../base/modal-body'; import ModalHeader from '../base/modal-header'; import ModalFooter from '../base/modal-footer'; -import * as session from '../../../sync/session'; -import * as sync from '../../../sync'; +import * as sync from '../../../sync-legacy'; +import * as session from '../../../account/session'; @autobind class LoginModal extends PureComponent { @@ -14,7 +14,6 @@ class LoginModal extends PureComponent { super(props); this.state = { - step: 1, loading: false, error: '', title: '', @@ -45,12 +44,9 @@ class LoginModal extends PureComponent { await session.login(email, password); // Clear all existing sync data that might be there and enable sync - process.nextTick(async () => { - await sync.resetLocalData(); - await sync.doInitialSync(); - }); - - this.setState({ step: 2, loading: false }); + await sync.resetLocalData(); + await sync.doInitialSync(); + this.hide(); } catch (e) { this.setState({ error: e.message, loading: false }); } @@ -58,7 +54,7 @@ class LoginModal extends PureComponent { show(options = {}) { const { title, message } = options; - this.setState({ step: 1, error: '', loading: false, title, message }); + this.setState({ error: '', loading: false, title, message }); this.modal.show(); setTimeout(() => this._emailInput.focus(), 100); } @@ -68,69 +64,46 @@ class LoginModal extends PureComponent { } render() { - const { step, title, message, loading, error } = this.state; - let inner; - if (step === 1) { - inner = [ - {title || 'Login to Your Account'}, - - {message ?

    {message}

    : null} -
    - -
    -
    - -
    - {error ?
    ** {error}
    : null} -
    , - -
    - Don't have an account yet? Signup -
    - -
    , - ]; - } else { - inner = [ - Login Success, - -

    Enjoy your stay!

    -

    - If you have any questions or concerns, send you email to{' '} - support@insomnia.rest -

    -
    , - - - , - ]; - } - + const { title, message, loading, error } = this.state; return (
    - {inner} + {title || 'Login to Your Account'} + + {message ?

    {message}

    : null} +
    + +
    +
    + +
    + {error ?
    ** {error}
    : null} +
    + +
    + Don't have an account yet? Signup +
    + +
    ); diff --git a/packages/insomnia-app/app/ui/components/modals/payment-notification-modal.js b/packages/insomnia-app/app/ui/components/modals/payment-notification-modal.js index 67431e19f0..db40136a95 100644 --- a/packages/insomnia-app/app/ui/components/modals/payment-notification-modal.js +++ b/packages/insomnia-app/app/ui/components/modals/payment-notification-modal.js @@ -5,8 +5,8 @@ import Link from '../base/link'; import Modal from '../base/modal'; import ModalBody from '../base/modal-body'; import ModalHeader from '../base/modal-header'; -import * as session from '../../../sync/session'; -import * as sync from '../../../sync/index'; +import * as sync from '../../../sync-legacy/index'; +import { getFirstName } from '../../../account/session'; let hidePaymentNotificationUntilNextLaunch = false; @@ -45,7 +45,7 @@ class PaymentNotificationModal extends PureComponent { Insomnia Plus Trial Ended
    -

    Hi {session.getFirstName()},

    +

    Hi {getFirstName()},

    Your Insomnia Plus trial has come to an end. Please enter your billing info to continue using Plus features like encrypted data synchronization and backup. diff --git a/packages/insomnia-app/app/ui/components/modals/prompt-modal.js b/packages/insomnia-app/app/ui/components/modals/prompt-modal.js index 3da2f8a645..e13545875e 100644 --- a/packages/insomnia-app/app/ui/components/modals/prompt-modal.js +++ b/packages/insomnia-app/app/ui/components/modals/prompt-modal.js @@ -18,6 +18,7 @@ type State = { submitName: ?string, selectText: ?boolean, upperCase: ?boolean, + validate: ?(string) => string, hint: ?string, label: ?string, placeholder: ?string, @@ -26,6 +27,7 @@ type State = { onComplete: ?(string) => void, onCancel: ?() => void, onDeleteHint: ?(string) => void, + currentValue: string, }; @autobind @@ -42,6 +44,7 @@ class PromptModal extends React.PureComponent { submitName: '', selectText: false, upperCase: false, + validate: null, hint: '', label: '', placeholder: '', @@ -50,6 +53,7 @@ class PromptModal extends React.PureComponent { onComplete: undefined, onCancel: undefined, onDeleteHint: undefined, + currentValue: '', }; } @@ -87,6 +91,15 @@ class PromptModal extends React.PureComponent { } } + _handleChange(e: SyntheticEvent) { + const { validate } = this.state; + + if (validate) { + const errorMessage = validate(e.currentTarget.value); + e.currentTarget.setCustomValidity(errorMessage); + } + } + hide() { this.modal && this.modal.hide(); } @@ -101,6 +114,7 @@ class PromptModal extends React.PureComponent { cancelable?: boolean, inputType?: string, placeholder?: string, + validate?: string => string, label?: string, hints?: Array, onComplete?: string => void, @@ -121,10 +135,12 @@ class PromptModal extends React.PureComponent { hints, onComplete, onCancel, + validate, onDeleteHint, } = options; this.setState({ + currentValue: '', title, onCancel, onDeleteHint, @@ -138,6 +154,7 @@ class PromptModal extends React.PureComponent { hint, inputType, label, + validate, hints: hints || [], }); @@ -167,7 +184,7 @@ class PromptModal extends React.PureComponent { @@ -194,6 +211,7 @@ class PromptModal extends React.PureComponent { const input = ( @@ -164,7 +164,7 @@ class SettingsModal extends PureComponent { SettingsModal.propTypes = { // Functions - handleExportWorkspaceToFile: PropTypes.func.isRequired, + handleShowExportRequestsModal: PropTypes.func.isRequired, handleExportAllToFile: PropTypes.func.isRequired, handleImportFile: PropTypes.func.isRequired, handleImportUri: PropTypes.func.isRequired, diff --git a/packages/insomnia-app/app/ui/components/modals/setup-sync-modal.js b/packages/insomnia-app/app/ui/components/modals/setup-sync-modal.js index fffce38334..bc79ef968b 100644 --- a/packages/insomnia-app/app/ui/components/modals/setup-sync-modal.js +++ b/packages/insomnia-app/app/ui/components/modals/setup-sync-modal.js @@ -5,13 +5,13 @@ import Modal from '../base/modal'; import ModalBody from '../base/modal-body'; import ModalHeader from '../base/modal-header'; import ModalFooter from '../base/modal-footer'; -import * as sync from '../../../sync'; +import * as sync from '../../../sync-legacy'; import { SYNC_MODE_OFF, SYNC_MODE_ON, SYNC_MODE_NEVER, SYNC_MODE_UNSET, -} from '../../../sync/storage'; +} from '../../../sync-legacy/storage'; import type { Workspace } from '../../../models/workspace'; import HelpTooltip from '../help-tooltip'; diff --git a/packages/insomnia-app/app/ui/components/modals/sync-branches-modal.js b/packages/insomnia-app/app/ui/components/modals/sync-branches-modal.js new file mode 100644 index 0000000000..00075992af --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/sync-branches-modal.js @@ -0,0 +1,285 @@ +// @flow +import * as React from 'react'; +import classnames from 'classnames'; +import autobind from 'autobind-decorator'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import type { Workspace } from '../../../models/workspace'; +import VCS from '../../../sync/vcs'; +import { batchModifyDocs } from '../../../common/database'; +import type { StatusCandidate } from '../../../sync/types'; +import PromptButton from '../base/prompt-button'; +import SyncPullButton from '../sync-pull-button'; + +type Props = { + workspace: Workspace, + syncItems: Array, + vcs: VCS, +}; + +type State = { + error: string, + newBranchName: string, + currentBranch: string, + branches: Array, + remoteBranches: Array, +}; + +@autobind +class SyncBranchesModal extends React.PureComponent { + modal: ?Modal; + + constructor(props: Props) { + super(props); + this.state = { + error: '', + newBranchName: '', + branches: [], + remoteBranches: [], + currentBranch: '', + }; + } + + _setModalRef(m: ?Modal) { + this.modal = m; + } + + async _handleCheckout(branch: string) { + const { vcs, syncItems } = this.props; + try { + const delta = await vcs.checkout(syncItems, branch); + await batchModifyDocs(delta); + await this.refreshState(); + } catch (err) { + console.log('Failed to checkout', err.stack); + this.setState({ error: err.message }); + } + } + + async _handleMerge(branch: string) { + const { vcs, syncItems } = this.props; + const delta = await vcs.merge(syncItems, branch); + try { + await batchModifyDocs(delta); + await this.refreshState(); + } catch (err) { + console.log('Failed to merge', err.stack); + this.setState({ error: err.message }); + } + } + + async _handleRemoteDelete(branch: string) { + const { vcs } = this.props; + try { + await vcs.removeRemoteBranch(branch); + await this.refreshState(); + } catch (err) { + console.log('Failed to remote delete', err.stack); + this.setState({ error: err.message }); + } + } + + async _handleDelete(branch: string) { + const { vcs } = this.props; + try { + await vcs.removeBranch(branch); + await this.refreshState(); + } catch (err) { + console.log('Failed to delete', err.stack); + this.setState({ error: err.message }); + } + } + + async _handleCreate(e: SyntheticEvent) { + e.preventDefault(); + + const { vcs, syncItems } = this.props; + try { + // Create new branch + const { newBranchName } = this.state; + await vcs.fork(newBranchName); + + // Checkout new branch + const delta = await vcs.checkout(syncItems, newBranchName); + await batchModifyDocs(delta); + + // Clear branch name and refresh things + await this.refreshState({ newBranchName: '' }); + } catch (err) { + console.log('Failed to create', err.stack); + this.setState({ error: err.message }); + } + } + + _updateNewBranchName(e: SyntheticEvent) { + this.setState({ newBranchName: e.currentTarget.value }); + } + + _handleClearError() { + this.setState({ error: '' }); + } + + async refreshState(newState?: Object) { + const { vcs } = this.props; + try { + const currentBranch = await vcs.getBranch(); + const branches = (await vcs.getBranches()).sort(); + + this.setState({ + branches, + currentBranch, + error: '', + ...newState, + }); + + const remoteBranches = (await vcs.getRemoteBranches()) + .filter(b => !branches.includes(b)) + .sort(); + this.setState({ remoteBranches }); + } catch (err) { + console.log('Failed to refresh', err.stack); + this.setState({ error: err.message }); + } + } + + hide() { + this.modal && this.modal.hide(); + } + + async show(options: { onHide: Function }) { + this.modal && this.modal.show({ onHide: options.onHide }); + await this.refreshState(); + } + + render() { + const { vcs } = this.props; + const { branches, remoteBranches, currentBranch, newBranchName, error } = this.state; + + return ( + + Branches + + {error && ( +

    + + {error} +

    + )} +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + + + + + + + + + {branches.map(name => ( + + + + + ))} + +
    Branches 
    + {name} + {name === currentBranch ? ( + (current) + ) : null} + {name === 'master' && } + + this._handleMerge(name)}> + Merge + + this._handleDelete(name)}> + Delete + + +
    +
    + + {remoteBranches.length > 0 && ( +
    + + + + + + + + + {remoteBranches.map(name => ( + + + + + ))} + +
    Remote Branches 
    + {name} + {name === 'master' && } + + {name !== 'master' && ( + this._handleRemoteDelete(name)}> + Delete + + )} + + Fetch + +
    +
    + )} + + + ); + } +} + +export default SyncBranchesModal; diff --git a/packages/insomnia-app/app/ui/components/modals/sync-history-modal.js b/packages/insomnia-app/app/ui/components/modals/sync-history-modal.js new file mode 100644 index 0000000000..91a8a0e62e --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/sync-history-modal.js @@ -0,0 +1,125 @@ +// @flow +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import type { Workspace } from '../../../models/workspace'; +import TimeFromNow from '../time-from-now'; +import Tooltip from '../tooltip'; +import PromptButton from '../base/prompt-button'; +import HelpTooltip from '../help-tooltip'; +import type { Snapshot } from '../../../sync/types'; +import VCS from '../../../sync/vcs'; + +type Props = { + workspace: Workspace, + vcs: VCS, +}; + +type State = { + branch: string, + history: Array, +}; + +@autobind +class SyncHistoryModal extends React.PureComponent { + modal: ?Modal; + handleRollback: Snapshot => Promise; + + constructor(props: Props) { + super(props); + this.state = { + branch: '', + history: [], + }; + } + + _setModalRef(m: ?Modal) { + this.modal = m; + } + + async _handleClickRollback(snapshot: Snapshot) { + await this.handleRollback(snapshot); + await this.refreshState(); + } + + async refreshState(newState?: Object) { + const { vcs } = this.props; + const branch = await vcs.getBranch(); + const history = await vcs.getHistory(); + + this.setState({ + branch, + history: history.sort((a, b) => (a.created < b.created ? 1 : -1)), + ...newState, + }); + } + + hide() { + this.modal && this.modal.hide(); + } + + async show(options: { handleRollback: Snapshot => Promise }) { + this.modal && this.modal.show(); + this.handleRollback = options.handleRollback; + await this.refreshState(); + } + + render() { + const { branch, history } = this.state; + + return ( + + + Branch History: {branch} + + + + + + + + + + + + + {history.map(snapshot => ( + + + + + + + ))} + +
    MessageTimeObjects + Restore + + This will revert the workspace to that state stored in the snapshot + +
    + + {snapshot.name} + + + + {snapshot.state.length} + this._handleClickRollback(snapshot)}> + Restore + +
    +
    +
    + ); + } +} + +export default SyncHistoryModal; diff --git a/packages/insomnia-app/app/ui/components/modals/sync-merge-modal.js b/packages/insomnia-app/app/ui/components/modals/sync-merge-modal.js new file mode 100644 index 0000000000..2ca5da3917 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/sync-merge-modal.js @@ -0,0 +1,125 @@ +// @flow + +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import type { Workspace } from '../../../models/workspace'; +import VCS from '../../../sync/vcs'; +import type { DocumentKey, MergeConflict, StatusCandidate } from '../../../sync/types'; +import ModalFooter from '../base/modal-footer'; + +type Props = { + workspace: Workspace, + vcs: VCS, + syncItems: Array, +}; + +type State = { + conflicts: Array, +}; + +@autobind +class SyncMergeModal extends React.PureComponent { + modal: ?Modal; + _handleDone: (Array) => void; + + state = { + conflicts: [], + }; + + _setModalRef(n: ?Modal) { + this.modal = n; + } + + _handleOk() { + this._handleDone(this.state.conflicts); + this.hide(); + } + + _handleToggleSelect(key: DocumentKey, e: SyntheticEvent) { + const conflicts = this.state.conflicts.map(c => { + if (c.key !== key) { + return c; + } + + return { ...c, choose: e.currentTarget.value }; + }); + + this.setState({ conflicts }); + } + + async show(options: { + conflicts: Array, + handleDone: (Array) => void, + }) { + this.modal && this.modal.show(); + this._handleDone = options.handleDone; + + this.setState({ + conflicts: options.conflicts, + }); + } + + hide() { + this.modal && this.modal.hide(); + } + + render() { + const { conflicts } = this.state; + return ( + + Resolve Conflicts + + + + + + + + + + + {conflicts.map(conflict => ( + + + + + + ))} + +
    NameDescriptionChoose
    {conflict.name}{conflict.message} + + +
    +
    + + + +
    + ); + } +} + +export default SyncMergeModal; diff --git a/packages/insomnia-app/app/ui/components/modals/sync-share-modal.js b/packages/insomnia-app/app/ui/components/modals/sync-share-modal.js new file mode 100644 index 0000000000..f29cc0e5d2 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/sync-share-modal.js @@ -0,0 +1,157 @@ +// @flow + +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import { Dropdown, DropdownButton, DropdownDivider, DropdownItem } from '../base/dropdown'; +import Link from '../base/link'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import PromptButton from '../base/prompt-button'; +import type { Workspace } from '../../../models/workspace'; +import VCS from '../../../sync/vcs'; + +type Props = { + workspace: Workspace, + vcs: VCS, +}; + +type Team = { id: string, name: string }; + +type State = { + loading: boolean, + selectedTeam: null | Team, + teams: Array, + error: string, +}; + +@autobind +class SyncShareModal extends React.PureComponent { + modal: ?Modal; + + constructor(props: Props) { + super(props); + this.state = { + selectedTeam: null, + teams: [], + error: '', + loading: false, + }; + } + + _setModalRef(n: ?Modal) { + this.modal = n; + } + + async _handleChangeTeam(team: Team) { + const { vcs } = this.props; + this.setState({ loading: true }); + + try { + if (team) { + await vcs.shareWithTeam(team.id); + } else { + await vcs.unShareWithTeam(); + } + } catch (err) { + this.setState({ + error: err.message, + loading: false, + }); + } + + this.setState({ + selectedTeam: team, + error: '', + loading: false, + }); + } + + async show() { + const { vcs } = this.props; + this.setState({ loading: true }); + this.modal && this.modal.show(); + + const [teams, projectTeams] = await Promise.all([vcs.teams(), vcs.projectTeams()]); + + this.setState({ + teams, + selectedTeam: projectTeams[0] || null, + error: '', + loading: false, + }); + } + + hide() { + this.modal && this.modal.hide(); + } + + render() { + const { teams, error, selectedTeam, loading } = this.state; + const { workspace } = this.props; + return ( + + Share Workspace + +

    + Collaborate on {workspace.name} with your team. +

    +
    + {error ?
    Oops: {error}
    : null} + + Teams + {selectedTeam ? ( + + {loading ? ( + + ) : ( + + )}{' '} + Shared with {selectedTeam.name}{' '} + + + ) : ( + + {loading ? ( + + ) : ( + + )}{' '} + Private + + )} + {teams.map(team => ( + + Share with {team.name} + + ))} + {teams.length === 0 && ( + + You have no teams + + )} + Other + + Private + + +    + + Manage Teams + +
    +
    +
    + ); + } +} + +export default SyncShareModal; diff --git a/packages/insomnia-app/app/ui/components/modals/sync-staging-modal.js b/packages/insomnia-app/app/ui/components/modals/sync-staging-modal.js new file mode 100644 index 0000000000..2e688ac8e9 --- /dev/null +++ b/packages/insomnia-app/app/ui/components/modals/sync-staging-modal.js @@ -0,0 +1,373 @@ +// @flow +import * as React from 'react'; +import autobind from 'autobind-decorator'; +import Modal from '../base/modal'; +import ModalBody from '../base/modal-body'; +import ModalHeader from '../base/modal-header'; +import ModalFooter from '../base/modal-footer'; +import type { Workspace } from '../../../models/workspace'; +import VCS from '../../../sync/vcs'; +import type { DocumentKey, Stage, StageEntry, Status, StatusCandidate } from '../../../sync/types'; +import * as models from '../../../models'; +import Tooltip from '../tooltip'; +import IndeterminateCheckbox from '../base/indeterminate-checkbox'; + +type Props = { + workspace: Workspace, + syncItems: Array, + vcs: VCS, +}; + +type State = { + status: Status, + message: string, + error: string, + branch: string, + lookupMap: { + [string]: { + entry: StageEntry, + type: string, + checked: boolean, + operation: string, + }, + }, +}; + +const _initialState: State = { + status: { + stage: {}, + unstaged: {}, + key: '', + }, + branch: '', + error: '', + message: '', + lookupMap: {}, +}; + +@autobind +class SyncStagingModal extends React.PureComponent { + modal: ?Modal; + _onSnapshot: ?() => void; + _handlePush: ?() => Promise; + textarea: ?HTMLTextAreaElement; + + state = _initialState; + + _setModalRef(m: ?Modal) { + this.modal = m; + } + + _setTextAreaRef(m: ?HTMLTextAreaElement) { + this.textarea = m; + } + + _handleClearError() { + this.setState({ error: '' }); + } + + _handleMessageChange(e: SyntheticEvent) { + this.setState({ message: e.currentTarget.value }); + } + + async _handleStageToggle(e: SyntheticEvent) { + const { vcs } = this.props; + const { status } = this.state; + const id = e.currentTarget.name; + + const newStage = status.stage[id] + ? await vcs.unstage(status.stage, [status.stage[id]]) + : await vcs.stage(status.stage, [status.unstaged[id]]); + + await this.refreshMainAttributes({}, newStage); + } + + async _handleAllToggle(keys: Array, doStage: boolean) { + const { vcs } = this.props; + const { status } = this.state; + + let stage; + if (doStage) { + const entries: Array = []; + for (const k of Object.keys(status.unstaged)) { + if (keys.includes(k)) { + entries.push(status.unstaged[k]); + } + } + stage = await vcs.stage(status.stage, entries); + } else { + const entries: Array = []; + for (const k of Object.keys(status.stage)) { + if (keys.includes(k)) { + entries.push(status.stage[k]); + } + } + stage = await vcs.unstage(status.stage, entries); + } + + await this.refreshMainAttributes({}, stage); + } + + async _handleTakeSnapshotAndPush() { + const success = await this._handleTakeSnapshot(); + if (success) { + this._handlePush && this._handlePush(); + } + } + + async _handleTakeSnapshot(): Promise { + const { vcs } = this.props; + const { + message, + status: { stage }, + } = this.state; + + try { + await vcs.takeSnapshot(stage, message); + } catch (err) { + this.setState({ error: err.message }); + return false; + } + + this._onSnapshot && this._onSnapshot(); + await this.refreshMainAttributes({ message: '', error: '' }); + this.hide(); + return true; + } + + async refreshMainAttributes(newState?: Object = {}, newStage?: Stage = {}) { + const { vcs, syncItems } = this.props; + const branch = await vcs.getBranch(); + const status = await vcs.status(syncItems, newStage); + + const lookupMap = {}; + const allKeys = [...Object.keys(status.stage), ...Object.keys(status.unstaged)]; + for (const key of allKeys) { + const item = syncItems.find(si => si.key === key); + const doc = (item && item.document) || (await vcs.blobFromLastSnapshot(key)); + const entry = status.stage[key] || status.unstaged[key]; + + if (!entry || !doc) { + continue; + } + + lookupMap[key] = { + entry: entry, + type: models.getModelName(doc.type), + checked: !!status.stage[key], + }; + } + + this.setState({ + status, + branch, + lookupMap, + error: '', + ...newState, + }); + } + + hide() { + this.modal && this.modal.hide(); + } + + async show(options: { onSnapshot?: () => any, handlePush: () => Promise }) { + const { vcs, syncItems } = this.props; + + this.modal && this.modal.show(); + this._onSnapshot = options.onSnapshot; + this._handlePush = options.handlePush; + + // Reset state + this.setState(_initialState); + + // Add everything to stage by default except new items + const status: Status = await vcs.status(syncItems, {}); + const toStage = []; + for (const key of Object.keys(status.unstaged)) { + if (status.unstaged[key].added) { + // Don't automatically stage added resources + continue; + } + + toStage.push(status.unstaged[key]); + } + + const stage = await vcs.stage(status.stage, toStage); + await this.refreshMainAttributes({}, stage); + this.textarea && this.textarea.focus(); + } + + static renderOperation(entry: StageEntry) { + if (entry.added) { + return ( + + + + ); + } else if (entry.modified) { + return ( + + + + ); + } else if (entry.deleted) { + return ( + + + + ); + } else { + return ( + + + + ); + } + } + + renderTable(keys: Array, title: React.Node) { + const { status, lookupMap } = this.state; + + if (keys.length === 0) { + return null; + } + + let allUnChecked = true; + let allChecked = true; + + for (const key of keys.sort()) { + if (!status.stage[key]) { + allChecked = false; + } + + if (!status.unstaged[key]) { + allUnChecked = false; + } + } + + const indeterminate = !allChecked && !allUnChecked; + + return ( +
    + {title} + + + + + + + + + {keys.map(key => { + if (!lookupMap[key]) { + return null; + } + + const { entry, type, checked } = lookupMap[key]; + return ( + + + + + ); + })} + +
    + + Description
    + + + {SyncStagingModal.renderOperation(entry)} {type} +
    +
    + ); + } + + render() { + const { status, message, error, branch } = this.state; + + const nonAddedKeys = []; + const addedKeys = []; + const allMap = { ...status.stage, ...status.unstaged }; + const allKeys = Object.keys(allMap); + for (const key of allKeys) { + if (allMap[key].added) { + addedKeys.push(key); + } else { + nonAddedKeys.push(key); + } + } + + return ( + + Create Snapshot + + {error && ( +

    + + {error} +

    + )} + +
    +
    +