diff --git a/packages/default-reporter/.editorconfig b/packages/default-reporter/.editorconfig new file mode 100644 index 0000000000..270dd84bb6 --- /dev/null +++ b/packages/default-reporter/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +end_of_line = lf + +[*.{ts,js,json}] +indent_style = space +indent_size = 2 diff --git a/packages/default-reporter/.gitignore b/packages/default-reporter/.gitignore new file mode 100644 index 0000000000..fbd9508c5e --- /dev/null +++ b/packages/default-reporter/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +lib diff --git a/packages/default-reporter/.npmrc b/packages/default-reporter/.npmrc new file mode 100644 index 0000000000..a8f757884b --- /dev/null +++ b/packages/default-reporter/.npmrc @@ -0,0 +1,2 @@ +tag-version-prefix = pnpm-default-reporter/ +message = chore(release): %s diff --git a/packages/default-reporter/.travis.yml b/packages/default-reporter/.travis.yml new file mode 100644 index 0000000000..4005ab8e81 --- /dev/null +++ b/packages/default-reporter/.travis.yml @@ -0,0 +1,15 @@ +language: node_js +node_js: + - 4 + - 6 + - 8 + - 10 +sudo: false +before_install: + - curl -L https://unpkg.com/@pnpm/self-installer | node +install: + - pnpm install +script: + - npm test +notifications: + email: false diff --git a/packages/default-reporter/LICENSE b/packages/default-reporter/LICENSE new file mode 100644 index 0000000000..2af900f32c --- /dev/null +++ b/packages/default-reporter/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-2018 Zoltan Kochan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/default-reporter/README.md b/packages/default-reporter/README.md new file mode 100644 index 0000000000..8a3d5d1077 --- /dev/null +++ b/packages/default-reporter/README.md @@ -0,0 +1,15 @@ +# pnpm-default-reporter + +[![Status](https://travis-ci.org/pnpm/pnpm-default-reporter.svg?branch=master)](https://travis-ci.org/pnpm/pnpm-default-reporter "See test builds") + +> The default reporter of pnpm + +## Install + +``` +npm install pnpm-default-reporter +``` + +## License + +[MIT](LICENSE) diff --git a/packages/default-reporter/package.json b/packages/default-reporter/package.json new file mode 100644 index 0000000000..027a4e4678 --- /dev/null +++ b/packages/default-reporter/package.json @@ -0,0 +1,93 @@ +{ + "name": "pnpm-default-reporter", + "version": "0.16.4", + "description": "The default reporter of pnpm", + "main": "lib/index.js", + "typings": "lib/index.d.ts", + "files": [ + "lib" + ], + "bin": "lib/bin/pnpm-default-reporter.js", + "scripts": { + "lint": "tslint -c tslint.json --project .", + "pretty-test": "preview && ts-node test | tap-diff", + "test": "npm run lint && npm run just-test", + "just-test": "preview && ts-node test --type-check", + "tsc": "rimraf lib && tsc", + "prepublishOnly": "npm run tsc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pnpm/pnpm-reporter-default.git" + }, + "keywords": [ + "pnpm-reporter" + ], + "author": { + "name": "Zoltan Kochan", + "email": "z@kochan.io", + "url": "https://www.kochan.io/", + "twitter": "ZoltanKochan" + }, + "engines": { + "node": ">=4" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/pnpm/pnpm-reporter-default/issues" + }, + "homepage": "https://github.com/pnpm/pnpm-reporter-default#readme", + "peerDependencies": { + "supi": ">=0.16.0 <0.19.0" + }, + "dependencies": { + "@types/common-tags": "^1.2.5", + "@types/node": "^9.3.0 || 10", + "@types/ramda": "^0.25.6", + "@types/semver": "^5.4.0", + "@types/strip-ansi": "^3.0.0", + "ansi-diff": "^1.0.10", + "chalk": "^2.2.0", + "cli-cursor": "^2.1.0", + "common-tags": "^1.4.0", + "most": "^1.7.2", + "most-last": "^1.0.0", + "ndjson": "^1.5.0", + "normalize-path": "^3.0.0", + "pretty-bytes": "^4.0.2", + "ramda": "^0.25.0", + "right-pad": "^1.0.1", + "semver": "^5.4.1", + "stacktracey": "^1.2.87", + "string-length": "^2.0.0", + "string.prototype.padstart": "^3.0.0", + "strip-ansi": "^4.0.0", + "zen-push": "^0.2.1" + }, + "devDependencies": { + "@pnpm/logger": "^1.0.0", + "@types/delay": "^2.0.1", + "@types/tape": "^4.2.30", + "commitizen": "^2.9.5", + "delay": "^2.0.0", + "ghooks": "^2.0.0", + "mos-tap-diff": "^1.0.0", + "normalize-newline": "^3.0.0", + "package-preview": "^1.0.0", + "rimraf": "^2.5.4", + "supi": "^0.18.0", + "tape": "^4.8.0", + "ts-node": "^6.0.0", + "tslint": "^5.7.0", + "typescript": "^2.6.2", + "validate-commit-msg": "^2.8.2" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + }, + "ghooks": { + "commit-msg": "node ./node_modules/validate-commit-msg/index.js" + } + } +} diff --git a/packages/default-reporter/renovate.json b/packages/default-reporter/renovate.json new file mode 100644 index 0000000000..b7ad6712df --- /dev/null +++ b/packages/default-reporter/renovate.json @@ -0,0 +1,6 @@ +{ + "extends": [ + "config:base" + ], + "pinVersions": false +} diff --git a/packages/default-reporter/shrinkwrap.yaml b/packages/default-reporter/shrinkwrap.yaml new file mode 100644 index 0000000000..a16e2b6ad3 --- /dev/null +++ b/packages/default-reporter/shrinkwrap.yaml @@ -0,0 +1,3800 @@ +dependencies: + '@types/common-tags': 1.4.0 + '@types/node': 10.0.8 + '@types/ramda': 0.25.28 + '@types/semver': 5.5.0 + '@types/strip-ansi': 3.0.0 + ansi-diff: 1.1.0 + chalk: 2.4.1 + cli-cursor: 2.1.0 + common-tags: 1.7.2 + most: 1.7.3 + most-last: 1.0.1 + ndjson: 1.5.0 + normalize-path: 3.0.0 + pnpm-default-reporter: 'link:../__package_previews__/pnpm-default-reporter/pnpm-default-reporter' + pretty-bytes: 4.0.2 + ramda: 0.25.0 + right-pad: 1.0.1 + semver: 5.5.0 + stacktracey: 1.2.102 + string-length: 2.0.0 + string.prototype.padstart: 3.0.0 + strip-ansi: 4.0.0 + zen-push: 0.2.1 +devDependencies: + '@pnpm/logger': 1.0.2 + '@types/delay': 2.0.1 + '@types/tape': 4.2.32 + commitizen: 2.9.6 + delay: 2.0.0 + ghooks: 2.0.4 + mos-tap-diff: 1.0.0 + normalize-newline: 3.0.0 + package-preview: 1.0.6 + rimraf: 2.6.2 + supi: 0.18.2 + tape: 4.9.0 + ts-node: 6.0.3 + tslint: 5.10.0 + typescript: 2.8.3 + validate-commit-msg: 2.14.0 +packages: + /@most/multicast/1.3.0: + dependencies: + '@most/prelude': 1.7.0 + dev: false + peerDependencies: + most: ^1.0.1 + resolution: + integrity: sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw== + /@most/prelude/1.7.0: + dev: false + resolution: + integrity: sha512-OlDCH0+u2/ro/AHeAg63zvbvCsQC930hSKC9Kc1qSev1JkWK8Yk0HDHJ4o62HSjPwWGXEUZG1WhQKQh4ypreGA== + /@pnpm/check-package/1.0.0: + dependencies: + '@types/load-json-file': 2.0.7 + dint: 2.0.2 + load-json-file: 4.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-rN+hiOjGtxwwus7c/E0xkCs9prBeXzZCSCW/Q3k2WdHGSRNLAepr777iv+i2eqTfz9vXlTF0rLZOGi62ujzwYA== + /@pnpm/exec/1.1.5: + dependencies: + '@pnpm/self-installer': 2.0.3 + '@types/got': 8.3.1 + '@types/node': 10.0.8 + command-exists: 1.2.6 + cross-spawn: 6.0.5 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-1zLmh6tRftQXfZ1IFHq1IexP0KaJhN6pSCA/IzK+Vixn4hPvxwcIbGjKW0KH9hsHSmrPpmSit2EWj7jGNgfa6Q== + /@pnpm/fetcher-base/1.0.0: + dependencies: + '@pnpm/resolver-base': 1.1.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-kp5ooq4wC84gelVjkQuV8GzDHe/m99+yvlx3HTHOP25SdfkshIG5k/q784cmw8axjBke/LXdgE9sR5JRNs8TTw== + /@pnpm/fs-locker/1.0.2: + dependencies: + '@types/node': 10.0.8 + mkdirp-promise: 5.0.1 + proper-lockfile: 2.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-ASULw2KzrapsjQVSMYdDc3f6+wYOs9cPt0M5Ip9VUkTfYfPrfxd0UYXcOPoUHkk7L12HUj0vwUYK0DE1da2gww== + /@pnpm/headless/0.3.0: + dependencies: + '@pnpm/lifecycle': 2.2.1 + '@pnpm/link-bins': 1.0.3 + '@pnpm/modules-yaml': 1.0.0 + '@pnpm/package-requester': 0.9.0 + '@pnpm/pkgid-to-filename': 1.0.1 + '@pnpm/types': 1.7.0 + '@types/ramda': 0.25.28 + dependency-path: 1.2.1 + graph-sequencer: 2.0.0 + p-limit: 1.2.0 + package-store: 0.19.0 + path-exists: 3.0.0 + pnpm-shrinkwrap: 6.4.0 + ramda: 0.25.0 + read-package-json: 2.0.13 + supi: 0.18.2 + symlink-dir: 1.1.3 + util.promisify: 1.0.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-44w+do+CW12jTGMOPXyyFiTT9HsCVcbV1m8JkloJJTHkpFA3mqnLu+pClKL+8a33kw+oSJXptuaTJxwDbrflOg== + /@pnpm/lifecycle/2.2.1: + dependencies: + '@pnpm/types': 1.7.0 + npm-lifecycle: 2.0.1 + path-exists: 3.0.0 + read-package-json: 2.0.13 + util.promisify: 1.0.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-jB8OzeApGS5zHi79p4O3m6WVH4X8zDYv5CTT3GAScxr5yA1RqFam5MAOhrMhYZa5CY+kXcL6T0D25IclQzmTUQ== + /@pnpm/link-bins/1.0.3: + dependencies: + '@pnpm/package-bins': 1.0.0 + '@pnpm/types': 1.7.0 + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + '@types/ramda': 0.25.28 + '@zkochan/cmd-shim': 2.2.4 + arr-flatten: 1.1.0 + is-windows: 1.0.2 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + normalize-path: 3.0.0 + p-filter: 1.0.0 + ramda: 0.25.0 + read-package-json: 2.0.13 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-thVgwrQ5rMcPYI6a0IPOt2pnlF1n5zX7BN4CrFeBp0/JCGsZAht/VOPv9bD3cZ+j0vDemEwE23BfhOWxmxq2yQ== + /@pnpm/logger/1.0.2: + dependencies: + '@types/node': 10.0.8 + bole: 3.0.2 + ndjson: 1.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-A8XbJKvdueazvJGPn1qQ9LL6uopV88ebIT+dJKNQ68gT7yfCbtfT8j5ZzdVczmGbkiuBeZ1VckZerkO0tjOXZA== + /@pnpm/modules-yaml/1.0.0: + dependencies: + load-yaml-file: 0.1.0 + write-yaml-file: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-bl9TPt2UObSEpGPQHZ2soXSSwz+/0XZqK+afBRJ4L78NKV41oZTUnrLjeNbeNEVwIG9icrQ3ZeSslIvQy4L+Dw== + /@pnpm/package-bins/1.0.0: + dependencies: + '@pnpm/types': 1.7.0 + '@types/mz': 0.0.32 + mz: 2.7.0 + p-filter: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-ZqVfIXK3r5AsP5VAhPHrhf3isF+T4yEuUpJTF9T03oFTJ9LBnkKvx8F7P7biKEManxSGOkSpNoIBdsura9pY5Q== + /@pnpm/package-requester/0.9.0: + dependencies: + '@pnpm/check-package': 1.0.0 + '@pnpm/fetcher-base': 1.0.0 + '@pnpm/pkgid-to-filename': 1.0.1 + '@pnpm/resolver-base': 1.1.0 + '@pnpm/types': 1.7.0 + '@types/load-json-file': 2.0.7 + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + '@types/p-queue': 2.3.1 + '@types/write-json-file': 2.2.1 + load-json-file: 4.0.0 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + p-limit: 1.2.0 + p-queue: 2.4.2 + path-exists: 3.0.0 + read-package-json: 2.0.13 + rename-overwrite: 1.0.2 + rimraf-then: 1.0.1 + symlink-dir: 1.1.3 + util.promisify: 1.0.0 + write-json-file: 2.3.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-u1ftVFdBiDKkorwsST0ZYRWcxo8/6KtAZ/hGhb+6VElSDQiEqC4NPSqlBnf8E3UmRYQgX9HzZYn5q4xcUVNTeQ== + /@pnpm/pkgid-to-filename/1.0.1: + dependencies: + normalize-path: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-PxAHIeraDV9YE0mBriqWewN4iOGL3UMzS7XTaYhu1OvoTqEuJ3cFCHGUW2GR0sYiMf0krj2WIASgoXi4XpAGuA== + /@pnpm/resolver-base/1.1.0: + dependencies: + '@pnpm/types': 1.7.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-YRUmjy2mR7Qk0r3xCUs0UkWLwRM2Mu2Fjyl2513PNlzsjDFG1xw4lbHRuz/bCMeN+ZKynJbIbfSW0ddMitfbgA== + /@pnpm/self-installer/2.0.3: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Awzcm+UsGmUZaZXkLH5efJEos9UICA4PIXpedyiY7Mg4LXVUtrGtX/jYNkuxj3x/bwh+7LnEvbBV4GpscxsFjw== + /@pnpm/types/1.7.0: + dev: true + resolution: + integrity: sha512-pn7g4uxcofWTNG/cxmKvkMK2lxr4OUIhrQDrEVYEdVhW0WkWztsHkFrYjFgfNzPbYu3ITlB3T6aSVjCoJQTOlw== + /@types/byline/4.2.31: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha1-DmH8ucA+BH0hxEllVMcRYperYM0= + /@types/common-tags/1.4.0: + resolution: + integrity: sha512-HI1tSO87vmd1sPS3DOVSK4gvVKROvCBFvAnXlLiQtAus/+1xXMQcNyu9TX2ChwRXFeQZeB9+f+nMo99xLd5DdA== + /@types/delay/2.0.1: + dev: true + resolution: + integrity: sha512-D1/YuYOcdOIdaQnaiUJ77VcilVvESkynw79CtGqpjkXyv4OUezEVZtdXnSOwXL8Zcelu66QbyC8QQcVQ/ZPdig== + /@types/fs-extra/5.0.2: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ== + /@types/got/8.3.1: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha512-CGEPw67/Ub6gNMusk062tueurxN+HyjDCvYl4QVBKiSO+fqluXmRX/wSqST/4RtKth4mz8lDZiaZIpXr/uPROg== + /@types/js-yaml/3.11.1: + dev: true + resolution: + integrity: sha512-M5qhhfuTt4fwHGqqANNQilp3Htb5cHwBxlMHDUw/TYRVkEp3s3IIFSH3Fe9HIAeEtnO4p3SSowLmCVavdRYfpw== + /@types/load-json-file/2.0.7: + dev: true + resolution: + integrity: sha512-NrH6jPlV77QCVPhAHofWeiOr77TgpKt82c2RVxSBChWBJqyY/u4ngl3CA4mcsAg/w7rNLrkR7dkObMV0ihLLXw== + /@types/mz/0.0.32: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha512-cy3yebKhrHuOcrJGkfwNHhpTXQLgmXSv1BX+4p32j+VUQ6aP2eJ5cL7OvGcAQx75fCTFaAIIAKewvqL+iwSd4g== + /@types/node/10.0.8: + resolution: + integrity: sha512-MFFKFv2X4iZy/NFl1m1E8uwE1CR96SGwJjgHma09PLtqOWoj3nqeJHMG+P/EuJGVLvC2I6MdQRQsr4TcRduIow== + /@types/node/8.10.14: + dev: false + resolution: + integrity: sha512-TKQqQIaYNO+8MrOsFgobkt3fbMzkfXhBFKcg20Nip5Omptw1HOY/IEvYiFtMwIbr7Me/Y2H/JO+TgNUMJ9NGjA== + /@types/nopt/3.0.29: + dev: true + resolution: + integrity: sha1-8Z3z20yX7hRZonQAKDIKcdcJZM4= + /@types/npm/2.0.29: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha512-McqGDdeT1tSMu8sPaL0ya7xBwojQYKGVwCrlPNBcaF+o+H4wLNH03nYRTfycU11Xdu8eziEb4cgdGmu4VF/NWA== + /@types/p-queue/2.3.1: + dev: true + resolution: + integrity: sha512-JyO7uMAtkcMMULmsTQ4t/lCC8nxirTtweGG1xAFNNIAoC1RemmeIxq8PiKghuEy99XdbS6Lwx4zpbXUjfeSSAA== + /@types/p-series/1.0.1: + dev: true + resolution: + integrity: sha512-dwv960sf5inFWiufjhDfK7ZG3nYyHXt58I+14bJJBKV5MPlZm6Tu1sQS63NWEtLpIw6+RhbNbXjNStdMXxR8Nw== + /@types/ramda/0.25.28: + resolution: + integrity: sha512-H2NDAXtu2NXXBM/GMkASnKX2sVMu3aMlUBP6OHeI22cb+5+Zb74ACQs5ymJo/vaE/iGjLP4UIZdqi67j1nws1A== + /@types/rc/0.0.1: + dev: true + resolution: + integrity: sha1-H1uKGzsaxtH+4TfFP6xfoPKK4Nc= + /@types/semver/5.5.0: + resolution: + integrity: sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== + /@types/strip-ansi/3.0.0: + dev: false + resolution: + integrity: sha1-m2PUU6a1SqhJGCIHcRoIvo7qSK4= + /@types/tape/4.2.32: + dependencies: + '@types/node': 10.0.8 + dev: true + resolution: + integrity: sha512-xil0KO5wkPoixdBWGIGolPv9dekf6dVkjjJLAFYchfKcd4DICou67rgGCIO7wAh3i5Ff/6j9IDgZz+GU9cMaqQ== + /@types/write-json-file/2.2.1: + dev: true + resolution: + integrity: sha512-JdO/UpPm9RrtQBNVcZdt3M7j3mHO/kXaea9LBGx3UgWJd1f9BkIWP7jObLBG6ZtRyqp7KzLFEsaPhWcidVittA== + /@zkochan/cmd-shim/2.2.4: + dependencies: + is-windows: 1.0.2 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-BDy1oz6aFYyY73618IkXzJzFghnXwVZDc3SVa6MVKTrrk4RgubahAF5yKK+Mx4a78tfO0OHeZnJKPs0pNy5uNA== + /@zkochan/npm-package-arg/1.0.0: + dependencies: + hosted-git-info: 2.6.0 + osenv: 0.1.5 + semver: 5.5.0 + validate-npm-package-name: 3.0.0 + dev: true + resolution: + integrity: sha512-ufMBw0x+4y7uaiPu1uhwMaHaysLB57+EJoo63DGf28FG+TIrYiIIE886qSNXuDqyhqt+PVsRLB9e8+QVGe+Dtg== + /abbrev/1.1.1: + dev: true + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /ajv/5.5.2: + dependencies: + co: 4.6.0 + fast-deep-equal: 1.1.0 + fast-json-stable-stringify: 2.0.0 + json-schema-traverse: 0.3.1 + dev: true + resolution: + integrity: sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + /ansi-diff/1.1.0: + dependencies: + ansi-split: 1.0.1 + dev: false + resolution: + integrity: sha512-fBcvTGkqVSdJNEBk6mL+1FCcbfI5pyWARjHdM4pfLpHeJUfOmN4SIJ4XWGEzKJNYBATbEOISTLuGAX9jqSrpFA== + /ansi-escapes/1.4.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-06ioOzGapneTZisT52HHkRQiMG4= + /ansi-regex/0.2.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= + /ansi-regex/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + /ansi-regex/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + /ansi-split/1.0.1: + dependencies: + ansi-regex: 3.0.0 + dev: false + resolution: + integrity: sha512-RRxQym4DFtDNmHIkW6aeFVvrXURb11lGAEPXNiryjCe8bK8RsANjzJ0M2aGOkvBYwP4Bl/xZ8ijtr6D3j1x/eg== + /ansi-styles/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= + /ansi-styles/2.2.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.1 + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /any-promise/1.3.0: + dev: true + resolution: + integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8= + /aproba/1.2.0: + dev: true + resolution: + integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + /are-we-there-yet/1.1.4: + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.6 + dev: true + resolution: + integrity: sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= + /argparse/1.0.10: + dependencies: + sprintf-js: 1.0.3 + dev: true + resolution: + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + /arr-diff/2.0.0: + dependencies: + arr-flatten: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + /arr-flatten/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + /array-find-index/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + /array-flatten/2.1.1: + dev: true + resolution: + integrity: sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= + /array-includes/3.0.3: + dependencies: + define-properties: 1.1.2 + es-abstract: 1.11.0 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + /array-unique/0.2.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + /arrify/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + /as-table/1.0.32: + dependencies: + printable-characters: 1.0.39 + dev: false + resolution: + integrity: sha1-zQmMcjtrgCOS+PeEmOZc0EHw5QQ= + /asn1/0.2.3: + dev: true + resolution: + integrity: sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= + /assert-plus/1.0.0: + dev: true + engines: + node: '>=0.8' + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /astral-regex/1.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + /asynckit/0.4.0: + dev: true + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /aws-sign2/0.7.0: + dev: true + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.7.0: + dev: true + resolution: + integrity: sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w== + /babel-code-frame/6.26.0: + dependencies: + chalk: 1.1.3 + esutils: 2.0.2 + js-tokens: 3.0.2 + dev: true + resolution: + integrity: sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + /babel-runtime/6.26.0: + dependencies: + core-js: 2.5.6 + regenerator-runtime: 0.11.1 + resolution: + integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + /balanced-match/1.0.0: + dev: true + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /base64-js/0.0.8: + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= + /bcrypt-pbkdf/1.0.1: + dependencies: + tweetnacl: 0.14.5 + dev: true + optional: true + resolution: + integrity: sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= + /bl/1.2.2: + dependencies: + readable-stream: 2.3.6 + safe-buffer: 5.1.2 + dev: true + resolution: + integrity: sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + /block-stream/0.0.9: + dependencies: + inherits: 2.0.3 + dev: true + engines: + node: 0.4 || >=0.5.8 + resolution: + integrity: sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + /bole/3.0.2: + dependencies: + fast-safe-stringify: 1.1.13 + individual: 3.0.0 + dev: true + resolution: + integrity: sha1-vIpIPKlASdqbg3wa0Rzf6+5uBRQ= + /boom/4.3.1: + dependencies: + hoek: 4.2.1 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha1-T4owBctKfjiJ90kDD9JbluAdLjE= + /boom/5.2.0: + dependencies: + hoek: 4.2.1 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + dev: true + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/1.8.5: + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + /browserify-zlib/0.1.4: + dependencies: + pako: 0.2.9 + dev: true + resolution: + integrity: sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= + /buffer-alloc-unsafe/0.1.1: + dev: true + resolution: + integrity: sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo= + /buffer-alloc/1.1.0: + dependencies: + buffer-alloc-unsafe: 0.1.1 + buffer-fill: 0.1.1 + dev: true + resolution: + integrity: sha1-BVFNM78WVtNUDGhPZbEgLpDsowM= + /buffer-fill/0.1.1: + dev: true + resolution: + integrity: sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q== + /buffer-from/1.0.0: + dev: true + resolution: + integrity: sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA== + /buffer/3.6.0: + dependencies: + base64-js: 0.0.8 + ieee754: 1.1.11 + isarray: 1.0.0 + dev: true + resolution: + integrity: sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= + /builtin-modules/1.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + /builtins/1.0.3: + dev: true + resolution: + integrity: sha1-y5T662HIaWRR2zZTThQi+U8K7og= + /byline/5.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= + /bzip2-maybe/1.0.0: + dependencies: + is-bzip2: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.0 + through2: 2.0.3 + unbzip2-stream: 1.2.5 + dev: true + resolution: + integrity: sha1-ya73AIprlDy+mcxhcSXrS9R4KWs= + /cachedir/1.2.0: + dependencies: + os-homedir: 1.0.2 + dev: true + resolution: + integrity: sha512-i3xIKd9U4ov0hWXYo08oJy0YVz0krZ9dbTZQim41xkg0IiScptkAK0UilZ5M1WE3gnWjXAa9+cMtrJ5dM+THbA== + /camelcase-keys/4.2.0: + dependencies: + camelcase: 4.1.0 + map-obj: 2.0.0 + quick-lru: 1.1.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + /camelcase/4.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + /caseless/0.12.0: + dev: true + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chalk/0.5.1: + dependencies: + ansi-styles: 1.1.0 + escape-string-regexp: 1.0.5 + has-ansi: 0.1.0 + strip-ansi: 0.3.0 + supports-color: 0.2.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= + /chalk/1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + /chalk/2.4.1: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.4.0 + engines: + node: '>=4' + resolution: + integrity: sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + /chownr/1.0.1: + dev: true + resolution: + integrity: sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= + /ci-info/1.1.3: + dev: true + resolution: + integrity: sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg== + /cli-cursor/1.0.2: + dependencies: + restore-cursor: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + /cli-cursor/2.1.0: + dependencies: + restore-cursor: 2.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + /cli-width/2.2.0: + dev: true + resolution: + integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + /co/4.6.0: + dev: true + engines: + iojs: '>= 1.0.0' + node: '>= 0.12.0' + resolution: + integrity: sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + /code-point-at/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + /color-convert/1.9.1: + dependencies: + color-name: 1.1.3 + resolution: + integrity: sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== + /color-name/1.1.3: + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /colors/0.6.2: + dev: true + engines: + node: '>=0.1.90' + resolution: + integrity: sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= + /combined-stream/1.0.6: + dependencies: + delayed-stream: 1.0.0 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha1-cj599ugBrFYTETp+RFqbactjKBg= + /command-exists/1.2.6: + dev: true + resolution: + integrity: sha512-Qst/zUUNmS/z3WziPxyqjrcz09pm+2Knbs5mAZL4VAE0sSrNY1/w8+/YxeHcoBTsO6iojA6BW7eFf27Eg2MRuw== + /commander/2.1.0: + dev: true + engines: + node: '>= 0.6.x' + resolution: + integrity: sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E= + /commander/2.15.1: + dev: true + resolution: + integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + /commander/2.9.0: + dependencies: + graceful-readlink: 1.0.1 + dev: true + engines: + node: '>= 0.6.x' + resolution: + integrity: sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + /commitizen/2.9.6: + dependencies: + cachedir: 1.2.0 + chalk: 1.1.3 + cz-conventional-changelog: 1.2.0 + dedent: 0.6.0 + detect-indent: 4.0.0 + find-node-modules: 1.0.4 + find-root: 1.0.0 + fs-extra: 1.0.0 + glob: 7.1.1 + inquirer: 1.2.3 + lodash: 4.17.2 + minimist: 1.2.0 + path-exists: 2.1.0 + shelljs: 0.7.6 + strip-json-comments: 2.0.1 + dev: true + engines: + node: '>= 0.12' + resolution: + integrity: sha1-wNAFNe8mTaf2Nzft/aQiiYP6IpE= + /common-tags/1.7.2: + dependencies: + babel-runtime: 6.26.0 + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ== + /concat-map/0.0.1: + dev: true + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /concat-stream/1.6.2: + dependencies: + buffer-from: 1.0.0 + inherits: 2.0.3 + readable-stream: 2.3.6 + typedarray: 0.0.6 + dev: true + engines: + '0': node >= 0.8 + resolution: + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + /console-control-strings/1.1.0: + dev: true + resolution: + integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + /conventional-commit-types/2.2.0: + dev: true + resolution: + integrity: sha1-XblXOdbCEqy+e29lahG5QLqmiUY= + /core-js/2.5.6: + resolution: + integrity: sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ== + /core-util-is/1.0.2: + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /cross-spawn/6.0.5: + dependencies: + nice-try: 1.0.4 + path-key: 2.0.1 + semver: 5.5.0 + shebang-command: 1.2.0 + which: 1.3.0 + dev: true + engines: + node: '>=4.8' + resolution: + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + /cryptiles/3.1.2: + dependencies: + boom: 5.2.0 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= + /crypto-random-string/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + /currently-unhandled/0.4.1: + dependencies: + array-find-index: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-mI3zP+qxke95mmE2nddsF635V+o= + /cz-conventional-changelog/1.2.0: + dependencies: + conventional-commit-types: 2.2.0 + lodash.map: 4.6.0 + longest: 1.0.1 + pad-right: 0.2.2 + right-pad: 1.0.1 + word-wrap: 1.2.3 + dev: true + resolution: + integrity: sha1-K8oElkyJGbI/P9aonvXmAIsxs/g= + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /data-uri-to-buffer/2.0.0: + dependencies: + '@types/node': 8.10.14 + dev: false + resolution: + integrity: sha512-YbKCNLPPP4inc0E5If4OaalBc7gpaM2MRv77Pv2VThVComLKfbGYtJcdDCViDyp1Wd4SebhHLz94vp91zbK6bw== + /decamelize-keys/1.1.0: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + /decamelize/1.2.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + /decompress-maybe/1.0.0: + dependencies: + bzip2-maybe: 1.0.0 + gunzip-maybe: 1.4.1 + pumpify: 1.5.0 + dev: true + resolution: + integrity: sha1-rf54xmzAaeZOgkvRQFuF515tHLs= + /dedent/0.6.0: + dev: true + resolution: + integrity: sha1-Dm2o8M5Sg471zsXI+TlrDBtko8s= + /deep-equal/1.0.1: + dev: true + resolution: + integrity: sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + /define-properties/1.1.2: + dependencies: + foreach: 2.0.5 + object-keys: 1.0.11 + engines: + node: '>= 0.4' + resolution: + integrity: sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ= + /defined/1.0.0: + dev: true + resolution: + integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + /delay/2.0.0: + dependencies: + p-defer: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-kRLq3APk7H4AKXM3iW8nO72R+uU= + /delayed-stream/1.0.0: + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + dev: true + resolution: + integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + /dependency-path/1.2.1: + dependencies: + '@types/semver': 5.5.0 + encode-registry: 1.1.0 + semver: 5.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-VcFlKHsD8EoTuVeRY/cKXHhbUDOVLboIaleqEh9qbzpRW9eAhMdbhT7yID274qtq6UvTdpxMxNocfG8Mtg+i0Q== + /detect-file/0.1.0: + dependencies: + fs-exists-sync: 0.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-STXe39lIhkjgBrASlWbpOGcR6mM= + /detect-indent/4.0.0: + dependencies: + repeating: 2.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + /detect-indent/5.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + /diff/2.2.3: + dev: true + engines: + node: '>=0.3.1' + resolution: + integrity: sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= + /diff/3.5.0: + dev: true + engines: + node: '>=0.3.1' + resolution: + integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + /dint/2.0.2: + dependencies: + graceful-fs: 4.1.11 + mz: 2.7.0 + p-every: 1.0.2 + p-limit: 1.2.0 + ssri: 5.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-O7ma/wc+Sf6ETmKtH678v94d1zx3EqHoiwIGKlF2zArUzXItQ1ZXrKZY7RGl4RuFr7eYyK8bEeZkOX4dEv8iZw== + /duplexer/0.1.1: + dev: true + resolution: + integrity: sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + /duplexify/3.6.0: + dependencies: + end-of-stream: 1.4.1 + inherits: 2.0.3 + readable-stream: 2.3.6 + stream-shift: 1.0.0 + dev: true + resolution: + integrity: sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== + /ecc-jsbn/0.1.1: + dependencies: + jsbn: 0.1.1 + dev: true + optional: true + resolution: + integrity: sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= + /encode-registry/1.1.0: + dependencies: + mem: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-we1k9/KE1067YXEyJzPg+kXlNFLk9/LT2IFP3VZgmANNwf8Bx+KdAVd1wxLpG8y7v6EgplVGTstmVNICwiaCNA== + /end-of-stream/1.4.1: + dependencies: + once: 1.4.0 + dev: true + resolution: + integrity: sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + /error-ex/1.3.1: + dependencies: + is-arrayish: 0.2.1 + dev: true + resolution: + integrity: sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= + /es-abstract/1.11.0: + dependencies: + es-to-primitive: 1.1.1 + function-bind: 1.1.1 + has: 1.0.1 + is-callable: 1.1.3 + is-regex: 1.0.4 + engines: + node: '>= 0.4' + resolution: + integrity: sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA== + /es-to-primitive/1.1.1: + dependencies: + is-callable: 1.1.3 + is-date-object: 1.0.1 + is-symbol: 1.0.1 + engines: + node: '>= 0.4' + resolution: + integrity: sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= + /escape-string-regexp/1.0.5: + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /esprima/4.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== + /esutils/2.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + /events-to-array/1.1.2: + dev: true + resolution: + integrity: sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= + /execa/0.10.0: + dependencies: + cross-spawn: 6.0.5 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.2 + strip-eof: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + /exit-hook/1.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + /expand-brackets/0.1.5: + dependencies: + is-posix-bracket: 0.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + /expand-range/1.8.2: + dependencies: + fill-range: 2.2.4 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + /expand-tilde/1.2.2: + dependencies: + os-homedir: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= + /extend/3.0.1: + dev: true + resolution: + integrity: sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= + /external-editor/1.1.1: + dependencies: + extend: 3.0.1 + spawn-sync: 1.0.15 + tmp: 0.0.29 + dev: true + resolution: + integrity: sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= + /extglob/0.3.2: + dependencies: + is-extglob: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + /extsprintf/1.3.0: + dev: true + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /extsprintf/1.4.0: + dev: true + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + /fast-deep-equal/1.1.0: + dev: true + resolution: + integrity: sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + /fast-json-stable-stringify/2.0.0: + dev: true + resolution: + integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + /fast-safe-stringify/1.1.13: + dev: true + resolution: + integrity: sha1-oB6c2cnkkXFcmKdaQtXwu9EH/3Y= + /figures/1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + /filename-regex/2.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + /fill-range/2.2.4: + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 3.0.0 + repeat-element: 1.1.2 + repeat-string: 1.6.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + /find-down/0.1.4: + dependencies: + locate-path: 2.0.0 + next-path: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-3lcasU5kFaqBp/IJ19lDRv5I0FG42J94s2oIP5r0KA5z5+ID0vocMylMUEuuGbXqJ5WLNZteQB9CAVIzUnk9bQ== + /find-node-modules/1.0.4: + dependencies: + findup-sync: 0.4.2 + merge: 1.2.0 + dev: true + resolution: + integrity: sha1-tt6zzMtpnIcDdne87eLF9YYrJVA= + /find-parent-dir/0.3.0: + dev: true + resolution: + integrity: sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= + /find-root/1.0.0: + dev: true + resolution: + integrity: sha1-li/yEaqyXGUg/u641ih/j26VgHo= + /find-up/2.1.0: + dependencies: + locate-path: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + /findup-sync/0.4.2: + dependencies: + detect-file: 0.1.0 + is-glob: 2.0.1 + micromatch: 2.3.11 + resolve-dir: 0.1.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-qBF9D3MST1pFRoOVef5S1xKfteU= + /findup/0.1.5: + dependencies: + colors: 0.6.2 + commander: 2.1.0 + dev: true + engines: + node: '>=0.6' + resolution: + integrity: sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs= + /for-each/0.3.2: + dependencies: + is-function: 1.0.1 + dev: true + resolution: + integrity: sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ= + /for-in/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + /for-own/0.1.5: + dependencies: + for-in: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + /foreach/2.0.5: + resolution: + integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k= + /forever-agent/0.6.1: + dev: true + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.6 + mime-types: 2.1.18 + dev: true + engines: + node: '>= 0.12' + resolution: + integrity: sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= + /fs-constants/1.0.0: + dev: true + resolution: + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + /fs-exists-sync/0.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= + /fs-extra/1.0.0: + dependencies: + graceful-fs: 4.1.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + dev: true + resolution: + integrity: sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + /fs-extra/5.0.0: + dependencies: + graceful-fs: 4.1.11 + jsonfile: 4.0.0 + universalify: 0.1.1 + dev: true + resolution: + integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + /fs-vacuum/1.2.10: + dependencies: + graceful-fs: 4.1.11 + path-is-inside: 1.0.2 + rimraf: 2.6.2 + dev: true + resolution: + integrity: sha1-t2Kb7AekAxolSP35n17PHMizHjY= + /fs.realpath/1.0.0: + dev: true + resolution: + integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + /fstream/1.0.11: + dependencies: + graceful-fs: 4.1.11 + inherits: 2.0.3 + mkdirp: 0.5.1 + rimraf: 2.6.2 + dev: true + engines: + node: '>=0.6' + resolution: + integrity: sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= + /function-bind/1.1.1: + resolution: + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + /gauge/2.7.4: + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.2 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.2 + dev: true + resolution: + integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + /get-npm-tarball-url/2.0.1: + dependencies: + normalize-registry-url: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-POrVRGyS9X5w+855/H46JGVYBGuVgJXyIkbsTCzW+sv5x2qH+rfQjc7652DzkgOskF+cqLevA2En7V0hu0gZCg== + /get-source/1.0.25: + dependencies: + data-uri-to-buffer: 2.0.0 + source-map: 0.6.1 + dev: false + resolution: + integrity: sha1-+j4GErwMG456GuT8DQV3Uvbz3+A= + /get-stream/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: true + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /ghooks/2.0.4: + dependencies: + findup: 0.1.5 + lodash.clone: 4.5.0 + manage-path: 2.0.0 + opt-cli: 1.5.1 + path-exists: 3.0.0 + spawn-command: 0.0.2 + dev: true + requiresBuild: true + resolution: + integrity: sha1-/VDgQP9UiQauQstReToBv+JFZ7k= + /glob-base/0.3.0: + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + /glob-parent/2.0.0: + dependencies: + is-glob: 2.0.1 + dev: true + resolution: + integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + /glob/7.1.1: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.3 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + resolution: + integrity: sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + /glob/7.1.2: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.3 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + resolution: + integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + /global-modules/0.2.3: + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= + /global-prefix/0.1.5: + dependencies: + homedir-polyfill: 1.0.1 + ini: 1.3.5 + is-windows: 0.2.0 + which: 1.3.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= + /graceful-fs/4.1.11: + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + /graceful-readlink/1.0.1: + dev: true + resolution: + integrity: sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + /graph-sequencer/2.0.0: + dependencies: + array-flatten: 2.1.1 + array-includes: 3.0.3 + dev: true + resolution: + integrity: sha1-v7gJuK9YT29Sh83OUHow1K6m7nA= + /gunzip-maybe/1.4.1: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.0 + through2: 2.0.3 + dev: true + resolution: + integrity: sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g== + /har-schema/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.0.3: + dependencies: + ajv: 5.5.2 + har-schema: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= + /has-ansi/0.1.0: + dependencies: + ansi-regex: 0.2.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= + /has-ansi/2.0.0: + dependencies: + ansi-regex: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + /has-flag/3.0.0: + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-unicode/2.0.1: + dev: true + resolution: + integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + /has/1.0.1: + dependencies: + function-bind: 1.1.1 + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-hGFzP1OLCDfJNh45qauelwTcLyg= + /hawk/6.0.2: + dependencies: + boom: 4.3.1 + cryptiles: 3.1.2 + hoek: 4.2.1 + sntp: 2.1.0 + dev: true + engines: + node: '>=4.5.0' + resolution: + integrity: sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== + /hoek/4.2.1: + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== + /homedir-polyfill/1.0.1: + dependencies: + parse-passwd: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-TCu8inWJmP7r9e1oWA921GdotLw= + /hosted-git-info/2.6.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.14.1 + dev: true + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /ieee754/1.1.11: + dev: true + resolution: + integrity: sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg== + /imurmurhash/0.1.4: + dev: true + engines: + node: '>=0.8.19' + resolution: + integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /indent-string/3.2.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + /individual/3.0.0: + dev: true + resolution: + integrity: sha1-58pPhfiVewGHNPKFdQ3CLsL5hi0= + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + resolution: + integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.3: + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /ini/1.3.5: + dev: true + resolution: + integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + /inquirer/1.2.3: + dependencies: + ansi-escapes: 1.4.0 + chalk: 1.1.3 + cli-cursor: 1.0.2 + cli-width: 2.2.0 + external-editor: 1.1.1 + figures: 1.7.0 + lodash: 4.17.10 + mute-stream: 0.0.6 + pinkie-promise: 2.0.1 + run-async: 2.3.0 + rx: 4.1.0 + string-width: 1.0.2 + strip-ansi: 3.0.1 + through: 2.3.8 + dev: true + resolution: + integrity: sha1-TexvMvN+97sLLtPx0aXD9UUHSRg= + /interpret/1.1.0: + dev: true + resolution: + integrity: sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= + /is-arrayish/0.2.1: + dev: true + resolution: + integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + /is-buffer/1.1.6: + dev: true + resolution: + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + /is-builtin-module/1.0.0: + dependencies: + builtin-modules: 1.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + /is-bzip2/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-XuWOqlounIDiFAe+3yOuWsCRs/w= + /is-callable/1.1.3: + engines: + node: '>= 0.4' + resolution: + integrity: sha1-hut1OSgF3cM69xySoO7fdO52BLI= + /is-ci/1.1.0: + dependencies: + ci-info: 1.1.3 + dev: true + resolution: + integrity: sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg== + /is-date-object/1.0.1: + engines: + node: '>= 0.4' + resolution: + integrity: sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + /is-deflate/1.0.0: + dev: true + resolution: + integrity: sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ= + /is-dotfile/1.0.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + /is-equal-shallow/0.1.3: + dependencies: + is-primitive: 2.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + /is-extendable/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + /is-extglob/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + /is-finite/1.0.2: + dependencies: + number-is-nan: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + /is-fullwidth-code-point/1.0.0: + dependencies: + number-is-nan: 1.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + /is-function/1.0.1: + dev: true + resolution: + integrity: sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + /is-glob/2.0.1: + dependencies: + is-extglob: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + /is-gzip/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM= + /is-inner-link/2.0.2: + dependencies: + graceful-fs: 4.1.11 + is-subdir: 1.0.2 + resolve-link-target: 1.0.1 + dev: true + resolution: + integrity: sha512-YS9RSUrRbskf/O6nMF5+dvoa8zoIwF2uXnJZN1X+gCEtA1cc3KqgbOmgPjIndHfrLJ8MCRaPoG2KBPTZqhy5ug== + /is-number/2.1.0: + dependencies: + kind-of: 3.2.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + /is-number/4.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + /is-plain-obj/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + /is-posix-bracket/0.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + /is-primitive/2.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + /is-promise/2.1.0: + dev: true + resolution: + integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + /is-regex/1.0.4: + dependencies: + has: 1.0.1 + engines: + node: '>= 0.4' + resolution: + integrity: sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + /is-stream/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + /is-subdir/1.0.2: + dependencies: + is-windows: 1.0.2 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-2H3vM92ez7TjW6T2e4G7AQVm/1/UA/qikNO0/aIi2SkouUU2wXW2CQ5Owiz8oaaFQpjNl74B5LIjTcM1htr2mQ== + /is-symbol/1.0.1: + engines: + node: '>= 0.4' + resolution: + integrity: sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= + /is-typedarray/1.0.0: + dev: true + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-windows/0.2.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-3hqm1j6indJIc3tp8f+LgALSEIw= + /is-windows/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + /isarray/1.0.0: + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isexe/2.0.0: + dev: true + resolution: + integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isobject/2.1.0: + dependencies: + isarray: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + /isstream/0.1.2: + dev: true + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /js-tokens/3.0.2: + dev: true + resolution: + integrity: sha1-mGbfOVECEw449/mWvOtlRDIJwls= + /js-yaml/3.11.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.0 + dev: true + resolution: + integrity: sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw== + /jsbn/0.1.1: + dev: true + optional: true + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /json-parse-better-errors/1.0.2: + dev: true + resolution: + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + /json-schema-traverse/0.3.1: + dev: true + resolution: + integrity: sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + /json-schema/0.2.3: + dev: true + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stringify-safe/5.0.1: + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /jsondiffpatch/0.1.43: + bundledDependencies: [] + dependencies: + chalk: 0.5.1 + dev: true + resolution: + integrity: sha1-wFKImpnvfroZ0AlfkPclz6cKVhE= + /jsonfile/2.4.0: + dev: true + optionalDependencies: + graceful-fs: 4.1.11 + resolution: + integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + /jsonfile/4.0.0: + dev: true + optionalDependencies: + graceful-fs: 4.1.11 + resolution: + integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: true + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /kind-of/3.2.2: + dependencies: + is-buffer: 1.1.6 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + /kind-of/6.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + /klaw/1.3.1: + dev: true + optionalDependencies: + graceful-fs: 4.1.11 + resolution: + integrity: sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + /load-json-file/4.0.0: + dependencies: + graceful-fs: 4.1.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + /load-yaml-file/0.1.0: + dependencies: + graceful-fs: 4.1.11 + js-yaml: 3.11.0 + pify: 2.3.0 + strip-bom: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-9oAGbmkbPutFAXZy5KOVavW4O4k= + /locate-path/2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + /lodash._baseclone/4.5.7: + dev: true + resolution: + integrity: sha1-zkKt4IOE711i+nfDD2GkbmhvhDQ= + /lodash.clone/4.3.2: + dependencies: + lodash._baseclone: 4.5.7 + dev: true + resolution: + integrity: sha1-5WsXa2gjp93jj38r9Y3n1ZcSAOk= + /lodash.clone/4.5.0: + dev: true + resolution: + integrity: sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + /lodash.map/4.6.0: + dev: true + resolution: + integrity: sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + /lodash/4.17.10: + dev: true + resolution: + integrity: sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== + /lodash/4.17.2: + dev: true + resolution: + integrity: sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I= + /longest/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + /loud-rejection/1.6.0: + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + /make-dir/1.3.0: + dependencies: + pify: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + /make-error/1.3.4: + dev: true + resolution: + integrity: sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g== + /manage-path/2.0.0: + dev: true + resolution: + integrity: sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc= + /map-obj/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + /map-obj/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + /math-random/1.0.1: + dev: true + resolution: + integrity: sha1-izqsWIuKZuSXXjzepn97sylgH6w= + /mem/3.0.0: + dependencies: + mimic-fn: 1.2.0 + p-is-promise: 1.1.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-hOWK1N+99dEFsmtlSKOYsrOqiiE= + /meow/4.0.1: + dependencies: + camelcase-keys: 4.2.0 + decamelize-keys: 1.1.0 + loud-rejection: 1.6.0 + minimist: 1.2.0 + minimist-options: 3.0.2 + normalize-package-data: 2.4.0 + read-pkg-up: 3.0.0 + redent: 2.0.0 + trim-newlines: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== + /merge/1.2.0: + dev: true + resolution: + integrity: sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= + /micromatch/2.3.11: + dependencies: + arr-diff: 2.0.0 + array-unique: 0.2.1 + braces: 1.8.5 + expand-brackets: 0.1.5 + extglob: 0.3.2 + filename-regex: 2.0.1 + is-extglob: 1.0.0 + is-glob: 2.0.1 + kind-of: 3.2.2 + normalize-path: 2.1.1 + object.omit: 2.0.1 + parse-glob: 3.0.4 + regex-cache: 0.4.4 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + /mime-db/1.33.0: + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + /mime-types/2.1.18: + dependencies: + mime-db: 1.33.0 + dev: true + engines: + node: '>= 0.6' + resolution: + integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + /mimic-fn/1.2.0: + engines: + node: '>=4' + resolution: + integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + dev: true + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /minimist-options/3.0.2: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + /minimist/0.0.8: + dev: true + resolution: + integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + /minimist/1.2.0: + resolution: + integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + /mkdirp-promise/5.0.1: + dependencies: + mkdirp: 0.5.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= + /mkdirp/0.5.1: + dependencies: + minimist: 0.0.8 + dev: true + resolution: + integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + /mos-tap-diff/1.0.0: + dependencies: + babel-runtime: 6.26.0 + chalk: 1.1.3 + core-js: 2.5.6 + diff: 2.2.3 + duplexer: 0.1.1 + figures: 1.7.0 + jsondiffpatch: 0.1.43 + pretty-ms: 2.1.0 + tap-parser: 1.3.2 + through2: 2.0.3 + dev: true + resolution: + integrity: sha1-NDOB0f2e1RljsLMVNbf9i64E/3A= + /most-last/1.0.1: + dev: false + peerDependencies: + most: ^1.0.3 + resolution: + integrity: sha512-ycc+leSrXoGRjxhsZJW/l+Sk0CXj9e/z6EP5ebZ8A+zDWGRq1v/oeNkyQF4TG95LnT5Q0ysG+5piJYSR86k58A== + /most/1.7.3: + dependencies: + '@most/multicast': 1.3.0 + '@most/prelude': 1.7.0 + symbol-observable: 1.2.0 + dev: false + resolution: + integrity: sha512-mk68SM/ptK8WSo3l03raXcWy02Hl7jbzxVozMuvyYxohn4yteh2THhl3+XABF5cunWE8eXHAsLbv+RCJI5y+jg== + /mute-stream/0.0.6: + dev: true + resolution: + integrity: sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= + /mz/2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + resolution: + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + /ncp/2.0.0: + dev: true + resolution: + integrity: sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + /ndjson/1.5.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.0 + split2: 2.2.0 + through2: 2.0.3 + resolution: + integrity: sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg= + /next-path/1.0.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha1-gixFgNer54PfGZZbeJYiyoAWA+Q= + /nice-try/1.0.4: + dev: true + resolution: + integrity: sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA== + /node-gyp/3.6.2: + dependencies: + fstream: 1.0.11 + glob: 7.1.2 + graceful-fs: 4.1.11 + minimatch: 3.0.4 + mkdirp: 0.5.1 + nopt: 3.0.6 + npmlog: 4.1.2 + osenv: 0.1.5 + request: 2.85.0 + rimraf: 2.6.2 + semver: 5.3.0 + tar: 2.2.1 + which: 1.3.0 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA= + /nopt/3.0.6: + dependencies: + abbrev: 1.1.1 + dev: true + resolution: + integrity: sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + /normalize-newline/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-HL6oBKukNgAfg5OKsh7AOdaa6dM= + /normalize-package-data/2.4.0: + dependencies: + hosted-git-info: 2.6.0 + is-builtin-module: 1.0.0 + semver: 5.5.0 + validate-npm-package-license: 3.0.3 + dev: true + resolution: + integrity: sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + /normalize-path/2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + /normalize-path/3.0.0: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /normalize-registry-url/1.0.0: + dev: true + resolution: + integrity: sha512-0v6T4851b72ykk5zEtFoN4QX/Fqyk7pouIj9xZyAvAe9jlDhAwT4z6FlwsoQCHjeuK2EGUoAwy/F4y4B1uZq9A== + /npm-lifecycle/2.0.1: + dependencies: + byline: 5.0.0 + graceful-fs: 4.1.11 + node-gyp: 3.6.2 + resolve-from: 4.0.0 + slide: 1.1.6 + uid-number: 0.0.6 + umask: 1.1.0 + which: 1.3.0 + dev: true + resolution: + integrity: sha512-6CypRO6iNsSfrWOUajeQnesouUgkeh7clByYDORUV6AhwRaGfHYh+5rFdDCIqzmMqomGlyDsSpazthNPG2BAOA== + /npm-run-path/2.0.2: + dependencies: + path-key: 2.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + /npmlog/4.1.2: + dependencies: + are-we-there-yet: 1.1.4 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: true + resolution: + integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + /number-is-nan/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + /oauth-sign/0.8.2: + dev: true + resolution: + integrity: sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= + /object-assign/4.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /object-inspect/1.5.0: + dev: true + resolution: + integrity: sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw== + /object-keys/1.0.11: + engines: + node: '>= 0.4' + resolution: + integrity: sha1-xUYBd4rVYPEULODgG8yotW0TQm0= + /object.getownpropertydescriptors/2.0.3: + dependencies: + define-properties: 1.1.2 + es-abstract: 1.11.0 + dev: true + engines: + node: '>= 0.8' + resolution: + integrity: sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + /object.omit/2.0.1: + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + dev: true + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + /onetime/1.1.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + tarball: 'http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz' + /onetime/2.0.1: + dependencies: + mimic-fn: 1.2.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + /opt-cli/1.5.1: + dependencies: + commander: 2.9.0 + lodash.clone: 4.3.2 + manage-path: 2.0.0 + spawn-command: 0.0.2-1 + dev: true + resolution: + integrity: sha1-BNtEexPJa5kusxaFJm9O0NlzbcI= + /os-homedir/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + /os-shim/0.1.3: + dev: true + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= + /os-tmpdir/1.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + /osenv/0.1.5: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: true + resolution: + integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + /p-defer/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + /p-every/1.0.2: + dependencies: + p-map: 1.2.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-TgHYXCPaGe1xpK+6MZvbTZTIXgA= + /p-filter/1.0.0: + dependencies: + p-map: 1.2.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds= + /p-finally/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + /p-is-promise/1.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + /p-limit/1.2.0: + dependencies: + p-try: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== + /p-locate/2.0.0: + dependencies: + p-limit: 1.2.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + /p-map/1.2.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + /p-queue/2.4.2: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== + /p-try/1.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + /package-preview/1.0.6: + dependencies: + '@pnpm/exec': 1.1.5 + '@types/fs-extra': 5.0.2 + '@types/load-json-file': 2.0.7 + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + '@types/write-json-file': 2.2.1 + cross-spawn: 6.0.5 + find-down: 0.1.4 + fs-extra: 5.0.0 + graceful-fs: 4.1.11 + load-json-file: 4.0.0 + meow: 4.0.1 + mz: 2.7.0 + rimraf-then: 1.0.1 + symlink-dir: 1.1.3 + unpack-stream: 3.0.3 + write-json-file: 2.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-GQ4w5vrDXoy8UVJM+0W7oWd5MYF21/IXkdzcupGNXdfqQuMzgQT+LXde109uHaH7xyqvCzPPBSxYM/HqQOi3+w== + /package-store/0.19.0: + dependencies: + '@pnpm/fetcher-base': 1.0.0 + '@pnpm/fs-locker': 1.0.2 + '@pnpm/package-requester': 0.9.0 + '@pnpm/resolver-base': 1.1.0 + '@pnpm/types': 1.7.0 + '@types/load-json-file': 2.0.7 + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + '@types/ramda': 0.25.28 + encode-registry: 1.1.0 + load-json-file: 4.0.0 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + ncp: 2.0.0 + p-filter: 1.0.0 + p-limit: 1.2.0 + path-exists: 3.0.0 + path-temp: 1.0.0 + ramda: 0.25.0 + rename-overwrite: 1.0.2 + rimraf-then: 1.0.1 + util.promisify: 1.0.0 + write-json-file: 2.3.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-d1cvhAX4C9fw5VHI18mH2oNWiuPH1lcTrvqUloCIZezvuFc31zEauLWIvjisg6HwvvxAdiQ4EDmEd9dnyhaL+g== + /pad-right/0.2.2: + dependencies: + repeat-string: 1.6.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q= + /pako/0.2.9: + dev: true + resolution: + integrity: sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + /parse-glob/3.0.4: + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.3 + is-extglob: 1.0.0 + is-glob: 2.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + /parse-json/4.0.0: + dependencies: + error-ex: 1.3.1 + json-parse-better-errors: 1.0.2 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + /parse-ms/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= + /parse-passwd/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + /path-absolute/1.0.0: + dependencies: + os-homedir: 1.0.2 + dev: true + resolution: + integrity: sha512-s0wa8oTU0s+jtq9C/xfNIRDp/8s6E2oeRvsATw1b6EZ1GNKxUCapwyBKdSzVm/2wkARh4KnyxTt3avOP4MwvnQ== + /path-exists/2.1.0: + dependencies: + pinkie-promise: 2.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + /path-exists/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + /path-is-absolute/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-is-inside/1.0.2: + dev: true + resolution: + integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + /path-key/2.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + /path-parse/1.0.5: + dev: true + resolution: + integrity: sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= + /path-temp/1.0.0: + dependencies: + unique-string: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-TeQgoH67RYUT3xt6WaRASbWyJmvrUnpeToQQT7RW+uighCh/gfs4VCO2/P8mIpjt6JsyJ6DxE6Q1FOJXVc3ANg== + /path-type/3.0.0: + dependencies: + pify: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + /peek-stream/1.1.3: + dependencies: + buffer-from: 1.0.0 + duplexify: 3.6.0 + through2: 2.0.3 + dev: true + resolution: + integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== + /performance-now/2.1.0: + dev: true + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /pify/2.3.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + /pify/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + /pinkie-promise/2.0.1: + dependencies: + pinkie: 2.0.4 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o= + /pinkie/2.0.4: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + /plur/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= + /pnpm-install-checks/1.1.0: + dependencies: + semver: 5.5.0 + dev: true + resolution: + integrity: sha1-dB2ZeXYv362T8+Rp3rSoFNNDAAg= + /pnpm-shrinkwrap/6.4.0: + dependencies: + '@pnpm/resolver-base': 1.1.0 + '@types/js-yaml': 3.11.1 + '@types/node': 10.0.8 + '@types/ramda': 0.25.28 + dependency-path: 1.2.1 + get-npm-tarball-url: 2.0.1 + js-yaml: 3.11.0 + load-yaml-file: 0.1.0 + mkdirp-promise: 5.0.1 + ramda: 0.25.0 + rimraf-then: 1.0.1 + util.promisify: 1.0.0 + write-file-atomic: 2.3.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-/b79ZgIjg52yLZ8CIf9ol+PoZ+GWNvjPIh9fLVyVpz2p5iU+RMFQPq764UNZnTxzbyo2vcELR6DtTS9yt8cnPQ== + /preserve/0.2.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + /pretty-bytes/4.0.2: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk= + /pretty-ms/2.1.0: + dependencies: + is-finite: 1.0.2 + parse-ms: 1.0.1 + plur: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw= + /printable-characters/1.0.39: + dev: false + resolution: + integrity: sha1-wRcMt22FjxmGqmB8r+9FhXQDoNs= + /process-nextick-args/2.0.0: + resolution: + integrity: sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + /proper-lockfile/2.0.1: + dependencies: + graceful-fs: 4.1.11 + retry: 0.10.1 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha1-FZ+wYZPTIAP0s2kd0uwaY0qoDR0= + /pump/1.0.3: + dependencies: + end-of-stream: 1.4.1 + once: 1.4.0 + dev: true + resolution: + integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + /pump/2.0.1: + dependencies: + end-of-stream: 1.4.1 + once: 1.4.0 + dev: true + resolution: + integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + /pumpify/1.5.0: + dependencies: + duplexify: 3.6.0 + inherits: 2.0.3 + pump: 2.0.1 + dev: true + resolution: + integrity: sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg== + /punycode/1.4.1: + dev: true + resolution: + integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= + /qs/6.5.2: + dev: true + engines: + node: '>=0.6' + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /quick-lru/1.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + /ramda/0.25.0: + resolution: + integrity: sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== + /randomatic/3.0.0: + dependencies: + is-number: 4.0.0 + kind-of: 6.0.2 + math-random: 1.0.1 + dev: true + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA== + /read-package-json/2.0.13: + dependencies: + glob: 7.1.2 + json-parse-better-errors: 1.0.2 + normalize-package-data: 2.4.0 + slash: 1.0.0 + dev: true + optionalDependencies: + graceful-fs: 4.1.11 + resolution: + integrity: sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg== + /read-pkg-up/3.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + /read-pkg/3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.4.0 + path-type: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + /readable-stream/2.3.6: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.3 + isarray: 1.0.0 + process-nextick-args: 2.0.0 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + resolution: + integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + /rechoir/0.6.2: + dependencies: + resolve: 1.7.1 + dev: true + engines: + node: '>= 0.10' + resolution: + integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + /redent/2.0.0: + dependencies: + indent-string: 3.2.0 + strip-indent: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + /regenerator-runtime/0.11.1: + resolution: + integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + /regex-cache/0.4.4: + dependencies: + is-equal-shallow: 0.1.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + /remove-all-except-outer-links/1.0.3: + dependencies: + is-subdir: 1.0.2 + mz: 2.7.0 + p-filter: 1.0.0 + resolve-link-target: 1.0.1 + rimraf-then: 1.0.1 + dev: true + resolution: + integrity: sha512-h9Pl2xE1ZxYOhlKh0nYeMfzfv0GYUfglE5Eb0ILFFUiDnvVcbKwxGGukETEeIteR0JTVfesOaKqiwrOoUz1ajw== + /remove-trailing-separator/1.1.0: + dev: true + resolution: + integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + /rename-overwrite/1.0.2: + dependencies: + delay: 2.0.0 + graceful-fs: 4.1.11 + rimraf: 2.6.2 + util.promisify: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-H7bHUSiUG9xIAtGAoP7MrpQYGxpkcnIWuDBlMWXdYra+NvkL8kQnjnLlseuSdRFRgwxs61So+qsX8AHQaWCTmg== + /repeat-element/1.1.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + /repeat-string/1.6.1: + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc= + /repeating/2.0.1: + dependencies: + is-finite: 1.0.2 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + /replace-string/1.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-hwYhF/gj/lgAwwa6yyz6NZuTX+o= + /request/2.85.0: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.7.0 + caseless: 0.12.0 + combined-stream: 1.0.6 + extend: 3.0.1 + forever-agent: 0.6.1 + form-data: 2.3.2 + har-validator: 5.0.3 + hawk: 6.0.2 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.18 + oauth-sign: 0.8.2 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.1.2 + stringstream: 0.0.5 + tough-cookie: 2.3.4 + tunnel-agent: 0.6.0 + uuid: 3.2.1 + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== + /resolve-dir/0.1.1: + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-shklmlYC+sXFxJatiUpujMQwJh4= + /resolve-from/4.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + /resolve-link-target/1.0.1: + dependencies: + graceful-fs: 4.1.11 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-uid343+whX+g+LLUzwCYaZBOZPX8Hi3Y7qZBr0r1Rvb0y6WMWVLT32uuGllxD5uNQR+mddUE/Dx/wwvgGrZLSA== + /resolve/1.5.0: + dependencies: + path-parse: 1.0.5 + dev: true + resolution: + integrity: sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== + /resolve/1.7.1: + dependencies: + path-parse: 1.0.5 + dev: true + resolution: + integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + /restore-cursor/1.0.1: + dependencies: + exit-hook: 1.1.1 + onetime: 1.1.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + /restore-cursor/2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.2 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + /resumer/0.0.0: + dependencies: + through: 2.3.8 + dev: true + resolution: + integrity: sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + /retry/0.10.1: + dev: true + resolution: + integrity: sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + /right-pad/1.0.1: + engines: + node: '>= 0.10' + resolution: + integrity: sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA= + /rimraf-then/1.0.1: + dependencies: + any-promise: 1.3.0 + rimraf: 2.6.2 + dev: true + resolution: + integrity: sha1-vURYp561YbdUiq7ArDdT70Kf5ws= + /rimraf/2.6.2: + dependencies: + glob: 7.1.2 + dev: true + resolution: + integrity: sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + /run-async/2.3.0: + dependencies: + is-promise: 2.1.0 + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + /rx/4.1.0: + dev: true + resolution: + integrity: sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + /safe-buffer/5.1.2: + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /semver-regex/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk= + /semver/5.3.0: + dev: true + resolution: + integrity: sha1-myzl094C0XxgEq0yaqa00M9U+U8= + /semver/5.5.0: + resolution: + integrity: sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + /set-blocking/2.0.0: + dev: true + resolution: + integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + /shebang-command/1.2.0: + dependencies: + shebang-regex: 1.0.0 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + /shebang-regex/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + /shelljs/0.7.6: + dependencies: + glob: 7.1.2 + interpret: 1.1.0 + rechoir: 0.6.2 + dev: true + engines: + node: '>=0.11.0' + resolution: + integrity: sha1-N5zM+1a5HIYB5HkzVutTgpJN6a0= + /signal-exit/3.0.2: + resolution: + integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + /slash/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + /slide/1.1.6: + dev: true + resolution: + integrity: sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + /sntp/2.1.0: + dependencies: + hoek: 4.2.1 + dev: true + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== + /sort-keys/2.0.0: + dependencies: + is-plain-obj: 1.1.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + /source-map-support/0.5.6: + dependencies: + buffer-from: 1.0.0 + source-map: 0.6.1 + dev: true + resolution: + integrity: sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== + /source-map/0.6.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /spawn-command/0.0.2: + dev: true + resolution: + integrity: sha1-lUThpDygRfhTGqwaSMspva5iM44= + /spawn-command/0.0.2-1: + dev: true + resolution: + integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + /spawn-sync/1.0.15: + dependencies: + concat-stream: 1.6.2 + os-shim: 0.1.3 + dev: true + requiresBuild: true + resolution: + integrity: sha1-sAeZVX63+wyDdsKdROih6mfldHY= + /spdx-correct/3.0.0: + dependencies: + spdx-expression-parse: 3.0.0 + spdx-license-ids: 3.0.0 + dev: true + resolution: + integrity: sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g== + /spdx-exceptions/2.1.0: + dev: true + resolution: + integrity: sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== + /spdx-expression-parse/3.0.0: + dependencies: + spdx-exceptions: 2.1.0 + spdx-license-ids: 3.0.0 + dev: true + resolution: + integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + /spdx-license-ids/3.0.0: + dev: true + resolution: + integrity: sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA== + /split2/2.2.0: + dependencies: + through2: 2.0.3 + resolution: + integrity: sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + /sprintf-js/1.0.3: + dev: true + resolution: + integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + /sshpk/1.14.1: + dependencies: + asn1: 0.2.3 + assert-plus: 1.0.0 + dashdash: 1.14.1 + getpass: 0.1.7 + dev: true + engines: + node: '>=0.10.0' + optionalDependencies: + bcrypt-pbkdf: 1.0.1 + ecc-jsbn: 0.1.1 + jsbn: 0.1.1 + tweetnacl: 0.14.5 + resolution: + integrity: sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s= + /ssri/5.3.0: + dependencies: + safe-buffer: 5.1.2 + dev: true + resolution: + integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + /stacktracey/1.2.102: + dependencies: + as-table: 1.0.32 + get-source: 1.0.25 + dev: false + resolution: + integrity: sha1-NYD/Zxi18oZsNEmHEhehF47BB6Q= + /stream-shift/1.0.0: + dev: true + resolution: + integrity: sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + /string-length/2.0.0: + dependencies: + astral-regex: 1.0.0 + strip-ansi: 4.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + /string-width/1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + /string.prototype.padstart/3.0.0: + dependencies: + define-properties: 1.1.2 + es-abstract: 1.11.0 + function-bind: 1.1.1 + dev: false + engines: + node: '>= 0.4' + resolution: + integrity: sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI= + /string.prototype.trim/1.1.2: + dependencies: + define-properties: 1.1.2 + es-abstract: 1.11.0 + function-bind: 1.1.1 + dev: true + engines: + node: '>= 0.4' + resolution: + integrity: sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /stringstream/0.0.5: + dev: true + resolution: + integrity: sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= + /strip-ansi/0.3.0: + dependencies: + ansi-regex: 0.2.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + /strip-ansi/4.0.0: + dependencies: + ansi-regex: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= + /strip-bom/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + /strip-eof/1.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + /strip-indent/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + /strip-json-comments/2.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= + /supi/0.18.2: + dependencies: + '@pnpm/check-package': 1.0.0 + '@pnpm/fs-locker': 1.0.2 + '@pnpm/headless': 0.3.0 + '@pnpm/lifecycle': 2.2.1 + '@pnpm/link-bins': 1.0.3 + '@pnpm/modules-yaml': 1.0.0 + '@pnpm/package-bins': 1.0.0 + '@pnpm/package-requester': 0.9.0 + '@pnpm/pkgid-to-filename': 1.0.1 + '@pnpm/resolver-base': 1.1.0 + '@pnpm/types': 1.7.0 + '@types/byline': 4.2.31 + '@types/common-tags': 1.4.0 + '@types/load-json-file': 2.0.7 + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + '@types/nopt': 3.0.29 + '@types/npm': 2.0.29 + '@types/p-series': 1.0.1 + '@types/ramda': 0.25.28 + '@types/rc': 0.0.1 + '@types/semver': 5.5.0 + '@zkochan/npm-package-arg': 1.0.0 + common-tags: 1.7.2 + dependency-path: 1.2.1 + encode-registry: 1.1.0 + execa: 0.10.0 + fs-vacuum: 1.2.10 + get-npm-tarball-url: 2.0.1 + graceful-fs: 4.1.11 + graph-sequencer: 2.0.0 + is-ci: 1.1.0 + is-inner-link: 2.0.2 + is-subdir: 1.0.2 + load-json-file: 4.0.0 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + normalize-path: 3.0.0 + normalize-registry-url: 1.0.0 + os-homedir: 1.0.2 + p-filter: 1.0.0 + p-limit: 1.2.0 + package-store: 0.19.0 + path-absolute: 1.0.0 + path-exists: 3.0.0 + pnpm-install-checks: 1.1.0 + pnpm-shrinkwrap: 6.4.0 + ramda: 0.25.0 + read-package-json: 2.0.13 + remove-all-except-outer-links: 1.0.3 + replace-string: 1.1.0 + resolve-link-target: 1.0.1 + rimraf-then: 1.0.1 + semver: 5.5.0 + symlink-dir: 1.1.3 + util.promisify: 1.0.0 + validate-npm-package-name: 3.0.0 + version-selector-type: 2.0.0 + write-pkg: 3.1.0 + dev: true + engines: + node: '>=4' + peerDependencies: + '@pnpm/logger': ^1.0.0 + resolution: + integrity: sha512-KRG7wp+sftboRaGpRhN0HBrGIwVQPzWEIwNTferwmdoeRwM+mNcd6+uZi6SmB1zL1IB6o/jwRn+3O/bWo00MMA== + /supports-color/0.2.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= + /supports-color/2.0.0: + dev: true + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + /supports-color/5.4.0: + dependencies: + has-flag: 3.0.0 + engines: + node: '>=4' + resolution: + integrity: sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + /symbol-observable/1.2.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + /symlink-dir/1.1.3: + dependencies: + '@types/mz': 0.0.32 + '@types/node': 10.0.8 + graceful-fs: 4.1.11 + is-windows: 1.0.2 + mkdirp-promise: 5.0.1 + mz: 2.7.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-klQgTYk7en8A69nAzZjJdaMXbGCmfh0DU+YLaZG/stHNp00VZSS3Pos238Ua7oCKVw57UszViod4D7RVRH6XHg== + /tap-parser/1.3.2: + dependencies: + events-to-array: 1.1.2 + inherits: 2.0.3 + js-yaml: 3.11.0 + dev: true + optionalDependencies: + readable-stream: 2.3.6 + resolution: + integrity: sha1-EgxQiciMPIp5PvKIhn3jIeGPjCI= + /tape/4.9.0: + dependencies: + deep-equal: 1.0.1 + defined: 1.0.0 + for-each: 0.3.2 + function-bind: 1.1.1 + glob: 7.1.2 + has: 1.0.1 + inherits: 2.0.3 + minimist: 1.2.0 + object-inspect: 1.5.0 + resolve: 1.5.0 + resumer: 0.0.0 + string.prototype.trim: 1.1.2 + through: 2.3.8 + dev: true + resolution: + integrity: sha512-j0jO9BiScfqtPBb9QmPLL0qvxXMz98xjkMb7x8lKipFlJZwNJkqkWPou+NU4V6T9RnVh1kuSthLE8gLrN8bBfw== + /tar-fs/1.16.2: + dependencies: + chownr: 1.0.1 + mkdirp: 0.5.1 + pump: 1.0.3 + tar-stream: 1.6.0 + dev: true + resolution: + integrity: sha512-LdknWjPEiZC1nOBwhv0JBzfJBGPJar08dZg2rwZe0ZTLQoRGEzgrl7vF3qUEkCHpI/wN9e7RyCuDhMsJUCLPPQ== + /tar-stream/1.6.0: + dependencies: + bl: 1.2.2 + buffer-alloc: 1.1.0 + end-of-stream: 1.4.1 + fs-constants: 1.0.0 + readable-stream: 2.3.6 + to-buffer: 1.1.1 + xtend: 4.0.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw== + /tar/2.2.1: + dependencies: + block-stream: 0.0.9 + fstream: 1.0.11 + inherits: 2.0.3 + dev: true + resolution: + integrity: sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= + /thenify-all/1.6.0: + dependencies: + thenify: 3.3.0 + dev: true + engines: + node: '>=0.8' + resolution: + integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + /thenify/3.3.0: + dependencies: + any-promise: 1.3.0 + dev: true + resolution: + integrity: sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + /through/2.3.8: + dev: true + resolution: + integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + /through2/2.0.3: + dependencies: + readable-stream: 2.3.6 + xtend: 4.0.1 + resolution: + integrity: sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + /tmp/0.0.29: + dependencies: + os-tmpdir: 1.0.2 + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= + /to-buffer/1.1.1: + dev: true + resolution: + integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + /tough-cookie/2.3.4: + dependencies: + punycode: 1.4.1 + dev: true + engines: + node: '>=0.8' + resolution: + integrity: sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== + /trim-newlines/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + /ts-node/6.0.3: + dependencies: + arrify: 1.0.1 + chalk: 2.4.1 + diff: 3.5.0 + make-error: 1.3.4 + minimist: 1.2.0 + mkdirp: 0.5.1 + source-map-support: 0.5.6 + yn: 2.0.0 + dev: true + engines: + node: '>=4.2.0' + resolution: + integrity: sha512-ARaOMNFEPKg2ZuC1qJddFvHxHNFVckR0g9xLxMIoMqSSIkDc8iS4/LoV53EdDWWNq2FGwqcEf0bVVGJIWpsznw== + /tslib/1.9.0: + dev: true + resolution: + integrity: sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== + /tslint/5.10.0: + dependencies: + babel-code-frame: 6.26.0 + builtin-modules: 1.1.1 + chalk: 2.4.1 + commander: 2.15.1 + diff: 3.5.0 + glob: 7.1.2 + js-yaml: 3.11.0 + minimatch: 3.0.4 + resolve: 1.7.1 + semver: 5.5.0 + tslib: 1.9.0 + tsutils: 2.27.0 + dev: true + engines: + node: '>=4.8.0' + peerDependencies: + typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev' + resolution: + integrity: sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM= + /tsutils/2.27.0: + dependencies: + tslib: 1.9.0 + dev: true + peerDependencies: + typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 2.10.0-dev' + resolution: + integrity: sha512-JcyX25oM9pFcb3zh60OqG1St8p/uSqC5Bgipdo3ieacB/Ao4dPhm7hAtKT9NrEu23CyYrrgJPV3CqYfo+/+T4w== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.1.2 + dev: true + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: true + optional: true + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /typedarray/0.0.6: + dev: true + resolution: + integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + /typescript/2.8.3: + dev: true + engines: + node: '>=4.2.0' + resolution: + integrity: sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw== + /uid-number/0.0.6: + dev: true + resolution: + integrity: sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + /umask/1.1.0: + dev: true + resolution: + integrity: sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + /unbzip2-stream/1.2.5: + dependencies: + buffer: 3.6.0 + through: 2.3.8 + dev: true + resolution: + integrity: sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og== + /unique-string/1.0.0: + dependencies: + crypto-random-string: 1.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + /universalify/0.1.1: + dev: true + resolution: + integrity: sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= + /unpack-stream/3.0.3: + dependencies: + '@types/node': 10.0.8 + decompress-maybe: 1.0.0 + ssri: 5.3.0 + tar-fs: 1.16.2 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-h3Ii7ThTL7P5LlX1RuMPsuW4V5EZnLyjPwStIMQ4V0F6rblgmXIS+IkpAOu9THHDZYUO/D8TTJddVc6HIY4S5g== + /util-deprecate/1.0.2: + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /util.promisify/1.0.0: + dependencies: + define-properties: 1.1.2 + object.getownpropertydescriptors: 2.0.3 + dev: true + resolution: + integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + /uuid/3.2.1: + dev: true + resolution: + integrity: sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== + /validate-commit-msg/2.14.0: + dependencies: + conventional-commit-types: 2.2.0 + find-parent-dir: 0.3.0 + findup: 0.1.5 + semver-regex: 1.0.0 + deprecated: Check out CommitLint which provides the same functionality with a more user-focused experience. + dev: true + resolution: + integrity: sha1-5Tg2kQEsuycNzAvCpO/+vhSJDqw= + /validate-npm-package-license/3.0.3: + dependencies: + spdx-correct: 3.0.0 + spdx-expression-parse: 3.0.0 + dev: true + resolution: + integrity: sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g== + /validate-npm-package-name/3.0.0: + dependencies: + builtins: 1.0.3 + dev: true + resolution: + integrity: sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.0 + dev: true + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /version-selector-type/2.0.0: + dependencies: + semver: 5.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-FYMSYiI76Pd8twRTtV/DBmDkZcrMqET3ar5G+alR7/VQgo2iwnu1xlgzpvaWUCwdx5R+mq8HxgFeSnJpssV17A== + /which/1.3.0: + dependencies: + isexe: 2.0.0 + dev: true + resolution: + integrity: sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== + /wide-align/1.1.2: + dependencies: + string-width: 1.0.2 + dev: true + resolution: + integrity: sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== + /word-wrap/1.2.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + /wrappy/1.0.2: + dev: true + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /write-file-atomic/2.3.0: + dependencies: + graceful-fs: 4.1.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.2 + dev: true + resolution: + integrity: sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + /write-json-file/2.3.0: + dependencies: + detect-indent: 5.0.0 + graceful-fs: 4.1.11 + make-dir: 1.3.0 + pify: 3.0.0 + sort-keys: 2.0.0 + write-file-atomic: 2.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + /write-pkg/3.1.0: + dependencies: + sort-keys: 2.0.0 + write-json-file: 2.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk= + /write-yaml-file/1.0.1: + dependencies: + graceful-fs: 4.1.11 + js-yaml: 3.11.0 + mkdirp: 0.5.1 + pify: 3.0.0 + write-file-atomic: 2.3.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-oesea6vricAQNNSrA1wn1Pt34qE= + /xtend/4.0.1: + engines: + node: '>=0.4' + resolution: + integrity: sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + /yn/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= + /zen-observable/0.7.1: + dev: false + resolution: + integrity: sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg== + /zen-push/0.2.1: + dependencies: + zen-observable: 0.7.1 + dev: false + resolution: + integrity: sha512-Qv4qvc8ZIue51B/0zmeIMxpIGDVhz4GhJALBvnKs/FRa2T7jy4Ori9wFwaHVt0zWV7MIFglKAHbgnVxVTw7U1w== +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 6 +shrinkwrapVersion: 3 +specifiers: + '@pnpm/logger': ^1.0.0 + '@types/common-tags': ^1.2.5 + '@types/delay': ^2.0.1 + '@types/node': ^9.3.0 || 10 + '@types/ramda': ^0.25.6 + '@types/semver': ^5.4.0 + '@types/strip-ansi': ^3.0.0 + '@types/tape': ^4.2.30 + ansi-diff: ^1.0.10 + chalk: ^2.2.0 + cli-cursor: ^2.1.0 + commitizen: ^2.9.5 + common-tags: ^1.4.0 + delay: ^2.0.0 + ghooks: ^2.0.0 + mos-tap-diff: ^1.0.0 + most: ^1.7.2 + most-last: ^1.0.0 + ndjson: ^1.5.0 + normalize-newline: ^3.0.0 + normalize-path: ^3.0.0 + package-preview: ^1.0.0 + pretty-bytes: ^4.0.2 + ramda: ^0.25.0 + right-pad: ^1.0.1 + rimraf: ^2.5.4 + semver: ^5.4.1 + stacktracey: ^1.2.87 + string-length: ^2.0.0 + string.prototype.padstart: ^3.0.0 + strip-ansi: ^4.0.0 + supi: ^0.18.0 + tape: ^4.8.0 + ts-node: ^6.0.0 + tslint: ^5.7.0 + typescript: ^2.6.2 + validate-commit-msg: ^2.8.2 + zen-push: ^0.2.1 diff --git a/packages/default-reporter/src/bin/pnpm-default-reporter.ts b/packages/default-reporter/src/bin/pnpm-default-reporter.ts new file mode 100644 index 0000000000..eca3404015 --- /dev/null +++ b/packages/default-reporter/src/bin/pnpm-default-reporter.ts @@ -0,0 +1,9 @@ +#!/usr/bin/env node +import ndjson = require('ndjson') +import reporter from '..' + +process.stdin.resume() +process.stdin.setEncoding('utf8') +const streamParser = process.stdin + .pipe(ndjson.parse()) +reporter(streamParser, {cmd: 'install'}) // TODO: make it smarter diff --git a/packages/default-reporter/src/constants.ts b/packages/default-reporter/src/constants.ts new file mode 100644 index 0000000000..5f5c0a6cbd --- /dev/null +++ b/packages/default-reporter/src/constants.ts @@ -0,0 +1,3 @@ +// In terminals, always Unix line endings are used +// even on Windows +export const EOL = '\n' diff --git a/packages/default-reporter/src/index.ts b/packages/default-reporter/src/index.ts new file mode 100644 index 0000000000..3fab0e4094 --- /dev/null +++ b/packages/default-reporter/src/index.ts @@ -0,0 +1,158 @@ +import createDiffer = require('ansi-diff') +import cliCursor = require('cli-cursor') +import most = require('most') +import R = require('ramda') +import * as supi from 'supi' +import PushStream = require('zen-push') +import {EOL} from './constants' +import mergeOutputs from './mergeOutputs' +import reporterForClient from './reporterForClient' +import reporterForServer from './reporterForServer' + +export default function ( + streamParser: object, + opts: { + cmd: string, + cwd?: string, + appendOnly?: boolean, + throttleProgress?: number, + width?: number, + }, +) { + if (opts.cmd === 'server') { + const log$ = most.fromEvent('data', streamParser) + reporterForServer(log$) + return + } + const width = opts.width || process.stdout.columns && process.stdout.columns - 2 || 80 + const output$ = toOutput$(streamParser, {...opts, width}) + if (opts.appendOnly) { + output$ + .subscribe({ + complete () {}, // tslint:disable-line:no-empty + error: (err) => console.error(err.message), + next: (line) => console.log(line), + }) + return + } + cliCursor.hide() + const diff = createDiffer({ + height: process.stdout.rows, + width, + }) + output$ + .subscribe({ + complete () {}, // tslint:disable-line:no-empty + error: (err) => logUpdate(err.message), + next: logUpdate, + }) + function logUpdate (view: string) { + process.stdout.write(diff.update(`${view}${EOL}`)) + } +} + +export function toOutput$ ( + streamParser: object, + opts: { + cmd: string, + cwd?: string, + appendOnly?: boolean, + throttleProgress?: number, + width?: number, + }, +): most.Stream { + opts = opts || {} + const isRecursive = opts.cmd === 'recursive' + const progressPushStream = new PushStream() + const stagePushStream = new PushStream() + const deprecationPushStream = new PushStream() + const summaryPushStream = new PushStream() + const lifecyclePushStream = new PushStream() + const statsPushStream = new PushStream() + const installCheckPushStream = new PushStream() + const registryPushStream = new PushStream() + const rootPushStream = new PushStream() + const packageJsonPushStream = new PushStream() + const linkPushStream = new PushStream() + const cliPushStream = new PushStream() + const otherPushStream = new PushStream() + const hookPushStream = new PushStream() + const skippedOptionalDependencyPushStream = new PushStream() + setTimeout(() => { // setTimeout is a workaround for a strange bug in most https://github.com/cujojs/most/issues/491 + streamParser['on']('data', (log: supi.Log) => { + switch (log.name) { + case 'pnpm:progress': + progressPushStream.next(log as supi.ProgressLog) + break + case 'pnpm:stage': + stagePushStream.next(log as supi.StageLog) + break + case 'pnpm:deprecation': + deprecationPushStream.next(log as supi.DeprecationLog) + break + case 'pnpm:summary': + summaryPushStream.next(log) + break + case 'pnpm:lifecycle': + lifecyclePushStream.next(log as supi.LifecycleLog) + break + case 'pnpm:stats': + statsPushStream.next(log as supi.StatsLog) + break + case 'pnpm:install-check': + installCheckPushStream.next(log as supi.InstallCheckLog) + break + case 'pnpm:registry': + registryPushStream.next(log as supi.RegistryLog) + break + case 'pnpm:root': + rootPushStream.next(log as supi.RootLog) + break + case 'pnpm:package-json': + packageJsonPushStream.next(log as supi.PackageJsonLog) + break + case 'pnpm:link' as any: // tslint:disable-line + linkPushStream.next(log) + break + case 'pnpm:cli' as any: // tslint:disable-line + cliPushStream.next(log) + break + case 'pnpm:hook' as any: // tslint:disable-line + hookPushStream.next(log) + break + case 'pnpm:skipped-optional-dependency': + skippedOptionalDependencyPushStream.next(log as supi.SkippedOptionalDependencyLog) + break + case 'pnpm' as any: // tslint:disable-line + otherPushStream.next(log) + break + } + }) + }, 0) + const log$ = { + cli: most.from(cliPushStream.observable), + deprecation: most.from(deprecationPushStream.observable), + hook: most.from(hookPushStream.observable), + installCheck: most.from(installCheckPushStream.observable), + lifecycle: most.from(lifecyclePushStream.observable), + link: most.from(linkPushStream.observable), + other: most.from(otherPushStream.observable), + packageJson: most.from(packageJsonPushStream.observable), + progress: most.from(progressPushStream.observable), + registry: most.from(registryPushStream.observable), + root: most.from(rootPushStream.observable), + skippedOptionalDependency: most.from(skippedOptionalDependencyPushStream.observable), + stage: most.from(stagePushStream.observable), + stats: most.from(statsPushStream.observable), + summary: most.from(summaryPushStream.observable), + } + const outputs: Array>> = reporterForClient(log$, isRecursive, opts.cmd, opts.width, opts.appendOnly, opts.throttleProgress, opts.cwd) + + if (opts.appendOnly) { + return most.join( + most.mergeArray(outputs) + .map((log: most.Stream<{msg: string}>) => log.map((msg) => msg.msg)), + ) + } + return mergeOutputs(outputs).multicast() +} diff --git a/packages/default-reporter/src/mergeOutputs.ts b/packages/default-reporter/src/mergeOutputs.ts new file mode 100644 index 0000000000..b6e9c49f9b --- /dev/null +++ b/packages/default-reporter/src/mergeOutputs.ts @@ -0,0 +1,67 @@ +import most = require('most') +import {EOL} from './constants' + +export default function mergeOutputs (outputs: Array>>): most.Stream { + let blockNo = 0 + let fixedBlockNo = 0 + let started = false + return most.join( + most.mergeArray(outputs) + .map((log: most.Stream<{msg: string}>) => { + let currentBlockNo = -1 + let currentFixedBlockNo = -1 + return log + .map((msg) => { + if (msg['fixed']) { + if (currentFixedBlockNo === -1) { + currentFixedBlockNo = fixedBlockNo++ + } + return { + blockNo: currentFixedBlockNo, + fixed: true, + msg: msg.msg, + } + } + if (currentBlockNo === -1) { + currentBlockNo = blockNo++ + } + return { + blockNo: currentBlockNo, + fixed: false, + msg: typeof msg === 'string' ? msg : msg.msg, + prevFixedBlockNo: currentFixedBlockNo, + } + }) + }), + ) + .scan((acc, log) => { + if (log.fixed === true) { + acc.fixedBlocks[log.blockNo] = log.msg + } else { + delete acc.fixedBlocks[log['prevFixedBlockNo'] as number] + acc.blocks[log.blockNo] = log.msg + } + return acc + }, {fixedBlocks: [], blocks: []} as {fixedBlocks: string[], blocks: string[]}) + .map((sections) => { + const fixedBlocks = sections.fixedBlocks.filter(Boolean) + const nonFixedPart = sections.blocks.filter(Boolean).join(EOL) + if (!fixedBlocks.length) { + return nonFixedPart + } + const fixedPart = fixedBlocks.join(EOL) + if (!nonFixedPart) { + return fixedPart + } + return `${nonFixedPart}${EOL}${fixedPart}` + }) + .filter((msg) => { + if (started) { + return true + } + if (msg === '') return false + started = true + return true + }) + .skipRepeats() +} diff --git a/packages/default-reporter/src/pkgsDiff.ts b/packages/default-reporter/src/pkgsDiff.ts new file mode 100644 index 0000000000..9414f2fa1b --- /dev/null +++ b/packages/default-reporter/src/pkgsDiff.ts @@ -0,0 +1,148 @@ +import most = require('most') +import R = require('ramda') +import { + DeprecationLog, + Log, +} from 'supi' +import * as supi from 'supi' + +export interface PackageDiff { + added: boolean, + from?: string, + name: string, + realName?: string, + version?: string, + deprecated?: boolean, + latest?: string, + linked?: true, +} + +export interface Map { + [index: string]: T, +} + +export const propertyByDependencyType = { + dev: 'devDependencies', + optional: 'optionalDependencies', + prod: 'dependencies', +} + +export default function ( + log$: { + progress: most.Stream, + stage: most.Stream, + deprecation: most.Stream, + summary: most.Stream, + lifecycle: most.Stream, + stats: most.Stream, + installCheck: most.Stream, + registry: most.Stream, + root: most.Stream, + packageJson: most.Stream, + link: most.Stream, + other: most.Stream, + }, +) { + const deprecationSet$ = log$.deprecation + .scan((acc, log) => { + acc.add(log.pkgId) + return acc + }, new Set()) + + const pkgsDiff$ = most.combine( + (rootLog, deprecationSet) => [rootLog, deprecationSet], + log$.root, + deprecationSet$, + ) + .scan((pkgsDiff, args) => { + const rootLog = args[0] + const deprecationSet = args[1] as Set + if (rootLog['added']) { + pkgsDiff[rootLog['added'].dependencyType][`+${rootLog['added'].name}`] = { + added: true, + deprecated: deprecationSet.has(rootLog['added'].id), + latest: rootLog['added'].latest, + name: rootLog['added'].name, + realName: rootLog['added'].realName, + version: rootLog['added'].version, + } + return pkgsDiff + } + if (rootLog['removed']) { + pkgsDiff[rootLog['removed'].dependencyType][`-${rootLog['removed'].name}`] = { + added: false, + name: rootLog['removed'].name, + version: rootLog['removed'].version, + } + return pkgsDiff + } + if (rootLog['linked']) { + pkgsDiff[rootLog['linked'].dependencyType][`>${rootLog['linked'].name}`] = { + added: false, + from: rootLog['linked'].from, + linked: true, + name: rootLog['linked'].name, + } + return pkgsDiff + } + return pkgsDiff + }, { + dev: {}, + optional: {}, + prod: {}, + } as { + dev: Map, + prod: Map, + optional: Map, + }) + + const packageJson$ = most.fromPromise( + most.merge( + log$.packageJson, + log$.summary.constant({}), + ) + .take(2) + .reduce(R.merge, {}), + ) + + return most.combine( + (pkgsDiff, packageJsons) => { + const initialPackageJson = packageJsons['initial'] + const updatedPackageJson = packageJsons['updated'] + + if (!initialPackageJson || !updatedPackageJson) return pkgsDiff + + for (const depType of ['prod', 'optional', 'dev']) { + const prop = propertyByDependencyType[depType] + const initialDeps = R.keys(initialPackageJson[prop]) + const updatedDeps = R.keys(updatedPackageJson[prop]) + const removedDeps = R.difference(initialDeps, updatedDeps) + + for (const removedDep of removedDeps) { + if (!pkgsDiff[depType][`-${removedDep}`]) { + pkgsDiff[depType][`-${removedDep}`] = { + added: false, + name: removedDep, + version: initialPackageJson[prop][removedDep], + } + } + } + + const addedDeps = R.difference(updatedDeps, initialDeps) + + for (const addedDep of addedDeps) { + if (!pkgsDiff[depType][`+${addedDep}`]) { + pkgsDiff[depType][`+${addedDep}`] = { + added: true, + name: addedDep, + version: updatedPackageJson[prop][addedDep], + } + } + } + } + return pkgsDiff + }, + pkgsDiff$, + packageJson$, + ) +} diff --git a/packages/default-reporter/src/reportError.ts b/packages/default-reporter/src/reportError.ts new file mode 100644 index 0000000000..136e257de7 --- /dev/null +++ b/packages/default-reporter/src/reportError.ts @@ -0,0 +1,133 @@ +import chalk from 'chalk' +import commonTags = require('common-tags') +import StackTracey = require('stacktracey') +import {Log} from 'supi' +import {EOL} from './constants' + +const stripIndent = commonTags.stripIndent +const stripIndents = commonTags.stripIndents +const highlight = chalk.yellow +const colorPath = chalk.gray + +export default function reportError (logObj: Log) { + if (logObj['err']) { + const err = logObj['err'] as (Error & { code: string, stack: object }) + switch (err.code) { + case 'UNEXPECTED_STORE': + return reportUnexpectedStore(err, logObj['message']) + case 'STORE_BREAKING_CHANGE': + return reportStoreBreakingChange(err, logObj['message']) + case 'MODULES_BREAKING_CHANGE': + return reportModulesBreakingChange(err, logObj['message']) + case 'MODIFIED_DEPENDENCY': + return reportModifiedDependency(err, logObj['message']) + case 'SHRINKWRAP_BREAKING_CHANGE': + return reportShrinkwrapBreakingChange(err, logObj['message']) + default: + return formatGenericError(err.message || logObj['message'], err.stack) + } + } + return formatErrorSummary(logObj['message']) +} + +function reportUnexpectedStore (err: Error, msg: object) { + return stripIndent` + ${formatErrorSummary(err.message)} + + expected: ${highlight(msg['expectedStorePath'])} + actual: ${highlight(msg['actualStorePath'])} + + If you want to use the new store, run the same command with the ${highlight('--force')} parameter. + ` +} + +function reportStoreBreakingChange (err: Error, msg: object) { + let output = stripIndent` + ${formatErrorSummary(`The store used for the current node_modules is incomatible with the current version of pnpm`)} + Store path: ${colorPath(msg['storePath'])} + + Try running the same command with the ${highlight('--force')} parameter. + ` + + if (msg['additionalInformation']) { + output += EOL + EOL + msg['additionalInformation'] + } + + output += formatRelatedSources(msg) + return output +} + +function reportModulesBreakingChange (err: Error, msg: object) { + let output = stripIndent` + ${formatErrorSummary(`The current version of pnpm is not compatible with the available node_modules structure`)} + node_modules path: ${colorPath(msg['modulesPath'])} + + Run ${highlight('pnpm install --force')} to recreate node_modules. + ` + + if (msg['additionalInformation']) { + output += EOL + EOL + msg['additionalInformation'] + } + + output += formatRelatedSources(msg) + return output +} + +function formatRelatedSources (msg: object) { + let output = '' + + if (!msg['relatedIssue'] && !msg['relatedPR']) return output + + output += EOL + + if (msg['relatedIssue']) { + output += EOL + `Related issue: ${colorPath(`https://github.com/pnpm/pnpm/issues/${msg['relatedIssue']}`)}` + } + + if (msg['relatedPR']) { + output += EOL + `Related PR: ${colorPath(`https://github.com/pnpm/pnpm/pull/${msg['relatedPR']}`)}` + } + + return output +} + +function formatGenericError (errorMessage: string, stack: object) { + if (stack) { + let prettyStack: string | undefined + try { + prettyStack = new StackTracey(stack).pretty + } catch (err) { + prettyStack = undefined + } + if (prettyStack) { + return stripIndents` + ${formatErrorSummary(errorMessage)} + ${prettyStack} + ` + } + } + return formatErrorSummary(errorMessage) +} + +function formatErrorSummary (message: string) { + return `${chalk.bgRed.black('\u2009ERROR\u2009')} ${chalk.red(message)}` +} + +function reportModifiedDependency (err: Error, msg: object) { + return stripIndent` + ${formatErrorSummary('Packages in the store have been mutated')} + + These packages are modified: + ${msg['modified'].map((pkgPath: string) => colorPath(pkgPath)).join(EOL)} + + You can run ${highlight('pnpm install')} to refetch the modified packages + ` +} + +function reportShrinkwrapBreakingChange (err: Error, msg: object) { + return stripIndent` + ${formatErrorSummary(err.message)} + + Run with the ${highlight('--force')} parameter to recreate the shrinkwrap file. + ` +} diff --git a/packages/default-reporter/src/reporterForClient.ts b/packages/default-reporter/src/reporterForClient.ts new file mode 100644 index 0000000000..03af0a1aa8 --- /dev/null +++ b/packages/default-reporter/src/reporterForClient.ts @@ -0,0 +1,533 @@ +import chalk from 'chalk' +import most = require('most') +import {last as mostLast} from 'most-last' +import normalize = require('normalize-path') +import os = require('os') +import path = require('path') +import prettyBytes = require('pretty-bytes') +import R = require('ramda') +import rightPad = require('right-pad') +import semver = require('semver') +import stringLength = require('string-length') +import padStart = require('string.prototype.padstart') +import stripAnsi = require('strip-ansi') +import { + DeprecationLog, + InstallCheckLog, + LifecycleLog, + Log, + ProgressLog, + RegistryLog, +} from 'supi' +import * as supi from 'supi' +import PushStream = require('zen-push') +import {EOL} from './constants' +import getPkgsDiff, { + PackageDiff, + propertyByDependencyType, +} from './pkgsDiff' +import reportError from './reportError' + +const BIG_TARBALL_SIZE = 1024 * 1024 * 5 // 5 MB + +const ADDED_CHAR = chalk.green('+') +const REMOVED_CHAR = chalk.red('-') +const LINKED_CHAR = chalk.magentaBright('#') +const PREFIX_MAX_LENGTH = 40 + +const hlValue = chalk.blue +const hlPkgId = chalk['whiteBright'] + +export default function ( + log$: { + progress: most.Stream, + stage: most.Stream, + deprecation: most.Stream, + summary: most.Stream, + lifecycle: most.Stream, + stats: most.Stream, + installCheck: most.Stream, + registry: most.Stream, + root: most.Stream, + packageJson: most.Stream, + link: most.Stream, + other: most.Stream, + cli: most.Stream, + hook: most.Stream, + skippedOptionalDependency: most.Stream, + }, + isRecursive: boolean, + cmd: string, + widthArg?: number, + appendOnly?: boolean, + throttleProgress?: number, + cwdArg?: string, +): Array>> { + const width = widthArg || process.stdout.columns || 80 + const outputs: Array>> = [] + const cwd = cwdArg || process.cwd() + + const resolutionDone$ = isRecursive + ? most.never() + : log$.stage + .filter((log) => log.message === 'resolution_done') + + const resolvingContentLog$ = log$.progress + .filter((log) => log.status === 'resolving_content') + .scan(R.inc, 0) + .skip(1) + .until(resolutionDone$) + + const fedtchedLog$ = log$.progress + .filter((log) => log.status === 'fetched') + .scan(R.inc, 0) + + const foundInStoreLog$ = log$.progress + .filter((log) => log.status === 'found_in_store') + .scan(R.inc, 0) + + function createStatusMessage (resolving: number, fetched: number, foundInStore: number, importingDone: boolean) { + const msg = `Resolving: total ${hlValue(resolving.toString())}, reused ${hlValue(foundInStore.toString())}, downloaded ${hlValue(fetched.toString())}` + if (importingDone) { + return { + done: true, + fixed: false, + msg: `${msg}, done`, + } + } + return { + fixed: true, + msg, + } + } + + const importingDone$ = log$.stage.filter((log) => log.message === 'importing_done') + .constant(true) + .take(1) + .startWith(false) + .multicast() + + if (!isRecursive && typeof throttleProgress === 'number' && throttleProgress > 0) { + const resolutionStarted$ = log$.stage + .filter((log) => log.message === 'resolution_started' || log.message === 'importing_started').take(1) + const commandDone$ = log$.cli.filter((log) => log['message'] === 'command_done') + + // Reporting is done every `throttleProgress` milliseconds + // and once all packages are fetched. + const sampler = most.merge( + most.periodic(throttleProgress).since(resolutionStarted$).until(most.merge<{}>(importingDone$.skip(1), commandDone$)), + importingDone$, + ) + const progress = most.sample( + createStatusMessage, + sampler, + resolvingContentLog$, + fedtchedLog$, + foundInStoreLog$, + importingDone$, + ) + // Avoid logs after all resolved packages were downloaded. + // Fixing issue: https://github.com/pnpm/pnpm/issues/1028#issuecomment-364782901 + .skipAfter((msg) => msg.done === true) + + outputs.push(most.of(progress)) + } else { + const progress = most.combine( + createStatusMessage, + resolvingContentLog$, + fedtchedLog$, + foundInStoreLog$, + isRecursive ? most.of(false) : importingDone$, + ) + outputs.push(most.of(progress)) + } + + if (!appendOnly) { + const tarballsProgressOutput$ = log$.progress + .filter((log) => log.status === 'fetching_started' && + typeof log.size === 'number' && log.size >= BIG_TARBALL_SIZE && + // When retrying the download, keep the existing progress line. + // Fixing issue: https://github.com/pnpm/pnpm/issues/1013 + log.attempt === 1) + .map((startedLog) => { + const size = prettyBytes(startedLog['size']) + return log$.progress + .filter((log) => log.status === 'fetching_progress' && log.pkgId === startedLog['pkgId']) + .map((log) => log['downloaded']) + .startWith(0) + .map((downloadedRaw) => { + const done = startedLog['size'] === downloadedRaw + const downloaded = prettyBytes(downloadedRaw) + return { + fixed: !done, + msg: `Downloading ${hlPkgId(startedLog['pkgId'])}: ${hlValue(downloaded)}/${hlValue(size)}${done ? ', done' : ''}`, + } + }) + }) + + outputs.push(tarballsProgressOutput$) + + const lifecycleMessages: { + [depPath: string]: { + output: string[], + script: string, + }, + } = {} + const lifecycleStreamByDepPath: { + [depPath: string]: { + observable: most.Observable<{msg: string}>, + complete (): void, + next (obj: object): void, + }, + } = {} + const lifecyclePushStream = new PushStream() + outputs.push(most.from(lifecyclePushStream.observable)) + + log$.lifecycle + .forEach((log: LifecycleLog) => { + const key = `${log.stage}:${log.depPath}` + lifecycleMessages[key] = lifecycleMessages[key] || {output: []} + if (log['script']) { + lifecycleMessages[key].script = formatLifecycle(cwd, log) + } else { + if (!lifecycleMessages[key].output.length || log['exitCode'] !== 0) { + lifecycleMessages[key].output.push(formatLifecycle(cwd, log)) + } + if (lifecycleMessages[key].output.length > 3) { + lifecycleMessages[key].output.shift() + } + } + if (!lifecycleStreamByDepPath[key]) { + lifecycleStreamByDepPath[key] = new PushStream() + lifecyclePushStream.next(most.from(lifecycleStreamByDepPath[key].observable)) + } + lifecycleStreamByDepPath[key].next({ + msg: EOL + [lifecycleMessages[key].script].concat(lifecycleMessages[key].output).join(EOL), + }) + if (typeof log['exitCode'] === 'number') { + lifecycleStreamByDepPath[key].complete() + } + }) + } else { + const lifecycleMessages: {[pkgId: string]: string} = {} + const lifecycleOutput$ = most.of( + log$.lifecycle + .map((log: LifecycleLog) => ({ msg: formatLifecycle(cwd, log) })), + ) + + outputs.push(lifecycleOutput$) + } + + if (!isRecursive) { + const pkgsDiff$ = getPkgsDiff(log$) + + const summaryLog$ = log$.summary + .take(1) + + const summaryOutput$ = most.combine( + (pkgsDiff) => { + let msg = '' + for (const depType of ['prod', 'optional', 'dev']) { + const diffs = R.values(pkgsDiff[depType]) + if (diffs.length) { + msg += EOL + msg += chalk.blue(`${propertyByDependencyType[depType]}:`) + msg += EOL + msg += printDiffs(diffs) + msg += EOL + } + } + return {msg} + }, + pkgsDiff$, + summaryLog$, + ) + .take(1) + .map(most.of) + + outputs.push(summaryOutput$) + + const deprecationOutput$ = log$.deprecation + // print warnings only about deprecated packages from the root + .filter((log) => log.depth === 0) + .map((log) => { + return { + msg: formatWarn(`${chalk.red('deprecated')} ${log.pkgName}@${log.pkgVersion}: ${log.deprecated}`), + } + }) + .map(most.of) + + outputs.push(deprecationOutput$) + } + + if (!isRecursive) { + outputs.push( + most.fromPromise( + log$.stats + .take((cmd === 'install' || cmd === 'update') ? 2 : 1) + .reduce((acc, log) => { + if (typeof log['added'] === 'number') { + acc['added'] = log['added'] + } else if (typeof log['removed'] === 'number') { + acc['removed'] = log['removed'] + } + return acc + }, {}), + ) + .map((stats) => { + if (!stats['removed'] && !stats['added']) { + return most.of({msg: 'Already up-to-date'}) + } + + let msg = 'Packages:' + if (stats['added']) { + msg += ' ' + chalk.green(`+${stats['added']}`) + } + if (stats['removed']) { + msg += ' ' + chalk.red(`-${stats['removed']}`) + } + msg += EOL + printPlusesAndMinuses(width, (stats['added'] || 0), (stats['removed'] || 0)) + return most.of({msg}) + }), + ) + + const installCheckOutput$ = log$.installCheck + .map(formatInstallCheck) + .filter(Boolean) + .map((msg) => ({msg})) + .map(most.of) as most.Stream> + + outputs.push(installCheckOutput$) + + const registryOutput$ = log$.registry + .filter((log) => log.level === 'warn') + .map((log: RegistryLog) => ({msg: formatWarn(log.message)})) + .map(most.of) + + outputs.push(registryOutput$) + + const miscOutput$ = most.merge(log$.link, log$.other) + .map((obj) => { + if (obj.level === 'debug') return + if (obj.level === 'warn') { + return formatWarn(obj['message']) + } + if (obj.level === 'error') { + return reportError(obj) + } + return obj['message'] + }) + .map((msg) => ({msg})) + .map(most.of) + + outputs.push(miscOutput$) + + outputs.push( + log$.skippedOptionalDependency + .filter((log) => Boolean(log.parents && log.parents.length === 0)) + .map((log) => most.of({ + msg: `info: ${ + log.package['id'] || log.package.name && (`${log.package.name}@${log.package.version}`) || log.package['pref'] + } is an optional dependency and failed compatibility check. Excluding it from installation.`, + })), + ) + } else { + outputs.push( + log$.stats + .loop((stats, log) => { + if (stats[log.prefix]) { + const value = {...stats[log.prefix], ...log} + delete stats[log.prefix] + return {seed: stats, value} + } + stats[log.prefix] = log + return {seed: stats, value: null} + }, {}) + .filter((stats) => stats !== null && (stats['removed'] || stats['added'])) + .map((stats) => { + const prefix = formatPrefix(cwd, stats['prefix']) + + let msg = `${rightPad(prefix, PREFIX_MAX_LENGTH)} |` + + if (stats['added']) { + msg += ` ${padStep(chalk.green(`+${stats['added']}`), 4)}` + } + if (stats['removed']) { + msg += ` ${padStep(chalk.red(`-${stats['removed']}`), 4)}` + } + + const rest = Math.max(0, width - 1 - stringLength(msg)) + msg += ' ' + printPlusesAndMinuses(rest, roundStats(stats['added'] || 0), roundStats(stats['removed'] || 0)) + return most.of({msg}) + }), + ) + + const miscOutput$ = log$.other + .filter((obj) => obj.level === 'error') + .map((obj) => { + if (obj['message']['prefix']) { + return obj['message']['prefix'] + ':' + os.EOL + reportError(obj) + } + return reportError(obj) + }) + .map((msg) => ({msg})) + .map(most.of) + + outputs.push(miscOutput$) + } + + if (!isRecursive) { + const hookOutput$ = log$.hook + .map((log) => ({msg: `${chalk.magentaBright(log['hook'])}: ${log['message']}`})) + .map(most.of) + + outputs.push(hookOutput$) + } else { + const hookOutput$ = log$.hook + .map((log) => ({ + msg: `${rightPad(formatPrefix(cwd, log['prefix']), PREFIX_MAX_LENGTH)} | ${chalk.magentaBright(log['hook'])}: ${log['message']}`, + })) + .map(most.of) + + outputs.push(hookOutput$) + } + + return outputs +} + +function padStep (s: string, step: number) { + const sLength = stringLength(s) + const placeholderLength = Math.ceil(sLength / step) * step + if (sLength < placeholderLength) { + return R.repeat(' ', placeholderLength - sLength).join('') + s + } + return s +} + +function roundStats (stat: number): number { + if (stat === 0) return 0 + return Math.max(1, Math.round(stat / 10)) +} + +function formatPrefix (cwd: string, prefix: string) { + prefix = normalize(path.relative(cwd, prefix) || '.') + + if (prefix.length <= PREFIX_MAX_LENGTH) { + return prefix + } + + const shortPrefix = prefix.substr(-PREFIX_MAX_LENGTH + 3) + + const separatorLocation = shortPrefix.indexOf('/') + + if (separatorLocation <= 0) { + return `...${shortPrefix}` + } + + return `...${shortPrefix.substr(separatorLocation)}` +} + +function printPlusesAndMinuses (maxWidth: number, added: number, removed: number) { + if (maxWidth === 0) return '' + const changes = added + removed + let addedChars: number + let removedChars: number + if (changes > maxWidth) { + if (!added) { + addedChars = 0 + removedChars = maxWidth + } else if (!removed) { + addedChars = maxWidth + removedChars = 0 + } else { + const p = maxWidth / changes + addedChars = Math.min(Math.max(Math.floor(added * p), 1), maxWidth - 1) + removedChars = maxWidth - addedChars + } + } else { + addedChars = added + removedChars = removed + } + return `${R.repeat(ADDED_CHAR, addedChars).join('')}${R.repeat(REMOVED_CHAR, removedChars).join('')}` +} + +function printDiffs (pkgsDiff: PackageDiff[]) { + // Sorts by alphabet then by removed/added + // + ava 0.10.0 + // - chalk 1.0.0 + // + chalk 2.0.0 + pkgsDiff.sort((a, b) => (a.name.localeCompare(b.name) * 10 + (Number(!b.added) - Number(!a.added)))) + const msg = pkgsDiff.map((pkg) => { + let result = pkg.added + ? ADDED_CHAR + : pkg.linked + ? LINKED_CHAR + : REMOVED_CHAR + if (!pkg.realName || pkg.name === pkg.realName) { + result += ` ${pkg.name}` + } else { + result += ` ${pkg.name} <- ${pkg.realName}` + } + if (pkg.version) { + result += ` ${chalk.grey(pkg.version)}` + if (pkg.latest && semver.lt(pkg.version, pkg.latest)) { + result += ` ${chalk.grey(`(${pkg.latest} is available)`)}` + } + } + if (pkg.deprecated) { + result += ` ${chalk.red('deprecated')}` + } + if (pkg.linked) { + result += ` ${chalk.magentaBright('linked from')} ${chalk.grey(pkg.from || '???')}` + } + return result + }).join(EOL) + return msg +} + +function formatLifecycle (cwd: string, logObj: LifecycleLog) { + const prefix = `${ + logObj.wd === logObj.depPath + ? rightPad(formatPrefix(cwd, logObj.wd), PREFIX_MAX_LENGTH) + : rightPad(logObj.depPath, PREFIX_MAX_LENGTH) + } | ${hlValue(padStart(logObj.stage, 11))}` + if (logObj['script']) { + return `${prefix}$ ${logObj['script']}` + } + if (logObj['exitCode'] === 0) { + return `${prefix}: done` + } + const line = formatLine(logObj) + if (logObj.level === 'error') { + return `${prefix}: ${line}` + } + return `${prefix}: ${line}` +} + +function formatLine (logObj: LifecycleLog) { + if (typeof logObj['exitCode'] === 'number') return chalk.red(`Exited with ${logObj['exitCode']}`) + + // TODO: strip only the non-color/style ansi escape codes + if (logObj.level === 'error') { + return chalk.gray(stripAnsi(logObj['line'])) + } + return stripAnsi(logObj['line']) +} + +function formatInstallCheck (logObj: InstallCheckLog) { + switch (logObj.code) { + case 'EBADPLATFORM': + return formatWarn(`Unsupported system. Skipping dependency ${logObj.pkgId}`) + case 'ENOTSUP': + return logObj.toString() + default: + return + } +} + +function formatWarn (message: string) { + // The \u2009 is the "thin space" unicode character + // It is used instead of ' ' because chalk (as of version 2.1.0) + // trims whitespace at the beginning + return `${chalk.bgYellow.black('\u2009WARN\u2009')} ${message}` +} diff --git a/packages/default-reporter/src/reporterForServer.ts b/packages/default-reporter/src/reporterForServer.ts new file mode 100644 index 0000000000..37655c13dc --- /dev/null +++ b/packages/default-reporter/src/reporterForServer.ts @@ -0,0 +1,57 @@ +import chalk from 'chalk' +import most = require('most') +import prettyBytes = require('pretty-bytes') +import R = require('ramda') +import semver = require('semver') +import { + DeprecationLog, + InstallCheckLog, + LifecycleLog, + Log, + ProgressLog, + RegistryLog, +} from 'supi' +import getPkgsDiff, { + PackageDiff, + propertyByDependencyType, +} from './pkgsDiff' +import reportError from './reportError' + +export default function ( + log$: most.Stream, +) { + log$.subscribe({ + complete: () => undefined, + error: () => undefined, + next (log) { + if (log.name === 'pnpm:progress') { + switch (log.status) { + case 'fetched': + case 'fetching_started': + console.log(`${chalk.cyan(log.status)} ${log.pkgId}`) + } + return + } + switch (log.level) { + case 'warn': + console.log(formatWarn(log['message'])) + return + case 'error': + console.log(reportError(log)) + return + case 'debug': + return + default: + console.log(log['message']) + return + } + }, + }) +} + +function formatWarn (message: string) { + // The \u2009 is the "thin space" unicode character + // It is used instead of ' ' because chalk (as of version 2.1.0) + // trims whitespace at the beginning + return `${chalk.bgYellow.black('\u2009WARN\u2009')} ${message}` +} diff --git a/packages/default-reporter/test/index.ts b/packages/default-reporter/test/index.ts new file mode 100644 index 0000000000..6d1188ef05 --- /dev/null +++ b/packages/default-reporter/test/index.ts @@ -0,0 +1,997 @@ +import logger, { + createStreamParser, +} from '@pnpm/logger' +import delay = require('delay') +import test = require('tape') +import normalizeNewline = require('normalize-newline') +import {toOutput$} from 'pnpm-default-reporter' +import {stripIndents} from 'common-tags' +import chalk from 'chalk' +import most = require('most') +import StackTracey = require('stacktracey') +import R = require('ramda') + +const WARN = chalk.bgYellow.black('\u2009WARN\u2009') +const ERROR = chalk.bgRed.black('\u2009ERROR\u2009') +const DEPRECATED = chalk.red('deprecated') +const versionColor = chalk.grey +const ADD = chalk.green('+') +const SUB = chalk.red('-') +const LINKED = chalk.magentaBright('#') +const h1 = chalk.blue +const hlValue = chalk.blue +const hlPkgId = chalk['whiteBright'] +const POSTINSTALL = hlValue('postinstall') +const PREINSTALL = hlValue(' preinstall') +const INSTALL = hlValue(' install') + +const progressLogger = logger('progress') +const stageLogger = logger('stage') +const rootLogger = logger('root') +const deprecationLogger = logger('deprecation') +const summaryLogger = logger('summary') +const lifecycleLogger = logger('lifecycle') +const packageJsonLogger = logger('package-json') +const statsLogger = logger('stats') +const hookLogger = logger('hook') +const skippedOptionalDependencyLogger = logger('skipped-optional-dependency') +const EOL = '\n' + +test('prints progress beginning', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + progressLogger.debug({ + status: 'resolving_content', + pkgId, + }) + + t.plan(1) + + output$.take(1).subscribe({ + next: output => { + t.equal(output, `Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')}`) + }, + error: t.end, + complete: () => t.end(), + }) +}) + +test('prints progress beginning when appendOnly is true', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', appendOnly: true}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + progressLogger.debug({ + status: 'resolving_content', + pkgId, + }) + + t.plan(1) + + output$.take(1).subscribe({ + next: output => { + t.equal(output, `Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')}`) + }, + error: t.end, + complete: () => t.end(), + }) +}) + +test('prints progress beginning during recursive install', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive'}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + progressLogger.debug({ + status: 'resolving_content', + pkgId, + }) + + t.plan(1) + + output$.take(1).subscribe({ + next: output => { + t.equal(output, `Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')}`) + }, + error: t.end, + complete: () => t.end(), + }) +}) + +test('prints progress on first download', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', throttleProgress: 0}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + progressLogger.debug({ + status: 'resolving_content', + pkgId, + }) + progressLogger.debug({ + status: 'fetched', + pkgId, + }) + + t.plan(1) + + output$.skip(1).take(1).subscribe({ + next: output => { + t.equal(output, `Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('1')}`) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('moves fixed line to the end', async t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', throttleProgress: 0}) + + output$.skip(3).take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + ${WARN} foo + Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('1')}, done + `) + }, + complete: v => t.end(), + error: t.end, + }) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + progressLogger.debug({ + status: 'resolving_content', + pkgId, + }) + progressLogger.debug({ + status: 'fetched', + pkgId, + }) + logger.warn('foo') + + await delay(0) // w/o delay warning goes below for some reason. Started to happen after switch to most + + stageLogger.debug('resolution_done') + stageLogger.debug('importing_done') + + t.plan(1) +}) + +test('prints "Already up-to-date"', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + statsLogger.debug({ added: 0 }) + statsLogger.debug({ removed: 0 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Already up-to-date + `) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints summary', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + packageJsonLogger.debug({ + initial: { + dependencies: { + 'is-13': '^1.0.0', + }, + devDependencies: { + 'is-negative': '^1.0.0', + }, + }, + }) + deprecationLogger.warn({ + pkgName: 'bar', + pkgVersion: '2.0.0', + pkgId: 'registry.npmjs.org/bar/2.0.0', + deprecated: 'This package was deprecated because bla bla bla', + depth: 0, + }) + rootLogger.info({ + added: { + dependencyType: 'prod', + name: 'foo', + version: '1.0.0', + latest: '2.0.0', + id: 'registry.npmjs.org/foo/1.0.0', + }, + }) + rootLogger.info({ + added: { + dependencyType: 'prod', + name: 'bar', + version: '2.0.0', + latest: '1.0.0', // this won't be printed in summary because latest is less than current version + id: 'registry.npmjs.org/bar/2.0.0', + }, + }) + rootLogger.info({ + removed: { + dependencyType: 'prod', + name: 'foo', + version: '0.1.0', + }, + }) + rootLogger.info({ + added: { + dependencyType: 'dev', + name: 'qar', + version: '2.0.0', + id: 'registry.npmjs.org/qar/2.0.0', + }, + }) + rootLogger.info({ + added: { + dependencyType: 'optional', + name: 'lala', + version: '1.1.0', + id: 'registry.npmjs.org/lala/1.1.0', + }, + }) + rootLogger.info({ + removed: { + dependencyType: 'optional', + name: 'is-positive', + }, + }) + rootLogger.debug({ + linked: { + dependencyType: 'optional', + from: '/src/is-linked', + name: 'is-linked', + to: '/src/project/node_modules' + }, + }) + rootLogger.info({ + added: { + dependencyType: 'prod', + name: 'winston', + realName: 'winst0n', + version: '1.0.0', + latest: '1.0.0', + id: 'registry.npmjs.org/winst0n/2.0.0', + }, + }) + packageJsonLogger.debug({ + updated: { + dependencies: { + 'is-negative': '^1.0.0', + }, + devDependencies: { + 'is-13': '^1.0.0', + }, + } + }) + summaryLogger.info() + + t.plan(1) + + output$.skip(1).take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + ${WARN} ${DEPRECATED} bar@2.0.0: This package was deprecated because bla bla bla + + ${h1('dependencies:')} + ${ADD} bar ${versionColor('2.0.0')} ${DEPRECATED} + ${SUB} foo ${versionColor('0.1.0')} + ${ADD} foo ${versionColor('1.0.0')} ${versionColor('(2.0.0 is available)')} + ${SUB} is-13 ${versionColor('^1.0.0')} + ${ADD} is-negative ${versionColor('^1.0.0')} + ${ADD} winston <- winst0n ${versionColor('1.0.0')} + + ${h1('optionalDependencies:')} + ${LINKED} is-linked ${chalk.magentaBright('linked from')} ${chalk.grey('/src/is-linked')} + ${SUB} is-positive + ${ADD} lala ${versionColor('1.1.0')} + + ${h1('devDependencies:')} + ${ADD} is-13 ${versionColor('^1.0.0')} + ${SUB} is-negative ${versionColor('^1.0.0')} + ${ADD} qar ${versionColor('2.0.0')} + ` + '\n') + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('groups lifecycle output', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + script: 'node foo', + stage: 'preinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + line: 'foo', + stage: 'preinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + script: 'node foo', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + line: 'foo I', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/bar/1.0.0', + script: 'node bar', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/bar/1.0.0', + line: 'bar I', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + line: 'foo II', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + line: 'foo III', + stage: 'postinstall', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/qar/1.0.0', + script: 'node qar', + stage: 'install', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/qar/1.0.0', + exitCode: 0, + stage: 'install', + }) + lifecycleLogger.debug({ + depPath: 'registry.npmjs.org/foo/1.0.0', + exitCode: 0, + stage: 'postinstall', + }) + + t.plan(1) + + output$.skip(9).take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, EOL + stripIndents` + registry.npmjs.org/foo/1.0.0 | ${PREINSTALL}$ node foo + registry.npmjs.org/foo/1.0.0 | ${PREINSTALL}: foo + + registry.npmjs.org/foo/1.0.0 | ${POSTINSTALL}$ node foo + registry.npmjs.org/foo/1.0.0 | ${POSTINSTALL}: foo I + registry.npmjs.org/foo/1.0.0 | ${POSTINSTALL}: foo II + registry.npmjs.org/foo/1.0.0 | ${POSTINSTALL}: foo III + + registry.npmjs.org/bar/1.0.0 | ${POSTINSTALL}$ node bar + registry.npmjs.org/bar/1.0.0 | ${POSTINSTALL}: bar I + + registry.npmjs.org/qar/1.0.0 | ${INSTALL}$ node qar + registry.npmjs.org/qar/1.0.0 | ${INSTALL}: done + `) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +// Many libs use stderr for logging, so showing all stderr adds not much value +test['skip']('prints lifecycle progress', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + lifecycleLogger.debug({ + pkgId: 'registry.npmjs.org/foo/1.0.0', + line: 'foo I', + script: 'postinstall', + }) + lifecycleLogger.debug({ + pkgId: 'registry.npmjs.org/bar/1.0.0', + line: 'bar I', + script: 'postinstall', + }) + lifecycleLogger.error({ + pkgId: 'registry.npmjs.org/foo/1.0.0', + line: 'foo II', + script: 'postinstall', + }) + lifecycleLogger.debug({ + pkgId: 'registry.npmjs.org/foo/1.0.0', + line: 'foo III', + script: 'postinstall', + }) + + t.plan(1) + + const childOutputColor = chalk.grey + const childOutputError = chalk.red + + output$.skip(3).take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Running ${POSTINSTALL} for ${hlPkgId('registry.npmjs.org/foo/1.0.0')}: ${childOutputColor('foo I')} + Running ${POSTINSTALL} for ${hlPkgId('registry.npmjs.org/foo/1.0.0')}! ${childOutputError('foo II')} + Running ${POSTINSTALL} for ${hlPkgId('registry.npmjs.org/foo/1.0.0')}: ${childOutputColor('foo III')} + Running ${POSTINSTALL} for ${hlPkgId('registry.npmjs.org/bar/1.0.0')}: ${childOutputColor('bar I')} + `) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints generic error', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + const err = new Error('some error') + logger.error(err) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + ${ERROR} ${chalk.red('some error')} + ${new StackTracey(err.stack).pretty} + `) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints generic error when recursive install fails', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive'}) + + const err = new Error('some error') + err['prefix'] = '/home/src/' + logger.error(err, err) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + /home/src/: + ${ERROR} ${chalk.red('some error')} + ${new StackTracey(err.stack).pretty} + `) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints info', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + logger.info('info message') + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, 'info message') + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints progress of big files download', async t => { + t.plan(6) + + let output$ = toOutput$(createStreamParser(), {cmd: 'install', throttleProgress: 0}) + .map(normalizeNewline) as most.Stream + const stream$: most.Stream[] = [] + + const pkgId1 = 'registry.npmjs.org/foo/1.0.0' + const pkgId2 = 'registry.npmjs.org/bar/2.0.0' + const pkgId3 = 'registry.npmjs.org/qar/3.0.0' + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, `Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')}`)) + ) + + output$ = output$.skip(1) + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, stripIndents` + Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')} + Downloading ${hlPkgId(pkgId1)}: ${hlValue('0 B')}/${hlValue('10.5 MB')} + `)) + ) + + output$ = output$.skip(1) + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, stripIndents` + Resolving: total ${hlValue('1')}, reused ${hlValue('0')}, downloaded ${hlValue('0')} + Downloading ${hlPkgId(pkgId1)}: ${hlValue('5.77 MB')}/${hlValue('10.5 MB')} + `)) + ) + + output$ = output$.skip(2) + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, stripIndents` + Resolving: total ${hlValue('2')}, reused ${hlValue('0')}, downloaded ${hlValue('0')} + Downloading ${hlPkgId(pkgId1)}: ${hlValue('7.34 MB')}/${hlValue('10.5 MB')} + `, 'downloading of small package not reported')) + ) + + output$ = output$.skip(3) + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, stripIndents` + Resolving: total ${hlValue('3')}, reused ${hlValue('0')}, downloaded ${hlValue('0')} + Downloading ${hlPkgId(pkgId1)}: ${hlValue('7.34 MB')}/${hlValue('10.5 MB')} + Downloading ${hlPkgId(pkgId3)}: ${hlValue('19.9 MB')}/${hlValue('21 MB')} + `)) + ) + + output$ = output$.skip(1) + + stream$.push( + output$.take(1) + .tap(output => t.equal(output, stripIndents` + Downloading ${hlPkgId(pkgId1)}: ${hlValue('10.5 MB')}/${hlValue('10.5 MB')}, done + Resolving: total ${hlValue('3')}, reused ${hlValue('0')}, downloaded ${hlValue('0')} + Downloading ${hlPkgId(pkgId3)}: ${hlValue('19.9 MB')}/${hlValue('21 MB')} + `)) + ) + + most.mergeArray(stream$) + .subscribe({ + next: () => undefined, + complete: () => t.end(), + error: t.end, + }) + + progressLogger.debug({ + status: 'resolving_content', + pkgId: pkgId1, + }) + + progressLogger.debug({ + status: 'fetching_started', + pkgId: pkgId1, + size: 1024 * 1024 * 10, // 10 MB + attempt: 1, + }) + + await delay(0) + + progressLogger.debug({ + status: 'fetching_progress', + pkgId: pkgId1, + downloaded: 1024 * 1024 * 5.5, // 5.5 MB + }) + + progressLogger.debug({ + status: 'resolving_content', + pkgId: pkgId2, + }) + + progressLogger.debug({ + status: 'fetching_started', + pkgId: pkgId1, + size: 10, // 10 B + attempt: 1, + }) + + progressLogger.debug({ + status: 'fetching_progress', + pkgId: pkgId1, + downloaded: 1024 * 1024 * 7, + }) + + progressLogger.debug({ + status: 'resolving_content', + pkgId: pkgId3, + }) + + progressLogger.debug({ + status: 'fetching_started', + pkgId: pkgId3, + size: 1024 * 1024 * 20, // 20 MB + attempt: 1, + }) + + await delay(0) + + progressLogger.debug({ + status: 'fetching_progress', + pkgId: pkgId3, + downloaded: 1024 * 1024 * 19, // 19 MB + }) + + progressLogger.debug({ + status: 'fetching_progress', + pkgId: pkgId1, + downloaded: 1024 * 1024 * 10, // 10 MB + }) +}) + +test('prints added/removed stats during installation', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + statsLogger.debug({ added: 5 }) + statsLogger.debug({ removed: 1 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+5')} ${chalk.red('-1')} + ${ADD + ADD + ADD + ADD + ADD + SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints added/removed stats during installation when 0 removed', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + statsLogger.debug({ added: 2 }) + statsLogger.debug({ removed: 0 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+2')} + ${ADD + ADD}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints only the added stats if nothing was removed', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + statsLogger.debug({ removed: 0 }) + statsLogger.debug({ added: 1 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+1')} + ${ADD}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints only the removed stats if nothing was added', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + statsLogger.debug({ removed: 1 }) + statsLogger.debug({ added: 0 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.red('-1')} + ${SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints only the added stats if nothing was removed and a lot added', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', width: 20}) + + statsLogger.debug({ removed: 0 }) + statsLogger.debug({ added: 100 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+100')} + ${R.repeat(ADD, 20).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints only the removed stats if nothing was added and a lot removed', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', width: 20}) + + statsLogger.debug({ removed: 100 }) + statsLogger.debug({ added: 0 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.red('-100')} + ${R.repeat(SUB, 20).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints at least one remove sign when removed !== 0', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', width: 20}) + + statsLogger.debug({ removed: 1 }) + statsLogger.debug({ added: 100 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+100')} ${chalk.red('-1')} + ${R.repeat(ADD, 19).join('') + SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints at least one add sign when added !== 0', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', width: 20}) + + statsLogger.debug({ removed: 100 }) + statsLogger.debug({ added: 1 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.green('+1')} ${chalk.red('-100')} + ${ADD + R.repeat(SUB, 19).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints just removed during uninstallation', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'uninstall'}) + + statsLogger.debug({ removed: 4 }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + Packages: ${chalk.red('-4')} + ${SUB + SUB + SUB + SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints added/removed stats during recursive installation', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', cwd: '/home/jane/repo'}) + + statsLogger.debug({ removed: 1, prefix: '/home/jane/repo' }) + statsLogger.debug({ added: 0, prefix: '/home/jane/repo' }) + statsLogger.debug({ removed: 0, prefix: '/home/jane/repo/pkg-5' }) + statsLogger.debug({ added: 0, prefix: '/home/jane/repo/pkg-5' }) + statsLogger.debug({ added: 2, prefix: '/home/jane/repo/dir/pkg-2' }) + statsLogger.debug({ added: 5, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ removed: 1, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ removed: 0, prefix: '/home/jane/repo/dir/pkg-2' }) + statsLogger.debug({ removed: 0, prefix: '/home/jane/repo/loooooooooooooooooooooooooooooooooong/pkg-3' }) + statsLogger.debug({ added: 1, prefix: '/home/jane/repo/loooooooooooooooooooooooooooooooooong/pkg-3' }) + statsLogger.debug({ removed: 1, prefix: '/home/jane/repo/loooooooooooooooooooooooooooooooooong-pkg-4' }) + statsLogger.debug({ added: 0, prefix: '/home/jane/repo/loooooooooooooooooooooooooooooooooong-pkg-4' }) + + t.plan(1) + + output$.skip(4).take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + . | ${chalk.red('-1')} ${SUB} + pkg-1 | ${chalk.green('+5')} ${chalk.red('-1')} ${ADD + SUB} + dir/pkg-2 | ${chalk.green('+2')} ${ADD} + .../pkg-3 | ${chalk.green('+1')} ${ADD} + ...ooooooooooooooooooooooooooooong-pkg-4 | ${chalk.red('-1')} ${SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('recursive installation: prints only the added stats if nothing was removed and a lot added', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', width: 60, cwd: '/home/jane/repo'}) + + statsLogger.debug({ removed: 0, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ added: 190, prefix: '/home/jane/repo/pkg-1' }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + pkg-1 | ${chalk.green('+190')} ${R.repeat(ADD, 12).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('recursive installation: prints only the removed stats if nothing was added and a lot removed', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', width: 60, cwd: '/home/jane/repo'}) + + statsLogger.debug({ removed: 190, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ added: 0, prefix: '/home/jane/repo/pkg-1' }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + pkg-1 | ${chalk.red('-190')} ${R.repeat(SUB, 12).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('recursive installation: prints at least one remove sign when removed !== 0', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', width: 62, cwd: '/home/jane/repo'}) + + statsLogger.debug({ removed: 1, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ added: 100, prefix: '/home/jane/repo/pkg-1' }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + pkg-1 | ${chalk.green('+100')} ${chalk.red('-1')} ${R.repeat(ADD, 8).join('') + SUB}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('recursive installation: prints at least one add sign when added !== 0', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', width: 62, cwd: '/home/jane/repo'}) + + statsLogger.debug({ removed: 100, prefix: '/home/jane/repo/pkg-1' }) + statsLogger.debug({ added: 1, prefix: '/home/jane/repo/pkg-1' }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + pkg-1 | ${chalk.green('+1')} ${chalk.red('-100')} ${ADD + R.repeat(SUB, 8).join('')}` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('install: print hook message', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install', cwd: '/home/jane/repo'}) + + hookLogger.debug({ + from: '/home/jane/repo/pnpmfile.js', + prefix: '/home/jane/repo', + hook: 'readPackage', + message: 'foo', + }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + ${chalk.magentaBright('readPackage')}: foo` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('recursive: print hook message', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'recursive', cwd: '/home/jane/repo'}) + + hookLogger.debug({ + from: '/home/jane/repo/pnpmfile.js', + prefix: '/home/jane/repo/pkg-1', + hook: 'readPackage', + message: 'foo', + }) + + t.plan(1) + + output$.take(1).map(normalizeNewline).subscribe({ + next: output => { + t.equal(output, stripIndents` + pkg-1 | ${chalk.magentaBright('readPackage')}: foo` + ) + }, + complete: () => t.end(), + error: t.end, + }) +}) + +test('prints skipped optional dependency info message', t => { + const output$ = toOutput$(createStreamParser(), {cmd: 'install'}) + + const pkgId = 'registry.npmjs.org/foo/1.0.0' + + skippedOptionalDependencyLogger.debug({ + package: { + id: pkgId, + name: 'foo', + version: '1.0.0', + }, + parents: [], + reason: 'unsupported_platform', + }) + + t.plan(1) + + output$.take(1).subscribe({ + next: output => { + t.equal(output, `info: ${pkgId} is an optional dependency and failed compatibility check. Excluding it from installation.`) + }, + error: t.end, + complete: () => t.end(), + }) +}) diff --git a/packages/default-reporter/tsconfig.json b/packages/default-reporter/tsconfig.json new file mode 100644 index 0000000000..e1c5b75154 --- /dev/null +++ b/packages/default-reporter/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "removeComments": false, + "preserveConstEnums": true, + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "suppressImplicitAnyIndexErrors": true, + "allowSyntheticDefaultImports": true, + "strictNullChecks": true, + "target": "es6", + "outDir": "lib", + "module": "commonjs", + "moduleResolution": "node" + }, + "include": [ + "src/**/*.ts", + "typings/**/*.d.ts" + ], + "atom": { + "rewriteTsconfig": true + } +} diff --git a/packages/default-reporter/tslint.json b/packages/default-reporter/tslint.json new file mode 100644 index 0000000000..40a42fafc5 --- /dev/null +++ b/packages/default-reporter/tslint.json @@ -0,0 +1,45 @@ +{ + "extends": "tslint:recommended", + "rules": { + "curly": false, + "eofline": false, + "align": [true, "parameters"], + "class-name": true, + "indent": [true, "spaces"], + "max-line-length": false, + "no-any": true, + "no-consecutive-blank-lines": true, + "no-trailing-whitespace": true, + "no-duplicate-variable": true, + "no-var-keyword": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-requires": true, + "no-require-imports": false, + "no-string-literal": false, + "space-before-function-paren": [true, "always"], + "interface-name": [true, "never-prefix"], + "no-console": false, + "one-line": [true, + "check-else", + "check-whitespace", + "check-open-brace"], + "quotemark": [true, + "single", + "avoid-escape"], + "semicolon": false, + "typedef-whitespace": [true, { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }], + "whitespace": [true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type"] + } +} diff --git a/packages/default-reporter/typings/index.d.ts b/packages/default-reporter/typings/index.d.ts new file mode 100644 index 0000000000..f3eb390d4a --- /dev/null +++ b/packages/default-reporter/typings/index.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/default-reporter/typings/local.d.ts b/packages/default-reporter/typings/local.d.ts new file mode 100644 index 0000000000..2f737b0acd --- /dev/null +++ b/packages/default-reporter/typings/local.d.ts @@ -0,0 +1,54 @@ +declare module 'ansi-diff' { + const anything: any; + export = anything; +} + +declare module 'cli-cursor' { + const anything: any; + export = anything; +} + +declare module 'ndjson' { + const anything: any; + export = anything; +} + +declare module 'normalize-newline' { + const anything: any; + export = anything; +} + +declare module 'pretty-bytes' { + const anything: any; + export = anything; +} + +declare module 'stacktracey' { + const anything: any; + export = anything; +} + +declare module 'zen-push' { + const anything: any; + export = anything; +} + +declare module 'right-pad' { + const anything: any; + export = anything; +} + +declare module 'string-length' { + function stringLength (s: string): number; + export = stringLength; +} + +declare module 'normalize-path' { + function normalize (path: string): string; + export = normalize; +} + +declare module 'string.prototype.padstart' { + function padStart (s: string, targetLength: number, padString?: string): string; + export = padStart; +}