From 26c75a01b66e401a9ccbd820816ea38c7b31e97d Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 20 Mar 2018 11:42:14 -0300 Subject: [PATCH 001/110] PoD(Proof Of Design) - v0 --- .gitignore | 11 + packages/opencensus-core/package-lock.json | 335 ++++++++++++++++++ packages/opencensus-core/package.json | 43 +++ .../opencensus-core/src/internal/clock.ts | 77 ++++ .../opencensus-core/src/internal/cls-ah.ts | 145 ++++++++ packages/opencensus-core/src/internal/cls.ts | 66 ++++ packages/opencensus-core/src/internal/util.ts | 40 +++ .../src/trace/instrumentation/types.ts | 38 ++ .../src/trace/model/root-span.ts | 60 ++++ .../opencensus-core/src/trace/model/span.ts | 73 ++++ .../opencensus-core/src/trace/model/tracer.ts | 118 ++++++ .../src/trace/types/tracetypes.ts | 167 +++++++++ packages/opencensus-core/tsconfig.json | 26 ++ 13 files changed, 1199 insertions(+) create mode 100644 packages/opencensus-core/package-lock.json create mode 100644 packages/opencensus-core/package.json create mode 100644 packages/opencensus-core/src/internal/clock.ts create mode 100644 packages/opencensus-core/src/internal/cls-ah.ts create mode 100644 packages/opencensus-core/src/internal/cls.ts create mode 100644 packages/opencensus-core/src/internal/util.ts create mode 100644 packages/opencensus-core/src/trace/instrumentation/types.ts create mode 100644 packages/opencensus-core/src/trace/model/root-span.ts create mode 100644 packages/opencensus-core/src/trace/model/span.ts create mode 100644 packages/opencensus-core/src/trace/model/tracer.ts create mode 100644 packages/opencensus-core/src/trace/types/tracetypes.ts create mode 100644 packages/opencensus-core/tsconfig.json diff --git a/.gitignore b/.gitignore index 7b0ff1e7e..b132d608b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,16 @@ bin # Vim .swp +#VScode +.vscode/ + # Other TAGS + +# nodejs +node_modules/ +npm-debug.log +.nyc_output/ +build/ + + diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json new file mode 100644 index 000000000..b81d65ed0 --- /dev/null +++ b/packages/opencensus-core/package-lock.json @@ -0,0 +1,335 @@ +{ + "name": "opencensus-nodejs-xp", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "dev": true, + "requires": { + "@types/node": "9.4.7" + } + }, + "@types/debug": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", + "dev": true + }, + "@types/end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@types/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha512-d0FD2A4vpFI8wyQeQbr9VDVKtA1PmeGO3Ntn+6j626QTtAQ9HSqWFACP7rTHaV2cspVhLijl00Vvkf/U2UZGWA==", + "dev": true, + "requires": { + "@types/node": "9.4.7" + } + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/node": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", + "dev": true + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true + }, + "@types/shimmer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", + "dev": true + }, + "@types/uuid": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", + "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", + "dev": true, + "requires": { + "@types/node": "9.4.7" + } + }, + "async-listener": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", + "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", + "requires": { + "semver": "5.5.0", + "shimmer": "1.2.0" + } + }, + "async_hooks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", + "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "0.6.9", + "emitter-listener": "1.1.1" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "requires": { + "shimmer": "1.2.0" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "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" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", + "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "require-in-the-middle": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", + "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", + "requires": { + "module-details-from-path": "1.0.3", + "resolve": "1.5.0" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "typescript": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json new file mode 100644 index 000000000..932edccdf --- /dev/null +++ b/packages/opencensus-core/package.json @@ -0,0 +1,43 @@ +{ + "name": "opencensus-nodejs-xp", + "version": "0.0.1", + "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", + "main": "build/src/index.js", + "types": "build/src/index.d.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "opencensus", + "nodejs", + "tracing", + "profiling" + ], + "author": "Google Inc.", + "license": "Apache-2.0", + "engines": { + "node": ">=6.00" + }, + "devDependencies": { + "@types/continuation-local-storage": "^3.2.1", + "@types/debug": "0.0.30", + "@types/end-of-stream": "^1.4.0", + "@types/mocha": "^2.2.48", + "@types/node": "^9.4.7", + "@types/semver": "^5.5.0", + "@types/shimmer": "^1.0.1", + "@types/uuid": "^3.4.3", + "mocha": "^5.0.4", + "typescript": "^2.7.2" + }, + "dependencies": { + "async_hooks": "^1.0.0", + "continuation-local-storage": "^3.2.1", + "debug": "^3.1.0", + "end-of-stream": "^1.4.1", + "require-in-the-middle": "^2.2.1", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + } +} diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts new file mode 100644 index 000000000..6f22b02e8 --- /dev/null +++ b/packages/opencensus-core/src/internal/clock.ts @@ -0,0 +1,77 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export class Clock { + private _ended: boolean; + private _startTime: Date; + private _hrtime: [number, number]; + private diff: [number,number]; + + constructor() { + this._ended = false + this._startTime = new Date() + this._hrtime = process.hrtime() + this.diff = null + } + + public end(): void { + if (this._ended) return + this.diff = process.hrtime(this._hrtime) + this._ended = true + } + + public get duration(): number { + if (!this._ended) return null + var ns = this.diff[0] * 1e9 + this.diff[1] + return ns / 1e6 + } + + public offset(timer: Clock): number { + var a = timer.hrtime + var b = this.hrtime + var ns = (b[0] - a[0]) * 1e9 + (b[1] - a[1]) + return ns / 1e6 + } + + public get hrtime() : [number, number] { + return this._hrtime; + } + + public get startTime(): Date { + return this._startTime; + } + + public get endTime(): Date { + let result: Date = null; + if(this.ended) { + result= new Date(this.startTime.getTime() + this.duration); + } + return result; + } + + public get ended(): boolean { + return this._ended; + } + +} + + + + + + + + diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts new file mode 100644 index 000000000..88326aacc --- /dev/null +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -0,0 +1,145 @@ +/** + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as asyncHook from 'async_hooks'; +import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; +import {EventEmitter} from 'events'; +import * as shimmer from 'shimmer'; + +const wrappedSymbol = Symbol('context_wrapped'); +let contexts: {[asyncId: number]: Context;} = {}; +let current: Context = {}; + +asyncHook.createHook({init, before, destroy}).enable(); + +const EVENT_EMITTER_METHODS: Array = + ['addListener', 'on', 'once', 'prependListener', 'prependOnceListener']; + +class AsyncHooksNamespace implements CLSNamespace { + get name(): string { + throw new Error('Not implemented'); + } + + get active(): Context { + throw new Error('Not implemented'); + } + + createContext(): Context { + throw new Error('Not implemented'); + } + + get(k: string) { + return current[k]; + } + + set(k: string, v: T): T { + current[k] = v; + return v; + } + + run(fn: Func): Context { + this.runAndReturn(fn); + return current; + } + + runAndReturn(fn: Func): T { + const oldContext = current; + current = {}; + const res = fn(); + current = oldContext; + return res; + } + + bind(cb: Func): Func { + // TODO(kjin): Monitor https://github.com/Microsoft/TypeScript/pull/15473. + // When it's landed and released, we can remove these `any` casts. + // tslint:disable-next-line:no-any + if ((cb as any)[wrappedSymbol] as boolean || !current) { + return cb; + } + const boundContext = current; + const contextWrapper = function(this: {}) { + const oldContext = current; + current = boundContext; + const res = cb.apply(this, arguments) as T; + current = oldContext; + return res; + }; + // tslint:disable-next-line:no-any + (contextWrapper as any)[wrappedSymbol] = true; + Object.defineProperty(contextWrapper, 'length', { + enumerable: false, + configurable: true, + writable: false, + value: cb.length + }); + return contextWrapper; + } + + // This function is not technically needed and all tests currently pass + // without it (after removing call sites). While it is not a complete + // solution, restoring correct context before running every request/response + // event handler reduces the number of situations in which userspace queuing + // will cause us to lose context. + bindEmitter(ee: NodeJS.EventEmitter): void { + const ns = this; + EVENT_EMITTER_METHODS.forEach((method) => { + if (ee[method]) { + shimmer.wrap(ee, method, (oldMethod) => { + return function(this: {}, event: string, cb: Func) { + return oldMethod.call(this, event, ns.bind(cb)); + }; + }); + } + }); + } +} + +const namespace = new AsyncHooksNamespace(); + +// AsyncWrap Hooks + +function init( + uid: number, provider: string, parentUid: number, parentHandle: {}) { + contexts[uid] = current; +} + +function before(uid: number) { + if (contexts[uid]) { + current = contexts[uid]; + } +} + +function destroy(uid: number) { + delete contexts[uid]; +} + +export function createNamespace(): CLSNamespace { + return namespace; +} + +export function destroyNamespace(): void { + current = {}; + contexts = {}; +} + +export function getNamespace(): CLSNamespace { + return namespace; +} + +export function reset(): void { + throw new Error('Not implemented'); +} diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts new file mode 100644 index 000000000..ca33c4ba5 --- /dev/null +++ b/packages/opencensus-core/src/internal/cls.ts @@ -0,0 +1,66 @@ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as CLS from 'continuation-local-storage'; +import * as semver from 'semver'; + +export type Namespace = CLS.Namespace; +export type Func = CLS.Func; + +const useAsyncHooks: boolean = semver.satisfies(process.version, '>=8') ;//&& + // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; + +const cls: typeof CLS = + useAsyncHooks ? require('./cls-ah') : require('continuation-local-storage'); + +const TRACE_NAMESPACE = 'opencensus.io'; + +/** + * Stack traces are captured when a root span is started. Because the stack + * trace height varies on the context propagation mechanism, to keep published + * stack traces uniform we need to remove the top-most frames when using the + * c-l-s module. Keep track of this number here. + */ +export const ROOT_SPAN_STACK_OFFSET = useAsyncHooks ? 0 : 2; + +export function createNamespace(): CLS.Namespace { + return cls.createNamespace(TRACE_NAMESPACE); +} + +export function destroyNamespace(): void { + cls.destroyNamespace(TRACE_NAMESPACE); +} + +export function getNamespace(): CLS.Namespace { + return cls.getNamespace(TRACE_NAMESPACE); +} + +/* +export function set(name:string, trace:any) { + getNamespace().set(name, trace); +} + +export function get(name:string): any { + // First getNamespace check is necessary in case any + // patched closures escaped before the agent was stopped and the + // namespace was destroyed. + var result: any = null; + if (getNamespace() && getNamespace().get(name)) { + result = getNamespace().get(name); + } + return result; +} +*/ diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts new file mode 100644 index 000000000..09fd9be0d --- /dev/null +++ b/packages/opencensus-core/src/internal/util.ts @@ -0,0 +1,40 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as crypto from 'crypto'; +import * as Debug from "debug"; + +export const debug = Debug("opencensus"); + + +//TODO: rethink this snippet aproach +//--- Code snippet from Stackdriver Trace Agent +// Use 6 bytes of randomness only as JS numbers are doubles not 64-bit ints. +const SPAN_ID_RANDOM_BYTES = 6; + +// Use the faster crypto.randomFillSync when available (Node 7+) falling back to +// using crypto.randomBytes. +const spanIdBuffer = Buffer.alloc(SPAN_ID_RANDOM_BYTES); +const randomFillSync = crypto.randomFillSync; +const randomBytes = crypto.randomBytes; +const spanRandomBuffer = randomFillSync ? + () => randomFillSync(spanIdBuffer) : + () => randomBytes(SPAN_ID_RANDOM_BYTES); + +export function randomSpanId() { + // tslint:disable-next-line:ban Needed to parse hexadecimal. + return parseInt(spanRandomBuffer().toString('hex'), 16).toString(); +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts new file mode 100644 index 000000000..de458eb9e --- /dev/null +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -0,0 +1,38 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface Plugin { + applyPatch: (module: any, manager: TM, version: string) => void; +} + +export abstract class BasePlugin { + + public module: any; + public moduleName: string; + public traceManager: TM; + public version: string; + + constructor (moduleName: string) { + this.moduleName = moduleName; + } + + setPluginContext(http: any, traceManager: TM, version: string) { + this.module = http; + this.traceManager = traceManager; + this.version = version; + } + +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts new file mode 100644 index 000000000..7712d63b8 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Span} from './span' +import {Clock} from '../internal/clock' +import * as uuid from 'uuid'; +import {debug} from '../internal/util' +import {TracerComponent} from './types/tracetypes' + +export class Trace extends TracerComponent { + + private spans: Span[] = []; + + constructor() { + super() + this.setId((uuid.v4().split('-').join(''))); + } + + public start() { + super.start() + debug('starting trace %o', {id: this.id}) + } + + public end() { + super.end() + + //TODO - Define logic for list of spans + this.spans.forEach(function (span) { + if (span.ended || !span.started) return + span.truncate() + }) + + debug('ending trace %o', + {id: this.id, name: this.name, startTime: this.startTime, endTime: this.endTime, duration: this.duration}) + } + + public startSpan(name: string, type: string) { + let newSpan = new Span(this); + newSpan.name = name + newSpan.type = type + newSpan.start(); + this.spans.push(newSpan); + return newSpan; + } + +} + diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts new file mode 100644 index 000000000..2e9ee7b99 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -0,0 +1,73 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Clock} from '../internal/clock'; +import {Trace} from './trace'; +import {debug, randomSpanId} from '../internal/util' +import {TracerComponent} from './types/tracetypes' + + +export class Span extends TracerComponent { + + private trace: TracerComponent; + private _parentSpanId: string; + + constructor(trace: TracerComponent) { + super() + this.trace = trace; + this.setId(randomSpanId()); + } + + public get traceId() : string { + return this.trace.id; + } + + public set parentSpanId(parentSpanId : string) { + this._parentSpanId = parentSpanId; + } + + public get parentSpanId() : string { + return this._parentSpanId; + } + + public get traceContext() { + return { + traceId: this.trace.id.toString(), + spanId: this.id.toString(), + options: 1 // always traced + }; + } + + public start() { + super.start(); + debug('starting span %o', {id: this.id, traceId: this.traceId, name: this.name }) + } + + public end(): void { + super.end(); + debug('ending span %o', + {spanId: this.id, + traceId: this.trace.id, + name: this.name , + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration} + ) + + } + + +} diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts new file mode 100644 index 000000000..a60cb09d9 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -0,0 +1,118 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as cls from '../internal/cls'; +import {Trace} from './trace' +import {Span} from './span' +import {PluginLoader} from './plugins/pluginloader' +import {debug} from '../internal/util' + +export type Func = (...args: any[]) => T; + +export class TraceManager { + + readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express'] + + private _active: boolean; + private contextManager: cls.Namespace; + private pluginLoader: PluginLoader; + + //TODO: temp solution + private endedTraces: Trace[] = []; + + constructor() { + this._active = false; + this.contextManager = cls.createNamespace(); + this.pluginLoader = new PluginLoader(this); + } + + public get currentTrace(): Trace { + return this.contextManager.get('trace'); + } + + private setCurrentTrace(trace:Trace) { + this.contextManager.set('trace', trace); + } + + public start(config?:Object): TraceManager { + this.pluginLoader.loadPlugins(this.PLUGINS); + this._active = true; + return this; + } + + public get active(): boolean { + return this._active; + } + + public startTrace(): Trace { + let newTrace = new Trace(); + this.setCurrentTrace(newTrace); + newTrace.start(); + return newTrace; + } + + public endTrace():void { + if (!this.currentTrace) return debug('cannot end trace - no active trace found') + this.currentTrace.end(); + this.addEndedTrace(this.currentTrace); + } + + public clearCurrentTrace() { + this.setCurrentTrace(null); + } + + public startSpan(name:string, type: string): Span { + let newSpan: Span = null; + if (!this.currentTrace) { + debug('no current trace found - cannot start a new span'); + } else { + newSpan = this.currentTrace.startSpan(name, type) + } + return newSpan; + } + + + private addEndedTrace(trace: Trace) { + if (this.active) { + //TODO: temp solution + this.endedTraces.push(trace); + } + } + + public wrap(fn: Func): Func { + if (!this.active) { + return fn; + } + + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + return namespace.bind(fn); + } + + public wrapEmitter(emitter: NodeJS.EventEmitter): void { + if (!this.active) { + return; + } + + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + namespace.bindEmitter(emitter); + } + +} + + + diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts new file mode 100644 index 000000000..759c18d19 --- /dev/null +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -0,0 +1,167 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Clock} from '../../internal/clock'; +import {debug, randomSpanId} from '../../internal/util' + + +export interface MapLabels { [propName: string]: string; } +export interface MapObjects { [propName: string]: any; } + +export abstract class TracerComponent { + + private _className: string; + private _id: string; + private clock: Clock; + //------ + private _remoteParent: string; + private attributes: MapLabels = {}; + private annotations: MapObjects = {}; + //messageEvents + //links + private _name: string; + private _started: boolean; + private _ended: boolean; + private _type: string; + private _status: number; + //TODO truncated + private _truncated: boolean; + + constructor() { + this._className = this.constructor.name; + this._name = null; + this._type = null; + this._started = false; + this.clock = null; + this._truncated = false; + this._ended = false; + } + + public get id() : string { + return this._id; + } + + protected setId(id : string) { + this._id = id; + } + + public get name() { + return this._name; + } + + public get started(): boolean { + return this._started; + } + + public get ended(): boolean { + return this._ended; + } + + public set name(name: string) { + this._name = name; + } + + public get type() : string { + return this._type; + } + + public set type(type : string) { + this._type = type; + } + + public set remoteParente(remoteParent : string) { + this._remoteParent = remoteParent; + } + + public get remoteSpanId() : string { + return this._remoteParent; + } + + public get status(): number { + return this._status; + } + + public set status(status: number) { + this._status = status; + } + + public get startTime(): Date { + return this.clock.startTime; + } + + public get endTime(): Date { + return this.clock.endTime; + } + + public get duration() : number { + return this.clock.duration; + } + + //TODO: maybe key and values must be truncate + public addAtribute(key: string, value: string) { + this.attributes[key] = value; + } + + //TODO: maybe keys and values must be truncate + public addAnotation(key: string, value: {}) { + this.annotations[key] = value; + } + + public start() { + if (this.started) { + debug('calling %s.start() on already started %s %o', + this._className, this._className, + {id: this.id, name: this.name, type: this.type}) + return + } + this.clock = new Clock(); + this._started = true; + } + + public end(): void { + if (!this.started) { + debug('calling %s.end() on un-started %s %o', + this._className, this._className, + {id: this.id, name: this.name, type: this.type}) + return + } else if (this.ended) { + debug('calling %s.end() on already ended %s %o', + this._className, this._className, + {id:this.id , name: this.name, type: this.type}) + return + } + this._started = false; + this._ended = true; + this.clock.end(); + + } + + + //TODO: review + public truncate() { + if (!this.started) { + debug('calling truncate non-started %s - ignoring %o', this._className, {id: this.id, name: this.name, type: this.type}) + return + } else if (this.ended) { + debug('calling truncate already ended %s - ignoring %o',this._className, {id: this.id, name: this.name, type: this.type}) + return + } + this._truncated = true + this.end() + debug('truncating %s %o', this._className, {id: this.id, name: this.name }) + } + +} diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json new file mode 100644 index 000000000..96990ef22 --- /dev/null +++ b/packages/opencensus-core/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "rootDir": ".", + "outDir": "build", + "allowUnreachableCode": true, + "noUnusedParameters": false, + "noImplicitAny": false, + "noImplicitThis": false, + "noEmitOnError": false, + "pretty": true, + "strict": false, + "module": "commonjs", + "target": "es6", + "sourceMap": true + }, + "exclude": [ + "node_modules" + ], + "include": [ + "src/*.ts", + "src/trace/*.ts", + "src/trace/plugins/*.ts", + "src/internal/*.ts" + ] + +} \ No newline at end of file From ce6d020f7c6b2391ab7d5c478d77d9cd37d684fa Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 20 Mar 2018 16:12:38 -0300 Subject: [PATCH 002/110] Added basic structure of tests --- packages/opencensus-core/package-lock.json | 1518 ++++++++++++++++- packages/opencensus-core/package.json | 10 +- packages/opencensus-core/scripts/compile.ts | 22 + packages/opencensus-core/scripts/index.ts | 121 ++ packages/opencensus-core/scripts/run-tests.ts | 53 + .../opencensus-core/scripts/tsconfig.json | 10 + packages/opencensus-core/scripts/utils.ts | 64 + packages/opencensus-core/test/test-trace.ts | 10 + packages/opencensus-core/tsconfig.full.json | 19 + 9 files changed, 1771 insertions(+), 56 deletions(-) create mode 100644 packages/opencensus-core/scripts/compile.ts create mode 100644 packages/opencensus-core/scripts/index.ts create mode 100644 packages/opencensus-core/scripts/run-tests.ts create mode 100644 packages/opencensus-core/scripts/tsconfig.json create mode 100644 packages/opencensus-core/scripts/utils.ts create mode 100644 packages/opencensus-core/test/test-trace.ts create mode 100644 packages/opencensus-core/tsconfig.full.json diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index b81d65ed0..18dfe4f72 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -52,6 +52,18 @@ "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", "dev": true }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", @@ -61,6 +73,63 @@ "@types/node": "9.4.7" } }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "async-listener": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", @@ -75,12 +144,80 @@ "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "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" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -97,6 +234,116 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "clang-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", + "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", + "dev": true, + "requires": { + "async": "1.5.2", + "glob": "7.1.2", + "resolve": "1.5.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", @@ -109,6 +356,20 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, "continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", @@ -118,6 +379,41 @@ "emitter-listener": "1.1.1" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -126,12 +422,57 @@ "ms": "2.0.0" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "emitter-listener": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", @@ -148,18 +489,89 @@ "once": "1.4.0" } }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "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" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -174,12 +586,80 @@ "path-is-absolute": "1.0.1" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true }, + "gts": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", + "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "clang-format": "1.2.2", + "inquirer": "3.3.0", + "meow": "4.0.0", + "pify": "3.0.0", + "rimraf": "2.6.2", + "tslint": "5.9.1", + "update-notifier": "2.3.0", + "write-file-atomic": "2.3.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -192,6 +672,45 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -208,84 +727,574 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "ansi-escapes": "3.0.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "minimist": "0.0.8" + "builtin-modules": "1.1.1" } }, - "mocha": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", - "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { - "wrappy": "1.0.2" + "path-is-inside": "1.0.2" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, - "require-in-the-middle": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", - "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, "requires": { - "module-details-from-path": "1.0.3", - "resolve": "1.5.0" + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", + "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.6" + } + }, + "require-in-the-middle": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", + "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", + "requires": { + "module-details-from-path": "1.0.3", + "resolve": "1.5.0" } }, "resolve": { @@ -296,16 +1305,191 @@ "path-parse": "1.0.5" } }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "shimmer": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -315,21 +1499,245 @@ "has-flag": "2.0.0" } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "ts-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.3.2", + "diff": "3.5.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.4", + "tsconfig": "7.0.0", + "v8flags": "3.0.2", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + } + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "tslint": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.2", + "commander": "2.15.1", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.11.0", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.5.0", + "tslib": "1.9.0", + "tsutils": "2.22.2" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", + "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, "typescript": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", "dev": true }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.3.2", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, + "v8flags": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", + "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 932edccdf..4a0d34a15 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -5,7 +5,12 @@ "main": "build/src/index.js", "types": "build/src/index.d.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "npm run script run-unit-tests", + "compile-all": "npm run script compile-auto", + "compile-strict": "npm run script compile-auto-strict", + "compile": "npm run script compile-auto compile-auto-strict", + "clean": "rimraf build/*", + "script": "ts-node -P ./scripts ./scripts" }, "keywords": [ "opencensus", @@ -27,7 +32,10 @@ "@types/semver": "^5.5.0", "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", + "gts": "^0.5.1", + "ncp": "^2.0.0", "mocha": "^5.0.4", + "ts-node": "^4.0.0", "typescript": "^2.7.2" }, "dependencies": { diff --git a/packages/opencensus-core/scripts/compile.ts b/packages/opencensus-core/scripts/compile.ts new file mode 100644 index 000000000..6df3b8550 --- /dev/null +++ b/packages/opencensus-core/scripts/compile.ts @@ -0,0 +1,22 @@ +import * as path from 'path'; +import { forkP } from './utils'; +import * as ts from 'typescript'; +import * as semver from 'semver'; + +export interface CompileOptions { + strict: boolean; + languageLevel: string; +} + +export async function compile(options: CompileOptions) { + let { strict, languageLevel } = options; + if (languageLevel === 'auto') { + languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es2017' : 'es2015'; + } + await forkP(`node_modules/typescript/lib/tsc`, [ + '-p', + strict ? '.' : './tsconfig.full.json', + '--target', + languageLevel + ]); +} diff --git a/packages/opencensus-core/scripts/index.ts b/packages/opencensus-core/scripts/index.ts new file mode 100644 index 000000000..e793b54be --- /dev/null +++ b/packages/opencensus-core/scripts/index.ts @@ -0,0 +1,121 @@ +/** + * The main entry point for cross-platform build scripts. + * Usage (in repository root directory): + * ts-node -P ./scripts ./scripts [step1] [step2 ... stepN] + * Alias for above: + * npm run script [step1] [step2 ... stepN] + */ + +const [, , ...steps] = process.argv; +const { + CI_PULL_REQUEST, + TRACE_TEST_EXCLUDE_INTEGRATION, + TRACE_SYSTEM_TEST_ENCRYPTED_CREDENTIALS_KEY, + TRACE_SYSTEM_TEST_ENCRYPTED_CREDENTIALS_IV +} = process.env; + +import { checkInstall } from './check-install'; +import { compile } from './compile'; +import { encryptCredentials, decryptCredentials } from './credentials'; +import { initTestFixtures } from './init-test-fixtures'; +import { reportCoverage } from './report-coverage'; +import { runTests } from './run-tests'; +import { testNonInterference } from './test-non-interference'; +import { BUILD_DIRECTORY, existsP, spawnP } from './utils'; + +// The identifying string in the service account credentials file path. +const keyID = 'de480e4f9023'; + +// Globs to exclude when running unit tests only. +const unitTestExcludeGlobs: string[] = TRACE_TEST_EXCLUDE_INTEGRATION ? [ + `${BUILD_DIRECTORY}/test/plugins/test-*`, + `${BUILD_DIRECTORY}/test/test-agent-stopped.js`, + `${BUILD_DIRECTORY}/test/test-grpc-context.js`, + `${BUILD_DIRECTORY}/test/test-mysql-pool.js`, + `${BUILD_DIRECTORY}/test/test-plugins-*`, + `${BUILD_DIRECTORY}/test/test-trace-web-frameworks.js`, + `${BUILD_DIRECTORY}/test/test-unpatch.js` +] : []; + +/** + * Sequentially runs a list of commands. + */ +async function run(steps: string[]) { + for (const step of steps) { + console.log(`> Running step: ${step}`); + // If the step string is prefixed with "npm-", treat it as an "npm run" + // command, and then short-circuit. + if (step.indexOf('npm-') === 0) { + const moduleAndArgs = step.split('-'); + await spawnP( + 'npm', + [ + 'run', + moduleAndArgs.slice(1).join('-') + ] + ); + continue; + } else if (step.startsWith('compile-')) { + const [, languageLevel, strict] = step.split('-'); + await compile({ strict: !!strict, languageLevel }); + continue; + } else { + switch (step) { + case 'run-unit-tests': + await runTests({ + includeGlobs: [ + `${BUILD_DIRECTORY}/test/test-*.js`, + `${BUILD_DIRECTORY}/test/plugins/test-*.js` + ], + excludeGlobs: unitTestExcludeGlobs, + rootDir: BUILD_DIRECTORY, + coverage: false, + timeout: 4000 + }); + break; + case 'run-unit-tests-with-coverage': + await runTests({ + includeGlobs: [ + `${BUILD_DIRECTORY}/test/test-*.js`, + `${BUILD_DIRECTORY}/test/plugins/test-*.js` + ], + excludeGlobs: unitTestExcludeGlobs, + rootDir: BUILD_DIRECTORY, + coverage: true, + timeout: 4000 + }); + break; + case 'run-system-tests': + await spawnP( + 'npm', ['install'], { cwd: 'system-test' } + ); + if (CI_PULL_REQUEST && !(await existsP('node-team-test-d0b0be11c23d.json'))) { + console.log('> Not running system tests in PRs'); + } else { + await runTests({ + includeGlobs: [ + `system-test/*.js`, + ], + rootDir: '.', + coverage: false + }); + } + break; + case 'report-coverage': + await reportCoverage(); + break; + case 'test-non-interference': + await testNonInterference(); + break; + default: + console.log(`> ${step}: not found`); + break; + } + } + } +} + +run(steps).catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/packages/opencensus-core/scripts/run-tests.ts b/packages/opencensus-core/scripts/run-tests.ts new file mode 100644 index 000000000..98cb936f6 --- /dev/null +++ b/packages/opencensus-core/scripts/run-tests.ts @@ -0,0 +1,53 @@ +import * as path from 'path'; +import { globP, forkP } from './utils'; + +export interface Options { + includeGlobs: string[], + excludeGlobs?: string[], + rootDir: string, + coverage?: boolean, + timeout?: number +} + +export async function runTests(options: Options) { + const { includeGlobs, excludeGlobs, rootDir, coverage, timeout } = options; + function nodule(nodule: string) { + return path.relative(rootDir, `node_modules/${nodule}`); + } + let testNum = 0; + const excludedFiles = ([] as string[]) + .concat(...await Promise.all((excludeGlobs || []).map(glob => globP(glob)))); + const includedFiles = ([] as string[]) + .concat(...await Promise.all(includeGlobs.map(glob => globP(glob)))); + // Take the difference + const files = includedFiles.filter(i => excludedFiles.indexOf(i) < 0); + for (const file of files) { + const moduleAndArgs = [ + ...coverage ? [ + nodule('.bin/nyc'), + '--reporter', + 'lcov', + '--report-dir', + `./coverage/${testNum++}`, + '--exclude', + 'build/test/**' + ] : [], + nodule('mocha/bin/_mocha'), + '--require', + 'source-map-support/register', + path.relative(rootDir, file), + ...timeout ? [ + '--timeout', + `${timeout}` + ] : [ + '--no-timeouts' + ] + ]; + + await forkP( + moduleAndArgs[0], + moduleAndArgs.slice(1), + { cwd: rootDir } + ); + } +} diff --git a/packages/opencensus-core/scripts/tsconfig.json b/packages/opencensus-core/scripts/tsconfig.json new file mode 100644 index 000000000..e4b33561a --- /dev/null +++ b/packages/opencensus-core/scripts/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": "..", + "outDir": "../build" + }, + "include": [ + "*.ts" + ] +} \ No newline at end of file diff --git a/packages/opencensus-core/scripts/utils.ts b/packages/opencensus-core/scripts/utils.ts new file mode 100644 index 000000000..39432c41a --- /dev/null +++ b/packages/opencensus-core/scripts/utils.ts @@ -0,0 +1,64 @@ +import { mkdir, Stats, stat, readFile, writeFile } from 'fs'; +import * as glob from 'glob'; +import { ncp } from 'ncp'; +import * as path from 'path'; +import * as pify from 'pify'; +import { ChildProcess, ForkOptions, fork, SpawnOptions, spawn } from 'child_process'; +import * as once from 'once'; +import * as tmp from 'tmp'; + +export const BUILD_DIRECTORY = 'build'; + +export const globP: (pattern: string) => Promise = pify(glob); +export const mkdirP: (dir: string) => Promise = pify(mkdir); +export const ncpP: (src: string, dest: string) => Promise = pify(ncp); +export const readFileP: (path: string, encoding?: string) => Promise = pify(readFile); +export const writeFileP: (path: string, data: Buffer|string, encoding?: string) => Promise = pify(writeFile); +export const statP: (path: string) => Promise = pify(stat); +export const tmpDirP: () => Promise = pify(tmp.dir); + +export function nodule(nodule: string) { + return path.relative(BUILD_DIRECTORY, `node_modules/${nodule}`); +} + +export function flatten(arr: Array>): Array { + return arr.reduce((acc, e) => acc.concat(e), []); +} + +export function existsP(path: string): Promise { + return statP(path).then( + () => Promise.resolve(true), + () => Promise.resolve(false) + ); +} + +function promisifyChildProcess(childProcess: ChildProcess): Promise { + return new Promise((resolve, reject) => { + const exit = (err?: Error) => once(() => err ? reject(err) : resolve())(); + childProcess.on('error', exit); + childProcess.on('close', (code) => { + if (code === 0) { + exit(); + } else { + exit(new Error(`Process ${childProcess.pid} exited with code ${code}.`)); + } + }); + }); +} + +export function spawnP(command: string, args?: string[], options?: SpawnOptions): Promise { + const stringifiedCommand = `\`${command}${args ? (' ' + args.join(' ')) : ''}\``; + console.log(`> Running: ${stringifiedCommand}`); + return promisifyChildProcess(spawn(command, args, Object.assign({ + stdio: 'inherit', + shell: true + }, options))); +} + +export function forkP(moduleName: string, args?: string[], options?: ForkOptions): Promise { + const stringifiedCommand = `\`${moduleName}${args ? (' ' + args.join(' ')) : ''}\``; + console.log(`> Running: ${stringifiedCommand}`); + return promisifyChildProcess(fork(moduleName, args, Object.assign({ + stdio: 'inherit' + }, options))); +} diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts new file mode 100644 index 000000000..6182344e5 --- /dev/null +++ b/packages/opencensus-core/test/test-trace.ts @@ -0,0 +1,10 @@ +import { Trace } from '../src/trace/trace'; + +var assert = require('assert'); + +describe('Trace', function() { + it('should be a Trace instance', function() { + var trace = new Trace(); + assert.ok(trace instanceof Trace); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/tsconfig.full.json b/packages/opencensus-core/tsconfig.full.json new file mode 100644 index 000000000..336e867a2 --- /dev/null +++ b/packages/opencensus-core/tsconfig.full.json @@ -0,0 +1,19 @@ +{ + "extends": "./node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build", + "target": "es2015", + "allowUnreachableCode": true, + "noUnusedParameters": false, + "noImplicitAny": false, + "noImplicitThis": false, + "noEmitOnError": false + }, + "include": [ + "src/*.ts", + "src/plugins/*.ts", + "test/*.ts", + "test/plugins/*.ts" + ] +} From f482e3721274426246dcfa87315972a26659b72a Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Wed, 21 Mar 2018 10:44:59 -0300 Subject: [PATCH 003/110] finished test-trace --- packages/opencensus-core/scripts/index.ts | 5 --- packages/opencensus-core/test/test-trace.ts | 46 ++++++++++++++++++--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/packages/opencensus-core/scripts/index.ts b/packages/opencensus-core/scripts/index.ts index e793b54be..148ba6ead 100644 --- a/packages/opencensus-core/scripts/index.ts +++ b/packages/opencensus-core/scripts/index.ts @@ -14,13 +14,8 @@ const { TRACE_SYSTEM_TEST_ENCRYPTED_CREDENTIALS_IV } = process.env; -import { checkInstall } from './check-install'; import { compile } from './compile'; -import { encryptCredentials, decryptCredentials } from './credentials'; -import { initTestFixtures } from './init-test-fixtures'; -import { reportCoverage } from './report-coverage'; import { runTests } from './run-tests'; -import { testNonInterference } from './test-non-interference'; import { BUILD_DIRECTORY, existsP, spawnP } from './utils'; // The identifying string in the service account credentials file path. diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index 6182344e5..7abf2ee86 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -1,10 +1,46 @@ import { Trace } from '../src/trace/trace'; +import { Span } from '../src/trace/span'; -var assert = require('assert'); +let assert = require('assert'); -describe('Trace', function() { - it('should be a Trace instance', function() { - var trace = new Trace(); - assert.ok(trace instanceof Trace); +describe('Trace', function () { + let trace = new Trace(); + + describe('new Trace()', function () { + it('should be a Trace instance', function () { + assert.ok(trace instanceof Trace); + }); + }); + + describe('start()', function () { + it('trace was started', function () { + trace.start() + assert.ok(trace.started); + }); + }); + + describe('startSpan()', function () { + let span = trace.startSpan("spanName", "spanType"); + it('should be a Span instance', function () { + assert.ok(span instanceof Span); + }); + + it('span was started', function () { + assert.ok(span.started); + }); }); + + describe('end()', function () { + it('trace was ended', function () { + trace.end(); + assert.ok(trace.ended); + }); + }); + + describe('startSpan() after ended trace', function () { + it('should throws an exception', function () { + assert.throws(() => trace.startSpan("spanName", "spanType")); + }); + }); + }); \ No newline at end of file From 8c9102dd5ea2b2a243095d6072a00b25350b6cf2 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Wed, 21 Mar 2018 13:37:32 -0300 Subject: [PATCH 004/110] added new tests in test-trace --- packages/opencensus-core/scripts/index.ts | 34 ------------------ packages/opencensus-core/test/test-trace.ts | 40 ++++++++++++++++----- 2 files changed, 32 insertions(+), 42 deletions(-) diff --git a/packages/opencensus-core/scripts/index.ts b/packages/opencensus-core/scripts/index.ts index 148ba6ead..e20cfabce 100644 --- a/packages/opencensus-core/scripts/index.ts +++ b/packages/opencensus-core/scripts/index.ts @@ -68,40 +68,6 @@ async function run(steps: string[]) { timeout: 4000 }); break; - case 'run-unit-tests-with-coverage': - await runTests({ - includeGlobs: [ - `${BUILD_DIRECTORY}/test/test-*.js`, - `${BUILD_DIRECTORY}/test/plugins/test-*.js` - ], - excludeGlobs: unitTestExcludeGlobs, - rootDir: BUILD_DIRECTORY, - coverage: true, - timeout: 4000 - }); - break; - case 'run-system-tests': - await spawnP( - 'npm', ['install'], { cwd: 'system-test' } - ); - if (CI_PULL_REQUEST && !(await existsP('node-team-test-d0b0be11c23d.json'))) { - console.log('> Not running system tests in PRs'); - } else { - await runTests({ - includeGlobs: [ - `system-test/*.js`, - ], - rootDir: '.', - coverage: false - }); - } - break; - case 'report-coverage': - await reportCoverage(); - break; - case 'test-non-interference': - await testNonInterference(); - break; default: console.log(`> ${step}: not found`); break; diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index 7abf2ee86..c5ed1c785 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -4,22 +4,24 @@ import { Span } from '../src/trace/span'; let assert = require('assert'); describe('Trace', function () { - let trace = new Trace(); - - describe('new Trace()', function () { - it('should be a Trace instance', function () { + describe('new Trace()', function () { + it('should be a Trace instance', function () { + let trace = new Trace(); assert.ok(trace instanceof Trace); }); }); describe('start()', function () { it('trace was started', function () { - trace.start() + let trace = new Trace(); + trace.start(); assert.ok(trace.started); }); }); describe('startSpan()', function () { + let trace = new Trace(); + trace.start() let span = trace.startSpan("spanName", "spanType"); it('should be a Span instance', function () { assert.ok(span instanceof Span); @@ -32,14 +34,36 @@ describe('Trace', function () { describe('end()', function () { it('trace was ended', function () { + let trace = new Trace(); + trace.start() trace.end(); assert.ok(trace.ended); }); }); - describe('startSpan() after ended trace', function () { - it('should throws an exception', function () { - assert.throws(() => trace.startSpan("spanName", "spanType")); + describe('end() before trace started', function () { + it('trace was not ended', function () { + let trace = new Trace(); + trace.end(); + assert.ok(!trace.ended); + }); + }); + + describe('startSpan() before trace started', function () { + it('should return null', function () { + let trace = new Trace(); + let span = trace.startSpan("spanName", "spanType"); + assert.ok(span == null); + }); + }); + + describe('startSpan() after trace ended', function () { + it('should return null', function () { + let trace = new Trace(); + trace.start() + trace.end(); + let span = trace.startSpan("spanName", "spanType"); + assert.ok(span == null); }); }); From 532819a062313d41c01a93f35f40c69668e4cea5 Mon Sep 17 00:00:00 2001 From: Luana Martins Date: Wed, 21 Mar 2018 15:26:36 -0300 Subject: [PATCH 005/110] Add unit tests for span.ts --- packages/opencensus-core/test/test-span.ts | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 packages/opencensus-core/test/test-span.ts diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts new file mode 100644 index 000000000..ad966094f --- /dev/null +++ b/packages/opencensus-core/test/test-span.ts @@ -0,0 +1,75 @@ +import { Span } from '../src/trace/span'; +import { Trace } from '../src/trace/trace'; + +var assert = require('assert'); + +describe('Span creation', function () { + + let trace; + let span; + + before(function () { + trace = new Trace(); + span = trace.startSpan('spanName', 'typeSpan'); + }); + + it('should create an span on the trace', function () { + assert.ok(trace instanceof Trace); + span = trace.startSpan('spanName', 'typeSpan'); + assert.ok(span instanceof Span); + assert.ok(span.id); + }); + + it('should start a span', function () { + span.start(); + assert.ok(span.started); + }); + + it('should end a span', function () { + span.end(); + assert.ok(span.ended); + }); +}); + +describe('Span checking creation', function () { + + let trace; + let span; + + before(function () { + trace = new Trace(); + span = trace.startSpan('spanName', 'typeSpan'); + }); + + it('should not start span after it ended', function () { + span.end(); + assert.equal(span.ended, true); + }); +}); + +describe('Span data', function () { + + let trace; + + before(function () { + trace = new Trace(); + }); + + it('generates unique numeric span ID strings', function () { + var numberOfSpansToCheck = 5; + for (var i = 0; i < numberOfSpansToCheck; i++) { + var span = trace.startSpan('spanName' + i, 'typeSpan' + i); + var spanId = span.id; + assert.ok(typeof spanId === 'string'); + assert.ok(spanId.match(/\d+/)); + assert.ok(Number(spanId) > 0); + assert.strictEqual(Number(spanId).toString(), spanId); + } + }); + + // TODO + it('truncates namespace', function(){ + this.skip(); + }); +}); + From 891202e0e05284ccac636e14d6ed0c51b1677c16 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Wed, 21 Mar 2018 16:47:46 -0300 Subject: [PATCH 006/110] finished test-tracemanager --- packages/opencensus-core/scripts/index.ts | 5 +++-- packages/opencensus-core/test/test-trace.ts | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/opencensus-core/scripts/index.ts b/packages/opencensus-core/scripts/index.ts index e20cfabce..64a2857e6 100644 --- a/packages/opencensus-core/scripts/index.ts +++ b/packages/opencensus-core/scripts/index.ts @@ -29,7 +29,8 @@ const unitTestExcludeGlobs: string[] = TRACE_TEST_EXCLUDE_INTEGRATION ? [ `${BUILD_DIRECTORY}/test/test-mysql-pool.js`, `${BUILD_DIRECTORY}/test/test-plugins-*`, `${BUILD_DIRECTORY}/test/test-trace-web-frameworks.js`, - `${BUILD_DIRECTORY}/test/test-unpatch.js` + `${BUILD_DIRECTORY}/test/test-unpatch.js`, + `${BUILD_DIRECTORY}/test/test-trace.js` ] : []; /** @@ -55,7 +56,7 @@ async function run(steps: string[]) { await compile({ strict: !!strict, languageLevel }); continue; } else { - switch (step) { + switch (step) { case 'run-unit-tests': await runTests({ includeGlobs: [ diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index c5ed1c785..a418c7627 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -12,7 +12,7 @@ describe('Trace', function () { }); describe('start()', function () { - it('trace was started', function () { + it('the trace was started', function () { let trace = new Trace(); trace.start(); assert.ok(trace.started); @@ -23,17 +23,17 @@ describe('Trace', function () { let trace = new Trace(); trace.start() let span = trace.startSpan("spanName", "spanType"); - it('should be a Span instance', function () { + it('should return a Span instance', function () { assert.ok(span instanceof Span); }); - it('span was started', function () { + it('the new span was started', function () { assert.ok(span.started); }); }); describe('end()', function () { - it('trace was ended', function () { + it('the trace was ended', function () { let trace = new Trace(); trace.start() trace.end(); @@ -42,7 +42,7 @@ describe('Trace', function () { }); describe('end() before trace started', function () { - it('trace was not ended', function () { + it('the trace was not ended', function () { let trace = new Trace(); trace.end(); assert.ok(!trace.ended); From 5126f586abceeabad7c370350b8513e2818bc440 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 22 Mar 2018 08:50:08 -0300 Subject: [PATCH 007/110] Add initial Stackdriver exporter --- packages/opencensus-core/package-lock.json | 9915 +++++++++++++++++++- packages/opencensus-core/package.json | 2 + src/exporters/stackdriver.ts | 122 + 3 files changed, 9906 insertions(+), 133 deletions(-) create mode 100644 src/exporters/stackdriver.ts diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index b81d65ed0..153639544 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -4,6 +4,4567 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@google-cloud/bigquery": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-0.9.6.tgz", + "integrity": "sha1-vqxtSGxF+AEKSAQ43klFJS/Ezq4=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "arrify": "1.0.1", + "duplexify": "3.5.4", + "extend": "3.0.1", + "is": "3.2.1", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1" + } + }, + "@google-cloud/bigtable": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@google-cloud/bigtable/-/bigtable-0.10.2.tgz", + "integrity": "sha1-NOZ5sZZH3uZ0Tj4e/lR71uvY2wE=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "@google-cloud/common-grpc": "0.4.3", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "dot-prop": "3.0.0", + "extend": "3.0.1", + "is": "3.2.1", + "lodash.flatten": "4.4.0", + "node-int64": "0.4.0", + "prop-assign": "1.0.0", + "pumpify": "1.4.0", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "@google-cloud/common": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", + "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", + "dev": true, + "requires": { + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "ent": "2.2.0", + "extend": "3.0.1", + "google-auto-auth": "0.7.2", + "is": "3.2.1", + "log-driver": "1.2.7", + "methmeth": "1.1.0", + "modelo": "4.2.3", + "request": "2.85.0", + "retry-request": "3.3.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "@google-cloud/common-grpc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.4.3.tgz", + "integrity": "sha512-A3nErp1qV8iCWPYQniBhot7Gx+kZHTAuRzOQyoPpfbv9pLmsvZgTWzVUg1/R1ncrirQElHUDhIFXPV+kr+UJAA==", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "dot-prop": "2.4.0", + "duplexify": "3.5.4", + "extend": "3.0.1", + "grpc": "1.10.0", + "is": "3.2.1", + "modelo": "4.2.3", + "retry-request": "3.3.1", + "through2": "2.0.3" + }, + "dependencies": { + "dot-prop": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-2.4.0.tgz", + "integrity": "sha1-hI4o9/HVB0DGdHqzywdnBGK2+Jw=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + } + } + }, + "@google-cloud/compute": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@google-cloud/compute/-/compute-0.8.0.tgz", + "integrity": "sha1-CiExGcAbja55/uMgdRYfSEZt5Ig=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "arrify": "1.0.1", + "async": "2.6.0", + "create-error-class": "3.0.2", + "extend": "3.0.1", + "gce-images": "0.3.3", + "is": "3.2.1", + "string-format-obj": "1.1.1" + } + }, + "@google-cloud/datastore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/datastore/-/datastore-1.4.0.tgz", + "integrity": "sha512-BwFlXHKnXzaydm9+6fEp5khASZvtYC5W5Pf6VXwwOmFmnFfXImGyFJpNov50tVnUw1qLJ8QiS1VD1iXpDCNLmQ==", + "dev": true, + "requires": { + "@google-cloud/common": "0.16.2", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "extend": "3.0.1", + "google-auto-auth": "0.9.7", + "google-gax": "0.16.0", + "google-proto-files": "0.15.1", + "is": "3.2.1", + "lodash.flatten": "4.4.0", + "lodash.merge": "4.6.1", + "prop-assign": "1.0.0", + "propprop": "0.3.1", + "safe-buffer": "5.1.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "through2": "2.0.3" + }, + "dependencies": { + "@google-cloud/common": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", + "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", + "dev": true, + "requires": { + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "ent": "2.2.0", + "extend": "3.0.1", + "google-auto-auth": "0.9.7", + "is": "3.2.1", + "log-driver": "1.2.7", + "methmeth": "1.1.0", + "modelo": "4.2.3", + "request": "2.85.0", + "retry-request": "3.3.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + } + } + }, + "@google-cloud/dlp": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@google-cloud/dlp/-/dlp-0.1.3.tgz", + "integrity": "sha1-xwbOK6Bj76xyAppRsfShdfknrGI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "google-gax": "0.13.5", + "google-proto-files": "0.12.1" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", + "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/dns": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@google-cloud/dns/-/dns-0.6.2.tgz", + "integrity": "sha1-CGgU407lw+DfF3fcEP3I3NJoob8=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "arrify": "1.0.1", + "dns-zonefile": "0.1.18", + "extend": "3.0.1", + "is": "3.2.1", + "methmeth": "1.1.0", + "string-format-obj": "1.1.1" + } + }, + "@google-cloud/firestore": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.8.2.tgz", + "integrity": "sha512-Z9hoiZIIn1MN7lUZE0pStvkrTdzJnSyFyxDJ4VojkzF/lL4EAUr9USyWXol6HZYcERPjXIasHSXXTYwuXx8tmA==", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "@google-cloud/common-grpc": "0.4.3", + "bun": "0.0.12", + "extend": "3.0.1", + "functional-red-black-tree": "1.0.1", + "google-gax": "0.14.5", + "grpc": "1.10.0", + "is": "3.2.1", + "through2": "2.0.3" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + }, + "google-gax": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.5.tgz", + "integrity": "sha512-3A6KbrtLDavrqZnnzurnSydRIJnyH+2Sm56fAvXciQ/62aEnSDaR43MCgWhtReCLVjeFjBiCEIdX5zV0LVLVBg==", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "7.1.1", + "google-auto-auth": "0.9.7", + "google-proto-files": "0.14.2", + "grpc": "1.7.3", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "grpc": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.3.tgz", + "integrity": "sha512-7zXQJlDXMr/ZaDqdaIchgclViyoWo8GQxZSmFUAxR8GwSr28b6/BTgF221WG+2W693jpp74XJ/+I9DcPXsgt9Q==", + "dev": true, + "requires": { + "arguejs": "0.2.3", + "lodash": "4.17.5", + "nan": "2.10.0", + "node-pre-gyp": "0.6.39", + "protobufjs": "5.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.1", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.2", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.0.9", + "osenv": "0.1.4" + } + } + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "dev": true, + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.1", + "yargs": "3.32.0" + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.4.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + } + } + }, + "google-proto-files": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.14.2.tgz", + "integrity": "sha512-wwm2TIlfTgAjDbjrxAb3akznO7vBM0PRLS6Xf2QfR3L7b0p+szD3iwOW0wMSFl3B0UbLv27hUVk+clePqCVmXA==", + "dev": true, + "requires": { + "globby": "7.1.1", + "power-assert": "1.4.4", + "prettier": "1.11.1", + "protobufjs": "6.8.6" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/language": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-0.12.1.tgz", + "integrity": "sha1-P57EQeuou+gDBwa5oJ4BFMFw/uE=", + "dev": true, + "requires": { + "extend": "3.0.1", + "google-gax": "0.13.5" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/logging": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-1.1.7.tgz", + "integrity": "sha512-qZ/lTJC07/78co4h3xj2OOzHM5E7X1KqWRujw0uiQs9f6Q5Bm0mgEqYnNM6BDpMbJhCr1ShLlc3s6XwzCyXF8g==", + "dev": true, + "requires": { + "@google-cloud/common": "0.16.2", + "@google-cloud/common-grpc": "0.6.0", + "arrify": "1.0.1", + "eventid": "0.1.2", + "extend": "3.0.1", + "gcp-metadata": "0.6.3", + "google-auto-auth": "0.9.7", + "google-gax": "0.15.0", + "google-proto-files": "0.15.1", + "is": "3.2.1", + "lodash.merge": "4.6.1", + "protobufjs": "6.8.6", + "pumpify": "1.4.0", + "snakecase-keys": "1.1.1", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + }, + "dependencies": { + "@google-cloud/common": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", + "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", + "dev": true, + "requires": { + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "ent": "2.2.0", + "extend": "3.0.1", + "google-auto-auth": "0.9.7", + "is": "3.2.1", + "log-driver": "1.2.7", + "methmeth": "1.1.0", + "modelo": "4.2.3", + "request": "2.85.0", + "retry-request": "3.3.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "@google-cloud/common-grpc": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.6.0.tgz", + "integrity": "sha512-b5i2auMeP+kPPPpWtZVgjbbbIB+3uDGw+Vww1QjG0SEQlahcGrwkCEaNLQit1R77m8ibxs+sTVa+AH/FNILAdQ==", + "dev": true, + "requires": { + "@google-cloud/common": "0.16.2", + "dot-prop": "4.2.0", + "duplexify": "3.5.4", + "extend": "3.0.1", + "grpc": "1.9.1", + "is": "3.2.1", + "modelo": "4.2.3", + "retry-request": "3.3.1", + "through2": "2.0.3" + } + }, + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + }, + "google-gax": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.15.0.tgz", + "integrity": "sha512-a+WBi3oiV3jQ0eLCIM0GAFe8vYQ10yYuXRnjhEEXFKSNd8nW6XSQ7YWqMLIod2Xnyu6JiSSymMBwCr5YSwQyRQ==", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "8.0.1", + "google-auto-auth": "0.9.7", + "google-proto-files": "0.15.1", + "grpc": "1.9.1", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + } + }, + "grpc": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.9.1.tgz", + "integrity": "sha512-WNW3MWMuAoo63AwIlzFE3T0KzzvNBSvOkg67Hm8WhvHNkXFBlIk1QyJRE3Ocm0O5eIwS7JU8Ssota53QR1zllg==", + "dev": true, + "requires": { + "lodash": "4.17.5", + "nan": "2.10.0", + "node-pre-gyp": "0.6.39", + "protobufjs": "5.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "1.0.3", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.4", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "2.2.1", + "tar-pack": "3.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "dev": true, + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.2", + "yargs": "3.32.0" + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/monitoring": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/monitoring/-/monitoring-0.3.0.tgz", + "integrity": "sha1-trJajKeBBT2b55grLpry2h7+2R8=", + "dev": true, + "requires": { + "extend": "3.0.1", + "google-gax": "0.13.5", + "google-proto-files": "0.12.1" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", + "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/prediction": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@google-cloud/prediction/-/prediction-0.6.2.tgz", + "integrity": "sha1-AGJTvxxENTDhLH1A40KP/gxHZcI=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "JSONStream": "1.3.2", + "arrify": "1.0.1", + "extend": "3.0.1", + "is": "3.2.1", + "pumpify": "1.4.0", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "@google-cloud/pubsub": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-0.14.8.tgz", + "integrity": "sha512-SarceyFmvq6xnn8pkirdjpP25O3GRFMzr2oO3OGEnA7K8l0ObPHjU6R+DJbOS5UVpP4Vi2vHj3w8XTDM18dicA==", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "@google-cloud/common-grpc": "0.4.3", + "arrify": "1.0.1", + "async-each": "1.0.1", + "extend": "3.0.1", + "google-auto-auth": "0.7.2", + "google-gax": "0.13.5", + "google-proto-files": "0.13.1", + "is": "3.2.1", + "lodash.snakecase": "4.1.1", + "uuid": "3.2.1" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/resource": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@google-cloud/resource/-/resource-0.7.3.tgz", + "integrity": "sha1-sYovOJ30XtSGnOQNtVQop4QW+q0=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "extend": "3.0.1", + "is": "3.2.1" + } + }, + "@google-cloud/spanner": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@google-cloud/spanner/-/spanner-0.7.1.tgz", + "integrity": "sha1-yFmgcuwJnZXmxtyHb7tOGcq8o9k=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "@google-cloud/common-grpc": "0.4.3", + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "checkpoint-stream": "0.1.1", + "events-intercept": "2.0.0", + "extend": "3.0.1", + "generic-pool": "3.4.2", + "google-gax": "0.13.5", + "google-proto-files": "0.12.1", + "is": "3.2.1", + "lodash.chunk": "4.2.0", + "lodash.flatten": "4.4.0", + "lodash.snakecase": "4.1.1", + "merge-stream": "1.0.1", + "methmeth": "1.1.0", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", + "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/speech": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@google-cloud/speech/-/speech-0.10.3.tgz", + "integrity": "sha1-ovMmiSkCW2C1yL0yRkNPimGHgHs=", + "dev": true, + "requires": { + "extend": "3.0.1", + "google-gax": "0.13.5", + "google-proto-files": "0.13.1", + "pumpify": "1.4.0", + "stream-events": "1.0.2", + "through2": "2.0.3" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/storage": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", + "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", + "dev": true, + "requires": { + "@google-cloud/common": "0.16.2", + "arrify": "1.0.1", + "async": "2.6.0", + "compressible": "2.0.13", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "extend": "3.0.1", + "gcs-resumable-upload": "0.9.0", + "hash-stream-validation": "0.2.1", + "is": "3.2.1", + "mime": "2.2.0", + "mime-types": "2.1.18", + "once": "1.4.0", + "pumpify": "1.4.0", + "request": "2.85.0", + "safe-buffer": "5.1.1", + "snakeize": "0.1.0", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + }, + "dependencies": { + "@google-cloud/common": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", + "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", + "dev": true, + "requires": { + "array-uniq": "1.0.3", + "arrify": "1.0.1", + "concat-stream": "1.6.1", + "create-error-class": "3.0.2", + "duplexify": "3.5.4", + "ent": "2.2.0", + "extend": "3.0.1", + "google-auto-auth": "0.9.7", + "is": "3.2.1", + "log-driver": "1.2.7", + "methmeth": "1.1.0", + "modelo": "4.2.3", + "request": "2.85.0", + "retry-request": "3.3.1", + "split-array-stream": "1.0.3", + "stream-events": "1.0.2", + "string-format-obj": "1.1.1", + "through2": "2.0.3" + } + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + } + } + }, + "@google-cloud/translate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/translate/-/translate-1.1.0.tgz", + "integrity": "sha512-UzllqCIb5aJys7qzX2pJ2eTrgJN8nd9TQurjPPBPoiIzuHojY5bTIdNUEEo01o1u9bQ/2trlaKEuwYXhoGXIww==", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "arrify": "1.0.1", + "extend": "3.0.1", + "is": "3.2.1", + "is-html": "1.1.0", + "propprop": "0.3.1" + } + }, + "@google-cloud/video-intelligence": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@google-cloud/video-intelligence/-/video-intelligence-0.3.2.tgz", + "integrity": "sha1-46Q7CN7CdE6WVX+lqt2l7qFs+KY=", + "dev": true, + "requires": { + "extend": "3.0.1", + "google-gax": "0.14.5", + "protobufjs": "6.8.6" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + }, + "google-gax": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.5.tgz", + "integrity": "sha512-3A6KbrtLDavrqZnnzurnSydRIJnyH+2Sm56fAvXciQ/62aEnSDaR43MCgWhtReCLVjeFjBiCEIdX5zV0LVLVBg==", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "7.1.1", + "google-auto-auth": "0.9.7", + "google-proto-files": "0.14.2", + "grpc": "1.7.3", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + } + }, + "google-proto-files": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.14.2.tgz", + "integrity": "sha512-wwm2TIlfTgAjDbjrxAb3akznO7vBM0PRLS6Xf2QfR3L7b0p+szD3iwOW0wMSFl3B0UbLv27hUVk+clePqCVmXA==", + "dev": true, + "requires": { + "globby": "7.1.1", + "power-assert": "1.4.4", + "prettier": "1.11.1", + "protobufjs": "6.8.6" + } + }, + "grpc": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.3.tgz", + "integrity": "sha512-7zXQJlDXMr/ZaDqdaIchgclViyoWo8GQxZSmFUAxR8GwSr28b6/BTgF221WG+2W693jpp74XJ/+I9DcPXsgt9Q==", + "dev": true, + "requires": { + "arguejs": "0.2.3", + "lodash": "4.17.5", + "nan": "2.10.0", + "node-pre-gyp": "0.6.39", + "protobufjs": "5.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.1", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.2", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.0.9", + "osenv": "0.1.4" + } + } + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "dev": true, + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.1", + "yargs": "3.32.0" + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.4.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@google-cloud/vision": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-0.12.0.tgz", + "integrity": "sha1-/6sKGODm6oQebE6BJzzUaAn98D4=", + "dev": true, + "requires": { + "@google-cloud/common": "0.13.6", + "async": "2.6.0", + "extend": "3.0.1", + "google-gax": "0.13.5", + "google-proto-files": "0.12.1", + "is": "3.2.1" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-auto-auth": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", + "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "dev": true, + "requires": { + "async": "2.6.0", + "google-auth-library": "0.10.0", + "object-assign": "3.0.0", + "request": "2.85.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "google-gax": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", + "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", + "dev": true, + "requires": { + "extend": "3.0.1", + "globby": "6.1.0", + "google-auto-auth": "0.5.4", + "google-proto-files": "0.13.1", + "grpc": "1.10.0", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "process-nextick-args": "1.0.7", + "protobufjs": "6.8.6", + "readable-stream": "2.3.5", + "through2": "2.0.3" + }, + "dependencies": { + "google-proto-files": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", + "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", + "dev": true + } + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "google-proto-files": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", + "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", + "dev": true + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/inquire": "1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true + }, "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", @@ -28,6 +4589,12 @@ "@types/node": "9.4.7" } }, + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==", + "dev": true + }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", @@ -61,6 +4628,146 @@ "@types/node": "9.4.7" } }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "acorn-es7-plugin": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", + "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "arguejs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/arguejs/-/arguejs-0.2.3.tgz", + "integrity": "sha1-tvk59f4OPNHz+T4qqSYkJL8xKvc=", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "dev": true, + "requires": { + "colour": "0.7.1", + "optjs": "3.2.2" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, "async-listener": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", @@ -75,12 +4782,97 @@ "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "dev": true, + "requires": { + "follow-redirects": "1.4.1", + "is-buffer": "1.1.6" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + } + } + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -91,53 +4883,582 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", "dev": true }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "bun": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", + "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", + "dev": true, "requires": { - "async-listener": "0.6.9", - "emitter-listener": "1.1.1" + "readable-stream": "1.0.34" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "dev": true, "requires": { - "ms": "2.0.0" + "long": "3.2.0" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, - "emitter-listener": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", - "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "call-signature": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", + "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "checkpoint-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/checkpoint-stream/-/checkpoint-stream-0.1.1.tgz", + "integrity": "sha1-WQiFEfviO20sHoLq8C8oRZZn9jc=", + "dev": true, "requires": { - "shimmer": "1.2.0" + "events-intercept": "2.0.0", + "pumpify": "1.4.0", + "split-array-stream": "1.0.3", + "through2": "2.0.3" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + } + } + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "0.6.9", + "emitter-listener": "1.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "d64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d64/-/d64-1.0.0.tgz", + "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diff-match-patch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", + "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "dns-zonefile": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/dns-zonefile/-/dns-zonefile-0.1.18.tgz", + "integrity": "sha1-dWnHNx29/VC/jlPi2gdAZ5KSKZ4=", + "dev": true + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "stream-shift": "1.0.0" + } + }, + "eastasianwidth": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", + "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "dev": true, + "requires": { + "base64url": "2.0.0", + "safe-buffer": "5.1.1" + } + }, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "requires": { + "shimmer": "1.2.0" + } + }, + "empower": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", + "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "empower-core": "0.6.2" + } + }, + "empower-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", + "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", + "dev": true, + "requires": { + "call-signature": "0.0.2", + "core-js": "2.5.3" } }, "end-of-stream": { @@ -148,163 +5469,4161 @@ "once": "1.4.0" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "fs.realpath": { + "espurify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", + "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", + "dev": true, + "requires": { + "core-js": "2.5.3" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "eventid": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/eventid/-/eventid-0.1.2.tgz", + "integrity": "sha1-CyMtPiROpbHVKJhBQOpprH7IkhU=", + "dev": true, + "requires": { + "d64": "1.0.0", + "uuid": "3.2.1" + } + }, + "events-intercept": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz", + "integrity": "sha1-rb84aBxaSyARxB7kH2GjTLpEiJc=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-glob": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", + "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.1", + "micromatch": "3.1.9" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "dev": true, + "requires": { + "debug": "3.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gce-images": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/gce-images/-/gce-images-0.3.3.tgz", + "integrity": "sha512-J+/kX80uYl8sz0zT1P9KlLzMBpzC6rSFFwh3BSXMNfZsVk3r0hXBj/mUOKiJ8EUVjs7AbeGFGLCS8Pz3LhfccA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "async": "1.5.2", + "google-auto-auth": "0.7.2", + "got": "4.2.0", + "object-assign": "3.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "gcp-metadata": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", + "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", + "dev": true, + "requires": { + "axios": "0.18.0", + "extend": "3.0.1", + "retry-axios": "0.3.2" + } + }, + "gcs-resumable-upload": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", + "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", + "dev": true, + "requires": { + "buffer-equal": "1.0.0", + "configstore": "3.1.1", + "google-auto-auth": "0.9.7", + "pumpify": "1.4.0", + "request": "2.85.0", + "stream-events": "1.0.2", + "through2": "2.0.3" + }, + "dependencies": { + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + } + } + }, + "generic-pool": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", + "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "google-auth-library": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", + "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", + "dev": true, + "requires": { + "axios": "0.18.0", + "gcp-metadata": "0.6.3", + "gtoken": "2.2.0", + "jws": "3.1.4", + "lodash.isstring": "4.0.1", + "lru-cache": "4.1.2", + "retry-axios": "0.3.2" + } + }, + "google-auto-auth": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", + "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.3.1", + "google-auth-library": "0.10.0", + "request": "2.85.0" + }, + "dependencies": { + "gcp-metadata": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", + "integrity": "sha512-5kJPX/RXuqoLmHiOOgkSDk/LI0QaXpEvZ3pvQP4ifjGGDKZKVSOjL/GcDjXA5kLxppFCOjmmsu0Uoop9d1upaQ==", + "dev": true, + "requires": { + "extend": "3.0.1", + "retry-request": "3.3.1" + } + }, + "google-auth-library": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", + "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "dev": true, + "requires": { + "gtoken": "1.2.3", + "jws": "3.1.4", + "lodash.noop": "3.0.1", + "request": "2.85.0" + } + }, + "google-p12-pem": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", + "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "dev": true, + "requires": { + "node-forge": "0.7.4" + } + }, + "gtoken": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "dev": true, + "requires": { + "google-p12-pem": "0.1.2", + "jws": "3.1.4", + "mime": "1.6.0", + "request": "2.85.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "google-cloud": { + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/google-cloud/-/google-cloud-0.57.0.tgz", + "integrity": "sha1-r+wKoY7K5TnBotJVVtcM152H3+U=", + "dev": true, + "requires": { + "@google-cloud/bigquery": "0.9.6", + "@google-cloud/bigtable": "0.10.2", + "@google-cloud/compute": "0.8.0", + "@google-cloud/datastore": "1.4.0", + "@google-cloud/dlp": "0.1.3", + "@google-cloud/dns": "0.6.2", + "@google-cloud/firestore": "0.8.2", + "@google-cloud/language": "0.12.1", + "@google-cloud/logging": "1.1.7", + "@google-cloud/monitoring": "0.3.0", + "@google-cloud/prediction": "0.6.2", + "@google-cloud/pubsub": "0.14.8", + "@google-cloud/resource": "0.7.3", + "@google-cloud/spanner": "0.7.1", + "@google-cloud/speech": "0.10.3", + "@google-cloud/storage": "1.6.0", + "@google-cloud/translate": "1.1.0", + "@google-cloud/video-intelligence": "0.3.2", + "@google-cloud/vision": "0.12.0", + "extend": "3.0.1" + } + }, + "google-gax": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.16.0.tgz", + "integrity": "sha512-sslPB7USGD8SrVUGlWFIGYVZrgZ6oj+fWUEW3f8Bk43+nxqeLyrNoI3iFBRpjLfwMCEYaXVziWNmatwLRP8azg==", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "extend": "3.0.1", + "globby": "8.0.1", + "google-auto-auth": "0.9.7", + "google-proto-files": "0.15.1", + "grpc": "1.9.1", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "protobufjs": "6.8.6", + "through2": "2.0.3" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "google-auto-auth": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", + "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "gcp-metadata": "0.6.3", + "google-auth-library": "1.3.2", + "request": "2.85.0" + } + }, + "grpc": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.9.1.tgz", + "integrity": "sha512-WNW3MWMuAoo63AwIlzFE3T0KzzvNBSvOkg67Hm8WhvHNkXFBlIk1QyJRE3Ocm0O5eIwS7JU8Ssota53QR1zllg==", + "dev": true, + "requires": { + "lodash": "4.17.5", + "nan": "2.10.0", + "node-pre-gyp": "0.6.39", + "protobufjs": "5.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "1.0.3", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.4", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "2.2.1", + "tar-pack": "3.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "dev": true, + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.2", + "yargs": "3.32.0" + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "google-p12-pem": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", + "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", + "dev": true, + "requires": { + "node-forge": "0.7.4", + "pify": "3.0.0" + } + }, + "google-proto-files": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.15.1.tgz", + "integrity": "sha512-ebtmWgi/ooR5Nl63qRVZZ6VLM6JOb5zTNxTT/ZAU8yfMOdcauoOZNNMOVg0pCmTjqWXeuuVbgPP0CwO5UHHzBQ==", + "dev": true, + "requires": { + "globby": "7.1.1", + "power-assert": "1.4.4", + "protobufjs": "6.8.6" + }, + "dependencies": { + "@types/node": { + "version": "8.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "protobufjs": { + "version": "6.8.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", + "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", + "dev": true, + "requires": { + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.5", + "long": "4.0.0" + } + } + } + }, + "googleapis": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-27.0.0.tgz", + "integrity": "sha512-Cz0BRsZmewc21N50x5nAUW5cqaGhJ9ETQKZMGqGL4BxmCV7ETELazSqmNi4oCDeRwM4Iub/fIJWAWZk2i6XLCg==", + "dev": true, + "requires": { + "google-auth-library": "1.3.2", + "pify": "3.0.0", + "qs": "6.5.1", + "string-template": "1.0.0", + "uuid": "3.2.1" + } + }, + "got": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/got/-/got-4.2.0.tgz", + "integrity": "sha1-r1n0YYNL+v1yLLoBrPTBSp3V2gY=", + "dev": true, + "requires": { + "create-error-class": "2.0.1", + "duplexify": "3.5.4", + "is-plain-obj": "1.1.0", + "is-redirect": "1.0.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "node-status-codes": "1.0.0", + "object-assign": "3.0.0", + "parse-json": "2.2.0", + "pinkie-promise": "1.0.0", + "prepend-http": "1.0.4", + "read-all-stream": "3.1.0", + "timed-out": "2.0.0", + "unzip-response": "1.0.2" + }, + "dependencies": { + "create-error-class": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-2.0.1.tgz", + "integrity": "sha1-qHWe1cjSFKRh6B0Y5wqssz3WPJw=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0", + "inherits": "2.0.3" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "grpc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.10.0.tgz", + "integrity": "sha512-g6Na2dgNusGvSM1ud4hwDaajNP4VSPQhGHnRXzbGNbQJIqGpJhRl7GRgYxTP8rYozqCx2NaT74UL37o8nb0GKA==", + "dev": true, + "requires": { + "lodash": "4.17.5", + "nan": "2.10.0", + "node-pre-gyp": "0.6.39", + "protobufjs": "5.0.2" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "requires": { + "detect-libc": "1.0.3", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.4", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "2.2.1", + "tar-pack": "3.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "gtoken": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", + "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", + "dev": true, + "requires": { + "axios": "0.18.0", + "google-p12-pem": "1.0.2", + "jws": "3.1.4", + "mime": "2.2.0", + "pify": "3.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-stream-validation": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", + "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "html-tags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz", + "integrity": "sha1-x43mW1Zjqll5id0rerSSANfk25g=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-html": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz", + "integrity": "sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ=", + "dev": true, + "requires": { + "html-tags": "1.2.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-stream-ended": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.3.tgz", + "integrity": "sha1-oEc7Jnx1ZjVIa+7cfjNE5UnRUqw=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "dev": true, + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "5.1.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "dev": true, + "requires": { + "base64url": "2.0.0", + "jwa": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, + "lodash.noop": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", + "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.5" + } + }, + "merge2": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "dev": true + }, + "methmeth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", + "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "mime": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", + "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", + "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "modelo": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", + "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==", + "dev": true + }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "node-forge": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", + "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", + "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", + "dev": true + }, + "pinkie-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", + "dev": true, + "requires": { + "pinkie": "1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "power-assert": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.4.4.tgz", + "integrity": "sha1-kpXqdDcZb1pgH95CDwQmMRhtdRc=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "empower": "1.2.3", + "power-assert-formatter": "1.4.1", + "universal-deep-strict-equal": "1.2.2", + "xtend": "4.0.1" + } + }, + "power-assert-context-formatter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", + "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "power-assert-context-traversal": "1.1.1" + } + }, + "power-assert-context-reducer-ast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", + "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", + "dev": true, + "requires": { + "acorn": "4.0.13", + "acorn-es7-plugin": "1.1.7", + "core-js": "2.5.3", + "espurify": "1.7.0", + "estraverse": "4.2.0" + } + }, + "power-assert-context-traversal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", + "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "estraverse": "4.2.0" + } + }, + "power-assert-formatter": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", + "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "power-assert-context-formatter": "1.1.1", + "power-assert-context-reducer-ast": "1.1.2", + "power-assert-renderer-assertion": "1.1.1", + "power-assert-renderer-comparison": "1.1.1", + "power-assert-renderer-diagram": "1.1.2", + "power-assert-renderer-file": "1.1.1" + } + }, + "power-assert-renderer-assertion": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", + "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", + "dev": true, + "requires": { + "power-assert-renderer-base": "1.1.1", + "power-assert-util-string-width": "1.1.1" + } + }, + "power-assert-renderer-base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", + "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", + "dev": true + }, + "power-assert-renderer-comparison": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", + "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "diff-match-patch": "1.0.0", + "power-assert-renderer-base": "1.1.1", + "stringifier": "1.3.0", + "type-name": "2.0.2" + } + }, + "power-assert-renderer-diagram": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", + "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "power-assert-renderer-base": "1.1.1", + "power-assert-util-string-width": "1.1.1", + "stringifier": "1.3.0" + } + }, + "power-assert-renderer-file": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", + "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", + "dev": true, + "requires": { + "power-assert-renderer-base": "1.1.1" + } + }, + "power-assert-util-string-width": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", + "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", + "dev": true, + "requires": { + "eastasianwidth": "0.1.1" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", + "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "prop-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prop-assign/-/prop-assign-1.0.0.tgz", + "integrity": "sha1-l2eh+/1wk5CGR6boRtMbT+qnBFk=", + "dev": true + }, + "propprop": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz", + "integrity": "sha1-oEmjVouJZEAGfRXY7J8zc15XAXg=", + "dev": true + }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "dev": true, + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.2", + "yargs": "3.32.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1", + "readable-stream": "2.3.5" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + } + } + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.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.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "require-in-the-middle": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", + "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", + "requires": { + "module-details-from-path": "1.0.3", + "resolve": "1.5.0" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry-axios": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", + "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==", + "dev": true + }, + "retry-request": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", + "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", + "dev": true, + "requires": { + "request": "2.85.0", + "through2": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "snakecase-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-1.1.1.tgz", + "integrity": "sha512-/7I66rMhAag18IH5o0jtWWCJH/f2cvICwBcSS+SBUxsorbDeBu4UvYDNlAn3MrHfk6re0rUECwaPhsZuV2P9Ng==", "dev": true, "requires": { - "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" + "map-obj": "2.0.0", + "to-snake-case": "0.1.2" } }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", "dev": true }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + } + } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "split-array-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", + "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", "dev": true, "requires": { - "minimist": "0.0.8" + "async": "2.6.0", + "is-stream-ended": "0.1.3" } }, - "mocha": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", - "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "extend-shallow": "3.0.2" } }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "stream-events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.2.tgz", + "integrity": "sha1-q/OfZsCJCk63lbyNXoWbJhW1kLI=", + "dev": true, "requires": { - "wrappy": "1.0.2" + "stubs": "3.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "string-format-obj": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", + "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==", + "dev": true }, - "require-in-the-middle": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", - "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", + "string-template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", + "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, "requires": { - "module-details-from-path": "1.0.3", - "resolve": "1.5.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, "requires": { - "path-parse": "1.0.5" + "safe-buffer": "5.1.1" } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "stringifier": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", + "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "traverse": "0.6.6", + "type-name": "2.0.2" + } }, - "shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "dev": true }, "supports-color": { "version": "4.4.0", @@ -315,21 +9634,351 @@ "has-flag": "2.0.0" } }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.5", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", + "dev": true + }, + "to-no-case": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-0.1.1.tgz", + "integrity": "sha1-zzPHDg8oFo2V5BWavxUOjFQu+f4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "to-snake-case": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-0.1.2.tgz", + "integrity": "sha1-0Ee22/BI2uG9wmCzwpb1TKNO7Xw=", + "dev": true, + "requires": { + "to-space-case": "0.1.2" + } + }, + "to-space-case": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-0.1.2.tgz", + "integrity": "sha1-mma+Pr5T8nefaH8CYu/9H8W20V4=", + "dev": true, + "requires": { + "to-no-case": "0.1.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typescript": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universal-deep-strict-equal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", + "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", + "dev": true, + "requires": { + "array-filter": "1.0.0", + "indexof": "0.0.1", + "object-keys": "1.0.11" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 932edccdf..ab2471763 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -27,6 +27,8 @@ "@types/semver": "^5.5.0", "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", + "google-cloud": "^0.57.0", + "googleapis": "27.0.0", "mocha": "^5.0.4", "typescript": "^2.7.2" }, diff --git a/src/exporters/stackdriver.ts b/src/exporters/stackdriver.ts new file mode 100644 index 000000000..b3df2b5f4 --- /dev/null +++ b/src/exporters/stackdriver.ts @@ -0,0 +1,122 @@ +import {debug} from '../internal/util' +import {google} from 'googleapis' +import { JWT } from 'google-auth-library'; +//import { auth } from 'google-auth-library' +//import { request } from 'http'; +const cloudTrace = google.cloudtrace('v1') +var uuidv4 = require('uuid/v4'); + +export class Stackdriver { + projectId: string; + + // TODO: Pass a stackdriver options objetc instead + constructor(projectId: string) { + this.projectId = projectId; + } + + emit() { + let resource = this.generateResource("cesar-opencensus", + "2018-03-21T19:36:49.074Z", + "2018-03-21T19:36:49.242Z") + this.authorize(function(projectId, authClient, resource) { + let request = { + projectId: projectId, + resource: resource, + auth: authClient + } + cloudTrace.projects.patchTraces(request, function(err) { + if (err) { + debug(err); + return; + } else { + debug(JSON.stringify(request.resource)); + } + }) + }, resource); + } + + private generateTraceId() { + let traceId = uuidv4().replace(/-/g, ''); + return traceId; + } + + private generateSpanId() { + const spanIdMax = Math.pow(10, 17); + const spanIdMin = Math.pow(10, 16); + + const spanId = Math.random() * (spanIdMax - spanIdMin) + spanIdMin; + return spanId.toString(); + } + + private generateSpanName() { + const spanIdMax = Math.pow(10, 3); + const spanIdMin = Math.pow(10, 2); + + const spanIdNum = Math.random() * (spanIdMax - spanIdMin) + spanIdMin; + return 'Test' + spanIdNum.toString().substring(0, 2); + } + + private generateResource(projectId, startTime, endTime) { + let resource = { + "traces": [ + { + "projectId": "cesar-opencensus", + "traceId": this.generateTraceId(), + "spans": [ + { + "spanId": this.generateSpanId(), + "kind": "RPC_CLIENT", + "name": this.generateSpanName(), + //"startTime": startTime.toISOString(), + //"endTime": endTime.toISOString() + "startTime": startTime, + "endTime": endTime + } + ] + } + ] + } + return resource; + } + + private generateRequest(projectId, authClient, startTime, endTime) { + let request = { + projectId: projectId, + resource: { + "traces": [ + { + "projectId": "cesar-opencensus", + "traceId": this.generateTraceId(), + "spans": [ + { + "spanId": this.generateSpanId(), + "kind": "RPC_CLIENT", + "name": this.generateSpanName(), + //"startTime": startTime.toISOString(), + //"endTime": endTime.toISOString() + "startTime": startTime, + "endTime": endTime + } + ] + } + ] + }, + auth: authClient + } + return request; + } + + private authorize(callback, resource) { + google.auth.getApplicationDefault(function(err, authClient: JWT, projectId) { + if (err) { + console.error('authentication failed: ', err); + return; + } + if (authClient.createScopedRequired && authClient.createScopedRequired()) { + var scopes = ['https://www.googleapis.com/auth/cloud-platform']; + authClient = authClient.createScoped(scopes); + } + callback(projectId, authClient, resource); + }); + } +} \ No newline at end of file From a221c639c0a10c0d8368272860def829be22974f Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Thu, 22 Mar 2018 09:48:07 -0300 Subject: [PATCH 008/110] added test-tracemanager --- .../opencensus-core/test/test-tracemanager.ts | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 packages/opencensus-core/test/test-tracemanager.ts diff --git a/packages/opencensus-core/test/test-tracemanager.ts b/packages/opencensus-core/test/test-tracemanager.ts new file mode 100644 index 000000000..30d66cf7e --- /dev/null +++ b/packages/opencensus-core/test/test-tracemanager.ts @@ -0,0 +1,81 @@ +import { TraceManager } from '../src/trace/tracemanager'; +import { Trace } from '../src/trace/trace'; +import { Span } from '../src/trace/span'; + +let assert = require('assert'); + +describe('TraceManager', function () { + describe('new TraceManager()', function () { + it('should be a TraceManager instance', function () { + let traceManager = new TraceManager(); + assert.ok(traceManager instanceof TraceManager); + }); + }); + + describe('start()', function () { + let traceManager = new TraceManager(); + let traceManagerStarted = traceManager.start(); + + it('should return a TraceManager instance', function () { + assert.ok(traceManagerStarted instanceof TraceManager); + }); + + it('should set true on active property', function () { + assert.ok(traceManagerStarted.active); + }); + }); + + describe('startTrace()', function () { + let traceManager; + let trace; + + before(() => { + traceManager = new TraceManager(); + trace = traceManager.startTrace(); + }) + + it('should return a Trace instance', function () { + assert.ok(trace instanceof Trace); + }); + + it('the new trace was set as current trace', function () { + assert.equal(traceManager.currentTrace.id, trace.id); + }); + + it('the new trace was started', function () { + assert.ok(trace.started); + }); + }); + + describe('endTrace()', function () { + it('the current trace was ended', function () { + let traceManager = new TraceManager(); + let trace = traceManager.startTrace(); + traceManager.endTrace(); + assert.ok(trace.ended); + }); + }); + + describe('clearCurrentTrace()', function () { + it('the current trace is null', function () { + let traceManager = new TraceManager(); + let trace = traceManager.startTrace(); + traceManager.clearCurrentTrace(); + assert.ok(traceManager.currentTrace == null); + }); + }); + + describe('startSpan()', function () { + let traceManager = new TraceManager(); + let trace = traceManager.startTrace(); + let span = traceManager.startSpan("spanName", "spanType"); + it('should return a Span instance', function () { + assert.ok(span instanceof Span); + }); + + it('span was started', function () { + assert.ok(span.started); + }); + }); + +}); \ No newline at end of file From 5c853bf39c0193fbaaac23c74164a24cd302ae1a Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Thu, 22 Mar 2018 10:07:51 -0300 Subject: [PATCH 009/110] finished interfaces creation --- packages/opencensus-core/src/exporters | 3 +++ src/exporters/stackdrive/options.ts | 9 +++++++++ src/exporters/{ => stackdrive}/stackdriver.ts | 8 +++++--- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 packages/opencensus-core/src/exporters create mode 100644 src/exporters/stackdrive/options.ts rename src/exporters/{ => stackdrive}/stackdriver.ts (94%) diff --git a/packages/opencensus-core/src/exporters b/packages/opencensus-core/src/exporters new file mode 100644 index 000000000..25c469e55 --- /dev/null +++ b/packages/opencensus-core/src/exporters @@ -0,0 +1,3 @@ +export interface ExporterOptions { + +} \ No newline at end of file diff --git a/src/exporters/stackdrive/options.ts b/src/exporters/stackdrive/options.ts new file mode 100644 index 000000000..15cb9f8f6 --- /dev/null +++ b/src/exporters/stackdrive/options.ts @@ -0,0 +1,9 @@ +import { ExporterOptions } from "../exporterOptions"; + +export class StackdriveOptions implements ExporterOptions { + projectId: string; + + constructor(projectId: string) { + this.projectId = projectId; + } +} \ No newline at end of file diff --git a/src/exporters/stackdriver.ts b/src/exporters/stackdrive/stackdriver.ts similarity index 94% rename from src/exporters/stackdriver.ts rename to src/exporters/stackdrive/stackdriver.ts index b3df2b5f4..53c144aa9 100644 --- a/src/exporters/stackdriver.ts +++ b/src/exporters/stackdrive/stackdriver.ts @@ -1,17 +1,19 @@ import {debug} from '../internal/util' import {google} from 'googleapis' import { JWT } from 'google-auth-library'; +import { Exporter } from './exporter'; +import { StackdriveOptions } from './options'; //import { auth } from 'google-auth-library' //import { request } from 'http'; const cloudTrace = google.cloudtrace('v1') var uuidv4 = require('uuid/v4'); -export class Stackdriver { +export class Stackdriver implements Exporter { projectId: string; // TODO: Pass a stackdriver options objetc instead - constructor(projectId: string) { - this.projectId = projectId; + constructor(options: StackdriveOptions) { + this.projectId = options.projectId; } emit() { From 994b9bc486c37eb7f864eb8b33d1516cdab77eaf Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 22 Mar 2018 13:50:13 -0300 Subject: [PATCH 010/110] Fix end trace --- .../opencensus-core/src/trace/model/tracer.ts | 14 +++++++- src/exporters/stackdriver.ts | 35 ++++++++++--------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index a60cb09d9..6e5c30def 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -19,6 +19,7 @@ import {Trace} from './trace' import {Span} from './span' import {PluginLoader} from './plugins/pluginloader' import {debug} from '../internal/util' +import {Stackdriver} from '../exporters/stackdriver' export type Func = (...args: any[]) => T; @@ -29,6 +30,7 @@ export class TraceManager { private _active: boolean; private contextManager: cls.Namespace; private pluginLoader: PluginLoader; + private exporter //TODO: temp solution private endedTraces: Trace[] = []; @@ -37,6 +39,7 @@ export class TraceManager { this._active = false; this.contextManager = cls.createNamespace(); this.pluginLoader = new PluginLoader(this); + this.exporter = new Stackdriver('opencensus-cesar'); } public get currentTrace(): Trace { @@ -64,10 +67,13 @@ export class TraceManager { return newTrace; } - public endTrace():void { + public endTrace(): void { if (!this.currentTrace) return debug('cannot end trace - no active trace found') this.currentTrace.end(); + this.exporter.emit(this.currentTrace); this.addEndedTrace(this.currentTrace); + //this.clearCurrentTrace(); + this.startTrace(); } public clearCurrentTrace() { @@ -84,6 +90,12 @@ export class TraceManager { return newSpan; } + /*public endSpan(span: Span) { + debug('END SPAN', span); + span.end(); + this.exporter.emit(this.currentTrace); + }*/ + private addEndedTrace(trace: Trace) { if (this.active) { diff --git a/src/exporters/stackdriver.ts b/src/exporters/stackdriver.ts index b3df2b5f4..56adb4109 100644 --- a/src/exporters/stackdriver.ts +++ b/src/exporters/stackdriver.ts @@ -1,8 +1,6 @@ import {debug} from '../internal/util' import {google} from 'googleapis' import { JWT } from 'google-auth-library'; -//import { auth } from 'google-auth-library' -//import { request } from 'http'; const cloudTrace = google.cloudtrace('v1') var uuidv4 = require('uuid/v4'); @@ -14,25 +12,28 @@ export class Stackdriver { this.projectId = projectId; } - emit() { + emit(trace) { + debug('CURRENT TRACE ', trace) let resource = this.generateResource("cesar-opencensus", "2018-03-21T19:36:49.074Z", "2018-03-21T19:36:49.242Z") - this.authorize(function(projectId, authClient, resource) { - let request = { - projectId: projectId, - resource: resource, - auth: authClient + this.authorize(this.sendTrace, resource); + } + + sendTrace(projectId, authClient, resource) { + let request = { + projectId: projectId, + resource: resource, + auth: authClient + } + cloudTrace.projects.patchTraces(request, function(err) { + if (err) { + debug(err); + return; + } else { + debug(JSON.stringify(request.resource)); } - cloudTrace.projects.patchTraces(request, function(err) { - if (err) { - debug(err); - return; - } else { - debug(JSON.stringify(request.resource)); - } - }) - }, resource); + }) } private generateTraceId() { From 50d266dcb389dbf5027ddafc8e120e3ae564a949 Mon Sep 17 00:00:00 2001 From: Luana Martins Date: Thu, 22 Mar 2018 16:13:45 -0300 Subject: [PATCH 011/110] Add license on the unit tests --- packages/opencensus-core/test/test-span.ts | 16 ++++++++++++++++ packages/opencensus-core/test/test-trace.ts | 16 ++++++++++++++++ .../opencensus-core/test/test-tracemanager.ts | 16 ++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index ad966094f..8c7f539c6 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -1,3 +1,19 @@ +/** + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { Span } from '../src/trace/span'; import { Trace } from '../src/trace/trace'; diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index a418c7627..c5b1f0776 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -1,3 +1,19 @@ +/** + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { Trace } from '../src/trace/trace'; import { Span } from '../src/trace/span'; diff --git a/packages/opencensus-core/test/test-tracemanager.ts b/packages/opencensus-core/test/test-tracemanager.ts index 30d66cf7e..940aaf4a1 100644 --- a/packages/opencensus-core/test/test-tracemanager.ts +++ b/packages/opencensus-core/test/test-tracemanager.ts @@ -1,3 +1,19 @@ +/** + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { TraceManager } from '../src/trace/tracemanager'; import { Trace } from '../src/trace/trace'; import { Span } from '../src/trace/span'; From 3cf908a25968008a8faa8dcb0779ef488e001df2 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 22 Mar 2018 21:47:31 -0300 Subject: [PATCH 012/110] Changing class name TraceManger to Tracer, creating class Tracing. Moving class files Span.ts, Trace.ts and Tracer.ts to trace/model --- .../src/trace/instrumentation/types.ts | 2 +- .../opencensus-core/src/trace/model/span.ts | 12 +++++------ .../trace/model/{root-span.ts => trace.ts} | 8 +++---- .../opencensus-core/src/trace/model/tracer.ts | 21 +++++++------------ .../src/trace/types/tracetypes.ts | 2 +- 5 files changed, 19 insertions(+), 26 deletions(-) rename packages/opencensus-core/src/trace/model/{root-span.ts => trace.ts} (89%) diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index de458eb9e..c7ef4e3e2 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -15,7 +15,7 @@ */ export interface Plugin { - applyPatch: (module: any, manager: TM, version: string) => void; + applyPatch(module: any, manager: TM, version: string): void; } export abstract class BasePlugin { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 2e9ee7b99..fe297ba8c 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {Clock} from '../internal/clock'; +import {Clock} from '../../internal/clock'; import {Trace} from './trace'; -import {debug, randomSpanId} from '../internal/util' -import {TracerComponent} from './types/tracetypes' +import {debug, randomSpanId} from '../../internal/util' +import {TraceBaseModel} from '../types/tracetypes' -export class Span extends TracerComponent { +export class Span extends TraceBaseModel { - private trace: TracerComponent; + private trace: TraceBaseModel; private _parentSpanId: string; - constructor(trace: TracerComponent) { + constructor(trace: TraceBaseModel) { super() this.trace = trace; this.setId(randomSpanId()); diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/trace.ts similarity index 89% rename from packages/opencensus-core/src/trace/model/root-span.ts rename to packages/opencensus-core/src/trace/model/trace.ts index 7712d63b8..c0f6529f0 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -15,12 +15,12 @@ */ import {Span} from './span' -import {Clock} from '../internal/clock' +import {Clock} from '../../internal/clock' import * as uuid from 'uuid'; -import {debug} from '../internal/util' -import {TracerComponent} from './types/tracetypes' +import {debug} from '../../internal/util' +import {TraceBaseModel} from '../types/tracetypes' -export class Trace extends TracerComponent { +export class Trace extends TraceBaseModel { private spans: Span[] = []; diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 0baabd489..b3dedb905 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -14,24 +14,21 @@ * limitations under the License. */ -import * as cls from '../internal/cls'; +import * as cls from '../../internal/cls'; import {Trace} from './trace' import {Span} from './span' -import {PluginLoader} from './plugins/pluginloader' -import {debug} from '../internal/util' -import {Stackdriver} from '../exporters/stackdriver/stackdriver' -import {StackdriverOptions} from '../exporters/stackdriver/options' +import {debug} from '../../internal/util' +import {Stackdriver} from '../../exporters/stackdriver/stackdriver' +import {StackdriverOptions} from '../../exporters/stackdriver/options' export type Func = (...args: any[]) => T; -export class TraceManager { +export class Tracer { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express'] private _active: boolean; private contextManager: cls.Namespace; - private pluginLoader: PluginLoader; - private exporter //TODO: temp solution private endedTraces: Trace[] = []; @@ -39,8 +36,6 @@ export class TraceManager { constructor() { this._active = false; this.contextManager = cls.createNamespace(); - this.pluginLoader = new PluginLoader(this); - this.exporter = new Stackdriver(new StackdriverOptions('opencensus-cesar')); } public get currentTrace(): Trace { @@ -51,8 +46,7 @@ export class TraceManager { this.contextManager.set('trace', trace); } - public start(config?:Object): TraceManager { - this.pluginLoader.loadPlugins(this.PLUGINS); + public start(config?:Object): Tracer { this._active = true; return this; } @@ -71,10 +65,8 @@ export class TraceManager { public endTrace(): void { if (!this.currentTrace) return debug('cannot end trace - no active trace found') this.currentTrace.end(); - this.exporter.emit(this.currentTrace); this.addEndedTrace(this.currentTrace); //this.clearCurrentTrace(); - this.startTrace(); } public clearCurrentTrace() { @@ -102,6 +94,7 @@ export class TraceManager { if (this.active) { //TODO: temp solution this.endedTraces.push(trace); +// this.exporter.emit(this.currentTrace); } } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 759c18d19..83aeec942 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -21,7 +21,7 @@ import {debug, randomSpanId} from '../../internal/util' export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } -export abstract class TracerComponent { +export abstract class TraceBaseModel { private _className: string; private _id: string; From 7af710f4aefda449b1ab01a9ad18956aa5bf633f Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 22 Mar 2018 21:47:31 -0300 Subject: [PATCH 013/110] Changing class name TraceManger to Tracer, creating class Tracing. Moving class files Span.ts, Trace.ts and Tracer.ts to trace/model --- .../src/trace/instrumentation/types.ts | 2 +- .../opencensus-core/src/trace/model/span.ts | 12 ++++---- .../trace/model/{root-span.ts => trace.ts} | 8 ++--- .../opencensus-core/src/trace/model/tracer.ts | 29 ++++++++----------- .../src/trace/types/tracetypes.ts | 2 +- 5 files changed, 24 insertions(+), 29 deletions(-) rename packages/opencensus-core/src/trace/model/{root-span.ts => trace.ts} (89%) diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index de458eb9e..c7ef4e3e2 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -15,7 +15,7 @@ */ export interface Plugin { - applyPatch: (module: any, manager: TM, version: string) => void; + applyPatch(module: any, manager: TM, version: string): void; } export abstract class BasePlugin { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 2e9ee7b99..fe297ba8c 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import {Clock} from '../internal/clock'; +import {Clock} from '../../internal/clock'; import {Trace} from './trace'; -import {debug, randomSpanId} from '../internal/util' -import {TracerComponent} from './types/tracetypes' +import {debug, randomSpanId} from '../../internal/util' +import {TraceBaseModel} from '../types/tracetypes' -export class Span extends TracerComponent { +export class Span extends TraceBaseModel { - private trace: TracerComponent; + private trace: TraceBaseModel; private _parentSpanId: string; - constructor(trace: TracerComponent) { + constructor(trace: TraceBaseModel) { super() this.trace = trace; this.setId(randomSpanId()); diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/trace.ts similarity index 89% rename from packages/opencensus-core/src/trace/model/root-span.ts rename to packages/opencensus-core/src/trace/model/trace.ts index 7712d63b8..c0f6529f0 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -15,12 +15,12 @@ */ import {Span} from './span' -import {Clock} from '../internal/clock' +import {Clock} from '../../internal/clock' import * as uuid from 'uuid'; -import {debug} from '../internal/util' -import {TracerComponent} from './types/tracetypes' +import {debug} from '../../internal/util' +import {TraceBaseModel} from '../types/tracetypes' -export class Trace extends TracerComponent { +export class Trace extends TraceBaseModel { private spans: Span[] = []; diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 0baabd489..63aa28fce 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -14,33 +14,31 @@ * limitations under the License. */ -import * as cls from '../internal/cls'; +import * as cls from '../../internal/cls'; import {Trace} from './trace' import {Span} from './span' -import {PluginLoader} from './plugins/pluginloader' -import {debug} from '../internal/util' -import {Stackdriver} from '../exporters/stackdriver/stackdriver' -import {StackdriverOptions} from '../exporters/stackdriver/options' +import {debug} from '../../internal/util' +import {Stackdriver} from '../../exporters/stackdriver/stackdriver' +import {StackdriverOptions} from '../../exporters/stackdriver/options' +import { Exporter } from '../../exporters/exporter'; export type Func = (...args: any[]) => T; -export class TraceManager { +export class Tracer { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express'] private _active: boolean; private contextManager: cls.Namespace; - private pluginLoader: PluginLoader; - private exporter + private exporter: Exporter; //TODO: temp solution private endedTraces: Trace[] = []; - constructor() { + constructor(exporter:Exporter) { this._active = false; this.contextManager = cls.createNamespace(); - this.pluginLoader = new PluginLoader(this); - this.exporter = new Stackdriver(new StackdriverOptions('opencensus-cesar')); + this.exporter = exporter; } public get currentTrace(): Trace { @@ -51,8 +49,7 @@ export class TraceManager { this.contextManager.set('trace', trace); } - public start(config?:Object): TraceManager { - this.pluginLoader.loadPlugins(this.PLUGINS); + public start(config?:Object): Tracer { this._active = true; return this; } @@ -71,10 +68,8 @@ export class TraceManager { public endTrace(): void { if (!this.currentTrace) return debug('cannot end trace - no active trace found') this.currentTrace.end(); - this.exporter.emit(this.currentTrace); this.addEndedTrace(this.currentTrace); //this.clearCurrentTrace(); - this.startTrace(); } public clearCurrentTrace() { @@ -97,11 +92,11 @@ export class TraceManager { this.exporter.emit(this.currentTrace); }*/ - private addEndedTrace(trace: Trace) { if (this.active) { //TODO: temp solution - this.endedTraces.push(trace); + //this.endedTraces.push(trace); + this.exporter.emit(this.currentTrace); } } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 759c18d19..83aeec942 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -21,7 +21,7 @@ import {debug, randomSpanId} from '../../internal/util' export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } -export abstract class TracerComponent { +export abstract class TraceBaseModel { private _className: string; private _id: string; From 072bfc4a77145b9f506696744bc83649441b5d20 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Fri, 23 Mar 2018 07:33:00 -0300 Subject: [PATCH 014/110] Send real data to Stackdriver and create registerExporter method --- packages/opencensus-core/src/trace/model/trace.ts | 4 ++++ packages/opencensus-core/src/trace/model/tracer.ts | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index c0f6529f0..5898c468e 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -28,6 +28,10 @@ export class Trace extends TraceBaseModel { super() this.setId((uuid.v4().split('-').join(''))); } + + public get traceSpans() : Span[] { + return this.spans; + } public start() { super.start() diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 63aa28fce..bfbe88730 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -35,10 +35,9 @@ export class Tracer { //TODO: temp solution private endedTraces: Trace[] = []; - constructor(exporter:Exporter) { + constructor() { this._active = false; this.contextManager = cls.createNamespace(); - this.exporter = exporter; } public get currentTrace(): Trace { @@ -120,6 +119,10 @@ export class Tracer { namespace.bindEmitter(emitter); } + public registerExporter(exporter:Exporter) { + this.exporter = exporter; + } + } From a40f1d4513a4441df1af7bcaa74ea58d9b8a7bd2 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Fri, 23 Mar 2018 08:51:55 -0300 Subject: [PATCH 015/110] traceId logic update --- packages/opencensus-core/package-lock.json | 3931 +++++++++++++++++ packages/opencensus-core/package.json | 1 + .../opencensus-core/src/trace/model/span.ts | 15 +- .../opencensus-core/src/trace/model/trace.ts | 13 +- .../src/trace/types/tracetypes.ts | 11 + 5 files changed, 3957 insertions(+), 14 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 2a468310a..737059713 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -9480,6 +9480,3937 @@ "validate-npm-package-license": "3.0.3" } }, + "npm": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-5.7.1.tgz", + "integrity": "sha512-r1grvv6mcEt+nlMzMWPc5n/z5q8NNuBWj0TGFp1PBSFCl6ubnAoUGBsucYsnZYT7MOJn0ha1ptEjmdBoAdJ+SA==", + "requires": { + "JSONStream": "1.3.2", + "abbrev": "1.1.1", + "ansi-regex": "3.0.0", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "cacache": "10.0.4", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "cli-table2": "0.2.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.5.0", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.1", + "is-cidr": "1.0.0", + "lazy-property": "1.0.0", + "libcipm": "1.3.3", + "libnpx": "9.7.1", + "lockfile": "1.0.3", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.1", + "meant": "1.0.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.0.0", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-profile": "3.0.1", + "npm-registry-client": "8.5.0", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.4.3", + "osenv": "0.1.5", + "pacote": "7.3.3", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.11.0", + "query-string": "5.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.12", + "read-package-tree": "5.1.6", + "readable-stream": "2.3.4", + "readdir-scoped-modules": "1.0.2", + "request": "2.83.0", + "retry": "0.10.1", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "5.2.4", + "strip-ansi": "4.0.0", + "tar": "4.3.3", + "text-table": "0.2.0", + "uid-number": "0.0.6", + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.3.0", + "uuid": "3.2.1", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0", + "which": "1.3.0", + "worker-farm": "1.5.2", + "wrappy": "1.0.2", + "write-file-atomic": "2.1.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.2", + "bundled": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + } + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "bin-links": { + "version": "1.1.0", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "slide": "1.1.6" + } + }, + "bluebird": { + "version": "3.5.1", + "bundled": true + }, + "cacache": { + "version": "10.0.4", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.2.4", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + }, + "dependencies": { + "y18n": { + "version": "4.0.0", + "bundled": true + } + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true + }, + "chownr": { + "version": "1.0.1", + "bundled": true + }, + "cli-table2": { + "version": "0.2.0", + "bundled": true, + "requires": { + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "bundled": true, + "optional": true + }, + "lodash": { + "version": "3.10.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "1.0.3" + }, + "dependencies": { + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.2", + "bundled": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "requires": { + "ini": "1.3.5", + "proto-list": "1.2.4" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "2.0.5", + "wrappy": "1.0.2" + }, + "dependencies": { + "asap": { + "version": "2.0.5", + "bundled": true + } + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.4" + } + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "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" + }, + "dependencies": { + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "2.5.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "init-package-json": { + "version": "1.10.1", + "bundled": true, + "requires": { + "glob": "7.1.2", + "npm-package-arg": "5.1.2", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.12", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1", + "validate-npm-package-name": "3.0.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1.0.7" + } + } + } + }, + "is-cidr": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cidr-regex": "1.0.6" + }, + "dependencies": { + "cidr-regex": { + "version": "1.0.6", + "bundled": true + } + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true + }, + "libcipm": { + "version": "1.3.3", + "bundled": true, + "requires": { + "bin-links": "1.1.0", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.0", + "npm-lifecycle": "2.0.0", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.0.0", + "pacote": "7.3.3", + "protoduck": "5.0.0", + "read-package-json": "2.0.12", + "rimraf": "2.6.2", + "worker-farm": "1.5.2" + }, + "dependencies": { + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "lock-verify": { + "version": "2.0.0", + "bundled": true, + "requires": { + "npm-package-arg": "5.1.2", + "semver": "5.5.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + } + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.2", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "libnpx": { + "version": "9.7.1", + "bundled": true, + "requires": { + "dotenv": "4.0.0", + "npm-package-arg": "5.1.2", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "update-notifier": "2.3.0", + "which": "1.3.0", + "y18n": "3.2.1", + "yargs": "8.0.2" + }, + "dependencies": { + "dotenv": { + "version": "4.0.0", + "bundled": true + }, + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yargs": { + "version": "8.0.2", + "bundled": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + } + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "1.0.0" + }, + "dependencies": { + "invert-kv": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "1.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.1.0", + "bundled": true + } + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "2.0.0" + }, + "dependencies": { + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.1.0", + "bundled": true + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + } + } + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "bundled": true, + "requires": { + "error-ex": "1.3.1" + }, + "dependencies": { + "error-ex": { + "version": "1.3.1", + "bundled": true, + "requires": { + "is-arrayish": "0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "bundled": true + } + } + } + } + }, + "pify": { + "version": "2.3.0", + "bundled": true + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true + } + } + }, + "path-type": { + "version": "2.0.0", + "bundled": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "bundled": true + } + } + } + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "yargs-parser": { + "version": "7.0.0", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + } + } + }, + "lockfile": { + "version": "1.0.3", + "bundled": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" + }, + "dependencies": { + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + } + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + } + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + }, + "dependencies": { + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "1.2.0" + } + } + } + }, + "node-gyp": { + "version": "3.6.2", + "bundled": true, + "requires": { + "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.83.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + }, + "dependencies": { + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + } + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "1.1.1" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "bundled": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "npm-lifecycle": { + "version": "2.0.0", + "bundled": true, + "requires": { + "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" + }, + "dependencies": { + "byline": { + "version": "5.0.0", + "bundled": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "6.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + }, + "dependencies": { + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + } + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true + } + } + }, + "npm-profile": { + "version": "3.0.1", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "make-fetch-happen": "2.6.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.0.0", + "https-proxy-agent": "2.1.1", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + } + } + }, + "npm-registry-client": { + "version": "8.5.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "5.1.2", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.83.0", + "retry": "0.10.1", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "4.1.6" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "5.1.2", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "ssri": { + "version": "4.1.6", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.4" + }, + "dependencies": { + "delegates": { + "version": "1.0.0", + "bundled": true + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "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" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "1.0.2" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opener": { + "version": "1.4.3", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + } + } + }, + "pacote": { + "version": "7.3.3", + "bundled": true, + "requires": { + "bluebird": "3.5.1", + "cacache": "10.0.4", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.1", + "make-fetch-happen": "2.6.0", + "minimatch": "3.0.4", + "mississippi": "2.0.0", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.0.0", + "npm-packlist": "1.1.10", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "ssri": "5.2.4", + "tar": "4.3.3", + "unique-filename": "1.1.0", + "which": "1.3.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "make-fetch-happen": { + "version": "2.6.0", + "bundled": true, + "requires": { + "agentkeepalive": "3.3.0", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.0.0", + "https-proxy-agent": "2.1.1", + "lru-cache": "4.1.1", + "mississippi": "1.3.1", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.2.4" + }, + "dependencies": { + "agentkeepalive": { + "version": "3.3.0", + "bundled": true, + "requires": { + "humanize-ms": "1.2.1" + }, + "dependencies": { + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "bundled": true + } + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "https-proxy-agent": { + "version": "2.1.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "1.3.1", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "1.0.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "0.4.19" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "bundled": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + } + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + }, + "dependencies": { + "agent-base": { + "version": "4.2.0", + "bundled": true, + "requires": { + "es6-promisify": "5.0.0" + }, + "dependencies": { + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "4.2.4" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "bundled": true + } + } + } + } + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + }, + "dependencies": { + "ip": { + "version": "1.1.5", + "bundled": true + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true + } + } + } + } + } + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.11" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + } + } + } + } + }, + "mississippi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.3", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + }, + "dependencies": { + "typedarray": { + "version": "0.0.6", + "bundled": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "1.4.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.4" + }, + "dependencies": { + "cyclist": { + "version": "0.2.2", + "bundled": true + } + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "bundled": true, + "requires": { + "duplexify": "3.5.3", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + } + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "6.0.0", + "semver": "5.5.0" + } + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "1.1.2", + "retry": "0.10.1" + }, + "dependencies": { + "err-code": { + "version": "1.1.2", + "bundled": true + } + } + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "requires": { + "genfun": "4.0.1" + }, + "dependencies": { + "genfun": { + "version": "4.0.1", + "bundled": true + } + } + }, + "semver": { + "version": "5.5.0", + "bundled": true + } + } + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.11.0", + "bundled": true + }, + "query-string": { + "version": "5.1.0", + "bundled": true, + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + }, + "dependencies": { + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "bundled": true + } + } + }, + "qw": { + "version": "1.0.1", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "0.0.7" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.7", + "bundled": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.12", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" + }, + "dependencies": { + "util-extend": { + "version": "1.0.3", + "bundled": true + } + } + }, + "read-package-json": { + "version": "2.0.12", + "bundled": true, + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.1", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" + }, + "dependencies": { + "json-parse-better-errors": { + "version": "1.0.1", + "bundled": true + }, + "slash": { + "version": "1.0.0", + "bundled": true + } + } + }, + "read-package-tree": { + "version": "5.1.6", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.12", + "readdir-scoped-modules": "1.0.2" + } + }, + "readable-stream": { + "version": "2.3.4", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + } + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "requires": { + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" + } + }, + "request": { + "version": "2.83.0", + "bundled": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "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.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.1", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.1", + "bundled": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "asynckit": { + "version": "0.4.0", + "bundled": true + } + } + }, + "har-validator": { + "version": "5.0.3", + "bundled": true, + "requires": { + "ajv": "5.2.3", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.2.3", + "bundled": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "co": { + "version": "4.6.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonify": "0.0.0" + }, + "dependencies": { + "jsonify": { + "version": "0.0.0", + "bundled": true + } + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + } + } + }, + "hawk": { + "version": "6.0.2", + "bundled": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + }, + "dependencies": { + "boom": { + "version": "4.3.1", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "bundled": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "hoek": { + "version": "4.2.0", + "bundled": true + }, + "sntp": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + } + } + } + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + } + } + } + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "requires": { + "mime-db": "1.30.0" + }, + "dependencies": { + "mime-db": { + "version": "1.30.0", + "bundled": true + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "qs": { + "version": "6.5.1", + "bundled": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "bundled": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "retry": { + "version": "0.10.1", + "bundled": true + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "readable-stream": "2.3.4" + } + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "requires": { + "from2": "1.3.0", + "stream-iterate": "1.2.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + } + } + } + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "requires": { + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "stream-shift": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "ssri": { + "version": "5.2.4", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + } + } + }, + "tar": { + "version": "4.3.3", + "bundled": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "minipass": { + "version": "2.2.1", + "bundled": true, + "requires": { + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "requires": { + "minipass": "2.2.1" + } + }, + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "requires": { + "unique-slug": "2.0.0" + }, + "dependencies": { + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "requires": { + "imurmurhash": "0.1.4" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true + }, + "update-notifier": { + "version": "2.3.0", + "bundled": true, + "requires": { + "boxen": "1.2.1", + "chalk": "2.1.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "boxen": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.1.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "2.1.1" + } + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "requires": { + "execa": "0.7.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + }, + "dependencies": { + "shebang-regex": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "bundled": true + } + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "widest-line": { + "version": "1.0.0", + "bundled": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.1", + "bundled": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "chalk": { + "version": "2.1.0", + "bundled": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "bundled": true, + "requires": { + "color-convert": "1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.0", + "bundled": true, + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "bundled": true + } + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "supports-color": { + "version": "4.4.0", + "bundled": true, + "requires": { + "has-flag": "2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "bundled": true + } + } + } + } + }, + "configstore": { + "version": "3.1.1", + "bundled": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.0.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.1.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "requires": { + "is-obj": "1.0.1" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "bundled": true + } + } + }, + "make-dir": { + "version": "1.0.0", + "bundled": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "bundled": true + } + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "requires": { + "crypto-random-string": "1.0.0" + }, + "dependencies": { + "crypto-random-string": { + "version": "1.0.0", + "bundled": true + } + } + } + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + }, + "dependencies": { + "global-dirs": { + "version": "0.1.0", + "bundled": true, + "requires": { + "ini": "1.3.5" + } + }, + "is-path-inside": { + "version": "1.0.0", + "bundled": true, + "requires": { + "path-is-inside": "1.0.2" + } + } + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "requires": { + "package-json": "4.0.1" + }, + "dependencies": { + "package-json": { + "version": "4.0.1", + "bundled": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "bundled": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + }, + "dependencies": { + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "requires": { + "capture-stack-trace": "1.0.0" + }, + "dependencies": { + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "lowercase-keys": { + "version": "1.0.0", + "bundled": true + }, + "timed-out": { + "version": "4.0.1", + "bundled": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "requires": { + "prepend-http": "1.0.4" + }, + "dependencies": { + "prepend-http": { + "version": "1.0.4", + "bundled": true + } + } + } + } + }, + "registry-auth-token": { + "version": "3.3.1", + "bundled": true, + "requires": { + "rc": "1.2.1", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "requires": { + "rc": "1.2.1" + }, + "dependencies": { + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + } + } + } + } + } + } + } + } + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "requires": { + "semver": "5.5.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true + } + } + }, + "uuid": { + "version": "3.2.1", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-license-ids": "1.2.2" + }, + "dependencies": { + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + } + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true + } + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "1.0.3" + }, + "dependencies": { + "builtins": { + "version": "1.0.3", + "bundled": true + } + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isexe": "2.0.0" + }, + "dependencies": { + "isexe": { + "version": "2.0.0", + "bundled": true + } + } + }, + "worker-farm": { + "version": "1.5.2", + "bundled": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + }, + "dependencies": { + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "1.0.1" + }, + "dependencies": { + "prr": { + "version": "1.0.1", + "bundled": true + } + } + }, + "xtend": { + "version": "4.0.1", + "bundled": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "2.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 4afba22c7..6f022872e 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -46,6 +46,7 @@ "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", "end-of-stream": "^1.4.1", + "npm": "^5.7.1", "require-in-the-middle": "^2.2.1", "semver": "^5.5.0", "shimmer": "^1.2.0", diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index fe297ba8c..b74807aa6 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -23,29 +23,24 @@ import {TraceBaseModel} from '../types/tracetypes' export class Span extends TraceBaseModel { private trace: TraceBaseModel; - private _parentSpanId: string; + // private _parentSpanId: string; constructor(trace: TraceBaseModel) { super() this.trace = trace; - this.setId(randomSpanId()); } public get traceId() : string { - return this.trace.id; - } - - public set parentSpanId(parentSpanId : string) { - this._parentSpanId = parentSpanId; + return this.trace.traceId; } public get parentSpanId() : string { - return this._parentSpanId; + return this.trace.id; } public get traceContext() { return { - traceId: this.trace.id.toString(), + traceId: this.traceId.toString(), spanId: this.id.toString(), options: 1 // always traced }; @@ -60,7 +55,7 @@ export class Span extends TraceBaseModel { super.end(); debug('ending span %o', {spanId: this.id, - traceId: this.trace.id, + traceId: this.traceId, name: this.name , startTime: this.startTime, endTime: this.endTime, diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index 5898c468e..d8cc10686 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -23,19 +23,24 @@ import {TraceBaseModel} from '../types/tracetypes' export class Trace extends TraceBaseModel { private spans: Span[] = []; + private _traceId: string; constructor() { super() - this.setId((uuid.v4().split('-').join(''))); + this._traceId = (uuid.v4().split('-').join('')); } public get traceSpans() : Span[] { return this.spans; } - + + public get traceId() : string { + return this._traceId; + } + public start() { super.start() - debug('starting trace %o', {id: this.id}) + debug('starting trace %o', {traceId: this.traceId}) } public end() { @@ -48,7 +53,7 @@ export class Trace extends TraceBaseModel { }) debug('ending trace %o', - {id: this.id, name: this.name, startTime: this.startTime, endTime: this.endTime, duration: this.duration}) + {traceId: this.traceId, name: this.name, startTime: this.startTime, endTime: this.endTime, duration: this.duration}) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 83aeec942..9750c27ac 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -48,6 +48,7 @@ export abstract class TraceBaseModel { this.clock = null; this._truncated = false; this._ended = false; + this.setId(randomSpanId()); } public get id() : string { @@ -57,6 +58,8 @@ export abstract class TraceBaseModel { protected setId(id : string) { this._id = id; } + + abstract get traceId():string; public get name() { return this._name; @@ -110,6 +113,14 @@ export abstract class TraceBaseModel { return this.clock.duration; } + public get traceContext() { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + options: 1 // always traced + }; + } + //TODO: maybe key and values must be truncate public addAtribute(key: string, value: string) { this.attributes[key] = value; From 3b86c768d05b4154130bb74388c2fb8fef0057a1 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Fri, 23 Mar 2018 09:42:18 -0300 Subject: [PATCH 016/110] Fix code style. --- packages/opencensus-core/src/exporters | 17 +++++++++++++++ .../opencensus-core/src/internal/clock.ts | 8 +++++-- .../opencensus-core/src/internal/cls-ah.ts | 10 ++++----- packages/opencensus-core/src/internal/cls.ts | 6 +++--- packages/opencensus-core/src/internal/util.ts | 4 ++-- .../opencensus-core/src/trace/model/span.ts | 21 +++++++++++-------- .../opencensus-core/src/trace/model/trace.ts | 11 +++++++--- .../opencensus-core/src/trace/model/tracer.ts | 12 ++++++----- .../src/trace/types/tracetypes.ts | 19 +++++++++++++---- 9 files changed, 75 insertions(+), 33 deletions(-) diff --git a/packages/opencensus-core/src/exporters b/packages/opencensus-core/src/exporters index 25c469e55..e25c6c6ad 100644 --- a/packages/opencensus-core/src/exporters +++ b/packages/opencensus-core/src/exporters @@ -1,3 +1,20 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + export interface ExporterOptions { } \ No newline at end of file diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index 6f22b02e8..6a0d8ae05 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -28,13 +28,17 @@ export class Clock { } public end(): void { - if (this._ended) return + if (this._ended){ + return + } this.diff = process.hrtime(this._hrtime) this._ended = true } public get duration(): number { - if (!this._ended) return null + if (!this._ended){ + return null + } var ns = this.diff[0] * 1e9 + this.diff[1] return ns / 1e6 } diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts index 88326aacc..60a23cfae 100644 --- a/packages/opencensus-core/src/internal/cls-ah.ts +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017 Google Inc. All Rights Reserved. + * Copyright 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,10 +14,10 @@ * limitations under the License. */ -import * as asyncHook from 'async_hooks'; -import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; -import {EventEmitter} from 'events'; -import * as shimmer from 'shimmer'; +import * as asyncHook from 'async_hooks' +import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage' +import {EventEmitter} from 'events' +import * as shimmer from 'shimmer' const wrappedSymbol = Symbol('context_wrapped'); let contexts: {[asyncId: number]: Context;} = {}; diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index ca33c4ba5..7beb4c709 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -1,5 +1,5 @@ /** - * Copyright 2015 Google Inc. All Rights Reserved. + * Copyright 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,8 @@ * limitations under the License. */ -import * as CLS from 'continuation-local-storage'; -import * as semver from 'semver'; +import * as CLS from 'continuation-local-storage' +import * as semver from 'semver' export type Namespace = CLS.Namespace; export type Func = CLS.Func; diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts index 09fd9be0d..76f758318 100644 --- a/packages/opencensus-core/src/internal/util.ts +++ b/packages/opencensus-core/src/internal/util.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import * as crypto from 'crypto'; -import * as Debug from "debug"; +import * as crypto from 'crypto' +import * as Debug from "debug" export const debug = Debug("opencensus"); diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index fe297ba8c..6e0fbe210 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import {Clock} from '../../internal/clock'; -import {Trace} from './trace'; +import {Clock} from '../../internal/clock' +import {Trace} from './trace' import {debug, randomSpanId} from '../../internal/util' import {TraceBaseModel} from '../types/tracetypes' @@ -53,18 +53,21 @@ export class Span extends TraceBaseModel { public start() { super.start(); - debug('starting span %o', {id: this.id, traceId: this.traceId, name: this.name }) + debug('starting span %o', + {id: this.id, + traceId: this.traceId, + name: this.name}) } public end(): void { super.end(); debug('ending span %o', - {spanId: this.id, - traceId: this.trace.id, - name: this.name , - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration} + {spanId: this.id, + traceId: this.trace.id, + name: this.name , + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration} ) } diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index 5898c468e..0fc545d00 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -14,9 +14,10 @@ * limitations under the License. */ -import {Span} from './span' +import * as uuid from 'uuid' + +import {Span} from './span' import {Clock} from '../../internal/clock' -import * as uuid from 'uuid'; import {debug} from '../../internal/util' import {TraceBaseModel} from '../types/tracetypes' @@ -48,7 +49,11 @@ export class Trace extends TraceBaseModel { }) debug('ending trace %o', - {id: this.id, name: this.name, startTime: this.startTime, endTime: this.endTime, duration: this.duration}) + {id: this.id, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration}) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index bfbe88730..df8e8f9d0 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import * as cls from '../../internal/cls'; +import * as cls from '../../internal/cls' import {Trace} from './trace' import {Span} from './span' import {debug} from '../../internal/util' import {Stackdriver} from '../../exporters/stackdriver/stackdriver' import {StackdriverOptions} from '../../exporters/stackdriver/options' -import { Exporter } from '../../exporters/exporter'; +import { Exporter } from '../../exporters/exporter' export type Func = (...args: any[]) => T; export class Tracer { - readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express'] + readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; private _active: boolean; private contextManager: cls.Namespace; @@ -65,7 +65,9 @@ export class Tracer { } public endTrace(): void { - if (!this.currentTrace) return debug('cannot end trace - no active trace found') + if (!this.currentTrace){ + return debug('cannot end trace - no active trace found') + } this.currentTrace.end(); this.addEndedTrace(this.currentTrace); //this.clearCurrentTrace(); @@ -80,7 +82,7 @@ export class Tracer { if (!this.currentTrace) { debug('no current trace found - cannot start a new span'); } else { - newSpan = this.currentTrace.startSpan(name, type) + newSpan = this.currentTrace.startSpan(name, type); } return newSpan; } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 83aeec942..401d268f4 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Clock} from '../../internal/clock'; +import {Clock} from '../../internal/clock' import {debug, randomSpanId} from '../../internal/util' @@ -153,15 +153,26 @@ export abstract class TraceBaseModel { //TODO: review public truncate() { if (!this.started) { - debug('calling truncate non-started %s - ignoring %o', this._className, {id: this.id, name: this.name, type: this.type}) + debug('calling truncate non-started %s - ignoring %o', + this._className, + {id: this.id, + name: this.name, + type: this.type}) return } else if (this.ended) { - debug('calling truncate already ended %s - ignoring %o',this._className, {id: this.id, name: this.name, type: this.type}) + debug('calling truncate already ended %s - ignoring %o', + this._className, + {id: this.id, + name: this.name, + type: this.type}) return } this._truncated = true this.end() - debug('truncating %s %o', this._className, {id: this.id, name: this.name }) + debug('truncating %s %o', + this._className, + {id: this.id, + name: this.name}) } } From abad01fa70c230f379ee4c85a7069284a8998d80 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Fri, 23 Mar 2018 11:39:22 -0300 Subject: [PATCH 017/110] Make spans in a trace private --- packages/opencensus-core/src/trace/model/trace.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index 0fb583a2a..e3ecaa3e2 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -23,7 +23,7 @@ import {TraceBaseModel} from '../types/tracetypes' export class Trace extends TraceBaseModel { - private spans: Span[] = []; + private _spans: Span[] = []; private _traceId: string; constructor() { @@ -31,8 +31,8 @@ export class Trace extends TraceBaseModel { this._traceId = (uuid.v4().split('-').join('')); } - public get traceSpans() : Span[] { - return this.spans; + public get spans() : Span[] { + return this._spans; } public get traceId() : string { @@ -48,7 +48,7 @@ export class Trace extends TraceBaseModel { super.end() //TODO - Define logic for list of spans - this.spans.forEach(function (span) { + this._spans.forEach(function (span) { if (span.ended || !span.started) return span.truncate() }) @@ -66,7 +66,7 @@ export class Trace extends TraceBaseModel { newSpan.name = name newSpan.type = type newSpan.start(); - this.spans.push(newSpan); + this._spans.push(newSpan); return newSpan; } From 1cff9312a3af7381e2c26326c14e56a9be70896d Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Fri, 23 Mar 2018 15:15:02 -0300 Subject: [PATCH 018/110] Add start methods for Stackdriver and Zipkin --- .../opencensus-core/src/trace/model/span.ts | 62 +++++---- .../opencensus-core/src/trace/model/trace.ts | 34 ++--- .../opencensus-core/src/trace/model/tracer.ts | 52 ++++---- .../src/trace/types/tracetypes.ts | 126 +++++++++--------- 4 files changed, 143 insertions(+), 131 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 8e9fe516b..d61d6beb3 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,58 +14,62 @@ * limitations under the License. */ -import {Clock} from '../../internal/clock' -import {Trace} from './trace' -import {debug, randomSpanId} from '../../internal/util' -import {TraceBaseModel} from '../types/tracetypes' +import { Clock } from '../../internal/clock' +import { Trace } from './trace' +import { debug, randomSpanId } from '../../internal/util' +import { TraceBaseModel } from '../types/tracetypes' export class Span extends TraceBaseModel { - private trace: TraceBaseModel; - // private _parentSpanId: string; - - constructor(trace: TraceBaseModel) { - super() - this.trace = trace; + private trace: TraceBaseModel; + // private _parentSpanId: string; + + constructor(trace: TraceBaseModel) { + super() + this.trace = trace; } - public get traceId() : string { + public get traceId(): string { return this.trace.traceId; } - public get parentSpanId() : string { + public get parentSpanId(): string { return this.trace.id; } - + public get traceContext() { return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - options: 1 // always traced + traceId: this.traceId.toString(), + spanId: this.id.toString(), + options: 1 // always traced }; } - + public start() { super.start(); - debug('starting span %o', - {id: this.id, + debug('starting span %o', + { + id: this.id, traceId: this.traceId, - name: this.name}) + name: this.name + }) } public end(): void { super.end(); - debug('ending span %o', - {spanId: this.id, - traceId: this.trace.id, - name: this.name , - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration} + debug('ending span %o', + { + spanId: this.id, + traceId: this.trace.id, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration + } ) - + } - + } diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index e3ecaa3e2..5d67d755b 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -16,10 +16,10 @@ import * as uuid from 'uuid' -import {Span} from './span' -import {Clock} from '../../internal/clock' -import {debug} from '../../internal/util' -import {TraceBaseModel} from '../types/tracetypes' +import { Span } from './span' +import { Clock } from '../../internal/clock' +import { debug } from '../../internal/util' +import { TraceBaseModel } from '../types/tracetypes' export class Trace extends TraceBaseModel { @@ -28,22 +28,22 @@ export class Trace extends TraceBaseModel { constructor() { super() - this._traceId = (uuid.v4().split('-').join('')); + this._traceId = (uuid.v4().split('-').join('')); } - public get spans() : Span[] { + public get spans(): Span[] { return this._spans; } - - public get traceId() : string { + + public get traceId(): string { return this._traceId; } - + public start() { - super.start() - debug('starting trace %o', {traceId: this.traceId}) + super.start() + debug('starting trace %o', { traceId: this.traceId }) } - + public end() { super.end() @@ -52,13 +52,15 @@ export class Trace extends TraceBaseModel { if (span.ended || !span.started) return span.truncate() }) - - debug('ending trace %o', - {id: this.id, + + debug('ending trace %o', + { + id: this.id, name: this.name, startTime: this.startTime, endTime: this.endTime, - duration: this.duration}) + duration: this.duration + }) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index df8e8f9d0..9ca4ac842 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -15,11 +15,11 @@ */ import * as cls from '../../internal/cls' -import {Trace} from './trace' -import {Span} from './span' -import {debug} from '../../internal/util' -import {Stackdriver} from '../../exporters/stackdriver/stackdriver' -import {StackdriverOptions} from '../../exporters/stackdriver/options' +import { Trace } from './trace' +import { Span } from './span' +import { debug } from '../../internal/util' +import { Stackdriver } from '../../exporters/stackdriver/stackdriver' +import { StackdriverOptions } from '../../exporters/stackdriver/options' import { Exporter } from '../../exporters/exporter' export type Func = (...args: any[]) => T; @@ -27,7 +27,7 @@ export type Func = (...args: any[]) => T; export class Tracer { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; - + private _active: boolean; private contextManager: cls.Namespace; private exporter: Exporter; @@ -40,15 +40,15 @@ export class Tracer { this.contextManager = cls.createNamespace(); } - public get currentTrace(): Trace { - return this.contextManager.get('trace'); + public get currentTrace(): Trace { + return this.contextManager.get('trace'); } - private setCurrentTrace(trace:Trace) { - this.contextManager.set('trace', trace); + private setCurrentTrace(trace: Trace) { + this.contextManager.set('trace', trace); } - public start(config?:Object): Tracer { + public start(config?: Object): Tracer { this._active = true; return this; } @@ -65,22 +65,22 @@ export class Tracer { } public endTrace(): void { - if (!this.currentTrace){ + if (!this.currentTrace) { return debug('cannot end trace - no active trace found') } this.currentTrace.end(); this.addEndedTrace(this.currentTrace); //this.clearCurrentTrace(); } - + public clearCurrentTrace() { this.setCurrentTrace(null); } - public startSpan(name:string, type: string): Span { + public startSpan(name: string, type: string): Span { let newSpan: Span = null; - if (!this.currentTrace) { - debug('no current trace found - cannot start a new span'); + if (!this.currentTrace) { + debug('no current trace found - cannot start a new span'); } else { newSpan = this.currentTrace.startSpan(name, type); } @@ -97,35 +97,35 @@ export class Tracer { if (this.active) { //TODO: temp solution //this.endedTraces.push(trace); - this.exporter.emit(this.currentTrace); + this.exporter.writeTrace(this.currentTrace); } } public wrap(fn: Func): Func { if (!this.active) { - return fn; - } - + return fn; + } + // This is safe because isActive checks the value of this.namespace. const namespace = this.contextManager as cls.Namespace; return namespace.bind(fn); } - + public wrapEmitter(emitter: NodeJS.EventEmitter): void { - if (!this.active) { - return; - } + if (!this.active) { + return; + } // This is safe because isActive checks the value of this.namespace. const namespace = this.contextManager as cls.Namespace; namespace.bindEmitter(emitter); } - public registerExporter(exporter:Exporter) { + public registerExporter(exporter: Exporter) { this.exporter = exporter; } -} +} diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 5a50687cc..c4aeb8187 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import {Clock} from '../../internal/clock' -import {debug, randomSpanId} from '../../internal/util' +import { Clock } from '../../internal/clock' +import { debug, randomSpanId } from '../../internal/util' + - export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } @@ -29,7 +29,7 @@ export abstract class TraceBaseModel { //------ private _remoteParent: string; private attributes: MapLabels = {}; - private annotations: MapObjects = {}; + private annotations: MapObjects = {}; //messageEvents //links private _name: string; @@ -38,36 +38,36 @@ export abstract class TraceBaseModel { private _type: string; private _status: number; //TODO truncated - private _truncated: boolean; + private _truncated: boolean; - constructor() { - this._className = this.constructor.name; - this._name = null; - this._type = null; - this._started = false; - this.clock = null; - this._truncated = false; - this._ended = false; - this.setId(randomSpanId()); + constructor() { + this._className = this.constructor.name; + this._name = null; + this._type = null; + this._started = false; + this.clock = null; + this._truncated = false; + this._ended = false; + this.setId(randomSpanId()); } - public get id() : string { + public get id(): string { return this._id; } - - protected setId(id : string) { + + protected setId(id: string) { this._id = id; } - abstract get traceId():string; - + abstract get traceId(): string; + public get name() { return this._name; } public get started(): boolean { return this._started; - } + } public get ended(): boolean { return this._ended; @@ -77,22 +77,22 @@ export abstract class TraceBaseModel { this._name = name; } - public get type() : string { + public get type(): string { return this._type; } - - public set type(type : string) { + + public set type(type: string) { this._type = type; } - - public set remoteParente(remoteParent : string) { + + public set remoteParente(remoteParent: string) { this._remoteParent = remoteParent; } - public get remoteSpanId() : string { + public get remoteSpanId(): string { return this._remoteParent; } - + public get status(): number { return this._status; } @@ -100,26 +100,26 @@ export abstract class TraceBaseModel { public set status(status: number) { this._status = status; } - + public get startTime(): Date { return this.clock.startTime; } - + public get endTime(): Date { return this.clock.endTime; } - public get duration() : number { + public get duration(): number { return this.clock.duration; - } + } public get traceContext() { return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - options: 1 // always traced + traceId: this.traceId.toString(), + spanId: this.id.toString(), + options: 1 // always traced }; - } + } //TODO: maybe key and values must be truncate public addAtribute(key: string, value: string) { @@ -129,35 +129,35 @@ export abstract class TraceBaseModel { //TODO: maybe keys and values must be truncate public addAnotation(key: string, value: {}) { this.annotations[key] = value; - } - + } + public start() { if (this.started) { debug('calling %s.start() on already started %s %o', this._className, this._className, - {id: this.id, name: this.name, type: this.type}) + { id: this.id, name: this.name, type: this.type }) return - } + } this.clock = new Clock(); - this._started = true; + this._started = true; } public end(): void { if (!this.started) { - debug('calling %s.end() on un-started %s %o', + debug('calling %s.end() on un-started %s %o', this._className, this._className, - {id: this.id, name: this.name, type: this.type}) + { id: this.id, name: this.name, type: this.type }) return } else if (this.ended) { - debug('calling %s.end() on already ended %s %o', + debug('calling %s.end() on already ended %s %o', this._className, this._className, - {id:this.id , name: this.name, type: this.type}) + { id: this.id, name: this.name, type: this.type }) return - } + } this._started = false; this._ended = true; this.clock.end(); - + } @@ -165,25 +165,31 @@ export abstract class TraceBaseModel { public truncate() { if (!this.started) { debug('calling truncate non-started %s - ignoring %o', - this._className, - {id: this.id, - name: this.name, - type: this.type}) + this._className, + { + id: this.id, + name: this.name, + type: this.type + }) return - } else if (this.ended) { + } else if (this.ended) { debug('calling truncate already ended %s - ignoring %o', - this._className, - {id: this.id, - name: this.name, - type: this.type}) + this._className, + { + id: this.id, + name: this.name, + type: this.type + }) return } this._truncated = true this.end() debug('truncating %s %o', - this._className, - {id: this.id, - name: this.name}) - } - + this._className, + { + id: this.id, + name: this.name + }) + } + } From 50b920d1927d788b74ddefdc8ec25a84c5fc1f84 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Fri, 23 Mar 2018 16:03:17 -0300 Subject: [PATCH 019/110] added basic struct --- .../opencensus-core/src/trace/model/trace.ts | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/trace.ts index 0fb583a2a..f5cf9b58b 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/trace.ts @@ -14,51 +14,47 @@ * limitations under the License. */ -import * as uuid from 'uuid' - -import {Span} from './span' -import {Clock} from '../../internal/clock' -import {debug} from '../../internal/util' -import {TraceBaseModel} from '../types/tracetypes' +import { Span } from './span' +import { Clock } from '../../internal/clock' +import * as uuid from 'uuid'; +import { debug } from '../../internal/util' +import { TraceBaseModel } from '../types/tracetypes' export class Trace extends TraceBaseModel { - private spans: Span[] = []; + private _spans: Span[]; private _traceId: string; constructor() { super() - this._traceId = (uuid.v4().split('-').join('')); + this.setId((uuid.v4().split('-').join(''))); + this._spans = []; } - public get traceSpans() : Span[] { - return this.spans; + public get spans() { + return this._spans; } - - public get traceId() : string { + + public get traceId() { return this._traceId; } - + public start() { - super.start() - debug('starting trace %o', {traceId: this.traceId}) + super.start() + debug('starting trace %o', { id: this.id }) } - + public end() { super.end() //TODO - Define logic for list of spans - this.spans.forEach(function (span) { + this._spans.forEach(function (span) { if (span.ended || !span.started) return span.truncate() }) - - debug('ending trace %o', - {id: this.id, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration}) + + debug('ending trace %o', + { id: this.id, name: this.name, startTime: this.startTime, endTime: this.endTime, duration: this.duration }) } public startSpan(name: string, type: string) { @@ -66,7 +62,7 @@ export class Trace extends TraceBaseModel { newSpan.name = name newSpan.type = type newSpan.start(); - this.spans.push(newSpan); + this._spans.push(newSpan); return newSpan; } From de75000cd386482267e9a5c7f76ddad38ca7079b Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 25 Mar 2018 06:42:15 -0300 Subject: [PATCH 020/110] Refactoring: rename class and file Trace to RootSpan, add TraceConfig interface, add TraceContext interface --- packages/opencensus-core/src/internal/cls.ts | 19 ++------ .../trace/model/{trace.ts => root-span.ts} | 20 ++++----- .../opencensus-core/src/trace/model/span.ts | 24 +++++----- .../opencensus-core/src/trace/model/tracer.ts | 44 ++++++++++++++----- .../src/trace/types/tracetypes.ts | 20 ++++++--- packages/opencensus-core/test/test-span.ts | 24 +++++----- packages/opencensus-core/test/test-trace.ts | 44 +++++++++---------- packages/opencensus-core/test/test-tracer.ts | 33 +++++++------- 8 files changed, 122 insertions(+), 106 deletions(-) rename packages/opencensus-core/src/trace/model/{trace.ts => root-span.ts} (76%) diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index 7beb4c709..9eb285328 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -16,6 +16,7 @@ import * as CLS from 'continuation-local-storage' import * as semver from 'semver' +import { debug } from './util' export type Namespace = CLS.Namespace; export type Func = CLS.Func; @@ -23,9 +24,12 @@ export type Func = CLS.Func; const useAsyncHooks: boolean = semver.satisfies(process.version, '>=8') ;//&& // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; +debug('useAsyncHooks = %s',useAsyncHooks); + const cls: typeof CLS = useAsyncHooks ? require('./cls-ah') : require('continuation-local-storage'); + const TRACE_NAMESPACE = 'opencensus.io'; /** @@ -48,19 +52,4 @@ export function getNamespace(): CLS.Namespace { return cls.getNamespace(TRACE_NAMESPACE); } -/* -export function set(name:string, trace:any) { - getNamespace().set(name, trace); -} -export function get(name:string): any { - // First getNamespace check is necessary in case any - // patched closures escaped before the agent was stopped and the - // namespace was destroyed. - var result: any = null; - if (getNamespace() && getNamespace().get(name)) { - result = getNamespace().get(name); - } - return result; -} -*/ diff --git a/packages/opencensus-core/src/trace/model/trace.ts b/packages/opencensus-core/src/trace/model/root-span.ts similarity index 76% rename from packages/opencensus-core/src/trace/model/trace.ts rename to packages/opencensus-core/src/trace/model/root-span.ts index ead64f26f..a13f8d4aa 100644 --- a/packages/opencensus-core/src/trace/model/trace.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,16 +18,16 @@ import { Span } from './span' import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; import { debug } from '../../internal/util' -import { TraceBaseModel } from '../types/tracetypes' +import { SpanBaseModel, TraceContext } from '../types/tracetypes' -export class Trace extends TraceBaseModel { +export class RootSpan extends SpanBaseModel { private _spans: Span[]; private _traceId: string; - constructor() { + constructor(context?: TraceContext ) { super() - this.setId((uuid.v4().split('-').join(''))); + this._traceId = context&&context.traceId?context.traceId:(uuid.v4().split('-').join('')); this._spans = []; } @@ -41,7 +41,7 @@ export class Trace extends TraceBaseModel { public start() { super.start() - debug('starting trace %o', { traceId: this.traceId }) + debug('starting %s %o', this._className, { traceId: this.traceId, id: this.id }) } public end() { @@ -53,14 +53,14 @@ export class Trace extends TraceBaseModel { span.truncate() }) - debug('ending trace %o', - { - id: this.id, + debug('ending %s %o', + this._className, + { id: this.id, + traceId: this.traceId, name: this.name, startTime: this.startTime, endTime: this.endTime, - duration: this.duration - }) + duration: this.duration }) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index d61d6beb3..1ce5b4a4f 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -15,30 +15,30 @@ */ import { Clock } from '../../internal/clock' -import { Trace } from './trace' +import { RootSpan } from './rootspan' import { debug, randomSpanId } from '../../internal/util' -import { TraceBaseModel } from '../types/tracetypes' +import { SpanBaseModel, TraceContext } from '../types/tracetypes' -export class Span extends TraceBaseModel { +export class Span extends SpanBaseModel { - private trace: TraceBaseModel; - // private _parentSpanId: string; + private root: SpanBaseModel; + // private _parentSpanId: string; - constructor(trace: TraceBaseModel) { + constructor(root: SpanBaseModel) { super() - this.trace = trace; + this.root = root; } public get traceId(): string { - return this.trace.traceId; + return this.root.traceId; } public get parentSpanId(): string { - return this.trace.id; + return this.root.id; } - public get traceContext() { + public get traceContext(): TraceContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), @@ -50,8 +50,8 @@ export class Span extends TraceBaseModel { super.start(); debug('starting span %o', { - id: this.id, traceId: this.traceId, + spanId: this.id, name: this.name }) } @@ -61,7 +61,7 @@ export class Span extends TraceBaseModel { debug('ending span %o', { spanId: this.id, - traceId: this.trace.id, + traceId: this.traceId, name: this.name, startTime: this.startTime, endTime: this.endTime, diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 9ca4ac842..98fc9a623 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -15,15 +15,27 @@ */ import * as cls from '../../internal/cls' -import { Trace } from './trace' +import { RootSpan } from './rootspan' import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' -import { Exporter } from '../../exporters/exporter' +import { Exporter, NoopExporter } from '../../exporters/exporter' +import { TraceContext } from '../types/tracetypes'; export type Func = (...args: any[]) => T; +export interface TracerConfig { + exporter?: Exporter, + sampleRate?: number; + ignoreUrls?: Array; +} + +export const defaultConfig: TracerConfig = { + exporter: new NoopExporter(), + sampleRate: 1.0 +} + export class Tracer { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; @@ -31,40 +43,52 @@ export class Tracer { private _active: boolean; private contextManager: cls.Namespace; private exporter: Exporter; + private config: TracerConfig; //TODO: temp solution - private endedTraces: Trace[] = []; + private endedTraces: RootSpan[] = []; constructor() { this._active = false; this.contextManager = cls.createNamespace(); } - public get currentTrace(): Trace { + public get currentTrace(): RootSpan { return this.contextManager.get('trace'); } - private setCurrentTrace(trace: Trace) { + private setCurrentTrace(trace: RootSpan) { this.contextManager.set('trace', trace); } - public start(config?: Object): Tracer { + public start(config?: TracerConfig): Tracer { this._active = true; + this.config = config || defaultConfig; + this.exporter = this.config.exporter; return this; } + public stop() { + this._active = false; + } + public get active(): boolean { return this._active; } - public startTrace(): Trace { - let newTrace = new Trace(); + public startRootSpan(context?: TraceContext): RootSpan { + let newTrace = new RootSpan(context); this.setCurrentTrace(newTrace); newTrace.start(); return newTrace; } - public endTrace(): void { + //TODO: review + public runInContex(fn: Func): T { + return this.contextManager.runAndReturn (fn) + } + + public endRootSpan(): void { if (!this.currentTrace) { return debug('cannot end trace - no active trace found') } @@ -93,7 +117,7 @@ export class Tracer { this.exporter.emit(this.currentTrace); }*/ - private addEndedTrace(trace: Trace) { + private addEndedTrace(trace: RootSpan) { if (this.active) { //TODO: temp solution //this.endedTraces.push(trace); diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index c4aeb8187..052a8596e 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -21,22 +21,28 @@ import { debug, randomSpanId } from '../../internal/util' export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } -export abstract class TraceBaseModel { +export interface TraceContext { + traceId: string, + spanId: string, + options?: number +} + +export abstract class SpanBaseModel { - private _className: string; + protected _className: string; private _id: string; private clock: Clock; //------ private _remoteParent: string; - private attributes: MapLabels = {}; - private annotations: MapObjects = {}; - //messageEvents - //links private _name: string; private _started: boolean; private _ended: boolean; private _type: string; private _status: number; + private attributes: MapLabels = {}; + private annotations: MapObjects = {}; + //messageEvents + //links //TODO truncated private _truncated: boolean; @@ -113,7 +119,7 @@ export abstract class TraceBaseModel { return this.clock.duration; } - public get traceContext() { + public get traceContext(): TraceContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 0ca273842..c092c5ece 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -15,23 +15,23 @@ */ import { Span } from '../src/trace/model/span'; -import { Trace } from '../src/trace/model/trace'; +import { RootSpan } from '../src/trace/model/rootspan'; var assert = require('assert'); describe('Span creation', function () { - let trace; + let root; let span; before(function () { - trace = new Trace(); - span = trace.startSpan('spanName', 'typeSpan'); + root = new RootSpan(); + span = root.startSpan('spanName', 'typeSpan'); }); it('should create an span on the trace', function () { - assert.ok(trace instanceof Trace); - span = trace.startSpan('spanName', 'typeSpan'); + assert.ok(root instanceof RootSpan); + span = root.startSpan('spanName', 'typeSpan'); assert.ok(span instanceof Span); assert.ok(span.id); }); @@ -49,12 +49,12 @@ describe('Span creation', function () { describe('Span checking creation', function () { - let trace; + let root; let span; before(function () { - trace = new Trace(); - span = trace.startSpan('spanName', 'typeSpan'); + root = new RootSpan(); + span = root.startSpan('spanName', 'typeSpan'); }); it('should not start span after it ended', function () { @@ -65,16 +65,16 @@ describe('Span checking creation', function () { describe('Span data', function () { - let trace; + let root; before(function () { - trace = new Trace(); + root = new RootSpan(); }); it('generates unique numeric span ID strings', function () { var numberOfSpansToCheck = 5; for (var i = 0; i < numberOfSpansToCheck; i++) { - var span = trace.startSpan('spanName' + i, 'typeSpan' + i); + var span = root.startSpan('spanName' + i, 'typeSpan' + i); var spanId = span.id; assert.ok(typeof spanId === 'string'); assert.ok(spanId.match(/\d+/)); diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index d82c6e865..d71b3b1a3 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Trace } from '../src/trace/model/trace'; +import { RootSpan } from '../src/trace/model/rootspan'; import { Span } from '../src/trace/model/span'; let assert = require('assert'); @@ -22,23 +22,23 @@ let assert = require('assert'); describe('Trace', function () { describe('new Trace()', function () { it('should be a Trace instance', function () { - let trace = new Trace(); - assert.ok(trace instanceof Trace); + let root = new RootSpan(); + assert.ok(root instanceof RootSpan); }); }); describe('start()', function () { it('the trace was started', function () { - let trace = new Trace(); - trace.start(); - assert.ok(trace.started); + let root = new RootSpan(); + root.start(); + assert.ok(root.started); }); }); describe('startSpan()', function () { - let trace = new Trace(); - trace.start() - let span = trace.startSpan("spanName", "spanType"); + let root = new RootSpan(); + root.start() + let span = root.startSpan("spanName", "spanType"); it('should return a Span instance', function () { assert.ok(span instanceof Span); }); @@ -50,35 +50,35 @@ describe('Trace', function () { describe('end()', function () { it('the trace was ended', function () { - let trace = new Trace(); - trace.start() - trace.end(); - assert.ok(trace.ended); + let root = new RootSpan(); + root.start() + root.end(); + assert.ok(root.ended); }); }); describe('end() before trace started', function () { it('the trace was not ended', function () { - let trace = new Trace(); - trace.end(); - assert.ok(!trace.ended); + let root = new RootSpan(); + root.end(); + assert.ok(!root.ended); }); }); describe('startSpan() before trace started', function () { it('should return null', function () { - let trace = new Trace(); - let span = trace.startSpan("spanName", "spanType"); + let root = new RootSpan(); + let span = root.startSpan("spanName", "spanType"); assert.ok(span == null); }); }); describe('startSpan() after trace ended', function () { it('should return null', function () { - let trace = new Trace(); - trace.start() - trace.end(); - let span = trace.startSpan("spanName", "spanType"); + let root = new RootSpan(); + root.start() + root.end(); + let span = root.startSpan("spanName", "spanType"); assert.ok(span == null); }); }); diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 87e08e0f3..ba857d880 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -14,29 +14,26 @@ * limitations under the License. */ -import { Tracer } from '../src/trace/model/tracer'; -import { Trace } from '../src/trace/model/trace'; +import { Tracer, defaultConfig } from '../src/trace/model/tracer'; +import { RootSpan } from '../src/trace/model/trace'; import { Span } from '../src/trace/model/span'; -import { Exporter } from '../src/exporters/exporter'; +import { Exporter, NoopExporter } from '../src/exporters/exporter'; let assert = require('assert'); -class NoopExporter implements Exporter { - emit(trace: Trace) {} -} -let noopExporter = new NoopExporter(); +let noopExporter = new NoopExporter (); describe('Tracer', function () { describe('new Tracer()', function () { it('should be a Tracer instance', function () { - let tracer = new Tracer(noopExporter); + let tracer = new Tracer(); assert.ok(tracer instanceof Tracer); }); }); describe('start()', function () { - let tracer = new Tracer(noopExporter); + let tracer = new Tracer(); let tracerStarted = tracer.start(); it('should return a tracer instance', function () { @@ -53,12 +50,12 @@ describe('Tracer', function () { let trace; before(() => { - tracer = new Tracer(noopExporter); + tracer = new Tracer(); trace = tracer.startTrace(); }) it('should return a Trace instance', function () { - assert.ok(trace instanceof Trace); + assert.ok(trace instanceof RootSpan); }); it('the new trace was set as current trace', function () { @@ -72,25 +69,25 @@ describe('Tracer', function () { describe('endTrace()', function () { it('the current trace was ended', function () { - let tracer = new Tracer(noopExporter); - let trace = tracer.startTrace(); - tracer.endTrace(); + let tracer = new Tracer(); + let trace = tracer.startRootSpan(); + tracer.endRootSpan(); assert.ok(trace.ended); }); }); describe('clearCurrentTrace()', function () { it('the current trace is null', function () { - let tracer = new Tracer(noopExporter); - let trace = tracer.startTrace(); + let tracer = new Tracer(); + let trace = tracer.startRootSpan(); tracer.clearCurrentTrace(); assert.ok(tracer.currentTrace == null); }); }); describe('startSpan()', function () { - let tracer = new Tracer(noopExporter); - let trace = tracer.startTrace(); + let tracer = new Tracer(); + let trace = tracer.startRootSpan(); let span = tracer.startSpan("spanName", "spanType"); it('should return a Span instance', function () { assert.ok(span instanceof Span); From fe5ece9a86550e715791ff3271e50f56517023b8 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 25 Mar 2018 14:17:26 -0300 Subject: [PATCH 021/110] More refactorings, add endspan event listener, correct bug in zipkin exporter and others --- .../src/trace/model/root-span.ts | 15 +++- .../opencensus-core/src/trace/model/span.ts | 9 +- .../opencensus-core/src/trace/model/tracer.ts | 85 ++++++++----------- .../src/trace/types/tracetypes.ts | 7 +- packages/opencensus-core/test/test-span.ts | 13 ++- packages/opencensus-core/test/test-trace.ts | 19 +++-- 6 files changed, 81 insertions(+), 67 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index a13f8d4aa..5f8a2f054 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,15 +18,18 @@ import { Span } from './span' import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; import { debug } from '../../internal/util' -import { SpanBaseModel, TraceContext } from '../types/tracetypes' +import { SpanBaseModel, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' +import { Tracer } from './tracer'; -export class RootSpan extends SpanBaseModel { +export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { + private tracer: Tracer; private _spans: Span[]; private _traceId: string; - constructor(context?: TraceContext ) { + constructor(tracer: Tracer, context?: TraceContext ) { super() + this.tracer = tracer; this._traceId = context&&context.traceId?context.traceId:(uuid.v4().split('-').join('')); this._spans = []; } @@ -61,6 +64,12 @@ export class RootSpan extends SpanBaseModel { startTime: this.startTime, endTime: this.endTime, duration: this.duration }) + + this.tracer.onEndSpan(this) + } + + public onEndSpan(span: Span) { + debug('%s notified ending by %o',{id: span.id, name: span.name}) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 1ce5b4a4f..2bc67a8ae 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -22,10 +22,10 @@ import { SpanBaseModel, TraceContext } from '../types/tracetypes' export class Span extends SpanBaseModel { - private root: SpanBaseModel; + private root: RootSpan; // private _parentSpanId: string; - constructor(root: SpanBaseModel) { + constructor(root: RootSpan) { super() this.root = root; } @@ -56,8 +56,13 @@ export class Span extends SpanBaseModel { }) } + private notifyEnd () { + this.root.onEndSpan(this); + } + public end(): void { super.end(); + this.notifyEnd(); debug('ending span %o', { spanId: this.id, diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 98fc9a623..66675017a 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -20,31 +20,22 @@ import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' -import { Exporter, NoopExporter } from '../../exporters/exporter' -import { TraceContext } from '../types/tracetypes'; +import { TraceContext, OnEndSpanEventListener } from '../types/tracetypes'; +import { TracerConfig, defaultConfig } from '../tracing'; export type Func = (...args: any[]) => T; -export interface TracerConfig { - exporter?: Exporter, - sampleRate?: number; - ignoreUrls?: Array; -} - -export const defaultConfig: TracerConfig = { - exporter: new NoopExporter(), - sampleRate: 1.0 -} -export class Tracer { +export class Tracer implements OnEndSpanEventListener { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; private _active: boolean; private contextManager: cls.Namespace; - private exporter: Exporter; private config: TracerConfig; + //TODO: simple solution - to be rewied in future + private eventListeners: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; @@ -53,18 +44,17 @@ export class Tracer { this.contextManager = cls.createNamespace(); } - public get currentTrace(): RootSpan { - return this.contextManager.get('trace'); + public get currentRootSpan(): RootSpan { + return this.contextManager.get('rootspan'); } - private setCurrentTrace(trace: RootSpan) { - this.contextManager.set('trace', trace); + private setCurrentRootSpan(root: RootSpan) { + this.contextManager.set('rootspan', root); } public start(config?: TracerConfig): Tracer { this._active = true; this.config = config || defaultConfig; - this.exporter = this.config.exporter; return this; } @@ -77,54 +67,57 @@ export class Tracer { } public startRootSpan(context?: TraceContext): RootSpan { - let newTrace = new RootSpan(context); - this.setCurrentTrace(newTrace); + let newTrace = new RootSpan(this, context); + this.setCurrentRootSpan(newTrace); newTrace.start(); return newTrace; } + + public onEndSpan(root:RootSpan): void { + if (!this.currentRootSpan) { + return debug('cannot end trace - no active trace found') + } + if(this.currentRootSpan != root) { + return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + } + this.notifyEndSpan(this.currentRootSpan); + //this.clearCurrentTrace(); + } + //TODO: review public runInContex(fn: Func): T { return this.contextManager.runAndReturn (fn) } + + public registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListeners.push(listner); + } - public endRootSpan(): void { - if (!this.currentTrace) { - return debug('cannot end trace - no active trace found') + private notifyEndSpan(root: RootSpan) { + if (this.active) { + if(this.eventListeners&&this.eventListeners.length >0) { + this.eventListeners.forEach((listener) => listener.onEndSpan(root)) + } + } else { + debug ('this tracer is inactivate cant notify endspan') } - this.currentTrace.end(); - this.addEndedTrace(this.currentTrace); - //this.clearCurrentTrace(); } public clearCurrentTrace() { - this.setCurrentTrace(null); + this.setCurrentRootSpan(null); } public startSpan(name: string, type: string): Span { let newSpan: Span = null; - if (!this.currentTrace) { + if (!this.currentRootSpan) { debug('no current trace found - cannot start a new span'); } else { - newSpan = this.currentTrace.startSpan(name, type); + newSpan = this.currentRootSpan.startSpan(name, type); } return newSpan; } - /*public endSpan(span: Span) { - debug('END SPAN', span); - span.end(); - this.exporter.emit(this.currentTrace); - }*/ - - private addEndedTrace(trace: RootSpan) { - if (this.active) { - //TODO: temp solution - //this.endedTraces.push(trace); - this.exporter.writeTrace(this.currentTrace); - } - } - public wrap(fn: Func): Func { if (!this.active) { return fn; @@ -145,10 +138,6 @@ export class Tracer { namespace.bindEmitter(emitter); } - public registerExporter(exporter: Exporter) { - this.exporter = exporter; - } - } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 052a8596e..9e8d55629 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -27,12 +27,16 @@ export interface TraceContext { options?: number } +export interface OnEndSpanEventListener { + onEndSpan(span: SpanBaseModel): void; +} + export abstract class SpanBaseModel { protected _className: string; private _id: string; private clock: Clock; - //------ + //--Tra---- private _remoteParent: string; private _name: string; private _started: boolean; @@ -163,7 +167,6 @@ export abstract class SpanBaseModel { this._started = false; this._ended = true; this.clock.end(); - } diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index c092c5ece..56873c521 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -16,21 +16,26 @@ import { Span } from '../src/trace/model/span'; import { RootSpan } from '../src/trace/model/rootspan'; +import { SpanBaseModel } from '../src/trace/types/tracetypes'; +import { Tracer } from '../src/trace/model/tracer'; + var assert = require('assert'); +let tracer = new Tracer() + describe('Span creation', function () { let root; let span; before(function () { - root = new RootSpan(); + root = new RootSpan(tracer); span = root.startSpan('spanName', 'typeSpan'); }); it('should create an span on the trace', function () { - assert.ok(root instanceof RootSpan); + assert.ok(root instanceof SpanBaseModel); span = root.startSpan('spanName', 'typeSpan'); assert.ok(span instanceof Span); assert.ok(span.id); @@ -53,7 +58,7 @@ describe('Span checking creation', function () { let span; before(function () { - root = new RootSpan(); + root = new RootSpan(tracer); span = root.startSpan('spanName', 'typeSpan'); }); @@ -68,7 +73,7 @@ describe('Span data', function () { let root; before(function () { - root = new RootSpan(); + root = new RootSpan(tracer); }); it('generates unique numeric span ID strings', function () { diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts index d71b3b1a3..7328f7138 100644 --- a/packages/opencensus-core/test/test-trace.ts +++ b/packages/opencensus-core/test/test-trace.ts @@ -16,27 +16,30 @@ import { RootSpan } from '../src/trace/model/rootspan'; import { Span } from '../src/trace/model/span'; +import { Tracer } from '../src/trace/model/tracer'; +import { SpanBaseModel } from '../src/trace/types/tracetypes'; let assert = require('assert'); +let tracer = new Tracer() describe('Trace', function () { describe('new Trace()', function () { it('should be a Trace instance', function () { - let root = new RootSpan(); - assert.ok(root instanceof RootSpan); + let root = new RootSpan(tracer); + assert.ok(root instanceof SpanBaseModel); }); }); describe('start()', function () { it('the trace was started', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); root.start(); assert.ok(root.started); }); }); describe('startSpan()', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); root.start() let span = root.startSpan("spanName", "spanType"); it('should return a Span instance', function () { @@ -50,7 +53,7 @@ describe('Trace', function () { describe('end()', function () { it('the trace was ended', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); root.start() root.end(); assert.ok(root.ended); @@ -59,7 +62,7 @@ describe('Trace', function () { describe('end() before trace started', function () { it('the trace was not ended', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); root.end(); assert.ok(!root.ended); }); @@ -67,7 +70,7 @@ describe('Trace', function () { describe('startSpan() before trace started', function () { it('should return null', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); let span = root.startSpan("spanName", "spanType"); assert.ok(span == null); }); @@ -75,7 +78,7 @@ describe('Trace', function () { describe('startSpan() after trace ended', function () { it('should return null', function () { - let root = new RootSpan(); + let root = new RootSpan(tracer); root.start() root.end(); let span = root.startSpan("spanName", "spanType"); From bb26d68174b69df66b6ac38b99228ea83b46a429 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Mon, 26 Mar 2018 09:44:59 -0300 Subject: [PATCH 022/110] Fix code style --- packages/opencensus-core/src/trace/model/tracer.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 66675017a..9ee3cb2db 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -91,6 +91,7 @@ export class Tracer implements OnEndSpanEventListener { } public registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListeners.push(listner); } From 3b00c704b117fabb47e5d24121dd55a9d9ebf1e0 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 27 Mar 2018 11:12:21 -0300 Subject: [PATCH 023/110] Adds patching for http GET requests --- packages/opencensus-core/src/trace/model/tracer.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 9ee3cb2db..8d3fa934a 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -67,10 +67,10 @@ export class Tracer implements OnEndSpanEventListener { } public startRootSpan(context?: TraceContext): RootSpan { - let newTrace = new RootSpan(this, context); - this.setCurrentRootSpan(newTrace); - newTrace.start(); - return newTrace; + let newRootSpan = new RootSpan(this, context); + this.setCurrentRootSpan(newRootSpan); + newRootSpan.start(); + return newRootSpan; } From 9bdb21fabda11223556bed8644a245f4375c9de7 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 27 Mar 2018 14:32:21 -0300 Subject: [PATCH 024/110] Buffer refactoring --- .../opencensus-core/src/trace/model/tracer.ts | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 9ee3cb2db..79b75ae52 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -20,8 +20,10 @@ import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' +import { Exporter } from '../../exporters/exporter' import { TraceContext, OnEndSpanEventListener } from '../types/tracetypes'; import { TracerConfig, defaultConfig } from '../tracing'; +import { Buffer } from '../../exporters/buffer' export type Func = (...args: any[]) => T; @@ -30,12 +32,13 @@ export class Tracer implements OnEndSpanEventListener { readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; + //public buffer: Buffer; private _active: boolean; private contextManager: cls.Namespace; private config: TracerConfig; //TODO: simple solution - to be rewied in future - private eventListeners: OnEndSpanEventListener[] = []; + private eventListeners: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; @@ -58,6 +61,10 @@ export class Tracer implements OnEndSpanEventListener { return this; } + public getEventListeners(): OnEndSpanEventListener[] { + return this.eventListeners; + } + public stop() { this._active = false; } @@ -74,12 +81,12 @@ export class Tracer implements OnEndSpanEventListener { } - public onEndSpan(root:RootSpan): void { + public onEndSpan(root: RootSpan): void { if (!this.currentRootSpan) { return debug('cannot end trace - no active trace found') } - if(this.currentRootSpan != root) { - return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + if (this.currentRootSpan != root) { + return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') } this.notifyEndSpan(this.currentRootSpan); //this.clearCurrentTrace(); @@ -87,21 +94,27 @@ export class Tracer implements OnEndSpanEventListener { //TODO: review public runInContex(fn: Func): T { - return this.contextManager.runAndReturn (fn) + return this.contextManager.runAndReturn(fn) } - - public registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListeners.push(listner); + public registerEndSpanListener(listener: OnEndSpanEventListener) { + this.eventListeners.push(listener); + //this.buffer.registerExporter(exporter) } + + /*public registerExporter(exporter: Exporter) { + //this.eventListeners.push(listner); + this.buffer.registerExporter(exporter) + }*/ private notifyEndSpan(root: RootSpan) { if (this.active) { - if(this.eventListeners&&this.eventListeners.length >0) { + //this.buffer.onEndSpan(root); + if (this.eventListeners && this.eventListeners.length > 0) { this.eventListeners.forEach((listener) => listener.onEndSpan(root)) } } else { - debug ('this tracer is inactivate cant notify endspan') + debug('this tracer is inactivate cant notify endspan') } } From 8cddf956793082c13ab676384883eb0ff3f73939 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 28 Mar 2018 14:54:19 -0300 Subject: [PATCH 025/110] Add sampler --- .../src/trace/model/root-span.ts | 21 +++-- .../opencensus-core/src/trace/model/tracer.ts | 23 ++--- .../src/trace/sampler/sampler.ts | 86 +++++++++++++++++++ .../src/trace/types/tracetypes.ts | 12 +++ 4 files changed, 125 insertions(+), 17 deletions(-) create mode 100644 packages/opencensus-core/src/trace/sampler/sampler.ts diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 5f8a2f054..5ceb3e803 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -19,7 +19,8 @@ import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; import { debug } from '../../internal/util' import { SpanBaseModel, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' -import { Tracer } from './tracer'; +import { Tracer } from './tracer' +import { Sampler } from './sampler' export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { @@ -73,12 +74,18 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { } public startSpan(name: string, type: string) { - let newSpan = new Span(this); - newSpan.name = name - newSpan.type = type - newSpan.start(); - this._spans.push(newSpan); - return newSpan; + if(!this.sampler == null || this.sampler.continue(this._traceId)){ + let newSpan = new Span(this); + newSpan.name = name + newSpan.type = type + newSpan.start(); + this._spans.push(newSpan); + return newSpan; + }else{ + //TODO + debug("ELDREY -> RootSpan return startSpan null") + return + } } } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 79b75ae52..98dc99de9 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -22,8 +22,9 @@ import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' import { Exporter } from '../../exporters/exporter' import { TraceContext, OnEndSpanEventListener } from '../types/tracetypes'; -import { TracerConfig, defaultConfig } from '../tracing'; +import { TracerConfig, defaultConfig } from '../tracing' import { Buffer } from '../../exporters/buffer' +import { Sampler } from './sampler' export type Func = (...args: any[]) => T; @@ -38,7 +39,7 @@ export class Tracer implements OnEndSpanEventListener { private config: TracerConfig; //TODO: simple solution - to be rewied in future - private eventListeners: OnEndSpanEventListener[] = []; + private eventListeners: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; @@ -73,9 +74,16 @@ export class Tracer implements OnEndSpanEventListener { return this._active; } - public startRootSpan(context?: TraceContext): RootSpan { + public startRootSpan(context?: TraceContext, sampler?: Sampler): RootSpan { let newTrace = new RootSpan(this, context); + debug("tracer startRootSpan ") this.setCurrentRootSpan(newTrace); + if(sampler == null){ + sampler = new Sampler(newTrace.traceId); + sampler.always(); + } + debug("tracer startRootSpan ") + newTrace.sampler = sampler; newTrace.start(); return newTrace; } @@ -86,7 +94,7 @@ export class Tracer implements OnEndSpanEventListener { return debug('cannot end trace - no active trace found') } if (this.currentRootSpan != root) { - return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') } this.notifyEndSpan(this.currentRootSpan); //this.clearCurrentTrace(); @@ -96,16 +104,11 @@ export class Tracer implements OnEndSpanEventListener { public runInContex(fn: Func): T { return this.contextManager.runAndReturn(fn) } - + public registerEndSpanListener(listener: OnEndSpanEventListener) { this.eventListeners.push(listener); //this.buffer.registerExporter(exporter) } - - /*public registerExporter(exporter: Exporter) { - //this.eventListeners.push(listner); - this.buffer.registerExporter(exporter) - }*/ private notifyEndSpan(root: RootSpan) { if (this.active) { diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts new file mode 100644 index 000000000..9f46a1739 --- /dev/null +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -0,0 +1,86 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { debug, randomSpanId } from '../../internal/util' + + +const minNumber = 1e-4; +const maxNumber = 1; + +export class Sampler{ + traceId: string; + spanId: string; + isRemote: boolean; + idUpperBound: number; + + /** + * + * @param traceId + * @param spanId + * @param isRemote + */ + constructor(traceId?:string, spanId?:string, isRemote?:boolean){ + debug('Samplre constructor') + if(traceId){ + this.traceId = traceId; + } + if(spanId){ + this.spanId = spanId; + } + this.isRemote = isRemote || false; + + } + + public always():Sampler{ + this.idUpperBound = maxNumber; + return this; + } + + public never():Sampler{ + this.idUpperBound = minNumber; + return this; + } + + public probability(probability:number):Sampler{ + if(probability < minNumber){ + return this.never(); + + } else if (probability > maxNumber){ + return this.always(); + + } + + this.idUpperBound = probability * maxNumber; + return this; + } + + public continue (traceId:string):boolean{ + debug('Samplre continue') + let lower_bytes = traceId.substring(traceId.length - 4) + let j; + let lower_long: number + for(j = 0; j < lower_bytes.length; j++) { + lower_long = lower_bytes.charCodeAt(j); + } + + if(lower_long <= this.idUpperBound){ + return true + }else{ + return false; + } + } + + } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 9e8d55629..eeb667c84 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -16,6 +16,7 @@ import { Clock } from '../../internal/clock' import { debug, randomSpanId } from '../../internal/util' +import { Sampler } from '../model/sampler' export interface MapLabels { [propName: string]: string; } @@ -49,6 +50,7 @@ export abstract class SpanBaseModel { //links //TODO truncated private _truncated: boolean; + private _sampler: Sampler; constructor() { this._className = this.constructor.name; @@ -141,6 +143,16 @@ export abstract class SpanBaseModel { this.annotations[key] = value; } + public get sampler(){ + debug('tracetypes get sampler()') + return this._sampler; + } + + public set sampler(sampler:Sampler){ + debug('tracetypes set sempler(sampler)') + this._sampler = sampler; + } + public start() { if (this.started) { debug('calling %s.start() on already started %s %o', From 26c24fc1a3de8d1a24af599a82eddd2e7749c59b Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 29 Mar 2018 03:36:54 -0300 Subject: [PATCH 026/110] Change startRootSpan to deal with context --- .../src/trace/model/root-span.ts | 8 ++++--- .../opencensus-core/src/trace/model/tracer.ts | 21 +++++++++---------- .../src/trace/types/tracetypes.ts | 5 +++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 5f8a2f054..7bcc92f5f 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,7 +18,7 @@ import { Span } from './span' import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; import { debug } from '../../internal/util' -import { SpanBaseModel, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' +import { SpanBaseModel, TraceContext, OnEndSpanEventListener, TraceOptions } from '../types/tracetypes' import { Tracer } from './tracer'; export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { @@ -27,10 +27,12 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { private _spans: Span[]; private _traceId: string; - constructor(tracer: Tracer, context?: TraceContext ) { + //TODO - improve root name setup + constructor(tracer: Tracer, context?: TraceOptions ) { super() this.tracer = tracer; - this._traceId = context&&context.traceId?context.traceId:(uuid.v4().split('-').join('')); + this._traceId = context&&context.traceContext&&context.traceContext.traceId?context.traceContext.traceId:(uuid.v4().split('-').join('')); + this.name = context&&context.name?context.name:'undefined'; this._spans = []; } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 66675017a..64695c941 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -20,8 +20,8 @@ import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' -import { TraceContext, OnEndSpanEventListener } from '../types/tracetypes'; -import { TracerConfig, defaultConfig } from '../tracing'; +import { TraceContext, TraceOptions, OnEndSpanEventListener } from '../types/tracetypes'; +import { TracerConfig, defaultConfig } from '../tracing'; export type Func = (...args: any[]) => T; @@ -66,11 +66,14 @@ export class Tracer implements OnEndSpanEventListener { return this._active; } - public startRootSpan(context?: TraceContext): RootSpan { - let newTrace = new RootSpan(this, context); - this.setCurrentRootSpan(newTrace); - newTrace.start(); - return newTrace; + public startRootSpan(context: TraceOptions, fn: (root: RootSpan) => T): T { + debug('starting root span: %o', context) + return this.contextManager.runAndReturn((root) => { + let newRoot = new RootSpan(this, context); + this.setCurrentRootSpan(newRoot); + newRoot.start(); + return fn(newRoot); + }); } @@ -85,10 +88,6 @@ export class Tracer implements OnEndSpanEventListener { //this.clearCurrentTrace(); } - //TODO: review - public runInContex(fn: Func): T { - return this.contextManager.runAndReturn (fn) - } public registerEndSpanListener(listner: OnEndSpanEventListener) { this.eventListeners.push(listner); diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 9e8d55629..23ad456ab 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -27,6 +27,11 @@ export interface TraceContext { options?: number } +export interface TraceOptions { + name:string; + traceContext?:TraceContext; +} + export interface OnEndSpanEventListener { onEndSpan(span: SpanBaseModel): void; } From f316a6ba9f44fb1d262f37d75c1320233beeb3ab Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 29 Mar 2018 03:36:54 -0300 Subject: [PATCH 027/110] Change startRootSpan to deal with context --- .../src/trace/model/root-span.ts | 8 ++++--- .../opencensus-core/src/trace/model/tracer.ts | 21 +++++++++---------- .../src/trace/types/tracetypes.ts | 5 +++++ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 5f8a2f054..7bcc92f5f 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,7 +18,7 @@ import { Span } from './span' import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; import { debug } from '../../internal/util' -import { SpanBaseModel, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' +import { SpanBaseModel, TraceContext, OnEndSpanEventListener, TraceOptions } from '../types/tracetypes' import { Tracer } from './tracer'; export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { @@ -27,10 +27,12 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { private _spans: Span[]; private _traceId: string; - constructor(tracer: Tracer, context?: TraceContext ) { + //TODO - improve root name setup + constructor(tracer: Tracer, context?: TraceOptions ) { super() this.tracer = tracer; - this._traceId = context&&context.traceId?context.traceId:(uuid.v4().split('-').join('')); + this._traceId = context&&context.traceContext&&context.traceContext.traceId?context.traceContext.traceId:(uuid.v4().split('-').join('')); + this.name = context&&context.name?context.name:'undefined'; this._spans = []; } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 66675017a..6a2602cc9 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -20,8 +20,8 @@ import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' -import { TraceContext, OnEndSpanEventListener } from '../types/tracetypes'; -import { TracerConfig, defaultConfig } from '../tracing'; +import { TraceContext, TraceOptions, OnEndSpanEventListener } from '../types/tracetypes'; +import { TracerConfig, defaultConfig } from '../tracing'; export type Func = (...args: any[]) => T; @@ -66,11 +66,14 @@ export class Tracer implements OnEndSpanEventListener { return this._active; } - public startRootSpan(context?: TraceContext): RootSpan { - let newTrace = new RootSpan(this, context); - this.setCurrentRootSpan(newTrace); - newTrace.start(); - return newTrace; + public startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + debug('starting root span: %o', options) + return this.contextManager.runAndReturn((root) => { + let newRoot = new RootSpan(this, options); + this.setCurrentRootSpan(newRoot); + newRoot.start(); + return fn(newRoot); + }); } @@ -85,10 +88,6 @@ export class Tracer implements OnEndSpanEventListener { //this.clearCurrentTrace(); } - //TODO: review - public runInContex(fn: Func): T { - return this.contextManager.runAndReturn (fn) - } public registerEndSpanListener(listner: OnEndSpanEventListener) { this.eventListeners.push(listner); diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 9e8d55629..23ad456ab 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -27,6 +27,11 @@ export interface TraceContext { options?: number } +export interface TraceOptions { + name:string; + traceContext?:TraceContext; +} + export interface OnEndSpanEventListener { onEndSpan(span: SpanBaseModel): void; } From aeb0264734c851435e85425d5d28efd09bff5265 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 29 Mar 2018 08:58:36 -0300 Subject: [PATCH 028/110] Add wrapEmitter to req and res, Improving debug mensages --- packages/opencensus-core/src/trace/model/root-span.ts | 2 +- packages/opencensus-core/src/trace/model/tracer.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 7bcc92f5f..b08b9b436 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -71,7 +71,7 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { } public onEndSpan(span: Span) { - debug('%s notified ending by %o',{id: span.id, name: span.name}) + debug('ended span notified %o', {id: span.id, name: span.name}) } public startSpan(name: string, type: string) { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 6a2602cc9..b97d906da 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -78,13 +78,13 @@ export class Tracer implements OnEndSpanEventListener { public onEndSpan(root:RootSpan): void { - if (!this.currentRootSpan) { + if (!root) { return debug('cannot end trace - no active trace found') } if(this.currentRootSpan != root) { - return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + debug('currentRootSpan != root on notifyEnd. Need more investigation.') } - this.notifyEndSpan(this.currentRootSpan); + this.notifyEndSpan(root); //this.clearCurrentTrace(); } @@ -95,6 +95,7 @@ export class Tracer implements OnEndSpanEventListener { private notifyEndSpan(root: RootSpan) { if (this.active) { + debug ('starting to notify listeners the end of rootspans') if(this.eventListeners&&this.eventListeners.length >0) { this.eventListeners.forEach((listener) => listener.onEndSpan(root)) } From 6c6c0360d0a992fa2916d4f901285faa20bd2817 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Thu, 29 Mar 2018 09:59:17 -0300 Subject: [PATCH 029/110] Fixed zipkin url configuration --- packages/opencensus-core/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 6f022872e..6112c2477 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -11,6 +11,7 @@ "compile-strict": "npm run script compile-auto-strict", "compile": "npm run script compile-auto compile-auto-strict", "clean": "rimraf build/*", + "fix": "gts fix", "script": "ts-node -P ./scripts ./scripts" }, "keywords": [ From 4b78a1e984e40d6a22f840d89da6dcc1b5184e9e Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Thu, 29 Mar 2018 11:01:52 -0300 Subject: [PATCH 030/110] Move sampler to options --- .../src/trace/model/root-span.ts | 18 +++++-------- .../opencensus-core/src/trace/model/span.ts | 27 ++++++++++--------- .../opencensus-core/src/trace/model/tracer.ts | 16 ++++++----- .../src/trace/sampler/sampler.ts | 12 +++++---- .../src/trace/types/tracetypes.ts | 1 + 5 files changed, 38 insertions(+), 36 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index d03784c53..30cceaf75 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -76,18 +76,12 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { } public startSpan(name: string, type: string) { - if(!this.sampler == null || this.sampler.continue(this._traceId)){ - let newSpan = new Span(this); - newSpan.name = name - newSpan.type = type - newSpan.start(); - this._spans.push(newSpan); - return newSpan; - }else{ - //TODO - debug("ELDREY -> RootSpan return startSpan null") - return - } + let newSpan = new Span(this); + newSpan.name = name + newSpan.type = type + newSpan.start(); + this._spans.push(newSpan); + return newSpan; } } diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 2bc67a8ae..8d67aa9e2 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -61,19 +61,20 @@ export class Span extends SpanBaseModel { } public end(): void { - super.end(); - this.notifyEnd(); - debug('ending span %o', - { - spanId: this.id, - traceId: this.traceId, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration - } - ) - + // if(this.sampler.continue(this.traceId)) { + + super.end(); + this.notifyEnd(); + debug('ending span %o', + { + spanId: this.id, + traceId: this.traceId, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration + }); + // } } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 3b72d38f1..86b386bc8 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -77,12 +77,16 @@ export class Tracer implements OnEndSpanEventListener { return this.contextManager.runAndReturn((root) => { let newRoot = new RootSpan(this, options); this.setCurrentRootSpan(newRoot); - if(sampler == null){ - sampler = new Sampler(newTrace.traceId); - sampler.always(); + debug('ELDREY -> START ROOT SPAN OPTIONS: ',options); + if(options.sampler == null){ + options.sampler = new Sampler(newRoot.traceId); + options.sampler.always(); + } + newRoot.sampler = options.sampler; + if(newRoot.sampler.continue(newRoot.traceId)){ + debug('ELDREY -> START ROOT SPAN .START()'); + newRoot.start(); } - newRoot.sampler = sampler; - newRoot.start(); return fn(newRoot); }); } @@ -124,7 +128,7 @@ export class Tracer implements OnEndSpanEventListener { let newSpan: Span = null; if (!this.currentRootSpan) { debug('no current trace found - cannot start a new span'); - } else { + } else{ newSpan = this.currentRootSpan.startSpan(name, type); } return newSpan; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 9f46a1739..a31961e70 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -18,7 +18,7 @@ import { debug, randomSpanId } from '../../internal/util' const minNumber = 1e-4; -const maxNumber = 1; +const maxNumber = 0xffffffffffffffff; export class Sampler{ traceId: string; @@ -69,13 +69,15 @@ export class Sampler{ public continue (traceId:string):boolean{ debug('Samplre continue') - let lower_bytes = traceId.substring(traceId.length - 4) + let lower_bytes = traceId.substring(16) let j; let lower_long: number - for(j = 0; j < lower_bytes.length; j++) { - lower_long = lower_bytes.charCodeAt(j); - } + debug('ELDREY -> SAMPLER CONTINUE lower_bytes :',lower_bytes) + + lower_long = parseInt(lower_bytes, 16); + debug('ELDREY -> SAMPLER CONTINUE lower_long :',lower_long) + debug('ELDREY -> SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) if(lower_long <= this.idUpperBound){ return true }else{ diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 3400bca5e..0f48566a0 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -31,6 +31,7 @@ export interface TraceContext { export interface TraceOptions { name:string; traceContext?:TraceContext; + sampler?:Sampler; } export interface OnEndSpanEventListener { From 8b9f7a2f392cb0c1810d292af4fbad155332f07c Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 29 Mar 2018 14:34:00 -0300 Subject: [PATCH 031/110] Add a README.md for the OpenCensus Node example --- examples/README.md | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 000000000..9379bee1b --- /dev/null +++ b/examples/README.md @@ -0,0 +1,96 @@ +# OpenCensus Node.js Example + + +Note: This code was tested on the following Node versions: +- v6.10.0 (for console exporter only) +- v9.8.0 (for Stackdriver and Zipkin exporters) + +___ + +## Setup + +1. Clone the OpenCensus Node repository **TODO link to repository** +<> + +2. Switch to branch `dev` with: +```bash +git checkout dev +``` + +3. Navigate to the OpenCensus Node project folder and install the dependencies with: +```bash +npm install +``` + +4. Compile the TypeScript code into JavaScript with: +``` +node_modules/.bin/tsc +``` + +5. Clone the application we will instrument (EasyNotes Application) + + +6. Navigate to the application folder and install the dependencies with: +```bash +npm install +``` + +7. Navigate to the `node_modules` folder inside the EasyNotes application and create a link to OpenCensus Node project folder with: +```bash +ln -s /opencensus-node/build/src opencensus-nodejs +``` + + +## Instrument using Stackdriver + +1. Make sure you enabled Stackdriver Tracing on Google Cloud Platform. More info at + +2. Enable Application Default Credentials for authentication with: +```bash +export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +``` +More information at + +3. Open the `server.js` file in the EasyNotes application and insert this code on top: +```javascript +var traceMng = require("opencensus-nodejs") + .addStackdriver("your-project-id") + .start(); +``` + +## Instrument using Zipkin + +1. Download Zipkin choosing one of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: +```bash + wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' + java -jar zipkin.jar +``` + +2. Open the `server.js` file in the EasyNotes application and insert this code on top: +```javascript +var tracing = require("opencensus-nodejs") + .addZipkin("http://localhost:9411/api/v2/spans", "easy-notes") + .start() +``` + +## Instrumenting with multiple Exporters + +It is possible to instrument with more than one code. To achieve this, simply add more than one Exporter in series. + +```javascript +var tracing = require("opencensus-nodejs") + .addZipkin(“http://localhost:9411/api/v2/spans“, "easy-notes") + .addStackdriver("your-project") + .start() +``` + +## Running the Instrumented Application + +It is possible both to run with debugging information and without it. To run with debugging information use: +```bash +DEBUG=opencensus node server.js +``` +To run without debugging information, simply use: +```bash +node server.js +``` From 088abb0333bd4724213de87016fba686b1b00522 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Thu, 29 Mar 2018 15:49:54 -0300 Subject: [PATCH 032/110] chord: merge commit --- .../opencensus-core/src/trace/model/tracer.ts | 8 +++--- .../src/trace/sampler/sampler.ts | 11 +++++--- .../src/trace/types/tracetypes.ts | 25 +++++++++++++------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index ae76de33c..5a7631f2d 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -73,21 +73,19 @@ export class Tracer implements OnEndSpanEventListener { } public startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { - debug('starting root span: %o', options) return this.contextManager.runAndReturn((root) => { let newRoot = new RootSpan(this, options); this.setCurrentRootSpan(newRoot); - debug('ELDREY -> START ROOT SPAN OPTIONS: ',options); if(options.sampler == null){ options.sampler = new Sampler(newRoot.traceId); - options.sampler.always(); + options.sampler.probability(0.6); } newRoot.sampler = options.sampler; if(newRoot.sampler.continue(newRoot.traceId)){ - debug('ELDREY -> START ROOT SPAN .START()'); newRoot.start(); + return fn(newRoot); } - return fn(newRoot); + return fn(null); }); } diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index a31961e70..6f348705a 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -70,17 +70,20 @@ export class Sampler{ public continue (traceId:string):boolean{ debug('Samplre continue') let lower_bytes = traceId.substring(16) - let j; let lower_long: number - debug('ELDREY -> SAMPLER CONTINUE lower_bytes :',lower_bytes) + debug('SAMPLER CONTINUE lower_bytes :',lower_bytes) lower_long = parseInt(lower_bytes, 16); - debug('ELDREY -> SAMPLER CONTINUE lower_long :',lower_long) - debug('ELDREY -> SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) + debug('SAMPLER CONTINUE lower_long :',lower_long) + debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) + debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) + if(lower_long <= this.idUpperBound){ + debug('trace sampler TRUE') return true }else{ + debug('trace sampler FALSE') return false; } } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 0f48566a0..332e1f891 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -69,6 +69,7 @@ export abstract class SpanBaseModel { this.setId(randomSpanId()); } + public get id(): string { return this._id; } @@ -120,15 +121,22 @@ export abstract class SpanBaseModel { } public get startTime(): Date { - return this.clock.startTime; + if(this.clock){ + return this.clock.startTime; + } + } public get endTime(): Date { - return this.clock.endTime; + if(this.clock){ + return this.clock.endTime; + } } public get duration(): number { - return this.clock.duration; + if(this.clock){ + return this.clock.duration; + } } public get traceContext(): TraceContext { @@ -173,13 +181,16 @@ export abstract class SpanBaseModel { public end(): void { if (!this.started) { debug('calling %s.end() on un-started %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) + this._started = false; + this._ended = true; + // this.clock.end(); return } else if (this.ended) { debug('calling %s.end() on already ended %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) return } this._started = false; From f95735785e60139bab81763101883f45cdaa7c02 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Thu, 29 Mar 2018 16:19:01 -0300 Subject: [PATCH 033/110] Adapted tests for dev --- .../opencensus-core/test/test-root-span.ts | 96 +++++++++++++++++++ packages/opencensus-core/test/test-span.ts | 52 +++++----- packages/opencensus-core/test/test-trace.ts | 89 ----------------- packages/opencensus-core/test/test-tracer.ts | 84 ++++++++-------- 4 files changed, 168 insertions(+), 153 deletions(-) create mode 100644 packages/opencensus-core/test/test-root-span.ts delete mode 100644 packages/opencensus-core/test/test-trace.ts diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts new file mode 100644 index 000000000..d30890529 --- /dev/null +++ b/packages/opencensus-core/test/test-root-span.ts @@ -0,0 +1,96 @@ +/** +* Copyright 2017 Google Inc. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the 'License'); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an 'AS IS' BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { RootSpan } from '../src/trace/model/rootspan'; +import { Span } from '../src/trace/model/span'; +import { Tracer } from '../src/trace/model/tracer'; +import { SpanBaseModel } from '../src/trace/types/tracetypes'; + +let assert = require('assert'); +let tracer = new Tracer(); + +describe('RootSpan', function () { + describe('new RootSpan()', function () { + it('should create a RootSpan instance', function () { + let root = new RootSpan(tracer); + assert.ok(root instanceof SpanBaseModel); + }); + }); + + describe('start()', function () { + + it('should start a RootSpan instance', function () { + let root = new RootSpan(tracer); + root.start(); + assert.ok(root.started); + }); + + }); + + describe('startSpan()', function () { + + let root, span; + + before(function () { + root = new RootSpan(tracer); + root.start(); + span = root.startSpan('spanName', 'spanType'); + }); + + it('should check span instance type', function () { + assert.ok(span instanceof Span); + }); + + it('should check if a new span was started', function () { + assert.ok(span.started); + }); + }); + + describe('end()', function () { + it('should end the trace', function () { + let root = new RootSpan(tracer); + root.start(); + root.end(); + assert.ok(root.ended); + }); + }); + + describe('end() before trace started', function () { + it('should not end trace', function () { + let root = new RootSpan(tracer); + root.end(); + assert.ok(!root.ended); + }); + }); + + describe('startSpan() before trace started', function () { + it('should not create span', function () { + let root = new RootSpan(tracer); + let span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); + }); + }); + + describe('startSpan() after trace ended', function () { + it('should not create span', function () { + let root = new RootSpan(tracer); + root.start(); + root.end(); + let span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); + }); + }); +}); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 56873c521..47695f5a8 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -24,59 +24,58 @@ var assert = require('assert'); let tracer = new Tracer() -describe('Span creation', function () { +describe('Span', function () { - let root; - let span; +describe('startSpan()', function () { - before(function () { - root = new RootSpan(tracer); - span = root.startSpan('spanName', 'typeSpan'); - }); + it('should create an span', function () { + const rootSpan = new RootSpan(tracer); + assert.ok(rootSpan instanceof SpanBaseModel); - it('should create an span on the trace', function () { - assert.ok(root instanceof SpanBaseModel); - span = root.startSpan('spanName', 'typeSpan'); + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); assert.ok(span instanceof Span); assert.ok(span.id); }); it('should start a span', function () { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); span.start(); assert.ok(span.started); }); it('should end a span', function () { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); + span.start(); span.end(); assert.ok(span.ended); }); }); -describe('Span checking creation', function () { - - let root; - let span; - - before(function () { - root = new RootSpan(tracer); - span = root.startSpan('spanName', 'typeSpan'); - }); +describe('Span checking after creation', function () { it('should not start span after it ended', function () { + const root = new RootSpan(tracer); + root.start(); + const span = root.startSpan('spanName', 'typeSpan'); + span.start(); span.end(); + + span.start(); assert.equal(span.ended, true); }); }); describe('Span data', function () { - let root; - - before(function () { - root = new RootSpan(tracer); - }); + it('should create an unique numeric span ID strings', function () { + const root = new RootSpan(tracer); + root.start(); - it('generates unique numeric span ID strings', function () { var numberOfSpansToCheck = 5; for (var i = 0; i < numberOfSpansToCheck; i++) { var span = root.startSpan('spanName' + i, 'typeSpan' + i); @@ -89,8 +88,9 @@ describe('Span data', function () { }); // TODO - it('truncates namespace', function(){ + it('should truncate namespace', function () { this.skip(); }); }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-trace.ts b/packages/opencensus-core/test/test-trace.ts deleted file mode 100644 index 7328f7138..000000000 --- a/packages/opencensus-core/test/test-trace.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright 2017 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { RootSpan } from '../src/trace/model/rootspan'; -import { Span } from '../src/trace/model/span'; -import { Tracer } from '../src/trace/model/tracer'; -import { SpanBaseModel } from '../src/trace/types/tracetypes'; - -let assert = require('assert'); -let tracer = new Tracer() - -describe('Trace', function () { - describe('new Trace()', function () { - it('should be a Trace instance', function () { - let root = new RootSpan(tracer); - assert.ok(root instanceof SpanBaseModel); - }); - }); - - describe('start()', function () { - it('the trace was started', function () { - let root = new RootSpan(tracer); - root.start(); - assert.ok(root.started); - }); - }); - - describe('startSpan()', function () { - let root = new RootSpan(tracer); - root.start() - let span = root.startSpan("spanName", "spanType"); - it('should return a Span instance', function () { - assert.ok(span instanceof Span); - }); - - it('the new span was started', function () { - assert.ok(span.started); - }); - }); - - describe('end()', function () { - it('the trace was ended', function () { - let root = new RootSpan(tracer); - root.start() - root.end(); - assert.ok(root.ended); - }); - }); - - describe('end() before trace started', function () { - it('the trace was not ended', function () { - let root = new RootSpan(tracer); - root.end(); - assert.ok(!root.ended); - }); - }); - - describe('startSpan() before trace started', function () { - it('should return null', function () { - let root = new RootSpan(tracer); - let span = root.startSpan("spanName", "spanType"); - assert.ok(span == null); - }); - }); - - describe('startSpan() after trace ended', function () { - it('should return null', function () { - let root = new RootSpan(tracer); - root.start() - root.end(); - let span = root.startSpan("spanName", "spanType"); - assert.ok(span == null); - }); - }); - -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index ba857d880..d8ca1dc39 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -14,86 +14,94 @@ * limitations under the License. */ -import { Tracer, defaultConfig } from '../src/trace/model/tracer'; -import { RootSpan } from '../src/trace/model/trace'; +import { Tracer } from '../src/trace/model/tracer'; +import { RootSpan } from '../src/trace/model/rootspan'; import { Span } from '../src/trace/model/span'; -import { Exporter, NoopExporter } from '../src/exporters/exporter'; +import { Exporter } from '../src/exporters/exporter'; let assert = require('assert'); +describe('Tracer', function () { + const options = { name: "test" }; + const callback = (root) => { -let noopExporter = new NoopExporter (); + return root; + } -describe('Tracer', function () { describe('new Tracer()', function () { - it('should be a Tracer instance', function () { + it('should create a Tracer instance', function () { let tracer = new Tracer(); assert.ok(tracer instanceof Tracer); }); }); describe('start()', function () { - let tracer = new Tracer(); - let tracerStarted = tracer.start(); - it('should return a tracer instance', function () { + let tracer = new Tracer(); + let tracerStarted = tracer.start(); assert.ok(tracerStarted instanceof Tracer); }); - it('should set true on active property', function () { + it('the trace was started', function () { + let tracer = new Tracer(); + let tracerStarted = tracer.start(); assert.ok(tracerStarted.active); }); }); - describe('startTrace()', function () { - let tracer; - let trace; + describe('startRootSpan()', function () { - before(() => { - tracer = new Tracer(); - trace = tracer.startTrace(); - }) + it('should start the rootSpan', function () { + const tracer = new Tracer(); + tracer.start(); + const root = tracer.startRootSpan(options, callback); - it('should return a Trace instance', function () { - assert.ok(trace instanceof RootSpan); + assert.ok(root.started); }); - it('the new trace was set as current trace', function () { - assert.equal(tracer.currentTrace.id, trace.id); - }); + it('should set the new span root as currentRootSpan', function () { + const tracer = new Tracer(); + tracer.start(); + const root = tracer.startRootSpan(options, callback); - it('the new trace was started', function () { - assert.ok(trace.started); + assert.equal(tracer.currentRootSpan.id, root.id); }); }); - describe('endTrace()', function () { - it('the current trace was ended', function () { - let tracer = new Tracer(); - let trace = tracer.startRootSpan(); - tracer.endRootSpan(); + describe('end()', function () { + it('should end current trace', function () { + const tracer = new Tracer(); + const trace = tracer.startRootSpan(options, callback); + trace.end(); assert.ok(trace.ended); }); }); - describe('clearCurrentTrace()', function () { - it('the current trace is null', function () { - let tracer = new Tracer(); - let trace = tracer.startRootSpan(); + describe('clearCurrentRootSpan()', function () { + it('should set the current root span to null', function () { + const tracer = new Tracer(); + const trace = tracer.startRootSpan(options, callback); tracer.clearCurrentTrace(); - assert.ok(tracer.currentTrace == null); + + assert.ok(tracer.currentRootSpan == null); }); }); describe('startSpan()', function () { - let tracer = new Tracer(); - let trace = tracer.startRootSpan(); - let span = tracer.startSpan("spanName", "spanType"); it('should return a Span instance', function () { + const tracer = new Tracer(); + const trace = tracer.startRootSpan(options, callback); + trace.start(); + const span = tracer.startSpan("spanName", "spanType"); + console.log(span); assert.ok(span instanceof Span); }); - it('span was started', function () { + it('should start a span', function () { + const tracer = new Tracer(); + const trace = tracer.startRootSpan(options, callback); + trace.start(); + const span = tracer.startSpan("spanName", "spanType"); assert.ok(span.started); }); }); From e1dce1935108f26b1ba5369da9ee9e3e3c8d7e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Gomes=20Silva?= Date: Thu, 29 Mar 2018 16:22:52 -0300 Subject: [PATCH 034/110] Update example README.md --- examples/README.md | 101 ++++++++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/examples/README.md b/examples/README.md index 9379bee1b..98956177a 100644 --- a/examples/README.md +++ b/examples/README.md @@ -5,19 +5,24 @@ Note: This code was tested on the following Node versions: - v6.10.0 (for console exporter only) - v9.8.0 (for Stackdriver and Zipkin exporters) +At this momment the automatic instrumetation is only for apps using http and mongo-db. + ___ ## Setup -1. Clone the OpenCensus Node repository **TODO link to repository** -<> +1. Clone the OpenCensus Node repository https://github.com/census-instrumentation/opencensus-node.git +```bash +git clone https://github.com/census-instrumentation/opencensus-node.git +cd opencensus-node +``` 2. Switch to branch `dev` with: ```bash git checkout dev ``` -3. Navigate to the OpenCensus Node project folder and install the dependencies with: +3. Install the dependencies with: ```bash npm install ``` @@ -27,38 +32,68 @@ npm install node_modules/.bin/tsc ``` -5. Clone the application we will instrument (EasyNotes Application) - +5. In a different folder, clone the example application to be instrumented (EasyNotes Application) +```bash + git clone https://github.com/callicoder/node-easy-notes-app +``` 6. Navigate to the application folder and install the dependencies with: ```bash +cd node-easy-notes-app npm install ``` -7. Navigate to the `node_modules` folder inside the EasyNotes application and create a link to OpenCensus Node project folder with: +7. Check if the app is running. PS.: a mongodb installation is required ```bash +$ node server.js +Server is listening on port 3000 +Successfully connected to the database +``` + +## Add opencensus instrumentation + +To add opencensus instrumetation, follow the step below: + +1. Navigate to the `node_modules` folder inside the EasyNotes application and create a link to OpenCensus Node project folder with: +```bash +cd node_modules ln -s /opencensus-node/build/src opencensus-nodejs +cd .. ``` +2. Edit server.js and add the following line, as the first line of the file: +```javascript + var tracing = require("opencensus-nodejs").start() + ... + var express = require('express'); + ``` -## Instrument using Stackdriver -1. Make sure you enabled Stackdriver Tracing on Google Cloud Platform. More info at +## Running the Instrumented Application + +Save the file server.js and run the app with debugging option. -2. Enable Application Default Credentials for authentication with: ```bash -export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +$ DEBUG=opencensus node server.js +opencensus useAsyncHooks = true +0ms +opencensus patching http@9.8.0 module +75ms +opencensus patching http.Server.prototype.emit function +7ms +.... +Server is listening on port 3000 +Successfully connected to the database ``` -More information at +This options uses a default exporter to console. -3. Open the `server.js` file in the EasyNotes application and insert this code on top: -```javascript -var traceMng = require("opencensus-nodejs") - .addStackdriver("your-project-id") - .start(); +To test de api you can use the commands: +```bash +#To insert a note: +curl -X POST http://localhost:3000/notes --data '{"title": "Note 1", "content": "this is the note content"}' -H "Content-Type: application/json" + +#To get notes: +curl http://localhost:3000/notes ``` -## Instrument using Zipkin +## Exporting to Zipkins 1. Download Zipkin choosing one of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: ```bash @@ -73,7 +108,26 @@ var tracing = require("opencensus-nodejs") .start() ``` -## Instrumenting with multiple Exporters + +## Exporting to Stackdriver + +1. Make sure you enabled Stackdriver Tracing on Google Cloud Platform. More info at + +2. Enable Application Default Credentials for authentication with: +```bash +export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +``` +More information at + +3. Open the `server.js` file in the EasyNotes application and insert this code on top: +```javascript +var traceMng = require("opencensus-nodejs") + .addStackdriver("your-project-id") + .start(); +``` + + +## Exporting to multiple Exporters It is possible to instrument with more than one code. To achieve this, simply add more than one Exporter in series. @@ -83,14 +137,3 @@ var tracing = require("opencensus-nodejs") .addStackdriver("your-project") .start() ``` - -## Running the Instrumented Application - -It is possible both to run with debugging information and without it. To run with debugging information use: -```bash -DEBUG=opencensus node server.js -``` -To run without debugging information, simply use: -```bash -node server.js -``` From 9c750cd5b4bdf2cf3d4f36494908239cef83057e Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 29 Mar 2018 16:28:48 -0300 Subject: [PATCH 035/110] Add design doc --- docs/design/opencensus.nodejs.first.design.pdf | Bin 0 -> 253990 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/design/opencensus.nodejs.first.design.pdf diff --git a/docs/design/opencensus.nodejs.first.design.pdf b/docs/design/opencensus.nodejs.first.design.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c2117c5c3f2bf1f229f74d3779d4e59972a707b3 GIT binary patch literal 253990 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 JUKJh6{0ANeuf+fW literal 0 HcmV?d00001 From 1e2f049974d002687db9e88edfff6a6be0e7adf8 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Mon, 2 Apr 2018 09:13:34 -0300 Subject: [PATCH 036/110] Creates Traces with sent context --- .../src/trace/model/root-span.ts | 26 +++++++-- .../opencensus-core/src/trace/model/tracer.ts | 58 ++++++++++++++----- .../src/trace/types/tracetypes.ts | 12 +++- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index ec43373cb..9f97118f1 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -28,11 +28,14 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { private _traceId: string; //TODO - improve root name setup - constructor(tracer: Tracer, context?: TraceOptions ) { + constructor(tracer: Tracer, context?: TraceOptions) { super() this.tracer = tracer; - this._traceId = context&&context.traceContext&&context.traceContext.traceId?context.traceContext.traceId:(uuid.v4().split('-').join('')); - this.name = context&&context.name?context.name:'undefined'; + this._traceId = context && context.traceContext && context.traceContext.traceId ? context.traceContext.traceId : (uuid.v4().split('-').join('')); + this.name = context && context.name ? context.name : 'undefined'; + if (context && context.traceContext) { + this.setParentSpanId(context.traceContext.spanId || '') + } this._spans = []; } @@ -44,9 +47,20 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { return this._traceId; } + public getOptions() { + return { + name: this.name, + traceContext: { + traceId: this.traceId, + spanId: this.id, + parentSpanId: this.getParentSpanId + } + } + } + public start() { super.start() - debug('starting %s %o', this._className, { traceId: this.traceId, id: this.id }) + debug('starting %s %o', this._className, { traceId: this.traceId, id: this.id, parentSpanId: this.getParentSpanId() }) } public end() { @@ -76,14 +90,14 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { debug('%s notified ending by %o', { id: span.id, name: span.name }) } - public startSpan(name?: string, type?: string) { + public startSpan(name?: string, type?: string, parentSpanId?: string) { let newSpan = new Span(this); if (name) { newSpan.name = name } if (type) { newSpan.type = type } + if (type) { newSpan.setParentSpanId(parentSpanId || '') } newSpan.start(); this._spans.push(newSpan); return newSpan; } - } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 439031bb8..33da9017b 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -20,8 +20,8 @@ import { Span } from './span' import { debug } from '../../internal/util' import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' -import { TraceContext, TraceOptions, OnEndSpanEventListener } from '../types/tracetypes'; -import { TracerConfig, defaultConfig } from '../tracing'; +import { TraceContext, TraceOptions, OnEndSpanEventListener, SpanBaseModel } from '../types/tracetypes'; +import { TracerConfig, defaultConfig } from '../tracing'; export type Func = (...args: any[]) => T; @@ -81,28 +81,24 @@ export class Tracer implements OnEndSpanEventListener { }); } - public onEndSpan(root: RootSpan): void { if (!this.currentRootSpan) { - return debug('cannot end trace - no active trace found') + return debug('cannot end trace - no active trace found', this.currentRootSpan) } if (this.currentRootSpan != root) { - return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') + debug('ROOT SPAN ', root) + return debug('CURRENT ROOT SPAN ', this.currentRootSpan) + //return debug('currentRootSpan != root on notifyEnd. Possbile implementation bug.') } this.notifyEndSpan(this.currentRootSpan); //this.clearCurrentTrace(); } - public registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListeners.push(listner); + this.eventListeners.push(listner); } - /*public registerExporter(exporter: Exporter) { - //this.eventListeners.push(listner); - this.buffer.registerExporter(exporter) - }*/ - private notifyEndSpan(root: RootSpan) { if (this.active) { //this.buffer.onEndSpan(root); @@ -118,16 +114,50 @@ export class Tracer implements OnEndSpanEventListener { this.setCurrentRootSpan(null); } - public startSpan(name?: string, type?: string): Span { + public startSpan(name?: string, type?: string, parentSpanId?: string): Span { let newSpan: Span = null; if (!this.currentRootSpan) { debug('no current trace found - must start a new root span first'); } else { - newSpan = this.currentRootSpan.startSpan(name, type); + newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); } return newSpan; } + /*public startSpan(fn: (span: Span) => T): T { + //debug('starting span: %o', options) + if (!this.currentRootSpan) { + debug('no current trace found - must start a new root span first'); + return null; + } else { + return this.contextManager.runAndReturn((span) => { + let newSpan = this.currentRootSpan.startSpan(); + return fn(newSpan); + }); + } + }*/ + + /*public startSpan(options: TraceOptions, fn: (span: SpanBaseModel) => T): T { + //debug('starting span: %o', options) + if (this.currentRootSpan) { + // Has an active root span + debug('starting span') + return this.contextManager.runAndReturn((span) => { + let newSpan = this.currentRootSpan.startSpan(); + return fn(newSpan); + }); + } else { + // Has no active root span + debug('starting root span: %o', options) + return this.contextManager.runAndReturn((root) => { + let newRoot = new RootSpan(this, options); + this.setCurrentRootSpan(newRoot); + newRoot.start(); + return fn(newRoot); + }); + } + }*/ + public wrap(fn: Func): Func { if (!this.active) { return fn; diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 04d767615..d9de345fc 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -24,7 +24,7 @@ export interface MapObjects { [propName: string]: any; } export interface TraceContext { traceId: string, spanId: string, - options?: number + options?: number } export interface TraceOptions { @@ -43,6 +43,7 @@ export abstract class SpanBaseModel { private clock: Clock; //--Tra---- private _remoteParent: string; + private _parentSpanId: string; private _name: string; private _started: boolean; private _ended: boolean; @@ -63,6 +64,7 @@ export abstract class SpanBaseModel { this.clock = null; this._truncated = false; this._ended = false; + this._parentSpanId = '' this.setId(randomSpanId()); } @@ -92,6 +94,14 @@ export abstract class SpanBaseModel { this._name = name; } + public setParentSpanId(parentSpanId: string) { + this._parentSpanId = parentSpanId; + } + + public getParentSpanId() { + return this._parentSpanId + } + public get type(): string { return this._type; } From f77b7944cbad7a44ae8ad42e8ad2b8d73a057975 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Mon, 2 Apr 2018 09:59:08 -0300 Subject: [PATCH 037/110] Move sampler.ts from model to config --- examples/README.md | 5 ++--- packages/opencensus-core/src/trace/model/root-span.ts | 1 - packages/opencensus-core/src/trace/model/tracer.ts | 2 +- packages/opencensus-core/src/trace/sampler/sampler.ts | 6 +++--- packages/opencensus-core/src/trace/types/tracetypes.ts | 10 +++++++++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/README.md b/examples/README.md index 98956177a..e8cf8944d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -52,7 +52,7 @@ Successfully connected to the database ## Add opencensus instrumentation -To add opencensus instrumetation, follow the step below: +To add opencensus instrumetation, follow the steps below: 1. Navigate to the `node_modules` folder inside the EasyNotes application and create a link to OpenCensus Node project folder with: ```bash @@ -66,8 +66,7 @@ cd .. var tracing = require("opencensus-nodejs").start() ... var express = require('express'); - ``` - +``` ## Running the Instrumented Application diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index e4d83263d..3a1d86d63 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -20,7 +20,6 @@ import * as uuid from 'uuid'; import { debug } from '../../internal/util' import { SpanBaseModel, TraceOptions, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' import { Tracer } from './tracer' -import { Sampler } from './sampler' export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 5a7631f2d..7824bb6d9 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -22,7 +22,7 @@ import { Stackdriver } from '../../exporters/stackdriver/stackdriver' import { StackdriverOptions } from '../../exporters/stackdriver/options' import { TraceContext, TraceOptions, OnEndSpanEventListener } from '../types/tracetypes'; import { TracerConfig, defaultConfig } from '../tracing'; -import { Sampler } from './sampler' +import { Sampler } from '../config/sampler' export type Func = (...args: any[]) => T; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 6f348705a..2ab87fe71 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -44,17 +44,17 @@ export class Sampler{ } - public always():Sampler{ + public always(): Sampler{ this.idUpperBound = maxNumber; return this; } - public never():Sampler{ + public never(): Sampler{ this.idUpperBound = minNumber; return this; } - public probability(probability:number):Sampler{ + public probability(probability:number): Sampler{ if(probability < minNumber){ return this.never(); diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 332e1f891..7713f9ee7 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -16,7 +16,7 @@ import { Clock } from '../../internal/clock' import { debug, randomSpanId } from '../../internal/util' -import { Sampler } from '../model/sampler' +import { Sampler } from '../config/sampler' export interface MapLabels { [propName: string]: string; } @@ -38,6 +38,14 @@ export interface OnEndSpanEventListener { onEndSpan(span: SpanBaseModel): void; } +export interface SpanData { + labels: {[key: string]: string}; + name: string; + spanId: string; + parentSpanId?: string; + } + + export abstract class SpanBaseModel { protected _className: string; From 2aad56a4e4df839691795a882f29f17bd2b3b07b Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Mon, 2 Apr 2018 16:38:42 -0300 Subject: [PATCH 038/110] Ajusted import sampler --- packages/opencensus-core/src/trace/model/root-span.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 3a1d86d63..eeab59d09 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -20,6 +20,7 @@ import * as uuid from 'uuid'; import { debug } from '../../internal/util' import { SpanBaseModel, TraceOptions, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' import { Tracer } from './tracer' +import { Sampler } from '../config/sampler' export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { From 36421be4ab000ff14e54292ba451c3ae83e7109c Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Mon, 2 Apr 2018 16:53:48 -0300 Subject: [PATCH 039/110] Revert "Ajusted import sampler" --- packages/opencensus-core/src/trace/model/root-span.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index eeab59d09..3a1d86d63 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -20,7 +20,6 @@ import * as uuid from 'uuid'; import { debug } from '../../internal/util' import { SpanBaseModel, TraceOptions, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' import { Tracer } from './tracer' -import { Sampler } from '../config/sampler' export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { From 8cd96cce0b51c8ced8f2aafb23e3eeded26ee26b Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 3 Apr 2018 09:01:16 -0300 Subject: [PATCH 040/110] Fix buffer and exporters local bugs --- .../opencensus-core/src/trace/model/tracer.ts | 25 +++++++++++-------- .../src/trace/sampler/sampler.ts | 12 ++++----- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index ea7b1f481..7c4ed66c1 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -29,7 +29,7 @@ export type Func = (...args: any[]) => T; export class Tracer implements OnEndSpanEventListener { - readonly PLUGINS = ['http', 'https', 'mongodb-core', 'express']; + readonly PLUGINS = ['http', 'https', 'mongodb-core']; //public buffer: Buffer; private _active: boolean; @@ -37,7 +37,7 @@ export class Tracer implements OnEndSpanEventListener { private config: TracerConfig; //TODO: simple solution - to be rewied in future - private eventListeners: OnEndSpanEventListener[] = []; + private eventListeners: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; @@ -76,12 +76,17 @@ export class Tracer implements OnEndSpanEventListener { return this.contextManager.runAndReturn((root) => { let newRoot = new RootSpan(this, options); this.setCurrentRootSpan(newRoot); - if(options.sampler == null){ + if (!options) { + options = {} + } + if (!options.sampler) { + // options.sampler = new Sampler(newRoot.traceId); + // options.sampler.probability(0.6); options.sampler = new Sampler(newRoot.traceId); - options.sampler.probability(0.6); + options.sampler.always(); } newRoot.sampler = options.sampler; - if(newRoot.sampler.continue(newRoot.traceId)){ + if (newRoot.sampler.continue(newRoot.traceId)) { newRoot.start(); return fn(newRoot); } @@ -90,12 +95,12 @@ export class Tracer implements OnEndSpanEventListener { } - public onEndSpan(root:RootSpan): void { + public onEndSpan(root: RootSpan): void { if (!root) { return debug('cannot end trace - no active trace found') } - if(this.currentRootSpan != root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.') + if (this.currentRootSpan != root) { + debug('currentRootSpan != root on notifyEnd. Need more investigation.') } this.notifyEndSpan(root); //this.clearCurrentTrace(); @@ -107,8 +112,8 @@ export class Tracer implements OnEndSpanEventListener { private notifyEndSpan(root: RootSpan) { if (this.active) { - debug ('starting to notify listeners the end of rootspans') - if(this.eventListeners&&this.eventListeners.length >0) { + debug('starting to notify listeners the end of rootspans') + if (this.eventListeners && this.eventListeners.length > 0) { this.eventListeners.forEach((listener) => listener.onEndSpan(root)) } } else { diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 2ab87fe71..501262978 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -32,7 +32,7 @@ export class Sampler{ * @param spanId * @param isRemote */ - constructor(traceId?:string, spanId?:string, isRemote?:boolean){ + constructor(traceId?:string, spanId?:string, isRemote?:boolean){ debug('Samplre constructor') if(traceId){ this.traceId = traceId; @@ -68,16 +68,16 @@ export class Sampler{ } public continue (traceId:string):boolean{ - debug('Samplre continue') + //debug('Samplre continue') let lower_bytes = traceId.substring(16) let lower_long: number - debug('SAMPLER CONTINUE lower_bytes :',lower_bytes) + //debug('SAMPLER CONTINUE lower_bytes :',lower_bytes) lower_long = parseInt(lower_bytes, 16); - debug('SAMPLER CONTINUE lower_long :',lower_long) - debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) - debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) + //debug('SAMPLER CONTINUE lower_long :',lower_long) + //debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) + //debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) if(lower_long <= this.idUpperBound){ debug('trace sampler TRUE') From 7484de415bef114333ee461185e6e04a7e787ea7 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 3 Apr 2018 10:51:16 -0300 Subject: [PATCH 041/110] Fixed trace tests --- .../src/trace/model/root-span.ts | 12 +++ .../opencensus-core/src/trace/model/tracer.ts | 2 +- .../src/trace/sampler/sampler.ts | 94 +++++++++---------- .../src/trace/types/tracetypes.ts | 44 +++++---- .../opencensus-core/test/test-root-span.ts | 2 +- packages/opencensus-core/test/test-span.ts | 2 +- packages/opencensus-core/test/test-tracer.ts | 49 ++++------ 7 files changed, 101 insertions(+), 104 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 3a1d86d63..91bfbab32 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -75,6 +75,18 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { } public startSpan(name: string, type: string) { + if (!this.started) { + debug('calling %s.startSpan() on un-started %s %o', + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) + return + } + if (this.ended) { + debug('calling %s.startSpan() on ended %s %o', + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) + return + } let newSpan = new Span(this); newSpan.name = name newSpan.type = type diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 7824bb6d9..5566c1bc9 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -78,7 +78,7 @@ export class Tracer implements OnEndSpanEventListener { this.setCurrentRootSpan(newRoot); if(options.sampler == null){ options.sampler = new Sampler(newRoot.traceId); - options.sampler.probability(0.6); + options.sampler.always(); } newRoot.sampler = options.sampler; if(newRoot.sampler.continue(newRoot.traceId)){ diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 2ab87fe71..773ecb89e 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -20,72 +20,72 @@ import { debug, randomSpanId } from '../../internal/util' const minNumber = 1e-4; const maxNumber = 0xffffffffffffffff; -export class Sampler{ - traceId: string; - spanId: string; - isRemote: boolean; - idUpperBound: number; - - /** - * - * @param traceId - * @param spanId - * @param isRemote - */ - constructor(traceId?:string, spanId?:string, isRemote?:boolean){ - debug('Samplre constructor') - if(traceId){ - this.traceId = traceId; - } - if(spanId){ - this.spanId = spanId; - } - this.isRemote = isRemote || false; - - } - - public always(): Sampler{ - this.idUpperBound = maxNumber; - return this; - } - - public never(): Sampler{ - this.idUpperBound = minNumber; - return this; - } - - public probability(probability:number): Sampler{ - if(probability < minNumber){ +export class Sampler { + traceId: string; + spanId: string; + isRemote: boolean; + idUpperBound: number; + + /** + * + * @param traceId + * @param spanId + * @param isRemote + */ + constructor(traceId?: string, spanId?: string, isRemote?: boolean) { + debug('Samplre constructor') + if (traceId) { + this.traceId = traceId; + } + if (spanId) { + this.spanId = spanId; + } + this.isRemote = isRemote || false; + + } + + public always(): Sampler { + this.idUpperBound = maxNumber; + return this; + } + + public never(): Sampler { + this.idUpperBound = minNumber; + return this; + } + + public probability(probability: number): Sampler { + if (probability < minNumber) { return this.never(); - } else if (probability > maxNumber){ + } else if (probability > maxNumber) { return this.always(); } this.idUpperBound = probability * maxNumber; return this; - } + } - public continue (traceId:string):boolean{ + public continue(traceId: string): boolean { debug('Samplre continue') let lower_bytes = traceId.substring(16) let lower_long: number - debug('SAMPLER CONTINUE lower_bytes :',lower_bytes) + debug('SAMPLER CONTINUE lower_bytes :', lower_bytes) lower_long = parseInt(lower_bytes, 16); - debug('SAMPLER CONTINUE lower_long :',lower_long) - debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) - debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) + debug('SAMPLER CONTINUE lower_long :', lower_long) + debug('SAMPLER CONTINUE this.idUpperBound :', this.idUpperBound) + debug('SAMPLER CONTINUE diff :', lower_long - this.idUpperBound) - if(lower_long <= this.idUpperBound){ + if (lower_long <= this.idUpperBound) { debug('trace sampler TRUE') return true - }else{ + } else { debug('trace sampler FALSE') return false; } - } + } - } \ No newline at end of file +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 7713f9ee7..651ae8e39 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -23,27 +23,27 @@ export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } export interface TraceContext { - traceId: string, - spanId: string, - options?: number + traceId: string, + spanId: string, + options?: number } export interface TraceOptions { - name:string; - traceContext?:TraceContext; - sampler?:Sampler; + name: string; + traceContext?: TraceContext; + sampler?: Sampler; } export interface OnEndSpanEventListener { - onEndSpan(span: SpanBaseModel): void; + onEndSpan(span: SpanBaseModel): void; } export interface SpanData { - labels: {[key: string]: string}; + labels: { [key: string]: string }; name: string; spanId: string; parentSpanId?: string; - } +} export abstract class SpanBaseModel { @@ -129,20 +129,20 @@ export abstract class SpanBaseModel { } public get startTime(): Date { - if(this.clock){ + if (this.clock) { return this.clock.startTime; } - + } public get endTime(): Date { - if(this.clock){ + if (this.clock) { return this.clock.endTime; } } public get duration(): number { - if(this.clock){ + if (this.clock) { return this.clock.duration; } } @@ -165,12 +165,12 @@ export abstract class SpanBaseModel { this.annotations[key] = value; } - public get sampler(){ + public get sampler() { debug('tracetypes get sampler()') return this._sampler; } - public set sampler(sampler:Sampler){ + public set sampler(sampler: Sampler) { debug('tracetypes set sempler(sampler)') this._sampler = sampler; } @@ -189,16 +189,14 @@ export abstract class SpanBaseModel { public end(): void { if (!this.started) { debug('calling %s.end() on un-started %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - this._started = false; - this._ended = true; - // this.clock.end(); + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) return - } else if (this.ended) { + } + if (this.ended) { debug('calling %s.end() on already ended %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) + this._className, this._className, + { id: this.id, name: this.name, type: this.type }) return } this._started = false; diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index d30890529..cba3e945b 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -1,5 +1,5 @@ /** -* Copyright 2017 Google Inc. All Rights Reserved. +* Copyright 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 47695f5a8..a51eeefaf 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017 Google Inc. All Rights Reserved. + * Copyright 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index d8ca1dc39..930858309 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017 Google Inc. All Rights Reserved. + * Copyright 2018 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,15 +18,13 @@ import { Tracer } from '../src/trace/model/tracer'; import { RootSpan } from '../src/trace/model/rootspan'; import { Span } from '../src/trace/model/span'; import { Exporter } from '../src/exporters/exporter'; +import { Sampler } from '../src/trace/config/sampler'; let assert = require('assert'); describe('Tracer', function () { const options = { name: "test" }; - const callback = (root) => { - - return root; - } + const callback = (root) => { return root; } describe('new Tracer()', function () { it('should create a Tracer instance', function () { @@ -52,35 +50,27 @@ describe('Tracer', function () { describe('startRootSpan()', function () { it('should start the rootSpan', function () { - const tracer = new Tracer(); - tracer.start(); - const root = tracer.startRootSpan(options, callback); - - assert.ok(root.started); - }); - - it('should set the new span root as currentRootSpan', function () { - const tracer = new Tracer(); + let tracer = new Tracer(); tracer.start(); - const root = tracer.startRootSpan(options, callback); + let rootSpan = tracer.startRootSpan(options, callback); - assert.equal(tracer.currentRootSpan.id, root.id); + assert.ok(rootSpan.started); }); }); describe('end()', function () { it('should end current trace', function () { - const tracer = new Tracer(); - const trace = tracer.startRootSpan(options, callback); - trace.end(); - assert.ok(trace.ended); + let tracer = new Tracer(); + let rootSpan = tracer.startRootSpan(options, callback); + rootSpan.end(); + assert.ok(rootSpan.ended); }); }); describe('clearCurrentRootSpan()', function () { it('should set the current root span to null', function () { - const tracer = new Tracer(); - const trace = tracer.startRootSpan(options, callback); + let tracer = new Tracer(); + let rootSpan = tracer.startRootSpan(options, callback); tracer.clearCurrentTrace(); assert.ok(tracer.currentRootSpan == null); @@ -89,19 +79,16 @@ describe('Tracer', function () { describe('startSpan()', function () { it('should return a Span instance', function () { - const tracer = new Tracer(); - const trace = tracer.startRootSpan(options, callback); - trace.start(); - const span = tracer.startSpan("spanName", "spanType"); - console.log(span); + let tracer = new Tracer(); + let rootSpan = tracer.startRootSpan(options, callback); + let span = tracer.startSpan("spanName", "spanType"); assert.ok(span instanceof Span); }); it('should start a span', function () { - const tracer = new Tracer(); - const trace = tracer.startRootSpan(options, callback); - trace.start(); - const span = tracer.startSpan("spanName", "spanType"); + let tracer = new Tracer(); + let rootSpan = tracer.startRootSpan(options, callback); + let span = tracer.startSpan("spanName", "spanType"); assert.ok(span.started); }); }); From 32360cbe978b5c2e9eff834e0d65da191e050a04 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 3 Apr 2018 10:56:29 -0300 Subject: [PATCH 042/110] Removing unnecessary import --- packages/opencensus-core/test/test-tracer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 930858309..3262ed77b 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -18,7 +18,6 @@ import { Tracer } from '../src/trace/model/tracer'; import { RootSpan } from '../src/trace/model/rootspan'; import { Span } from '../src/trace/model/span'; import { Exporter } from '../src/exporters/exporter'; -import { Sampler } from '../src/trace/config/sampler'; let assert = require('assert'); From 2b12413bb9758e9243a2f90b08f8ffa7f9118193 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 3 Apr 2018 14:45:18 -0300 Subject: [PATCH 043/110] Refactor the Sampler class --- .../opencensus-core/src/trace/model/tracer.ts | 4 +- .../src/trace/sampler/sampler.ts | 59 +++++++++++-------- .../src/trace/types/tracetypes.ts | 3 - 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 7824bb6d9..73e3f0566 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -78,10 +78,10 @@ export class Tracer implements OnEndSpanEventListener { this.setCurrentRootSpan(newRoot); if(options.sampler == null){ options.sampler = new Sampler(newRoot.traceId); - options.sampler.probability(0.6); + options.sampler.always(); } newRoot.sampler = options.sampler; - if(newRoot.sampler.continue(newRoot.traceId)){ + if(newRoot.sampler.shouldSample(newRoot.traceId)){ newRoot.start(); return fn(newRoot); } diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 2ab87fe71..f9c001c8c 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -20,20 +20,21 @@ import { debug, randomSpanId } from '../../internal/util' const minNumber = 1e-4; const maxNumber = 0xffffffffffffffff; +/** + * Class Sampler + */ export class Sampler{ - traceId: string; - spanId: string; - isRemote: boolean; - idUpperBound: number; + traceId: string; + spanId: string; + isRemote: boolean; + private idUpperBound: number; /** - * - * @param traceId - * @param spanId - * @param isRemote + * @param traceId Used for probability calculation + * @param spanId todo: integration with propagation class + * @param isRemote todo: integration with propagation class */ constructor(traceId?:string, spanId?:string, isRemote?:boolean){ - debug('Samplre constructor') if(traceId){ this.traceId = traceId; } @@ -43,17 +44,29 @@ export class Sampler{ this.isRemote = isRemote || false; } - + /** + * @description Set idUpperBound with maxNumber + * @returns a Sampler object + */ public always(): Sampler{ this.idUpperBound = maxNumber; return this; } - + /** + * @description Set idUpperBound with minNumber + * @returns a Sampler object + */ public never(): Sampler{ this.idUpperBound = minNumber; return this; } - + /** + * @description Set idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1 + * @returns a Sampler object + */ public probability(probability:number): Sampler{ if(probability < minNumber){ return this.never(); @@ -66,24 +79,18 @@ export class Sampler{ this.idUpperBound = probability * maxNumber; return this; } - - public continue (traceId:string):boolean{ - debug('Samplre continue') - let lower_bytes = traceId.substring(16) - let lower_long: number - debug('SAMPLER CONTINUE lower_bytes :',lower_bytes) - - lower_long = parseInt(lower_bytes, 16); - - debug('SAMPLER CONTINUE lower_long :',lower_long) - debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) - debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) + /** + * @description + * @param traceId + * @returns a boolean + */ + public shouldSample (traceId:string):boolean{ + const lower_bytes = traceId.substring(16) + const lower_long = parseInt(lower_bytes, 16); if(lower_long <= this.idUpperBound){ - debug('trace sampler TRUE') return true }else{ - debug('trace sampler FALSE') return false; } } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 7713f9ee7..90578ee87 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -191,9 +191,6 @@ export abstract class SpanBaseModel { debug('calling %s.end() on un-started %s %o', this._className, this._className, { id: this.id, name: this.name, type: this.type }) - this._started = false; - this._ended = true; - // this.clock.end(); return } else if (this.ended) { debug('calling %s.end() on already ended %s %o', From 12e0b507110e5485c57a22cb467834b0dc6be10f Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 3 Apr 2018 16:25:47 -0300 Subject: [PATCH 044/110] Propagate trace context over B3 format --- .../src/trace/model/root-span.ts | 13 ++- .../opencensus-core/src/trace/model/tracer.ts | 37 +------- .../src/trace/sampler/sampler.ts | 87 +++++++++---------- .../src/trace/types/tracetypes.ts | 1 + 4 files changed, 50 insertions(+), 88 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 5267493f3..e83883184 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -47,14 +47,11 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { return this._traceId; } - public getOptions() { - return { - name: this.name, - traceContext: { - traceId: this.traceId, - spanId: this.id, - parentSpanId: this.getParentSpanId - } + public getContext(): TraceContext { + return { + traceId: this.traceId, + spanId: this.id, + parentSpanId: this.getParentSpanId } } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 7c4ed66c1..1aaaf0968 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -80,9 +80,8 @@ export class Tracer implements OnEndSpanEventListener { options = {} } if (!options.sampler) { - // options.sampler = new Sampler(newRoot.traceId); - // options.sampler.probability(0.6); options.sampler = new Sampler(newRoot.traceId); + // options.sampler.probability(0.6); options.sampler.always(); } newRoot.sampler = options.sampler; @@ -135,40 +134,6 @@ export class Tracer implements OnEndSpanEventListener { return newSpan; } - /*public startSpan(fn: (span: Span) => T): T { - //debug('starting span: %o', options) - if (!this.currentRootSpan) { - debug('no current trace found - must start a new root span first'); - return null; - } else { - return this.contextManager.runAndReturn((span) => { - let newSpan = this.currentRootSpan.startSpan(); - return fn(newSpan); - }); - } - }*/ - - /*public startSpan(options: TraceOptions, fn: (span: SpanBaseModel) => T): T { - //debug('starting span: %o', options) - if (this.currentRootSpan) { - // Has an active root span - debug('starting span') - return this.contextManager.runAndReturn((span) => { - let newSpan = this.currentRootSpan.startSpan(); - return fn(newSpan); - }); - } else { - // Has no active root span - debug('starting root span: %o', options) - return this.contextManager.runAndReturn((root) => { - let newRoot = new RootSpan(this, options); - this.setCurrentRootSpan(newRoot); - newRoot.start(); - return fn(newRoot); - }); - } - }*/ - public wrap(fn: Func): Func { if (!this.active) { return fn; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 501262978..9f0b6c438 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -20,54 +20,54 @@ import { debug, randomSpanId } from '../../internal/util' const minNumber = 1e-4; const maxNumber = 0xffffffffffffffff; -export class Sampler{ - traceId: string; - spanId: string; - isRemote: boolean; - idUpperBound: number; - - /** - * - * @param traceId - * @param spanId - * @param isRemote - */ - constructor(traceId?:string, spanId?:string, isRemote?:boolean){ - debug('Samplre constructor') - if(traceId){ - this.traceId = traceId; - } - if(spanId){ - this.spanId = spanId; - } - this.isRemote = isRemote || false; - - } - - public always(): Sampler{ - this.idUpperBound = maxNumber; - return this; - } - - public never(): Sampler{ - this.idUpperBound = minNumber; - return this; - } - - public probability(probability:number): Sampler{ - if(probability < minNumber){ +export class Sampler { + traceId: string; + spanId: string; + isRemote: boolean; + idUpperBound: number; + + /** + * + * @param traceId + * @param spanId + * @param isRemote + */ + constructor(traceId?: string, spanId?: string, isRemote?: boolean) { + debug('Samplre constructor') + if (traceId) { + this.traceId = traceId; + } + if (spanId) { + this.spanId = spanId; + } + this.isRemote = isRemote || false; + + } + + public always(): Sampler { + this.idUpperBound = maxNumber; + return this; + } + + public never(): Sampler { + this.idUpperBound = minNumber; + return this; + } + + public probability(probability: number): Sampler { + if (probability < minNumber) { return this.never(); - } else if (probability > maxNumber){ + } else if (probability > maxNumber) { return this.always(); } this.idUpperBound = probability * maxNumber; return this; - } + } - public continue (traceId:string):boolean{ + public continue(traceId: string): boolean { //debug('Samplre continue') let lower_bytes = traceId.substring(16) let lower_long: number @@ -79,13 +79,12 @@ export class Sampler{ //debug('SAMPLER CONTINUE this.idUpperBound :',this.idUpperBound) //debug('SAMPLER CONTINUE diff :',lower_long - this.idUpperBound) - if(lower_long <= this.idUpperBound){ + if (lower_long <= this.idUpperBound) { debug('trace sampler TRUE') return true - }else{ + } else { debug('trace sampler FALSE') return false; } - } - - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 8e04d3b87..7551355e2 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -32,6 +32,7 @@ export interface TraceOptions { name:string; traceContext?:TraceContext; sampler?:Sampler; + type?:string; } export interface OnEndSpanEventListener { From 1c7b9e204ed670f23ca4c69893477d105e57d1b1 Mon Sep 17 00:00:00 2001 From: Luana Date: Wed, 4 Apr 2018 11:24:01 -0300 Subject: [PATCH 045/110] Add examples for automatic tracing on Stackdriver and Zipkin --- examples/stackdriver/automatic.ts | 9 +++++++++ examples/stackdriver/package-lock.json | 5 +++++ examples/stackdriver/package.json | 11 +++++++++++ examples/zipkin/automatic.ts | 11 +++++++++++ examples/zipkin/package-lock.json | 14 ++++++++++++++ examples/zipkin/package.json | 14 ++++++++++++++ 6 files changed, 64 insertions(+) create mode 100644 examples/stackdriver/automatic.ts create mode 100644 examples/stackdriver/package-lock.json create mode 100644 examples/stackdriver/package.json create mode 100644 examples/zipkin/automatic.ts create mode 100644 examples/zipkin/package-lock.json create mode 100644 examples/zipkin/package.json diff --git a/examples/stackdriver/automatic.ts b/examples/stackdriver/automatic.ts new file mode 100644 index 000000000..1c621858a --- /dev/null +++ b/examples/stackdriver/automatic.ts @@ -0,0 +1,9 @@ +var fs = require('fs'); +var tracing = require('opencensus-nodejs').addStackdriver('project-id').start(); + +var http = require('http'); +http.createServer(function (req, res) { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write('Hello World!'); + res.end(); +}).listen(8080); diff --git a/examples/stackdriver/package-lock.json b/examples/stackdriver/package-lock.json new file mode 100644 index 000000000..91e5cb294 --- /dev/null +++ b/examples/stackdriver/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "stackdriver", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/examples/stackdriver/package.json b/examples/stackdriver/package.json new file mode 100644 index 000000000..f63d1504a --- /dev/null +++ b/examples/stackdriver/package.json @@ -0,0 +1,11 @@ +{ + "name": "stackdriver", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Google Inc.", + "license": "Apache-2.0" +} diff --git a/examples/zipkin/automatic.ts b/examples/zipkin/automatic.ts new file mode 100644 index 000000000..845e7aab9 --- /dev/null +++ b/examples/zipkin/automatic.ts @@ -0,0 +1,11 @@ +var fs = require('fs'); +var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'automatic_service'); +tracing.start(); + + +var http = require('http'); +http.createServer(function (req, res) { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write('Hello World!'); + res.end(); +}).listen(8080); diff --git a/examples/zipkin/package-lock.json b/examples/zipkin/package-lock.json new file mode 100644 index 000000000..f50171fcf --- /dev/null +++ b/examples/zipkin/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "zipkin", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.1.tgz", + "integrity": "sha512-xwlHq5DXQFRpe+u6hmmNkzYk/3oxxqDp71a/AJMupOQYmxyaBetqrVMqdNlSQfbg7XTJYD8vARjf3Op06OzdtQ==", + "dev": true + } + } +} diff --git a/examples/zipkin/package.json b/examples/zipkin/package.json new file mode 100644 index 000000000..c9ae88ca4 --- /dev/null +++ b/examples/zipkin/package.json @@ -0,0 +1,14 @@ +{ + "name": "zipkin", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Google Inc.", + "license": "Apache-2.0", + "devDependencies": { + "@types/node": "^9.6.1" + } +} From b9a61583f79b5e8c319ba0d6214527a0672d8cfe Mon Sep 17 00:00:00 2001 From: Luana Date: Wed, 4 Apr 2018 15:18:04 -0300 Subject: [PATCH 046/110] WIP: Example of manual tracing on Zipkin --- examples/zipkin/manual.ts | 53 +++++ examples/zipkin/package-lock.json | 373 ++++++++++++++++++++++++++++++ examples/zipkin/package.json | 3 + 3 files changed, 429 insertions(+) create mode 100644 examples/zipkin/manual.ts diff --git a/examples/zipkin/manual.ts b/examples/zipkin/manual.ts new file mode 100644 index 000000000..d5e099877 --- /dev/null +++ b/examples/zipkin/manual.ts @@ -0,0 +1,53 @@ +var opencensus = require('opencensus-nodejs'); +var request = require('request'); +var fs = require('fs'); + +var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'manual_service'); +var trace = tracing.Trace; + + +request('https://httpbin.org/get', function (error, response, body) { + console.log('error:', error); + console.log('statusCode:', response && response.statusCode); + console.log('body:', body); + + var filename = 'results/arquivo'; + for (var i = 0; i < 10; i++) { + fs.writeFileSync(filename + i + '.txt', body, 'utf-8'); + } +}); + + + + + + + + + +// var fs = require('fs'); +// var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'manual_service'); + +// tracing.startTracer(); + +// var tracer = opencensus.Tracer; +// tracer.start(); + +// var options = { +// name: 'GET' +// }; + +// var http = require('http'); +// http.createServer(function (req, res) { +// tracer.startRootSpan(options, (span) => { +// if (span) { +// res.writeHead(200, { 'Content-Type': 'text/html' }); +// res.write('Hello World!'); +// res.end(); +// span.end(); +// } else { +// console.log("span is null"); +// } +// }); + +// }).listen(8081); \ No newline at end of file diff --git a/examples/zipkin/package-lock.json b/examples/zipkin/package-lock.json index f50171fcf..81e1d7aac 100644 --- a/examples/zipkin/package-lock.json +++ b/examples/zipkin/package-lock.json @@ -9,6 +9,379 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.1.tgz", "integrity": "sha512-xwlHq5DXQFRpe+u6hmmNkzYk/3oxxqDp71a/AJMupOQYmxyaBetqrVMqdNlSQfbg7XTJYD8vARjf3Op06OzdtQ==", "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.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.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.1" + } + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } } } } diff --git a/examples/zipkin/package.json b/examples/zipkin/package.json index c9ae88ca4..063dfa841 100644 --- a/examples/zipkin/package.json +++ b/examples/zipkin/package.json @@ -10,5 +10,8 @@ "license": "Apache-2.0", "devDependencies": { "@types/node": "^9.6.1" + }, + "dependencies": { + "request": "^2.85.0" } } From 9d08c47655523c9562ddd7c209a8c08a1eacc9af Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 4 Apr 2018 16:07:45 -0300 Subject: [PATCH 047/110] Remove unused variables --- packages/opencensus-core/src/trace/sampler/sampler.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 0561400c6..d0d4e14a0 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -25,8 +25,6 @@ const maxNumber = 0xffffffffffffffff; */ export class Sampler{ traceId: string; - spanId: string; - isRemote: boolean; private idUpperBound: number; /** @@ -38,12 +36,8 @@ export class Sampler{ if(traceId){ this.traceId = traceId; } - if(spanId){ - this.spanId = spanId; - } - this.isRemote = isRemote || false; - } + /** * @description Set idUpperBound with maxNumber * @returns a Sampler object @@ -52,6 +46,7 @@ export class Sampler{ this.idUpperBound = maxNumber; return this; } + /** * @description Set idUpperBound with minNumber * @returns a Sampler object @@ -60,6 +55,7 @@ export class Sampler{ this.idUpperBound = minNumber; return this; } + /** * @description Set idUpperBound with the probability. If probability * parameter is bigger then 1 set always. If probability parameter less @@ -79,6 +75,7 @@ export class Sampler{ this.idUpperBound = probability * maxNumber; return this; } + /** * @description * @param traceId From 842d1127d778d65e9889a0e48e7897672dde2547 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Wed, 4 Apr 2018 16:48:53 -0300 Subject: [PATCH 048/110] Move easy-notes instrumentation do it's own directory --- examples/{ => automatic_instrumentation}/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{ => automatic_instrumentation}/README.md (100%) diff --git a/examples/README.md b/examples/automatic_instrumentation/README.md similarity index 100% rename from examples/README.md rename to examples/automatic_instrumentation/README.md From 71f70c67096b3398c1578dbd62712a260656df4e Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 5 Apr 2018 06:31:06 -0300 Subject: [PATCH 049/110] Changes http span naming method --- packages/opencensus-core/src/trace/types/tracetypes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 7551355e2..45a2f0fd4 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -25,7 +25,8 @@ export interface MapObjects { [propName: string]: any; } export interface TraceContext { traceId: string, spanId: string, - options?: number + options?: number, + sampleDecision?: boolean } export interface TraceOptions { From 5e4ef9b1addeaeab54f63ab26c65397b2a5f04cb Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 5 Apr 2018 08:37:49 -0300 Subject: [PATCH 050/110] Enable propagation to work with non sampled spans --- .../opencensus-core/src/trace/model/tracer.ts | 2 +- .../src/trace/sampler/sampler.ts | 56 +++++++++---------- .../src/trace/types/tracetypes.ts | 2 - 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 22030e7fc..32cd84128 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -81,7 +81,7 @@ export class Tracer implements OnEndSpanEventListener { } if (!options.sampler) { options.sampler = new Sampler(newRoot.traceId); - // options.sampler.probability(0.6); + //options.sampler.probability(0.5); options.sampler.always(); } newRoot.sampler = options.sampler; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index d0d4e14a0..dd1846aa6 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -23,38 +23,38 @@ const maxNumber = 0xffffffffffffffff; /** * Class Sampler */ -export class Sampler{ - traceId: string; - private idUpperBound: number; +export class Sampler { + traceId: string; + private idUpperBound: number; - /** - * @param traceId Used for probability calculation - * @param spanId todo: integration with propagation class - * @param isRemote todo: integration with propagation class - */ - constructor(traceId?:string, spanId?:string, isRemote?:boolean){ - if(traceId){ - this.traceId = traceId; - } - } + /** + * @param traceId Used for probability calculation + * @param spanId todo: integration with propagation class + * @param isRemote todo: integration with propagation class + */ + constructor(traceId?: string, spanId?: string, isRemote?: boolean) { + if (traceId) { + this.traceId = traceId; + } + } /** * @description Set idUpperBound with maxNumber * @returns a Sampler object */ - public always(): Sampler{ - this.idUpperBound = maxNumber; - return this; - } + public always(): Sampler { + this.idUpperBound = maxNumber; + return this; + } /** * @description Set idUpperBound with minNumber * @returns a Sampler object */ - public never(): Sampler{ - this.idUpperBound = minNumber; - return this; - } + public never(): Sampler { + this.idUpperBound = minNumber; + return this; + } /** * @description Set idUpperBound with the probability. If probability @@ -63,8 +63,8 @@ export class Sampler{ * @param probability probability between 0 and 1 * @returns a Sampler object */ - public probability(probability:number): Sampler{ - if(probability < minNumber){ + public probability(probability: number): Sampler { + if (probability < minNumber) { return this.never(); } else if (probability > maxNumber) { @@ -74,20 +74,20 @@ export class Sampler{ this.idUpperBound = probability * maxNumber; return this; - } - + } + /** * @description * @param traceId * @returns a boolean */ - public shouldSample (traceId:string):boolean{ + public shouldSample(traceId: string): boolean { const lower_bytes = traceId.substring(16) const lower_long = parseInt(lower_bytes, 16); - if(lower_long <= this.idUpperBound){ + if (lower_long <= this.idUpperBound) { return true - }else{ + } else { return false; } } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 436580b1d..b0345c5d8 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -178,12 +178,10 @@ export abstract class SpanBaseModel { } public get sampler() { - debug('tracetypes get sampler()') return this._sampler; } public set sampler(sampler: Sampler) { - debug('tracetypes set sempler(sampler)') this._sampler = sampler; } From 667d31a06b9195b434b949639b11ec32d3639614 Mon Sep 17 00:00:00 2001 From: Luana Date: Thu, 5 Apr 2018 11:45:12 -0300 Subject: [PATCH 051/110] Add manual examples for Stackdriver and Zipkin and add license on files --- examples/stackdriver/automatic.ts | 16 ++++++++ examples/stackdriver/custom_tracing.ts | 53 +++++++++++++++++++++++++ examples/zipkin/automatic.ts | 19 ++++++++- examples/zipkin/custom_tracing.ts | 54 ++++++++++++++++++++++++++ examples/zipkin/manual.ts | 53 ------------------------- 5 files changed, 140 insertions(+), 55 deletions(-) create mode 100644 examples/stackdriver/custom_tracing.ts create mode 100644 examples/zipkin/custom_tracing.ts delete mode 100644 examples/zipkin/manual.ts diff --git a/examples/stackdriver/automatic.ts b/examples/stackdriver/automatic.ts index 1c621858a..a47446cd0 100644 --- a/examples/stackdriver/automatic.ts +++ b/examples/stackdriver/automatic.ts @@ -1,3 +1,19 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + var fs = require('fs'); var tracing = require('opencensus-nodejs').addStackdriver('project-id').start(); diff --git a/examples/stackdriver/custom_tracing.ts b/examples/stackdriver/custom_tracing.ts new file mode 100644 index 000000000..afc09c5c8 --- /dev/null +++ b/examples/stackdriver/custom_tracing.ts @@ -0,0 +1,53 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var opencensus = require('opencensus-nodejs'); +var http = require('http'); +var fs = require('fs'); + +// Register trace exporters to export the collected data. +var tracing = require('opencensus-nodejs').addStackdriver('project-id').start(); +var tracer = tracing.Tracer; + +var options = { + name: 'fs.writeFileSync' +}; + +// Create root span for GET request +tracer.startRootSpan(options, (span) => { + http.get('http://httpbin.org/image/jpeg', function (response) { + + var data = []; + + response.on('data', (chunk) => { + data.push(chunk); + }); + + response.on('end', () => { + var filename = 'file'; + // Create a child span for file writing operation + var childSpan = tracer.startSpan(filename); + var buffer = Buffer.concat(data); + fs.writeFileSync(filename + '.jpeg', buffer, 'utf-8'); + + // Finish both root span and child span, since the operations + // has ended. + childSpan.end(); + span.end(); + }); + console.log('No more data in response.'); + }); +}); diff --git a/examples/zipkin/automatic.ts b/examples/zipkin/automatic.ts index 845e7aab9..384d02335 100644 --- a/examples/zipkin/automatic.ts +++ b/examples/zipkin/automatic.ts @@ -1,8 +1,23 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + var fs = require('fs'); -var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'automatic_service'); +var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); tracing.start(); - var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/html' }); diff --git a/examples/zipkin/custom_tracing.ts b/examples/zipkin/custom_tracing.ts new file mode 100644 index 000000000..3e1cccb56 --- /dev/null +++ b/examples/zipkin/custom_tracing.ts @@ -0,0 +1,54 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var opencensus = require('opencensus-nodejs'); +var http = require('http'); +var fs = require('fs'); + +// Register trace exporters to export the collected data. +var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'service_name').start(); +var tracer = tracing.Tracer; + +var options = { + name: 'fs.writeFileSync' +}; + +// Create root span for GET request +tracer.startRootSpan(options, (span) => { + http.get('http://httpbin.org/image/jpeg', function (response) { + + var data = []; + + response.on('data', (chunk) => { + data.push(chunk); + }); + + response.on('end', () => { + var filename = 'file'; + // Create a child span for file writing operation + var childSpan = tracer.startSpan(filename); + var buffer = Buffer.concat(data); + fs.writeFileSync(filename + '.jpeg', buffer, 'utf-8'); + + // Finish both root span and child span, since the operations + // has ended. + childSpan.end(); + span.end(); + }); + console.log('No more data in response.'); + }); +}); + diff --git a/examples/zipkin/manual.ts b/examples/zipkin/manual.ts deleted file mode 100644 index d5e099877..000000000 --- a/examples/zipkin/manual.ts +++ /dev/null @@ -1,53 +0,0 @@ -var opencensus = require('opencensus-nodejs'); -var request = require('request'); -var fs = require('fs'); - -var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'manual_service'); -var trace = tracing.Trace; - - -request('https://httpbin.org/get', function (error, response, body) { - console.log('error:', error); - console.log('statusCode:', response && response.statusCode); - console.log('body:', body); - - var filename = 'results/arquivo'; - for (var i = 0; i < 10; i++) { - fs.writeFileSync(filename + i + '.txt', body, 'utf-8'); - } -}); - - - - - - - - - -// var fs = require('fs'); -// var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'manual_service'); - -// tracing.startTracer(); - -// var tracer = opencensus.Tracer; -// tracer.start(); - -// var options = { -// name: 'GET' -// }; - -// var http = require('http'); -// http.createServer(function (req, res) { -// tracer.startRootSpan(options, (span) => { -// if (span) { -// res.writeHead(200, { 'Content-Type': 'text/html' }); -// res.write('Hello World!'); -// res.end(); -// span.end(); -// } else { -// console.log("span is null"); -// } -// }); - -// }).listen(8081); \ No newline at end of file From fe5a6aaaf42012a07c693bf5e6ed3a7a2052081a Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Thu, 5 Apr 2018 14:57:21 -0300 Subject: [PATCH 052/110] Change getContext to SpanBaseModel --- packages/opencensus-core/src/trace/model/root-span.ts | 8 -------- packages/opencensus-core/src/trace/types/tracetypes.ts | 6 +++--- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 533696773..51370bc26 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -47,14 +47,6 @@ export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { return this._traceId; } - public getContext(): TraceContext { - return { - traceId: this.traceId, - spanId: this.id, - parentSpanId: this.getParentSpanId - } - } - public start() { super.start() debug('starting %s %o', this._className, { traceId: this.traceId, id: this.id, parentSpanId: this.getParentSpanId() }) diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index b0345c5d8..48904a2eb 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -160,11 +160,11 @@ export abstract class SpanBaseModel { } public get traceContext(): TraceContext { - return { + return { traceId: this.traceId.toString(), spanId: this.id.toString(), - options: 1 // always traced - }; + parentSpanId: this.getParentSpanId + } } //TODO: maybe key and values must be truncate From c4734249955bc994b97192a44e4dafcea3bf177a Mon Sep 17 00:00:00 2001 From: Luana Date: Fri, 6 Apr 2018 10:23:11 -0300 Subject: [PATCH 053/110] WIP: Refactor examples for both exporters --- examples/automatic_tracing/README.md | 88 ++++ .../package.json | 8 +- .../stackdriver.js} | 2 +- .../zipkin.js} | 0 examples/custom_tracing/README.md | 86 ++++ .../stackdriver.js} | 2 +- .../zipkin.js} | 0 examples/stackdriver/package-lock.json | 5 - examples/zipkin/package-lock.json | 387 ------------------ examples/zipkin/package.json | 17 - 10 files changed, 180 insertions(+), 415 deletions(-) create mode 100644 examples/automatic_tracing/README.md rename examples/{stackdriver => automatic_tracing}/package.json (55%) rename examples/{stackdriver/automatic.ts => automatic_tracing/stackdriver.js} (90%) rename examples/{zipkin/automatic.ts => automatic_tracing/zipkin.js} (100%) create mode 100644 examples/custom_tracing/README.md rename examples/{stackdriver/custom_tracing.ts => custom_tracing/stackdriver.js} (95%) rename examples/{zipkin/custom_tracing.ts => custom_tracing/zipkin.js} (100%) delete mode 100644 examples/stackdriver/package-lock.json delete mode 100644 examples/zipkin/package-lock.json delete mode 100644 examples/zipkin/package.json diff --git a/examples/automatic_tracing/README.md b/examples/automatic_tracing/README.md new file mode 100644 index 000000000..28b79f95c --- /dev/null +++ b/examples/automatic_tracing/README.md @@ -0,0 +1,88 @@ +# OpenCensus Node.js Automatic Tracing + + +Note: This code was tested on the following Node versions: +- v6.10.0 (for console exporter only) +- v9.8.0 (for Stackdriver and Zipkin exporters) + +___ + +In this example we'll build a simple http server that can return `Hello World`. We're also going to instrument it using OpenCensus, to be able to collect traces and send them to different services. + +## OpenCensus Setup + +1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> +```bash +git clone https://github.com/census-instrumentation/opencensus-node.git +``` + +2. Switch to branch `dev` with: +```bash +git checkout dev +``` + +3. Navigate to the OpenCensus Node project folder and install the dependencies with: +```bash +cd opencensus-node +npm install +``` + +4. Compile the TypeScript code into JavaScript with: +``` +node_modules/.bin/tsc +``` + +___ + +## Instrumented Application Setup + +1. Navigate to the `automatic_tracing` folder with: +``` +cd examples/automatic_tracing +``` + +2. **TODO Create a node_modules folder or npm install command?** + + +### Using Stackdriver Exporter + +To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: +```bash +export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +``` + +Open the `stackdriver.js` file and, in the `.addStackdriver()` method, pass your Project ID as follows: +```javascript +var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); +``` + +### Using Zipkin Exporter + +To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: +```bash + wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' + java -jar zipkin.jar +``` + +Open the `zipkin.js` file and , in the `.addZipkin()` method, pass your *URL* and *service name* as follows: +```javascript +var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); +``` + +___ + +## Running the Instrumented Application + +It is possible to run the application both with or without debugging information. To run with debugging information use: +```bash +DEBUG=opencensus node server.js +``` + +To run without debugging information, simply use: +```bash +node server.js +``` + +Go to `http://localhost:8080` to make a request or use a REST Application to do so. + +Now, just go to the service used to send the traces and see the requests you just made. diff --git a/examples/stackdriver/package.json b/examples/automatic_tracing/package.json similarity index 55% rename from examples/stackdriver/package.json rename to examples/automatic_tracing/package.json index f63d1504a..c588b5e9b 100644 --- a/examples/stackdriver/package.json +++ b/examples/automatic_tracing/package.json @@ -1,11 +1,11 @@ { - "name": "stackdriver", + "name": "automatic_tracing", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "stackdriver.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "author": "Google Inc.", - "license": "Apache-2.0" + "author": "", + "license": "ISC" } diff --git a/examples/stackdriver/automatic.ts b/examples/automatic_tracing/stackdriver.js similarity index 90% rename from examples/stackdriver/automatic.ts rename to examples/automatic_tracing/stackdriver.js index a47446cd0..c77b8663f 100644 --- a/examples/stackdriver/automatic.ts +++ b/examples/automatic_tracing/stackdriver.js @@ -15,7 +15,7 @@ */ var fs = require('fs'); -var tracing = require('opencensus-nodejs').addStackdriver('project-id').start(); +var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); var http = require('http'); http.createServer(function (req, res) { diff --git a/examples/zipkin/automatic.ts b/examples/automatic_tracing/zipkin.js similarity index 100% rename from examples/zipkin/automatic.ts rename to examples/automatic_tracing/zipkin.js diff --git a/examples/custom_tracing/README.md b/examples/custom_tracing/README.md new file mode 100644 index 000000000..c66508520 --- /dev/null +++ b/examples/custom_tracing/README.md @@ -0,0 +1,86 @@ +# OpenCensus Node.js Custom Tracing + + +Note: This code was tested on the following Node versions: +- v6.10.0 (for console exporter only) +- v9.8.0 (for Stackdriver and Zipkin exporters) + +___ + +In these example we're going to build custom spans for `GET` requests and file writing operations and send them to different services. + +## OpenCensus Setup + +1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> +```bash +git clone https://github.com/census-instrumentation/opencensus-node.git +``` + +2. Switch to branch `dev` with: +```bash +git checkout dev +``` + +3. Navigate to the OpenCensus Node project folder and install the dependencies with: +```bash +cd opencensus-node +npm install +``` + +4. Compile the TypeScript code into JavaScript with: +``` +node_modules/.bin/tsc +``` + +___ + +## Instrumented Application Setup + +1. Navigate to the `automatic_tracing` folder with: +``` +cd examples/automatic_tracing +``` + +2. **TODO Create a node_modules folder or npm install command?** + + +### Using Stackdriver Exporter + +To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: +```bash +export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +``` + +Open the `stackdriver.js` file and, in the `.addStackdriver()` method, pass your Project ID as follows: +```javascript +var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); +``` + +### Using Zipkin Exporter + +To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: +```bash + wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' + java -jar zipkin.jar +``` + +Open the `zipkin.js` file and , in the `.addZipkin()` method, pass your *URL* and *service name* as follows: +```javascript +var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); +``` + +___ + +## Running the Instrumented Application + +It is possible to run the application both with or without debugging information. To run with debugging information use: +```bash +DEBUG=opencensus node server.js +``` + +To run without debugging information, simply use: +```bash +node server.js +``` + +Go to the service used to send the traces and see the spans for the operations you just made. diff --git a/examples/stackdriver/custom_tracing.ts b/examples/custom_tracing/stackdriver.js similarity index 95% rename from examples/stackdriver/custom_tracing.ts rename to examples/custom_tracing/stackdriver.js index afc09c5c8..0d349dc94 100644 --- a/examples/stackdriver/custom_tracing.ts +++ b/examples/custom_tracing/stackdriver.js @@ -19,7 +19,7 @@ var http = require('http'); var fs = require('fs'); // Register trace exporters to export the collected data. -var tracing = require('opencensus-nodejs').addStackdriver('project-id').start(); +var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); var tracer = tracing.Tracer; var options = { diff --git a/examples/zipkin/custom_tracing.ts b/examples/custom_tracing/zipkin.js similarity index 100% rename from examples/zipkin/custom_tracing.ts rename to examples/custom_tracing/zipkin.js diff --git a/examples/stackdriver/package-lock.json b/examples/stackdriver/package-lock.json deleted file mode 100644 index 91e5cb294..000000000 --- a/examples/stackdriver/package-lock.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "stackdriver", - "version": "1.0.0", - "lockfileVersion": 1 -} diff --git a/examples/zipkin/package-lock.json b/examples/zipkin/package-lock.json deleted file mode 100644 index 81e1d7aac..000000000 --- a/examples/zipkin/package-lock.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "name": "zipkin", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.1.tgz", - "integrity": "sha512-xwlHq5DXQFRpe+u6hmmNkzYk/3oxxqDp71a/AJMupOQYmxyaBetqrVMqdNlSQfbg7XTJYD8vARjf3Op06OzdtQ==", - "dev": true - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "1.33.0" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.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.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.1" - } - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - } - } -} diff --git a/examples/zipkin/package.json b/examples/zipkin/package.json deleted file mode 100644 index 063dfa841..000000000 --- a/examples/zipkin/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "zipkin", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Google Inc.", - "license": "Apache-2.0", - "devDependencies": { - "@types/node": "^9.6.1" - }, - "dependencies": { - "request": "^2.85.0" - } -} From a664b6ec9364be9fc8b0f2231a358774c4b94943 Mon Sep 17 00:00:00 2001 From: Luana Date: Fri, 6 Apr 2018 11:34:03 -0300 Subject: [PATCH 054/110] Update readme --- examples/automatic_tracing/README.md | 7 +++++-- examples/automatic_tracing/package.json | 11 ----------- examples/custom_tracing/README.md | 6 +++++- 3 files changed, 10 insertions(+), 14 deletions(-) delete mode 100644 examples/automatic_tracing/package.json diff --git a/examples/automatic_tracing/README.md b/examples/automatic_tracing/README.md index 28b79f95c..8473167eb 100644 --- a/examples/automatic_tracing/README.md +++ b/examples/automatic_tracing/README.md @@ -41,8 +41,11 @@ ___ cd examples/automatic_tracing ``` -2. **TODO Create a node_modules folder or npm install command?** - +2. Create a folder named `node_modules` and make a symlink inside of it, running the following command: +``` +cd node_modules +ln -s /build/src opencensus-nodejs +``` ### Using Stackdriver Exporter diff --git a/examples/automatic_tracing/package.json b/examples/automatic_tracing/package.json deleted file mode 100644 index c588b5e9b..000000000 --- a/examples/automatic_tracing/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "automatic_tracing", - "version": "1.0.0", - "description": "", - "main": "stackdriver.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC" -} diff --git a/examples/custom_tracing/README.md b/examples/custom_tracing/README.md index c66508520..5a96620ec 100644 --- a/examples/custom_tracing/README.md +++ b/examples/custom_tracing/README.md @@ -41,7 +41,11 @@ ___ cd examples/automatic_tracing ``` -2. **TODO Create a node_modules folder or npm install command?** +2. Create a folder named `node_modules` and make a symlink inside of it, running the following command: +``` +cd node_modules +ln -s /build/src opencensus-nodejs +``` ### Using Stackdriver Exporter From 528be792e77e8768ea443b7078777d27d937260f Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sat, 7 Apr 2018 19:05:08 -0300 Subject: [PATCH 055/110] refactor: remove some unwanted dependencies from Tracer --- .gitignore | 8 ++++++++ .npmignore | 4 ++++ packages/opencensus-core/package.json | 13 ++++++++++++- packages/opencensus-core/src/trace/model/tracer.ts | 6 ++---- .../opencensus-core/src/trace/types/tracetypes.ts | 10 +++++++++- packages/opencensus-core/tsconfig.json | 5 +---- 6 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 .npmignore diff --git a/.gitignore b/.gitignore index b132d608b..ec67649c6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,12 @@ npm-debug.log .nyc_output/ build/ +#backup files +*-- +*_backup + +#log files +*.log + + diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..9505ba945 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 6112c2477..ac3b2dcbb 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -6,6 +6,7 @@ "types": "build/src/index.d.js", "repository": "census-instrumentation/opencensus-node", "scripts": { + "build": "node_modules/.bin/tsc --declaration", "test": "npm run script run-unit-tests", "compile-all": "npm run script compile-auto", "compile-strict": "npm run script compile-auto-strict", @@ -25,6 +26,17 @@ "engines": { "node": ">=6.00" }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.d.ts", + "doc", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, "devDependencies": { "@types/continuation-local-storage": "^3.2.1", "@types/debug": "0.0.30", @@ -47,7 +59,6 @@ "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", "end-of-stream": "^1.4.1", - "npm": "^5.7.1", "require-in-the-middle": "^2.2.1", "semver": "^5.5.0", "shimmer": "^1.2.0", diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 32cd84128..8a6adc87a 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -18,11 +18,9 @@ import * as cls from '../../internal/cls' import { RootSpan } from './rootspan' import { Span } from './span' import { debug } from '../../internal/util' -import { Stackdriver } from '../../exporters/stackdriver/stackdriver' -import { StackdriverOptions } from '../../exporters/stackdriver/options' import { Sampler } from '../config/sampler' -import { TraceContext, TraceOptions, OnEndSpanEventListener, SpanBaseModel } from '../types/tracetypes'; -import { TracerConfig, defaultConfig } from '../tracing'; +import { TraceContext, TraceOptions, OnEndSpanEventListener, SpanBaseModel, TracerConfig, defaultConfig } from '../types/tracetypes'; + export type Func = (...args: any[]) => T; diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 48904a2eb..7378db6df 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -22,6 +22,15 @@ import { Sampler } from '../config/sampler' export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } +export interface TracerConfig { + sampleRate?: number; + ignoreUrls?: Array; +} + +export const defaultConfig: TracerConfig = { + sampleRate: 1.0 +} + export interface TraceContext { traceId: string, spanId: string, @@ -47,7 +56,6 @@ export interface SpanData { parentSpanId?: string; } - export abstract class SpanBaseModel { protected _className: string; diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json index 96990ef22..5893f9982 100644 --- a/packages/opencensus-core/tsconfig.json +++ b/packages/opencensus-core/tsconfig.json @@ -17,10 +17,7 @@ "node_modules" ], "include": [ - "src/*.ts", - "src/trace/*.ts", - "src/trace/plugins/*.ts", - "src/internal/*.ts" + "src/**/*.ts" ] } \ No newline at end of file From aa307a2576036a2f837a1028bb32876a7793f5b7 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 10 Apr 2018 08:39:56 -0300 Subject: [PATCH 056/110] refactor: apply code guidelines rules to sampler.ts file --- .../src/trace/sampler/sampler.ts | 121 +++++++++--------- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index dd1846aa6..5f1b8c636 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -14,82 +14,81 @@ * limitations under the License. */ -import { debug, randomSpanId } from '../../internal/util' +import {debug, randomSpanId} from '../../internal/util'; -const minNumber = 1e-4; -const maxNumber = 0xffffffffffffffff; +const MIN_NUMBER = 1e-4; +const MAX_NUMBER = 0xffffffffffffffff; /** * Class Sampler */ export class Sampler { - traceId: string; - private idUpperBound: number; + traceId: string; + private idUpperBound: number; - /** - * @param traceId Used for probability calculation - * @param spanId todo: integration with propagation class - * @param isRemote todo: integration with propagation class - */ - constructor(traceId?: string, spanId?: string, isRemote?: boolean) { - if (traceId) { - this.traceId = traceId; - } + /** + * @param traceId Used for probability calculation + * @param spanId todo: integration with propagation class + * @param isRemote todo: integration with propagation class + */ + constructor(traceId?: string, spanId?: string, isRemote?: boolean) { + if (traceId) { + this.traceId = traceId; } + } - /** - * @description Set idUpperBound with maxNumber - * @returns a Sampler object - */ - public always(): Sampler { - this.idUpperBound = maxNumber; - return this; - } - - /** - * @description Set idUpperBound with minNumber - * @returns a Sampler object - */ - public never(): Sampler { - this.idUpperBound = minNumber; - return this; - } + /** + * Set idUpperBound with MAX_NUMBER + * @returns a Sampler object + */ + always(): Sampler { + this.idUpperBound = MAX_NUMBER; + return this; + } - /** - * @description Set idUpperBound with the probability. If probability - * parameter is bigger then 1 set always. If probability parameter less - * than 0, set never. - * @param probability probability between 0 and 1 - * @returns a Sampler object - */ - public probability(probability: number): Sampler { - if (probability < minNumber) { - return this.never(); + /** + * Set idUpperBound with MIN_NUMBER + * @returns a Sampler object + */ + never(): Sampler { + this.idUpperBound = MIN_NUMBER; + return this; + } - } else if (probability > maxNumber) { - return this.always(); + /** + * Set idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1 + * @returns a Sampler object + */ + probability(probability: number): Sampler { + if (probability < MIN_NUMBER) { + return this.never(); - } - - this.idUpperBound = probability * maxNumber; - return this; + } else if (probability > MAX_NUMBER) { + return this.always(); } - /** - * @description - * @param traceId - * @returns a boolean - */ - public shouldSample(traceId: string): boolean { - const lower_bytes = traceId.substring(16) - const lower_long = parseInt(lower_bytes, 16); + this.idUpperBound = probability * MAX_NUMBER; + return this; + } - if (lower_long <= this.idUpperBound) { - return true - } else { - return false; - } - } + /** + * + * @param traceId + * @returns a boolean + */ + shouldSample(traceId: string): boolean { + const LOWER_BYTES = traceId.substring(16); + // tslint:disable-next-line:ban Needed to parse hexadecimal. + const LOWER_LONG = parseInt(LOWER_BYTES, 16); + if (LOWER_LONG <= this.idUpperBound) { + return true; + } else { + return false; + } + } } \ No newline at end of file From 314e7ab901355001a66cb95c7b4e8387b71e5aa7 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 10 Apr 2018 09:41:26 -0300 Subject: [PATCH 057/110] refactor: typescript doc rewrited --- .../opencensus-core/src/trace/sampler/sampler.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 5f1b8c636..37759eedd 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -21,7 +21,7 @@ const MIN_NUMBER = 1e-4; const MAX_NUMBER = 0xffffffffffffffff; /** - * Class Sampler + * This class represent the probability of a tracer. */ export class Sampler { traceId: string; @@ -39,7 +39,7 @@ export class Sampler { } /** - * Set idUpperBound with MAX_NUMBER + * Set idUpperBound with MAX_NUMBER that is equivalent the probability be 1 * @returns a Sampler object */ always(): Sampler { @@ -48,7 +48,7 @@ export class Sampler { } /** - * Set idUpperBound with MIN_NUMBER + * Set idUpperBound with MIN_NUMBER that is equivalent the probability be 0 * @returns a Sampler object */ never(): Sampler { @@ -76,9 +76,10 @@ export class Sampler { } /** - * - * @param traceId - * @returns a boolean + * Checks if trace belong the sample. + * @param traceId Used to check the probability + * @returns a boolean. True if the traceId is in probability + * False if the traceId is not in probability. */ shouldSample(traceId: string): boolean { const LOWER_BYTES = traceId.substring(16); From efb59f5f160b7c61b58fbc58321d53cdce8dafd2 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 10 Apr 2018 12:30:12 -0300 Subject: [PATCH 058/110] refactor: apply code guidelines rules to buffer.ts file --- packages/opencensus-core/package-lock.json | 3931 -------------------- packages/opencensus-core/package.json | 10 +- 2 files changed, 7 insertions(+), 3934 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 737059713..2a468310a 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -9480,3937 +9480,6 @@ "validate-npm-package-license": "3.0.3" } }, - "npm": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-5.7.1.tgz", - "integrity": "sha512-r1grvv6mcEt+nlMzMWPc5n/z5q8NNuBWj0TGFp1PBSFCl6ubnAoUGBsucYsnZYT7MOJn0ha1ptEjmdBoAdJ+SA==", - "requires": { - "JSONStream": "1.3.2", - "abbrev": "1.1.1", - "ansi-regex": "3.0.0", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.2.0", - "archy": "1.0.0", - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "cacache": "10.0.4", - "call-limit": "1.1.0", - "chownr": "1.0.1", - "cli-table2": "0.2.0", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "detect-indent": "5.0.0", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "find-npm-prefix": "1.0.2", - "fs-vacuum": "1.2.10", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "has-unicode": "2.0.1", - "hosted-git-info": "2.5.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "inflight": "1.0.6", - "inherits": "2.0.3", - "ini": "1.3.5", - "init-package-json": "1.10.1", - "is-cidr": "1.0.0", - "lazy-property": "1.0.0", - "libcipm": "1.3.3", - "libnpx": "9.7.1", - "lockfile": "1.0.3", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "lru-cache": "4.1.1", - "meant": "1.0.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "nopt": "4.0.1", - "normalize-package-data": "2.4.0", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-lifecycle": "2.0.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-profile": "3.0.1", - "npm-registry-client": "8.5.0", - "npm-user-validate": "1.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "opener": "1.4.3", - "osenv": "0.1.5", - "pacote": "7.3.3", - "path-is-inside": "1.0.2", - "promise-inflight": "1.0.1", - "qrcode-terminal": "0.11.0", - "query-string": "5.1.0", - "qw": "1.0.1", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.12", - "read-package-tree": "5.1.6", - "readable-stream": "2.3.4", - "readdir-scoped-modules": "1.0.2", - "request": "2.83.0", - "retry": "0.10.1", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "sorted-union-stream": "2.1.3", - "ssri": "5.2.4", - "strip-ansi": "4.0.0", - "tar": "4.3.3", - "text-table": "0.2.0", - "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "update-notifier": "2.3.0", - "uuid": "3.2.1", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0", - "which": "1.3.0", - "worker-farm": "1.5.2", - "wrappy": "1.0.2", - "write-file-atomic": "2.1.0" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.2", - "bundled": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "through": { - "version": "2.3.8", - "bundled": true - } - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "bin-links": { - "version": "1.1.0", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cmd-shim": "2.0.2", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "graceful-fs": "4.1.11", - "slide": "1.1.6" - } - }, - "bluebird": { - "version": "3.5.1", - "bundled": true - }, - "cacache": { - "version": "10.0.4", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.2.4", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - }, - "dependencies": { - "y18n": { - "version": "4.0.0", - "bundled": true - } - } - }, - "call-limit": { - "version": "1.1.0", - "bundled": true - }, - "chownr": { - "version": "1.0.1", - "bundled": true - }, - "cli-table2": { - "version": "0.2.0", - "bundled": true, - "requires": { - "colors": "1.1.2", - "lodash": "3.10.1", - "string-width": "1.0.2" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "bundled": true, - "optional": true - }, - "lodash": { - "version": "3.10.1", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - }, - "cmd-shim": { - "version": "2.0.2", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" - } - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "1.0.3" - }, - "dependencies": { - "defaults": { - "version": "1.0.3", - "bundled": true, - "requires": { - "clone": "1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "bundled": true - } - } - } - } - } - } - }, - "config-chain": { - "version": "1.1.11", - "bundled": true, - "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" - }, - "dependencies": { - "proto-list": { - "version": "1.2.4", - "bundled": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true - }, - "detect-indent": { - "version": "5.0.0", - "bundled": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "requires": { - "asap": "2.0.5", - "wrappy": "1.0.2" - }, - "dependencies": { - "asap": { - "version": "2.0.5", - "bundled": true - } - } - }, - "editor": { - "version": "1.0.0", - "bundled": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "path-is-inside": "1.0.2", - "rimraf": "2.6.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.4" - } - }, - "gentle-fs": { - "version": "2.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-vacuum": "1.2.10", - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "path-is-inside": "1.0.2", - "read-cmd-shim": "1.0.1", - "slide": "1.1.6" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "2.5.0", - "bundled": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "init-package-json": { - "version": "1.10.1", - "bundled": true, - "requires": { - "glob": "7.1.2", - "npm-package-arg": "5.1.2", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.12", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "requires": { - "read": "1.0.7" - } - } - } - }, - "is-cidr": { - "version": "1.0.0", - "bundled": true, - "requires": { - "cidr-regex": "1.0.6" - }, - "dependencies": { - "cidr-regex": { - "version": "1.0.6", - "bundled": true - } - } - }, - "lazy-property": { - "version": "1.0.0", - "bundled": true - }, - "libcipm": { - "version": "1.3.3", - "bundled": true, - "requires": { - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "find-npm-prefix": "1.0.2", - "graceful-fs": "4.1.11", - "lock-verify": "2.0.0", - "npm-lifecycle": "2.0.0", - "npm-logical-tree": "1.2.1", - "npm-package-arg": "6.0.0", - "pacote": "7.3.3", - "protoduck": "5.0.0", - "read-package-json": "2.0.12", - "rimraf": "2.6.2", - "worker-farm": "1.5.2" - }, - "dependencies": { - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "lock-verify": { - "version": "2.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "5.1.2", - "semver": "5.5.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - } - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.2", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "libnpx": { - "version": "9.7.1", - "bundled": true, - "requires": { - "dotenv": "4.0.0", - "npm-package-arg": "5.1.2", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "update-notifier": "2.3.0", - "which": "1.3.0", - "y18n": "3.2.1", - "yargs": "8.0.2" - }, - "dependencies": { - "dotenv": { - "version": "4.0.0", - "bundled": true - }, - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yargs": { - "version": "8.0.2", - "bundled": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cliui": { - "version": "3.2.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "bundled": true - } - } - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "1.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.1.0", - "bundled": true - } - } - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "bundled": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "bundled": true, - "requires": { - "locate-path": "2.0.0" - }, - "dependencies": { - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "p-locate": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "1.1.0" - }, - "dependencies": { - "p-limit": { - "version": "1.1.0", - "bundled": true - } - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true - } - } - } - } - }, - "read-pkg": { - "version": "2.0.0", - "bundled": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "2.0.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "bundled": true, - "requires": { - "error-ex": "1.3.1" - }, - "dependencies": { - "error-ex": { - "version": "1.3.1", - "bundled": true, - "requires": { - "is-arrayish": "0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "bundled": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "bundled": true - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true - } - } - }, - "path-type": { - "version": "2.0.0", - "bundled": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "bundled": true - } - } - } - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "yargs-parser": { - "version": "7.0.0", - "bundled": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - } - } - }, - "lockfile": { - "version": "1.0.3", - "bundled": true - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._createset": { - "version": "4.0.3", - "bundled": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true - } - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "requires": { - "lodash._getnative": "3.9.1" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true - }, - "lru-cache": { - "version": "4.1.1", - "bundled": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - } - } - }, - "meant": { - "version": "1.0.1", - "bundled": true - }, - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "requires": { - "aproba": "1.2.0" - } - } - } - }, - "node-gyp": { - "version": "3.6.2", - "bundled": true, - "requires": { - "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.83.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" - }, - "dependencies": { - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - } - } - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "bundled": true - } - } - } - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "npm-lifecycle": { - "version": "2.0.0", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "byline": { - "version": "5.0.0", - "bundled": true - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-package-arg": { - "version": "6.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - }, - "dependencies": { - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - } - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true - } - } - }, - "npm-profile": { - "version": "3.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "make-fetch-happen": "2.6.0" - }, - "dependencies": { - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.3.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - } - } - }, - "npm-registry-client": { - "version": "8.5.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "5.1.2", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.83.0", - "retry": "0.10.1", - "semver": "5.5.0", - "slide": "1.1.6", - "ssri": "4.1.6" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "ssri": { - "version": "4.1.6", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "npm-user-validate": { - "version": "1.0.0", - "bundled": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.4" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "bundled": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "requires": { - "string-width": "1.0.2" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - } - } - }, - "pacote": { - "version": "7.3.3", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cacache": "10.0.4", - "get-stream": "3.0.0", - "glob": "7.1.2", - "lru-cache": "4.1.1", - "make-fetch-happen": "2.6.0", - "minimatch": "3.0.4", - "mississippi": "2.0.0", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-pick-manifest": "2.1.0", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.0", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "ssri": "5.2.4", - "tar": "4.3.3", - "unique-filename": "1.1.0", - "which": "1.3.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.3.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.11" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "npm-pick-manifest": { - "version": "2.1.0", - "bundled": true, - "requires": { - "npm-package-arg": "6.0.0", - "semver": "5.5.0" - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "semver": { - "version": "5.5.0", - "bundled": true - } - } - }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "qrcode-terminal": { - "version": "0.11.0", - "bundled": true - }, - "query-string": { - "version": "5.1.0", - "bundled": true, - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - }, - "dependencies": { - "decode-uri-component": { - "version": "0.2.0", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "bundled": true - } - } - }, - "qw": { - "version": "1.0.1", - "bundled": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "requires": { - "mute-stream": "0.0.7" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.7", - "bundled": true - } - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.11", - "read-package-json": "2.0.12", - "readdir-scoped-modules": "1.0.2", - "semver": "5.5.0", - "slide": "1.1.6", - "util-extend": "1.0.3" - }, - "dependencies": { - "util-extend": { - "version": "1.0.3", - "bundled": true - } - } - }, - "read-package-json": { - "version": "2.0.12", - "bundled": true, - "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "json-parse-better-errors": "1.0.1", - "normalize-package-data": "2.4.0", - "slash": "1.0.0" - }, - "dependencies": { - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - }, - "slash": { - "version": "1.0.0", - "bundled": true - } - } - }, - "read-package-tree": { - "version": "5.1.6", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.12", - "readdir-scoped-modules": "1.0.2" - } - }, - "readable-stream": { - "version": "2.3.4", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - } - } - }, - "readdir-scoped-modules": { - "version": "1.0.2", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.11", - "once": "1.4.0" - } - }, - "request": { - "version": "2.83.0", - "bundled": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "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.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.7.0", - "bundled": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "bundled": true - } - } - }, - "extend": { - "version": "3.0.1", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.3.1", - "bundled": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "bundled": true - } - } - }, - "har-validator": { - "version": "5.0.3", - "bundled": true, - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.3", - "bundled": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "co": { - "version": "4.6.0", - "bundled": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "bundled": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "bundled": true - } - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "bundled": true - } - } - }, - "hawk": { - "version": "6.0.2", - "bundled": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - }, - "dependencies": { - "boom": { - "version": "4.3.1", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "bundled": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "hoek": { - "version": "4.2.0", - "bundled": true - }, - "sntp": { - "version": "2.0.2", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "requires": { - "mime-db": "1.30.0" - }, - "dependencies": { - "mime-db": { - "version": "1.30.0", - "bundled": true - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true - }, - "qs": { - "version": "6.5.1", - "bundled": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "bundled": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "retry": { - "version": "0.10.1", - "bundled": true - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "semver": { - "version": "5.5.0", - "bundled": true - }, - "sha": { - "version": "2.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "readable-stream": "2.3.4" - } - }, - "slide": { - "version": "1.1.6", - "bundled": true - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "requires": { - "from2": "1.3.0", - "stream-iterate": "1.2.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "0.0.1", - "bundled": true - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true - } - } - } - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "ssri": { - "version": "5.2.4", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - } - } - }, - "tar": { - "version": "4.3.3", - "bundled": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.1", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "yallist": "3.0.2" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "minipass": { - "version": "2.2.1", - "bundled": true, - "requires": { - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - }, - "umask": { - "version": "1.1.0", - "bundled": true - }, - "unique-filename": { - "version": "1.1.0", - "bundled": true, - "requires": { - "unique-slug": "2.0.0" - }, - "dependencies": { - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "requires": { - "imurmurhash": "0.1.4" - } - } - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true - }, - "update-notifier": { - "version": "2.3.0", - "bundled": true, - "requires": { - "boxen": "1.2.1", - "chalk": "2.1.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "boxen": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "requires": { - "string-width": "2.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "requires": { - "execa": "0.7.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "widest-line": { - "version": "1.0.0", - "bundled": true, - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "chalk": { - "version": "2.1.0", - "bundled": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "bundled": true, - "requires": { - "color-convert": "1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.0", - "bundled": true, - "requires": { - "color-name": "1.1.3" - }, - "dependencies": { - "color-name": { - "version": "1.1.3", - "bundled": true - } - } - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true - }, - "supports-color": { - "version": "4.4.0", - "bundled": true, - "requires": { - "has-flag": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "configstore": { - "version": "3.1.1", - "bundled": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.0", - "bundled": true, - "requires": { - "is-obj": "1.0.1" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "bundled": true - } - } - }, - "make-dir": { - "version": "1.0.0", - "bundled": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "bundled": true - } - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "requires": { - "crypto-random-string": "1.0.0" - }, - "dependencies": { - "crypto-random-string": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "import-lazy": { - "version": "2.1.0", - "bundled": true - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "requires": { - "global-dirs": "0.1.0", - "is-path-inside": "1.0.0" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.0", - "bundled": true, - "requires": { - "ini": "1.3.5" - } - }, - "is-path-inside": { - "version": "1.0.0", - "bundled": true, - "requires": { - "path-is-inside": "1.0.2" - } - } - } - }, - "is-npm": { - "version": "1.0.0", - "bundled": true - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "requires": { - "package-json": "4.0.1" - }, - "dependencies": { - "package-json": { - "version": "4.0.1", - "bundled": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.5.0" - }, - "dependencies": { - "got": { - "version": "6.7.1", - "bundled": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - }, - "dependencies": { - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "requires": { - "capture-stack-trace": "1.0.0" - }, - "dependencies": { - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true - } - } - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "lowercase-keys": { - "version": "1.0.0", - "bundled": true - }, - "timed-out": { - "version": "4.0.1", - "bundled": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "requires": { - "prepend-http": "1.0.4" - }, - "dependencies": { - "prepend-http": { - "version": "1.0.4", - "bundled": true - } - } - } - } - }, - "registry-auth-token": { - "version": "3.3.1", - "bundled": true, - "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "requires": { - "rc": "1.2.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "semver-diff": { - "version": "2.1.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true - } - } - }, - "uuid": { - "version": "3.2.1", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "bundled": true, - "requires": { - "spdx-license-ids": "1.2.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "bundled": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true - } - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "requires": { - "builtins": "1.0.3" - }, - "dependencies": { - "builtins": { - "version": "1.0.3", - "bundled": true - } - } - }, - "which": { - "version": "1.3.0", - "bundled": true, - "requires": { - "isexe": "2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.2", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "2.1.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - } - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index ac3b2dcbb..9577433fa 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -13,7 +13,11 @@ "compile": "npm run script compile-auto compile-auto-strict", "clean": "rimraf build/*", "fix": "gts fix", - "script": "ts-node -P ./scripts ./scripts" + "script": "ts-node -P ./scripts ./scripts", + "check": "gts check", + "prepare": "npm run compile", + "pretest": "npm run compile", + "posttest": "npm run check" }, "keywords": [ "opencensus", @@ -46,13 +50,13 @@ "@types/semver": "^5.5.0", "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", - "gts": "^0.5.1", + "gts": "^0.5.4", "ncp": "^2.0.0", "google-cloud": "^0.57.0", "googleapis": "27.0.0", "mocha": "^5.0.4", "ts-node": "^4.0.0", - "typescript": "^2.7.2" + "typescript": "~2.6.1" }, "dependencies": { "async_hooks": "^1.0.0", From 86ae976cb316d95cc42924782b4ac8094361eebe Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 11 Apr 2018 09:39:00 -0300 Subject: [PATCH 059/110] refactor: apply code guidelines rules to plugingtypes.ts file --- .../src/trace/instrumentation/types.ts | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index 35a3450af..94e884d2b 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -14,25 +14,33 @@ * limitations under the License. */ -export interface Plugin { - applyPatch(module: any, tracer: T, version: string): void; +/** + * Interface Plugin to apply patch. + */ +export interface Plugin { + applyPatch(module: {}, tracer: T, version: string): void; } +/** + * This class represent the base to patch plugin + */ +export abstract class BasePlugin { + module: {}; + moduleName: string; + tracer: T; + version: string; -export abstract class BasePlugin { - - public module: any; - public moduleName: string; - public tracer: T; - public version: string; - - constructor (moduleName: string) { - this.moduleName = moduleName; - } - - setPluginContext(http: any, tracer: T, version: string) { - this.module = http; - this.tracer = tracer; - this.version = version; - } - + constructor(moduleName: string) { + this.moduleName = moduleName; + } + /** + * Set modified plugin to the context. + * @param http object module to set on context + * @param tracer tracer relating to context + * @param version module version description + */ + setPluginContext(http: {}, tracer: T, version: string) { + this.module = http; + this.tracer = tracer; + this.version = version; + } } \ No newline at end of file From d966db5e2771ab06aa81eb008b63a6f6798d3cbe Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 11 Apr 2018 09:40:10 -0300 Subject: [PATCH 060/110] refactor: modified variable traceId for private --- packages/opencensus-core/src/trace/sampler/sampler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 37759eedd..be48cec49 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -24,7 +24,7 @@ const MAX_NUMBER = 0xffffffffffffffff; * This class represent the probability of a tracer. */ export class Sampler { - traceId: string; + private traceId: string; private idUpperBound: number; /** From 014afa6e6ca0cfc889d72dbff4f6fedb85596eb4 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 10 Apr 2018 08:10:39 -0300 Subject: [PATCH 061/110] refactor: apply code guidelines rules to stackdriver.ts file --- packages/opencensus-core/package-lock.json | 3955 +------------------- packages/opencensus-core/package.json | 6 +- 2 files changed, 15 insertions(+), 3946 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 737059713..204286732 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -7502,7 +7502,7 @@ "integrity": "sha512-Cz0BRsZmewc21N50x5nAUW5cqaGhJ9ETQKZMGqGL4BxmCV7ETELazSqmNi4oCDeRwM4Iub/fIJWAWZk2i6XLCg==", "dev": true, "requires": { - "google-auth-library": "1.3.2", + "google-auth-library": "1.4.0", "pify": "3.0.0", "qs": "6.5.1", "string-template": "1.0.0", @@ -7521,14 +7521,14 @@ } }, "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.4.0.tgz", + "integrity": "sha512-vWRx6pJulK7Y5V/Xyr7MPMlx2mWfmrUVbcffZ7hpq8ElFg5S8WY6PvjMovdcr6JfuAwwpAX4R0I1XOcyWuBcUw==", "dev": true, "requires": { "axios": "0.18.0", "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", + "gtoken": "2.3.0", "jws": "3.1.4", "lodash.isstring": "4.0.1", "lru-cache": "4.1.2", @@ -7546,22 +7546,22 @@ } }, "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz", + "integrity": "sha512-Jc9/8mV630cZE9FC5tIlJCZNdUjwunvlwOtCz6IDlaiB4Sz68ki29a1+q97sWTnTYroiuF9B135rod9zrQdHLw==", "dev": true, "requires": { "axios": "0.18.0", "google-p12-pem": "1.0.2", "jws": "3.1.4", - "mime": "2.2.0", + "mime": "2.2.2", "pify": "3.0.0" } }, "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.2.tgz", + "integrity": "sha512-A7PDg4s48MkqFEcYg2b069m3DXOEq7hx+9q9rIFrSSYfzsh35GX+LOVMQ8Au0ko7d8bSQCIAuzkjp0vCtwENlQ==", "dev": true } } @@ -9480,3937 +9480,6 @@ "validate-npm-package-license": "3.0.3" } }, - "npm": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-5.7.1.tgz", - "integrity": "sha512-r1grvv6mcEt+nlMzMWPc5n/z5q8NNuBWj0TGFp1PBSFCl6ubnAoUGBsucYsnZYT7MOJn0ha1ptEjmdBoAdJ+SA==", - "requires": { - "JSONStream": "1.3.2", - "abbrev": "1.1.1", - "ansi-regex": "3.0.0", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.2.0", - "archy": "1.0.0", - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "cacache": "10.0.4", - "call-limit": "1.1.0", - "chownr": "1.0.1", - "cli-table2": "0.2.0", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "detect-indent": "5.0.0", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "find-npm-prefix": "1.0.2", - "fs-vacuum": "1.2.10", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "has-unicode": "2.0.1", - "hosted-git-info": "2.5.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "inflight": "1.0.6", - "inherits": "2.0.3", - "ini": "1.3.5", - "init-package-json": "1.10.1", - "is-cidr": "1.0.0", - "lazy-property": "1.0.0", - "libcipm": "1.3.3", - "libnpx": "9.7.1", - "lockfile": "1.0.3", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "lru-cache": "4.1.1", - "meant": "1.0.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "nopt": "4.0.1", - "normalize-package-data": "2.4.0", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-lifecycle": "2.0.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-profile": "3.0.1", - "npm-registry-client": "8.5.0", - "npm-user-validate": "1.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "opener": "1.4.3", - "osenv": "0.1.5", - "pacote": "7.3.3", - "path-is-inside": "1.0.2", - "promise-inflight": "1.0.1", - "qrcode-terminal": "0.11.0", - "query-string": "5.1.0", - "qw": "1.0.1", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.12", - "read-package-tree": "5.1.6", - "readable-stream": "2.3.4", - "readdir-scoped-modules": "1.0.2", - "request": "2.83.0", - "retry": "0.10.1", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "sorted-union-stream": "2.1.3", - "ssri": "5.2.4", - "strip-ansi": "4.0.0", - "tar": "4.3.3", - "text-table": "0.2.0", - "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "update-notifier": "2.3.0", - "uuid": "3.2.1", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0", - "which": "1.3.0", - "worker-farm": "1.5.2", - "wrappy": "1.0.2", - "write-file-atomic": "2.1.0" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.2", - "bundled": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "through": { - "version": "2.3.8", - "bundled": true - } - } - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "bin-links": { - "version": "1.1.0", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cmd-shim": "2.0.2", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "graceful-fs": "4.1.11", - "slide": "1.1.6" - } - }, - "bluebird": { - "version": "3.5.1", - "bundled": true - }, - "cacache": { - "version": "10.0.4", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.2.4", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - }, - "dependencies": { - "y18n": { - "version": "4.0.0", - "bundled": true - } - } - }, - "call-limit": { - "version": "1.1.0", - "bundled": true - }, - "chownr": { - "version": "1.0.1", - "bundled": true - }, - "cli-table2": { - "version": "0.2.0", - "bundled": true, - "requires": { - "colors": "1.1.2", - "lodash": "3.10.1", - "string-width": "1.0.2" - }, - "dependencies": { - "colors": { - "version": "1.1.2", - "bundled": true, - "optional": true - }, - "lodash": { - "version": "3.10.1", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - }, - "cmd-shim": { - "version": "2.0.2", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" - } - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" - }, - "dependencies": { - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "1.0.3" - }, - "dependencies": { - "defaults": { - "version": "1.0.3", - "bundled": true, - "requires": { - "clone": "1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.2", - "bundled": true - } - } - } - } - } - } - }, - "config-chain": { - "version": "1.1.11", - "bundled": true, - "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" - }, - "dependencies": { - "proto-list": { - "version": "1.2.4", - "bundled": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true - }, - "detect-indent": { - "version": "5.0.0", - "bundled": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "requires": { - "asap": "2.0.5", - "wrappy": "1.0.2" - }, - "dependencies": { - "asap": { - "version": "2.0.5", - "bundled": true - } - } - }, - "editor": { - "version": "1.0.0", - "bundled": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "path-is-inside": "1.0.2", - "rimraf": "2.6.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.4" - } - }, - "gentle-fs": { - "version": "2.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-vacuum": "1.2.10", - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "path-is-inside": "1.0.2", - "read-cmd-shim": "1.0.1", - "slide": "1.1.6" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "2.5.0", - "bundled": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "init-package-json": { - "version": "1.10.1", - "bundled": true, - "requires": { - "glob": "7.1.2", - "npm-package-arg": "5.1.2", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.12", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1", - "validate-npm-package-name": "3.0.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "requires": { - "read": "1.0.7" - } - } - } - }, - "is-cidr": { - "version": "1.0.0", - "bundled": true, - "requires": { - "cidr-regex": "1.0.6" - }, - "dependencies": { - "cidr-regex": { - "version": "1.0.6", - "bundled": true - } - } - }, - "lazy-property": { - "version": "1.0.0", - "bundled": true - }, - "libcipm": { - "version": "1.3.3", - "bundled": true, - "requires": { - "bin-links": "1.1.0", - "bluebird": "3.5.1", - "find-npm-prefix": "1.0.2", - "graceful-fs": "4.1.11", - "lock-verify": "2.0.0", - "npm-lifecycle": "2.0.0", - "npm-logical-tree": "1.2.1", - "npm-package-arg": "6.0.0", - "pacote": "7.3.3", - "protoduck": "5.0.0", - "read-package-json": "2.0.12", - "rimraf": "2.6.2", - "worker-farm": "1.5.2" - }, - "dependencies": { - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "lock-verify": { - "version": "2.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "5.1.2", - "semver": "5.5.0" - }, - "dependencies": { - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - } - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.2", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "libnpx": { - "version": "9.7.1", - "bundled": true, - "requires": { - "dotenv": "4.0.0", - "npm-package-arg": "5.1.2", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "update-notifier": "2.3.0", - "which": "1.3.0", - "y18n": "3.2.1", - "yargs": "8.0.2" - }, - "dependencies": { - "dotenv": { - "version": "4.0.0", - "bundled": true - }, - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yargs": { - "version": "8.0.2", - "bundled": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cliui": { - "version": "3.2.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "bundled": true - } - } - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "1.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "1.1.0", - "bundled": true - } - } - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "bundled": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "bundled": true, - "requires": { - "locate-path": "2.0.0" - }, - "dependencies": { - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "p-locate": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "1.1.0" - }, - "dependencies": { - "p-limit": { - "version": "1.1.0", - "bundled": true - } - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true - } - } - } - } - }, - "read-pkg": { - "version": "2.0.0", - "bundled": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "2.0.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "bundled": true, - "requires": { - "error-ex": "1.3.1" - }, - "dependencies": { - "error-ex": { - "version": "1.3.1", - "bundled": true, - "requires": { - "is-arrayish": "0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "bundled": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "bundled": true - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true - } - } - }, - "path-type": { - "version": "2.0.0", - "bundled": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "bundled": true - } - } - } - } - } - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "yargs-parser": { - "version": "7.0.0", - "bundled": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - } - } - }, - "lockfile": { - "version": "1.0.3", - "bundled": true - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" - }, - "dependencies": { - "lodash._createset": { - "version": "4.0.3", - "bundled": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true - } - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "requires": { - "lodash._getnative": "3.9.1" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true - }, - "lru-cache": { - "version": "4.1.1", - "bundled": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - } - } - }, - "meant": { - "version": "1.0.1", - "bundled": true - }, - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "requires": { - "aproba": "1.2.0" - } - } - } - }, - "node-gyp": { - "version": "3.6.2", - "bundled": true, - "requires": { - "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.83.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" - }, - "dependencies": { - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "nopt": { - "version": "3.0.6", - "bundled": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { - "version": "5.3.0", - "bundled": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - } - } - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - }, - "dependencies": { - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "requires": { - "builtin-modules": "1.1.1" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "bundled": true - } - } - } - } - }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true - }, - "npm-install-checks": { - "version": "3.0.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "npm-lifecycle": { - "version": "2.0.0", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "byline": { - "version": "5.0.0", - "bundled": true - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-package-arg": { - "version": "6.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - }, - "dependencies": { - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - } - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true - } - } - }, - "npm-profile": { - "version": "3.0.1", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "make-fetch-happen": "2.6.0" - }, - "dependencies": { - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.3.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - } - } - }, - "npm-registry-client": { - "version": "8.5.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "5.1.2", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.83.0", - "retry": "0.10.1", - "semver": "5.5.0", - "slide": "1.1.6", - "ssri": "4.1.6" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "npm-package-arg": { - "version": "5.1.2", - "bundled": true, - "requires": { - "hosted-git-info": "2.5.0", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" - } - }, - "ssri": { - "version": "4.1.6", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "npm-user-validate": { - "version": "1.0.0", - "bundled": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.4" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "bundled": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "requires": { - "string-width": "1.0.2" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opener": { - "version": "1.4.3", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - } - } - }, - "pacote": { - "version": "7.3.3", - "bundled": true, - "requires": { - "bluebird": "3.5.1", - "cacache": "10.0.4", - "get-stream": "3.0.0", - "glob": "7.1.2", - "lru-cache": "4.1.1", - "make-fetch-happen": "2.6.0", - "minimatch": "3.0.4", - "mississippi": "2.0.0", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.0.0", - "npm-packlist": "1.1.10", - "npm-pick-manifest": "2.1.0", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.0", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "ssri": "5.2.4", - "tar": "4.3.3", - "unique-filename": "1.1.0", - "which": "1.3.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "make-fetch-happen": { - "version": "2.6.0", - "bundled": true, - "requires": { - "agentkeepalive": "3.3.0", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.0.0", - "https-proxy-agent": "2.1.1", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.2.4" - }, - "dependencies": { - "agentkeepalive": { - "version": "3.3.0", - "bundled": true, - "requires": { - "humanize-ms": "1.2.1" - }, - "dependencies": { - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "bundled": true - } - } - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "2.6.9" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "https-proxy-agent": { - "version": "2.1.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "1.3.1", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "1.0.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - } - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "encoding": { - "version": "0.1.12", - "bundled": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "bundled": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - } - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "bundled": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "bundled": true, - "requires": { - "es6-promisify": "5.0.0" - }, - "dependencies": { - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "bundled": true - } - } - } - } - }, - "socks": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - }, - "dependencies": { - "ip": { - "version": "1.1.5", - "bundled": true - }, - "smart-buffer": { - "version": "1.1.15", - "bundled": true - } - } - } - } - } - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.11" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "mississippi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "typedarray": "0.0.6" - }, - "dependencies": { - "typedarray": { - "version": "0.0.6", - "bundled": true - } - } - }, - "duplexify": { - "version": "3.5.3", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "1.4.0" - } - }, - "flush-write-stream": { - "version": "1.0.2", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.4" - } - }, - "parallel-transform": { - "version": "1.1.0", - "bundled": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.4" - }, - "dependencies": { - "cyclist": { - "version": "0.2.2", - "bundled": true - } - } - }, - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "bundled": true, - "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - } - } - }, - "npm-pick-manifest": { - "version": "2.1.0", - "bundled": true, - "requires": { - "npm-package-arg": "6.0.0", - "semver": "5.5.0" - } - }, - "promise-retry": { - "version": "1.1.1", - "bundled": true, - "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" - }, - "dependencies": { - "err-code": { - "version": "1.1.2", - "bundled": true - } - } - }, - "protoduck": { - "version": "5.0.0", - "bundled": true, - "requires": { - "genfun": "4.0.1" - }, - "dependencies": { - "genfun": { - "version": "4.0.1", - "bundled": true - } - } - }, - "semver": { - "version": "5.5.0", - "bundled": true - } - } - }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "qrcode-terminal": { - "version": "0.11.0", - "bundled": true - }, - "query-string": { - "version": "5.1.0", - "bundled": true, - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - }, - "dependencies": { - "decode-uri-component": { - "version": "0.2.0", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "bundled": true - } - } - }, - "qw": { - "version": "1.0.1", - "bundled": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "requires": { - "mute-stream": "0.0.7" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.7", - "bundled": true - } - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.11", - "read-package-json": "2.0.12", - "readdir-scoped-modules": "1.0.2", - "semver": "5.5.0", - "slide": "1.1.6", - "util-extend": "1.0.3" - }, - "dependencies": { - "util-extend": { - "version": "1.0.3", - "bundled": true - } - } - }, - "read-package-json": { - "version": "2.0.12", - "bundled": true, - "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "json-parse-better-errors": "1.0.1", - "normalize-package-data": "2.4.0", - "slash": "1.0.0" - }, - "dependencies": { - "json-parse-better-errors": { - "version": "1.0.1", - "bundled": true - }, - "slash": { - "version": "1.0.0", - "bundled": true - } - } - }, - "read-package-tree": { - "version": "5.1.6", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.12", - "readdir-scoped-modules": "1.0.2" - } - }, - "readable-stream": { - "version": "2.3.4", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - } - } - }, - "readdir-scoped-modules": { - "version": "1.0.2", - "bundled": true, - "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.11", - "once": "1.4.0" - } - }, - "request": { - "version": "2.83.0", - "bundled": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "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.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - }, - "dependencies": { - "aws-sign2": { - "version": "0.7.0", - "bundled": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "bundled": true - } - } - }, - "extend": { - "version": "3.0.1", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.3.1", - "bundled": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "bundled": true - } - } - }, - "har-validator": { - "version": "5.0.3", - "bundled": true, - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.3", - "bundled": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "co": { - "version": "4.6.0", - "bundled": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "bundled": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "bundled": true - } - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "bundled": true - } - } - }, - "hawk": { - "version": "6.0.2", - "bundled": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - }, - "dependencies": { - "boom": { - "version": "4.3.1", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "bundled": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "hoek": { - "version": "4.2.0", - "bundled": true - }, - "sntp": { - "version": "2.0.2", - "bundled": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "requires": { - "mime-db": "1.30.0" - }, - "dependencies": { - "mime-db": { - "version": "1.30.0", - "bundled": true - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true - }, - "qs": { - "version": "6.5.1", - "bundled": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "bundled": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "retry": { - "version": "0.10.1", - "bundled": true - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "semver": { - "version": "5.5.0", - "bundled": true - }, - "sha": { - "version": "2.0.1", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "readable-stream": "2.3.4" - } - }, - "slide": { - "version": "1.1.6", - "bundled": true - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "requires": { - "from2": "1.3.0", - "stream-iterate": "1.2.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "0.0.1", - "bundled": true - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true - } - } - } - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "requires": { - "readable-stream": "2.3.4", - "stream-shift": "1.0.0" - }, - "dependencies": { - "stream-shift": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "ssri": { - "version": "5.2.4", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - } - } - }, - "tar": { - "version": "4.3.3", - "bundled": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.1", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "yallist": "3.0.2" - }, - "dependencies": { - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "minipass": { - "version": "2.2.1", - "bundled": true, - "requires": { - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "requires": { - "minipass": "2.2.1" - } - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - }, - "umask": { - "version": "1.1.0", - "bundled": true - }, - "unique-filename": { - "version": "1.1.0", - "bundled": true, - "requires": { - "unique-slug": "2.0.0" - }, - "dependencies": { - "unique-slug": { - "version": "2.0.0", - "bundled": true, - "requires": { - "imurmurhash": "0.1.4" - } - } - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true - }, - "update-notifier": { - "version": "2.3.0", - "bundled": true, - "requires": { - "boxen": "1.2.1", - "chalk": "2.1.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "boxen": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.1.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" - }, - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "requires": { - "string-width": "2.1.1" - } - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cli-boxes": { - "version": "1.0.0", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "requires": { - "execa": "0.7.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - }, - "dependencies": { - "shebang-regex": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "bundled": true - } - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "widest-line": { - "version": "1.0.0", - "bundled": true, - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "chalk": { - "version": "2.1.0", - "bundled": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "bundled": true, - "requires": { - "color-convert": "1.9.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.0", - "bundled": true, - "requires": { - "color-name": "1.1.3" - }, - "dependencies": { - "color-name": { - "version": "1.1.3", - "bundled": true - } - } - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true - }, - "supports-color": { - "version": "4.4.0", - "bundled": true, - "requires": { - "has-flag": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "bundled": true - } - } - } - } - }, - "configstore": { - "version": "3.1.1", - "bundled": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.0", - "bundled": true, - "requires": { - "is-obj": "1.0.1" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "bundled": true - } - } - }, - "make-dir": { - "version": "1.0.0", - "bundled": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "bundled": true - } - } - }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "requires": { - "crypto-random-string": "1.0.0" - }, - "dependencies": { - "crypto-random-string": { - "version": "1.0.0", - "bundled": true - } - } - } - } - }, - "import-lazy": { - "version": "2.1.0", - "bundled": true - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "requires": { - "global-dirs": "0.1.0", - "is-path-inside": "1.0.0" - }, - "dependencies": { - "global-dirs": { - "version": "0.1.0", - "bundled": true, - "requires": { - "ini": "1.3.5" - } - }, - "is-path-inside": { - "version": "1.0.0", - "bundled": true, - "requires": { - "path-is-inside": "1.0.2" - } - } - } - }, - "is-npm": { - "version": "1.0.0", - "bundled": true - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "requires": { - "package-json": "4.0.1" - }, - "dependencies": { - "package-json": { - "version": "4.0.1", - "bundled": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.5.0" - }, - "dependencies": { - "got": { - "version": "6.7.1", - "bundled": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - }, - "dependencies": { - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "requires": { - "capture-stack-trace": "1.0.0" - }, - "dependencies": { - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true - } - } - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "lowercase-keys": { - "version": "1.0.0", - "bundled": true - }, - "timed-out": { - "version": "4.0.1", - "bundled": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "requires": { - "prepend-http": "1.0.4" - }, - "dependencies": { - "prepend-http": { - "version": "1.0.4", - "bundled": true - } - } - } - } - }, - "registry-auth-token": { - "version": "3.3.1", - "bundled": true, - "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "requires": { - "rc": "1.2.1" - }, - "dependencies": { - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - } - } - } - } - } - } - }, - "semver-diff": { - "version": "2.1.0", - "bundled": true, - "requires": { - "semver": "5.5.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true - } - } - }, - "uuid": { - "version": "3.2.1", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "bundled": true, - "requires": { - "spdx-license-ids": "1.2.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.2", - "bundled": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "bundled": true - } - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "requires": { - "builtins": "1.0.3" - }, - "dependencies": { - "builtins": { - "version": "1.0.3", - "bundled": true - } - } - }, - "which": { - "version": "1.3.0", - "bundled": true, - "requires": { - "isexe": "2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "bundled": true - } - } - }, - "worker-farm": { - "version": "1.5.2", - "bundled": true, - "requires": { - "errno": "0.1.7", - "xtend": "4.0.1" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "1.0.1" - }, - "dependencies": { - "prr": { - "version": "1.0.1", - "bundled": true - } - } - }, - "xtend": { - "version": "4.0.1", - "bundled": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "2.1.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - } - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index ac3b2dcbb..9c33101f9 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -46,11 +46,11 @@ "@types/semver": "^5.5.0", "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", - "gts": "^0.5.1", - "ncp": "^2.0.0", "google-cloud": "^0.57.0", - "googleapis": "27.0.0", + "googleapis": "^27.0.0", + "gts": "^0.5.1", "mocha": "^5.0.4", + "ncp": "^2.0.0", "ts-node": "^4.0.0", "typescript": "^2.7.2" }, From 221ff15b02701d7d01d5138054e81a165a09d35d Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 11 Apr 2018 10:23:56 -0300 Subject: [PATCH 062/110] docs: document interface todo --- packages/opencensus-core/src/exporters | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/opencensus-core/src/exporters b/packages/opencensus-core/src/exporters index e25c6c6ad..d00baeb8a 100644 --- a/packages/opencensus-core/src/exporters +++ b/packages/opencensus-core/src/exporters @@ -14,7 +14,9 @@ * limitations under the License. */ - +/** + * TODO: Interface to exporters options + */ export interface ExporterOptions { } \ No newline at end of file From 1ea07bc61c4f4cf028c354f9c54c0f7b9e522e06 Mon Sep 17 00:00:00 2001 From: Luana Date: Tue, 10 Apr 2018 07:41:23 -0300 Subject: [PATCH 063/110] refactor: apply code guidelines rules to test-rootspan.ts file --- .../opencensus-core/test/test-root-span.ts | 167 ++++++++++-------- 1 file changed, 93 insertions(+), 74 deletions(-) diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index cba3e945b..17f9a87ad 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -1,96 +1,115 @@ /** -* Copyright 2018 Google Inc. All Rights Reserved. -* -* Licensed under the Apache License, Version 2.0 (the 'License'); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an 'AS IS' BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -import { RootSpan } from '../src/trace/model/rootspan'; -import { Span } from '../src/trace/model/span'; -import { Tracer } from '../src/trace/model/tracer'; -import { SpanBaseModel } from '../src/trace/types/tracetypes'; +import * as assert from 'assert'; + +import {RootSpan} from '../src/trace/model/rootspan'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {SpanBaseModel} from '../src/trace/types/tracetypes'; -let assert = require('assert'); let tracer = new Tracer(); -describe('RootSpan', function () { - describe('new RootSpan()', function () { - it('should create a RootSpan instance', function () { - let root = new RootSpan(tracer); - assert.ok(root instanceof SpanBaseModel); - }); +describe('RootSpan', function() { + /** + * Should create a RootSpan instance + */ + describe('new RootSpan()', function() { + it('should create a RootSpan instance', function() { + let root = new RootSpan(tracer); + assert.ok(root instanceof SpanBaseModel); }); + }); - describe('start()', function () { - - it('should start a RootSpan instance', function () { - let root = new RootSpan(tracer); - root.start(); - assert.ok(root.started); - }); - + /** + * Should create and start a RootSpan instance + */ + describe('start()', function() { + it('should start a RootSpan instance', function() { + let root = new RootSpan(tracer); + root.start(); + assert.ok(root.started); }); + }); - describe('startSpan()', function () { + /** + * Should check type and a span was started + */ + describe('startSpan()', function() { + let root, span; - let root, span; - - before(function () { - root = new RootSpan(tracer); - root.start(); - span = root.startSpan('spanName', 'spanType'); - }); + before(function() { + root = new RootSpan(tracer); + root.start(); + span = root.startSpan('spanName', 'spanType'); + }); - it('should check span instance type', function () { - assert.ok(span instanceof Span); - }); + it('should check span instance type', function() { + assert.ok(span instanceof Span); + }); - it('should check if a new span was started', function () { - assert.ok(span.started); - }); + it('should check if a new span was started', function() { + assert.ok(span.started); }); + }); - describe('end()', function () { - it('should end the trace', function () { - let root = new RootSpan(tracer); - root.start(); - root.end(); - assert.ok(root.ended); - }); + /** + * Should start and end a rootspan properly + */ + describe('end()', function() { + it('should end the trace', function() { + let root = new RootSpan(tracer); + root.start(); + root.end(); + assert.ok(root.ended); }); + }); - describe('end() before trace started', function () { - it('should not end trace', function () { - let root = new RootSpan(tracer); - root.end(); - assert.ok(!root.ended); - }); + /** + * Should not end a rootspan which was not started + */ + describe('end() before trace started', function() { + it('should not end trace', function() { + let root = new RootSpan(tracer); + root.end(); + assert.ok(!root.ended); }); + }); - describe('startSpan() before trace started', function () { - it('should not create span', function () { - let root = new RootSpan(tracer); - let span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); - }); + /** + * Should not start a span from a not started rootspan + */ + describe('startSpan() before trace started', function() { + it('should not create span', function() { + let root = new RootSpan(tracer); + let span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); }); + }); - describe('startSpan() after trace ended', function () { - it('should not create span', function () { - let root = new RootSpan(tracer); - root.start(); - root.end(); - let span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); - }); + /** + * Should not create a span from a ended rootspan + */ + describe('startSpan() after trace ended', function() { + it('should not create span', function() { + let root = new RootSpan(tracer); + root.start(); + root.end(); + let span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); }); + }); }); From 3f161dde1109c53ecb5432ceb9f7271c2a363d40 Mon Sep 17 00:00:00 2001 From: Luana Date: Tue, 10 Apr 2018 07:46:18 -0300 Subject: [PATCH 064/110] refactor: apply code guidelines rules to test-span.ts file --- packages/opencensus-core/test/test-span.ts | 141 +++++++++++---------- 1 file changed, 72 insertions(+), 69 deletions(-) diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index a51eeefaf..9eb6c7077 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -14,83 +14,86 @@ * limitations under the License. */ -import { Span } from '../src/trace/model/span'; -import { RootSpan } from '../src/trace/model/rootspan'; -import { SpanBaseModel } from '../src/trace/types/tracetypes'; -import { Tracer } from '../src/trace/model/tracer'; - - -var assert = require('assert'); - -let tracer = new Tracer() - -describe('Span', function () { - -describe('startSpan()', function () { - - it('should create an span', function () { - const rootSpan = new RootSpan(tracer); - assert.ok(rootSpan instanceof SpanBaseModel); - - rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); - assert.ok(span instanceof Span); - assert.ok(span.id); +import * as assert from 'assert'; + +import {RootSpan} from '../src/trace/model/rootspan'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {SpanBaseModel} from '../src/trace/types/tracetypes'; + +let tracer = new Tracer(); + +describe('Span', function() { + /** + * Should create, start and end a rootspan + */ + describe('startSpan()', function() { + it('should create an span', function() { + const rootSpan = new RootSpan(tracer); + assert.ok(rootSpan instanceof SpanBaseModel); + + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); + assert.ok(span instanceof Span); + assert.ok(span.id); }); - it('should start a span', function () { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); - span.start(); - assert.ok(span.started); + it('should start a span', function() { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); + span.start(); + assert.ok(span.started); }); - it('should end a span', function () { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); - span.start(); - span.end(); - assert.ok(span.ended); + it('should end a span', function() { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = rootSpan.startSpan('spanName', 'typeSpan'); + span.start(); + span.end(); + assert.ok(span.ended); }); -}); - -describe('Span checking after creation', function () { - - it('should not start span after it ended', function () { - const root = new RootSpan(tracer); - root.start(); - const span = root.startSpan('spanName', 'typeSpan'); - span.start(); - span.end(); - - span.start(); - assert.equal(span.ended, true); + }); + + /** + * Should not start span after it ended + */ + describe('Span checking after creation', function() { + it('should not start span after it ended', function() { + const root = new RootSpan(tracer); + root.start(); + const span = root.startSpan('spanName', 'typeSpan'); + span.start(); + span.end(); + + span.start(); + assert.equal(span.ended, true); }); -}); - -describe('Span data', function () { - - it('should create an unique numeric span ID strings', function () { - const root = new RootSpan(tracer); - root.start(); - - var numberOfSpansToCheck = 5; - for (var i = 0; i < numberOfSpansToCheck; i++) { - var span = root.startSpan('spanName' + i, 'typeSpan' + i); - var spanId = span.id; - assert.ok(typeof spanId === 'string'); - assert.ok(spanId.match(/\d+/)); - assert.ok(Number(spanId) > 0); - assert.strictEqual(Number(spanId).toString(), spanId); - } + }); + + /** + * Should an unique ID for spans + */ + describe('Span data', function() { + it('should create an unique numeric span ID strings', function() { + const root = new RootSpan(tracer); + root.start(); + + var numberOfSpansToCheck = 5; + for (var i = 0; i < numberOfSpansToCheck; i++) { + var span = root.startSpan('spanName' + i, 'typeSpan' + i); + var spanId = span.id; + assert.ok(typeof spanId === 'string'); + assert.ok(spanId.match(/\d+/)); + assert.ok(Number(spanId) > 0); + assert.strictEqual(Number(spanId).toString(), spanId); + } }); // TODO - it('should truncate namespace', function () { - this.skip(); + it('should truncate namespace', function() { + this.skip(); }); -}); - + }); }); \ No newline at end of file From 6f7627550553e55be341eb0f1eb47269ad485fc9 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Wed, 11 Apr 2018 15:33:59 -0300 Subject: [PATCH 065/110] refactor: apply code guidelines rules to rootspan.ts file --- .../src/trace/model/root-span.ts | 168 ++++++++++-------- 1 file changed, 96 insertions(+), 72 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 51370bc26..052177de9 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -14,91 +14,115 @@ * limitations under the License. */ -import { Span } from './span' -import { Clock } from '../../internal/clock' import * as uuid from 'uuid'; -import { debug } from '../../internal/util' -import { SpanBaseModel, TraceOptions, TraceContext, OnEndSpanEventListener } from '../types/tracetypes' -import { Tracer } from './tracer' -export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { +import {Clock} from '../../internal/clock'; +import {debug} from '../../internal/util'; +import {OnEndSpanEventListener, SpanBaseModel, TraceContext, TraceOptions} from '../types/tracetypes'; +import {Span} from './span'; +import {Tracer} from './tracer'; - private tracer: Tracer; - private _spans: Span[]; - private _traceId: string; +/** Defines a root span */ +export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { + private tracer: Tracer; + readonly traceId: string; + private spansLocal: Span[] = []; - //TODO - improve root name setup - constructor(tracer: Tracer, context?: TraceOptions) { - super() - this.tracer = tracer; - this._traceId = context && context.traceContext && context.traceContext.traceId ? context.traceContext.traceId : (uuid.v4().split('-').join('')); - this.name = context && context.name ? context.name : 'undefined'; - if (context && context.traceContext) { - this.setParentSpanId(context.traceContext.spanId || '') - } - this._spans = []; + /** + * Constructs a new RootSpan instance. + * @param tracer + * @param context + */ + constructor(tracer: Tracer, context?: TraceOptions) { + super(); + this.tracer = tracer; + this.traceId = + context && context.traceContext && context.traceContext.traceId ? + context.traceContext.traceId : + (uuid.v4().split('-').join('')); + // TODO - improve root name setup + this.name = context && context.name ? context.name : 'undefined'; + if (context && context.traceContext) { + this.setParentSpanId(context.traceContext.spanId || ''); } + } - public get spans() { - return this._spans; - } + /** Returns a list of the trace's spans. */ + get spans() { + return this.spansLocal; + } - public get traceId() { - return this._traceId; - } + /** Starts the root span. */ + start() { + super.start(); + debug('starting %s %o', this._className, { + traceId: this.traceId, + id: this.id, + parentSpanId: this.getParentSpanId() + }); + } - public start() { - super.start() - debug('starting %s %o', this._className, { traceId: this.traceId, id: this.id, parentSpanId: this.getParentSpanId() }) - } + /** Ends the root span. */ + end() { + super.end(); - public end() { - super.end() + // TODO - Define logic for list of spans + this.spansLocal.map(span => { + if (span.ended || !span.started) return; + span.truncate(); + }); - //TODO - Define logic for list of spans - this._spans.forEach(function (span) { - if (span.ended || !span.started) return - span.truncate() - }) + debug('ending %s %o', this._className, { + id: this.id, + traceId: this.traceId, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration + }); - debug('ending %s %o', - this._className, - { - id: this.id, - traceId: this.traceId, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration - }) + this.tracer.onEndSpan(this); + } - this.tracer.onEndSpan(this) - } + /** + * Happens when a span is ended. + * @param span + */ + onEndSpan(span: Span) { + debug('%s notified ending by %o', {id: span.id, name: span.name}); + } - public onEndSpan(span: Span) { - debug('%s notified ending by %o', { id: span.id, name: span.name }) + /** + * Starts a span inside the respective trace. + * @param name Span's name + * @param type Spans's type + * @param parentSpanId Span's parent ID + */ + startSpan(name: string, type: string, parentSpanId?: string) { + if (!this.started) { + debug( + 'calling %s.startSpan() on un-started %s %o', this._className, + this._className, {id: this.id, name: this.name, type: this.type}); + return; } - - public startSpan(name: string, type: string, parentSpanId?: string) { - if (!this.started) { - debug('calling %s.startSpan() on un-started %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - return - } - if (this.ended) { - debug('calling %s.startSpan() on ended %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - return - } - let newSpan = new Span(this); - if (name) { newSpan.name = name } - if (type) { newSpan.type = type } - if (type) { newSpan.setParentSpanId(parentSpanId || '') } - newSpan.start(); - this._spans.push(newSpan); - return newSpan; + if (this.ended) { + debug( + 'calling %s.startSpan() on ended %s %o', this._className, + this._className, {id: this.id, name: this.name, type: this.type}); + return; + } + const newSpan = new Span(this); + if (name) { + newSpan.name = name; + } + if (type) { + newSpan.type = type; } + if (type) { + newSpan.setParentSpanId(parentSpanId || ''); + } + newSpan.start(); + this.spansLocal.push(newSpan); + return newSpan; + } } - From a38a897ff275dadd8e838580a88c0965343ffac8 Mon Sep 17 00:00:00 2001 From: Luana Date: Wed, 11 Apr 2018 16:03:43 -0300 Subject: [PATCH 066/110] refactor: apply code guidelines rules to span.ts --- .../opencensus-core/src/trace/model/span.ts | 111 +++++++++--------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 8d67aa9e2..b138c582e 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,68 +14,69 @@ * limitations under the License. */ -import { Clock } from '../../internal/clock' -import { RootSpan } from './rootspan' -import { debug, randomSpanId } from '../../internal/util' -import { SpanBaseModel, TraceContext } from '../types/tracetypes' - +import {Clock} from '../../internal/clock'; +import {debug, randomSpanId} from '../../internal/util'; +import {SpanBaseModel, TraceContext} from '../types/tracetypes'; +import {RootSpan} from './rootspan'; +/** + * This class represent a span. + */ export class Span extends SpanBaseModel { + private root: RootSpan; - private root: RootSpan; - // private _parentSpanId: string; - - constructor(root: RootSpan) { - super() - this.root = root; - } - - public get traceId(): string { - return this.root.traceId; - } - - public get parentSpanId(): string { - return this.root.id; - } + /** + * Constructs a new Span instance. + * @param root + */ + constructor(root: RootSpan) { + super(); + this.root = root; + } - public get traceContext(): TraceContext { - return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - options: 1 // always traced - }; - } + /** Gets trace id of rootspan. */ + get traceId(): string { + return this.root.traceId; + } - public start() { - super.start(); - debug('starting span %o', - { - traceId: this.traceId, - spanId: this.id, - name: this.name - }) - } + /** Gets trace id of rootspan. */ + get parentSpanId(): string { + return this.root.id; + } - private notifyEnd () { - this.root.onEndSpan(this); - } + /** Gets trace context of rootspan. */ + get traceContext(): TraceContext { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + options: 1 // always traced + }; + } - public end(): void { - // if(this.sampler.continue(this.traceId)) { - - super.end(); - this.notifyEnd(); - debug('ending span %o', - { - spanId: this.id, - traceId: this.traceId, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration - }); - // } - } + /** Starts the span instance. */ + start() { + super.start(); + debug( + 'starting span %o', + {traceId: this.traceId, spanId: this.id, name: this.name}); + } + /** Notifies an end operation on span instance. */ + private notifyEnd() { + this.root.onEndSpan(this); + } + /** Ends the span. */ + end(): void { + super.end(); + this.notifyEnd(); + debug('ending span %o', { + spanId: this.id, + traceId: this.traceId, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration + }); + } } From 7f0beecdd2016b20c8c41144a00594a6ef0a7739 Mon Sep 17 00:00:00 2001 From: Luana Date: Tue, 10 Apr 2018 07:48:13 -0300 Subject: [PATCH 067/110] refactor: apply code guidelines rules to clock.ts file --- .../opencensus-core/src/internal/clock.ts | 99 +++++++++---------- 1 file changed, 45 insertions(+), 54 deletions(-) diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index 6a0d8ae05..c3d54c0eb 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -15,67 +15,58 @@ */ export class Clock { - private _ended: boolean; - private _startTime: Date; - private _hrtime: [number, number]; - private diff: [number,number]; + private endedLocal: boolean; + private startTimeLocal: Date; + private hrtimeLocal: [number, number]; + private diff: [number, number]; - constructor() { - this._ended = false - this._startTime = new Date() - this._hrtime = process.hrtime() - this.diff = null - } + constructor() { + this.endedLocal = false; + this.startTimeLocal = new Date(); + this.hrtimeLocal = process.hrtime(); + this.diff = null; + } - public end(): void { - if (this._ended){ - return - } - this.diff = process.hrtime(this._hrtime) - this._ended = true - } - - public get duration(): number { - if (!this._ended){ - return null - } - var ns = this.diff[0] * 1e9 + this.diff[1] - return ns / 1e6 - } - - public offset(timer: Clock): number { - var a = timer.hrtime - var b = this.hrtime - var ns = (b[0] - a[0]) * 1e9 + (b[1] - a[1]) - return ns / 1e6 + end(): void { + if (this.endedLocal) { + return; } + this.diff = process.hrtime(this.hrtimeLocal); + this.endedLocal = true; + } - public get hrtime() : [number, number] { - return this._hrtime; - } - - public get startTime(): Date { - return this._startTime; + get duration(): number { + if (!this.endedLocal) { + return null; } - - public get endTime(): Date { - let result: Date = null; - if(this.ended) { - result= new Date(this.startTime.getTime() + this.duration); - } - return result; - } - - public get ended(): boolean { - return this._ended; - } - -} - - - + const ns = this.diff[0] * 1e9 + this.diff[1]; + return ns / 1e6; + } + offset(timer: Clock): number { + const a = timer.hrtime; + const b = this.hrtime; + const ns = (b[0] - a[0]) * 1e9 + (b[1] - a[1]); + return ns / 1e6; + } + get hrtime(): [number, number] { + return this.hrtimeLocal; + } + get startTime(): Date { + return this.startTimeLocal; + } + get endTime(): Date { + let result: Date = null; + if (this.ended) { + result = new Date(this.startTime.getTime() + this.duration); + } + return result; + } + get ended(): boolean { + return this.endedLocal; + } +} From 7ccff2501670586ddfed8931767907d7df4caa6e Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 22 Apr 2018 07:59:15 -0300 Subject: [PATCH 068/110] refactor: create new module structure --- lerna.json | 7 + package-lock.json | 2917 +++++ package.json | 38 + packages/opencensus-core/.npmignore | 4 + packages/opencensus-core/AUTHORS | 1 + packages/opencensus-core/LICENSE | 202 + packages/opencensus-core/README.md | 13 + packages/opencensus-core/package-lock.json | 10747 +--------------- packages/opencensus-core/package.json | 24 +- packages/opencensus-core/scripts/compile.ts | 4 +- packages/opencensus-core/scripts/index.ts | 83 - packages/opencensus-core/scripts/run-tests.ts | 53 - packages/opencensus-core/scripts/utils.ts | 64 - .../opencensus-core/src/exporters/buffer.ts | 138 + .../opencensus-core/src/exporters/exporter.ts | 52 + .../exporterOptions.ts} | 0 packages/opencensus-core/src/index.ts | 29 + .../{types.ts => plugingtypes.ts} | 0 packages/opencensus-core/tsconfig.json | 2 +- scripts/update_lerna_modules_links.sh | 73 + 20 files changed, 3965 insertions(+), 10486 deletions(-) create mode 100644 lerna.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/opencensus-core/.npmignore create mode 100644 packages/opencensus-core/AUTHORS create mode 100644 packages/opencensus-core/LICENSE create mode 100644 packages/opencensus-core/README.md delete mode 100644 packages/opencensus-core/scripts/index.ts delete mode 100644 packages/opencensus-core/scripts/run-tests.ts delete mode 100644 packages/opencensus-core/scripts/utils.ts create mode 100644 packages/opencensus-core/src/exporters/buffer.ts create mode 100644 packages/opencensus-core/src/exporters/exporter.ts rename packages/opencensus-core/src/{exporters => exporters/exporterOptions.ts} (100%) create mode 100644 packages/opencensus-core/src/index.ts rename packages/opencensus-core/src/trace/instrumentation/{types.ts => plugingtypes.ts} (100%) create mode 100755 scripts/update_lerna_modules_links.sh diff --git a/lerna.json b/lerna.json new file mode 100644 index 000000000..9fef7c549 --- /dev/null +++ b/lerna.json @@ -0,0 +1,7 @@ +{ + "lerna": "2.10.1", + "packages": [ + "packages/*" + ], + "version": "0.0.0" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..a8980391a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2917 @@ +{ + "name": "@opencensus/opencensus-base", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "9.6.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz", + "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==", + "dev": true + }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + } + }, + "command-join": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/command-join/-/command-join-2.0.0.tgz", + "integrity": "sha1-Uui5hPSHLZUv8b3IuYOX0nxxRM8=", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "1.0.0", + "dot-prop": "3.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "conventional-changelog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.23.tgz", + "integrity": "sha512-yCPXU/OXJmxgbvTQfIKXKwKa4KQTvlO0a4T/371Raz3bdxcHIGhQtHtdrNee4Z8nGLNfe54njHDblVG2JNFyjg==", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.6.6", + "conventional-changelog-atom": "0.2.8", + "conventional-changelog-codemirror": "0.3.8", + "conventional-changelog-core": "2.0.10", + "conventional-changelog-ember": "0.3.11", + "conventional-changelog-eslint": "1.0.9", + "conventional-changelog-express": "0.3.6", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.3.8", + "conventional-changelog-preset-loader": "1.1.8" + } + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-cli": { + "version": "1.3.21", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.21.tgz", + "integrity": "sha512-K9VBljxzuATZCLTVnI83PN7WdeRJRPPB5FumuLk4ES3E+m2YJvX07DRbdJlINk6C2DeAjj4ioS5JvsvJaaCRbA==", + "dev": true, + "requires": { + "add-stream": "1.0.0", + "conventional-changelog": "1.1.23", + "lodash": "4.17.5", + "meow": "4.0.0", + "tempfile": "1.1.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.10.tgz", + "integrity": "sha512-FP0NHXIbpvU+f5jk/qZdnodhFmlzKW8ENRHQIWT69oe7ffur9nFRVJZlnXnFBOzwHM9WIRbC15ZWh9HZN6t9Uw==", + "dev": true, + "requires": { + "conventional-changelog-writer": "3.0.9", + "conventional-commits-parser": "2.1.7", + "dateformat": "3.0.3", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.6", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.3.6", + "lodash": "4.17.5", + "normalize-package-data": "2.4.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "conventional-changelog-ember": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.11.tgz", + "integrity": "sha512-ErjPPiDmTd/WPgj2bSp+CGsLtJiv7FbdPKjZXH2Cd5P7j44Rqf0V9SIAAYFTQNoPqmvcp+sIcr/vH52WzPJUbw==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.6", + "dateformat": "3.0.3", + "handlebars": "4.0.11", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.5", + "meow": "4.0.0", + "semver": "5.5.0", + "split": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.1" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "JSONStream": "1.3.2", + "is-text-path": "1.0.1", + "lodash": "4.17.5", + "meow": "4.0.0", + "split2": "2.2.0", + "through2": "2.0.3", + "trim-off-newlines": "1.0.1" + } + }, + "conventional-recommended-bump": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz", + "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "conventional-commits-filter": "1.1.6", + "conventional-commits-parser": "2.1.7", + "git-raw-commits": "1.3.6", + "git-semver-tags": "1.3.6", + "meow": "3.7.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.4" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "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" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.21", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "meow": "3.7.0", + "normalize-package-data": "2.4.0", + "parse-github-repo-url": "1.4.1", + "through2": "2.0.3" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "4.0.0", + "split2": "2.2.0", + "through2": "2.0.3" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "1.0.0", + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "requires": { + "meow": "4.0.0", + "semver": "5.5.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "1.7.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lerna": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-2.10.1.tgz", + "integrity": "sha512-p0Rmew8TEa/4wKDuaOYfTFx1VtNeMqjSJgjUkmIqqIdnFeEMDuL0gTY3JFRjnjfmWT9BEHaObC+orHlgN9orfA==", + "dev": true, + "requires": { + "async": "1.5.2", + "chalk": "2.3.2", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "command-join": "2.0.0", + "conventional-changelog-cli": "1.3.21", + "conventional-recommended-bump": "1.2.1", + "dedent": "0.7.0", + "execa": "0.8.0", + "find-up": "2.1.0", + "fs-extra": "4.0.3", + "get-port": "3.2.0", + "glob": "7.1.2", + "glob-parent": "3.1.0", + "globby": "6.1.0", + "graceful-fs": "4.1.11", + "hosted-git-info": "2.6.0", + "inquirer": "3.3.0", + "is-ci": "1.1.0", + "load-json-file": "4.0.0", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "npmlog": "4.1.2", + "p-finally": "1.0.0", + "package-json": "4.0.1", + "path-exists": "3.0.0", + "read-cmd-shim": "1.0.1", + "read-pkg": "3.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "signal-exit": "3.0.2", + "slash": "1.0.0", + "strong-log-transformer": "1.0.6", + "temp-write": "3.4.0", + "write-file-atomic": "2.3.0", + "write-json-file": "2.3.0", + "write-pkg": "3.1.0", + "yargs": "8.0.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", + "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "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" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.6" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "strong-log-transformer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz", + "integrity": "sha1-9/uTdYpppXEUAYEnfuoMLrEwH6M=", + "dev": true, + "requires": { + "byline": "5.0.0", + "duplexer": "0.1.1", + "minimist": "0.1.0", + "moment": "2.22.0", + "through": "2.3.8" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "temp-write": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", + "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "is-stream": "1.1.0", + "make-dir": "1.2.0", + "pify": "3.0.0", + "temp-dir": "1.0.0", + "uuid": "3.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + } + } + }, + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "uuid": "2.0.3" + } + }, + "text-extensions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "1.0.3" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" + } + }, + "write-pkg": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", + "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", + "dev": true, + "requires": { + "sort-keys": "2.0.0", + "write-json-file": "2.3.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..1dcafcab9 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "@opencensus/opencensus-base", + "version": "0.0.1", + "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", + "main": "build/src/index.js", + "types": "build/src/index.d.js", + "repository": "census-instrumentation/opencensus-node", + "scripts": { + "postinstall": "scripts/update_lerna_modules_links.sh" + }, + "keywords": [ + "opencensus", + "nodejs", + "tracing", + "profiling" + ], + "author": "Google Inc.", + "license": "Apache-2.0", + "engines": { + "node": ">=6.00" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.d.ts", + "doc", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/node": "^9.4.7", + "lerna": "^2.10.1", + "typescript": "^2.7.2" + } +} diff --git a/packages/opencensus-core/.npmignore b/packages/opencensus-core/.npmignore new file mode 100644 index 000000000..9505ba945 --- /dev/null +++ b/packages/opencensus-core/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/packages/opencensus-core/AUTHORS b/packages/opencensus-core/AUTHORS new file mode 100644 index 000000000..e068e731e --- /dev/null +++ b/packages/opencensus-core/AUTHORS @@ -0,0 +1 @@ +Google Inc. \ No newline at end of file diff --git a/packages/opencensus-core/LICENSE b/packages/opencensus-core/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/packages/opencensus-core/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/opencensus-core/README.md b/packages/opencensus-core/README.md new file mode 100644 index 000000000..b2808a59d --- /dev/null +++ b/packages/opencensus-core/README.md @@ -0,0 +1,13 @@ +# OpenCensus - A stats collection and distributed tracing framework +[![Gitter chat][gitter-image]][gitter-url] + +OpenCensus is a toolkit for collecting application performance and behavior data. It currently +includes 3 apis: stats, tracing and tags. + +The library is in alpha stage and the API is subject to change. + +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this +project. + +[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg +[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 204286732..bce43c103 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,6355 +1,548 @@ { - "name": "opencensus-nodejs-xp", - "version": "0.0.1", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { - "@google-cloud/bigquery": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-0.9.6.tgz", - "integrity": "sha1-vqxtSGxF+AEKSAQ43klFJS/Ezq4=", - "dev": true, + "@types/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", "requires": { - "@google-cloud/common": "0.13.6", - "arrify": "1.0.1", - "duplexify": "3.5.4", - "extend": "3.0.1", - "is": "3.2.1", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1" + "@types/node": "9.4.7" } }, - "@google-cloud/bigtable": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@google-cloud/bigtable/-/bigtable-0.10.2.tgz", - "integrity": "sha1-NOZ5sZZH3uZ0Tj4e/lR71uvY2wE=", - "dev": true, - "requires": { - "@google-cloud/common": "0.13.6", - "@google-cloud/common-grpc": "0.4.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "dot-prop": "3.0.0", - "extend": "3.0.1", - "is": "3.2.1", - "lodash.flatten": "4.4.0", - "node-int64": "0.4.0", - "prop-assign": "1.0.0", - "pumpify": "1.4.0", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } + "@types/debug": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, - "@google-cloud/common": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", - "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.7.2", - "is": "3.2.1", - "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" }, - "@google-cloud/common-grpc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.4.3.tgz", - "integrity": "sha512-A3nErp1qV8iCWPYQniBhot7Gx+kZHTAuRzOQyoPpfbv9pLmsvZgTWzVUg1/R1ncrirQElHUDhIFXPV+kr+UJAA==", - "dev": true, - "requires": { - "@google-cloud/common": "0.13.6", - "dot-prop": "2.4.0", - "duplexify": "3.5.4", - "extend": "3.0.1", - "grpc": "1.10.0", - "is": "3.2.1", - "modelo": "4.2.3", - "retry-request": "3.3.1", - "through2": "2.0.3" - }, - "dependencies": { - "dot-prop": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-2.4.0.tgz", - "integrity": "sha1-hI4o9/HVB0DGdHqzywdnBGK2+Jw=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - } - } + "@types/node": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" }, - "@google-cloud/compute": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@google-cloud/compute/-/compute-0.8.0.tgz", - "integrity": "sha1-CiExGcAbja55/uMgdRYfSEZt5Ig=", - "dev": true, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + }, + "@types/uuid": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", + "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", "requires": { - "@google-cloud/common": "0.13.6", - "arrify": "1.0.1", - "async": "2.6.0", - "create-error-class": "3.0.2", - "extend": "3.0.1", - "gce-images": "0.3.3", - "is": "3.2.1", - "string-format-obj": "1.1.1" + "@types/node": "9.4.7" } }, - "@google-cloud/datastore": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/datastore/-/datastore-1.4.0.tgz", - "integrity": "sha512-BwFlXHKnXzaydm9+6fEp5khASZvtYC5W5Pf6VXwwOmFmnFfXImGyFJpNov50tVnUw1qLJ8QiS1VD1iXpDCNLmQ==", - "dev": true, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "@google-cloud/common": "0.16.2", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "extend": "3.0.1", - "google-auto-auth": "0.9.7", - "google-gax": "0.16.0", - "google-proto-files": "0.15.1", - "is": "3.2.1", - "lodash.flatten": "4.4.0", - "lodash.merge": "4.6.1", - "prop-assign": "1.0.0", - "propprop": "0.3.1", - "safe-buffer": "5.1.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "through2": "2.0.3" + "string-width": "2.1.1" }, "dependencies": { - "@google-cloud/common": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", - "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.9.7", - "is": "3.2.1", - "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" + "ansi-regex": "3.0.0" } - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true } } }, - "@google-cloud/dlp": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@google-cloud/dlp/-/dlp-0.1.3.tgz", - "integrity": "sha1-xwbOK6Bj76xyAppRsfShdfknrGI=", - "dev": true, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "extend": "3.0.1", - "google-gax": "0.13.5", - "google-proto-files": "0.12.1" - }, - "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - } - } - }, - "google-proto-files": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", - "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } + "color-convert": "1.9.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" } }, - "@google-cloud/dns": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@google-cloud/dns/-/dns-0.6.2.tgz", - "integrity": "sha1-CGgU407lw+DfF3fcEP3I3NJoob8=", - "dev": true, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "async-listener": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", + "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", "requires": { - "@google-cloud/common": "0.13.6", - "arrify": "1.0.1", - "dns-zonefile": "0.1.18", - "extend": "3.0.1", - "is": "3.2.1", - "methmeth": "1.1.0", - "string-format-obj": "1.1.1" + "semver": "5.5.0", + "shimmer": "1.2.0" } }, - "@google-cloud/firestore": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.8.2.tgz", - "integrity": "sha512-Z9hoiZIIn1MN7lUZE0pStvkrTdzJnSyFyxDJ4VojkzF/lL4EAUr9USyWXol6HZYcERPjXIasHSXXTYwuXx8tmA==", - "dev": true, + "async_hooks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", + "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "@google-cloud/common": "0.13.6", - "@google-cloud/common-grpc": "0.4.3", - "bun": "0.0.12", - "extend": "3.0.1", - "functional-red-black-tree": "1.0.1", - "google-gax": "0.14.5", - "grpc": "1.10.0", - "is": "3.2.1", - "through2": "2.0.3" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-gax": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.5.tgz", - "integrity": "sha512-3A6KbrtLDavrqZnnzurnSydRIJnyH+2Sm56fAvXciQ/62aEnSDaR43MCgWhtReCLVjeFjBiCEIdX5zV0LVLVBg==", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "7.1.1", - "google-auto-auth": "0.9.7", - "google-proto-files": "0.14.2", - "grpc": "1.7.3", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "grpc": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.3.tgz", - "integrity": "sha512-7zXQJlDXMr/ZaDqdaIchgclViyoWo8GQxZSmFUAxR8GwSr28b6/BTgF221WG+2W693jpp74XJ/+I9DcPXsgt9Q==", - "dev": true, - "requires": { - "arguejs": "0.2.3", - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "glob": { - "version": "7.1.1", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "mime-db": { - "version": "1.30.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.2", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1.0.9", - "osenv": "0.1.4" - } - } - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", - "dev": true, - "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.1", - "yargs": "3.32.0" - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.2", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.4.1", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - } - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "google-proto-files": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.14.2.tgz", - "integrity": "sha512-wwm2TIlfTgAjDbjrxAb3akznO7vBM0PRLS6Xf2QfR3L7b0p+szD3iwOW0wMSFl3B0UbLv27hUVk+clePqCVmXA==", - "dev": true, - "requires": { - "globby": "7.1.1", - "power-assert": "1.4.4", - "prettier": "1.11.1", - "protobufjs": "6.8.6" - } + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" + "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" } }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, - "@google-cloud/language": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-0.12.1.tgz", - "integrity": "sha1-P57EQeuou+gDBwa5oJ4BFMFw/uE=", - "dev": true, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "requires": { - "extend": "3.0.1", - "google-gax": "0.13.5" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - }, - "long": { + "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" + "ansi-regex": "3.0.0" } } } }, - "@google-cloud/logging": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-1.1.7.tgz", - "integrity": "sha512-qZ/lTJC07/78co4h3xj2OOzHM5E7X1KqWRujw0uiQs9f6Q5Bm0mgEqYnNM6BDpMbJhCr1ShLlc3s6XwzCyXF8g==", - "dev": true, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "@google-cloud/common": "0.16.2", - "@google-cloud/common-grpc": "0.6.0", - "arrify": "1.0.1", - "eventid": "0.1.2", - "extend": "3.0.1", - "gcp-metadata": "0.6.3", - "google-auto-auth": "0.9.7", - "google-gax": "0.15.0", - "google-proto-files": "0.15.1", - "is": "3.2.1", - "lodash.merge": "4.6.1", - "protobufjs": "6.8.6", - "pumpify": "1.4.0", - "snakecase-keys": "1.1.1", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - }, - "dependencies": { - "@google-cloud/common": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", - "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.9.7", - "is": "3.2.1", - "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "@google-cloud/common-grpc": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.6.0.tgz", - "integrity": "sha512-b5i2auMeP+kPPPpWtZVgjbbbIB+3uDGw+Vww1QjG0SEQlahcGrwkCEaNLQit1R77m8ibxs+sTVa+AH/FNILAdQ==", - "dev": true, - "requires": { - "@google-cloud/common": "0.16.2", - "dot-prop": "4.2.0", - "duplexify": "3.5.4", - "extend": "3.0.1", - "grpc": "1.9.1", - "is": "3.2.1", - "modelo": "4.2.3", - "retry-request": "3.3.1", - "through2": "2.0.3" - } - }, - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-gax": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.15.0.tgz", - "integrity": "sha512-a+WBi3oiV3jQ0eLCIM0GAFe8vYQ10yYuXRnjhEEXFKSNd8nW6XSQ7YWqMLIod2Xnyu6JiSSymMBwCr5YSwQyRQ==", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "8.0.1", - "google-auto-auth": "0.9.7", - "google-proto-files": "0.15.1", - "grpc": "1.9.1", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "grpc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.9.1.tgz", - "integrity": "sha512-WNW3MWMuAoo63AwIlzFE3T0KzzvNBSvOkg67Hm8WhvHNkXFBlIk1QyJRE3Ocm0O5eIwS7JU8Ssota53QR1zllg==", - "dev": true, - "requires": { - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "mime-db": { - "version": "1.30.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "requires": { - "detect-libc": "1.0.3", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.4", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", - "dev": true, - "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } + "balanced-match": "1.0.0", + "concat-map": "0.0.1" } }, - "@google-cloud/monitoring": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/monitoring/-/monitoring-0.3.0.tgz", - "integrity": "sha1-trJajKeBBT2b55grLpry2h7+2R8=", - "dev": true, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "requires": { - "extend": "3.0.1", - "google-gax": "0.13.5", - "google-proto-files": "0.12.1" + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - } - } - }, - "google-proto-files": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", - "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } }, - "@google-cloud/prediction": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@google-cloud/prediction/-/prediction-0.6.2.tgz", - "integrity": "sha1-AGJTvxxENTDhLH1A40KP/gxHZcI=", - "dev": true, - "requires": { - "@google-cloud/common": "0.13.6", - "JSONStream": "1.3.2", - "arrify": "1.0.1", - "extend": "3.0.1", - "is": "3.2.1", - "pumpify": "1.4.0", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, - "@google-cloud/pubsub": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-0.14.8.tgz", - "integrity": "sha512-SarceyFmvq6xnn8pkirdjpP25O3GRFMzr2oO3OGEnA7K8l0ObPHjU6R+DJbOS5UVpP4Vi2vHj3w8XTDM18dicA==", - "dev": true, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "@google-cloud/common": "0.13.6", - "@google-cloud/common-grpc": "0.4.3", - "arrify": "1.0.1", - "async-each": "1.0.1", - "extend": "3.0.1", - "google-auto-auth": "0.7.2", - "google-gax": "0.13.5", - "google-proto-files": "0.13.1", - "is": "3.2.1", - "lodash.snakecase": "4.1.1", - "uuid": "3.2.1" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" + "has-flag": "3.0.0" } } } }, - "@google-cloud/resource": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@google-cloud/resource/-/resource-0.7.3.tgz", - "integrity": "sha1-sYovOJ30XtSGnOQNtVQop4QW+q0=", - "dev": true, - "requires": { - "@google-cloud/common": "0.13.6", - "extend": "3.0.1", - "is": "3.2.1" - } + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, - "@google-cloud/spanner": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@google-cloud/spanner/-/spanner-0.7.1.tgz", - "integrity": "sha1-yFmgcuwJnZXmxtyHb7tOGcq8o9k=", - "dev": true, + "clang-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", + "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", "requires": { - "@google-cloud/common": "0.13.6", - "@google-cloud/common-grpc": "0.4.3", - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "checkpoint-stream": "0.1.1", - "events-intercept": "2.0.0", - "extend": "3.0.1", - "generic-pool": "3.4.2", - "google-gax": "0.13.5", - "google-proto-files": "0.12.1", - "is": "3.2.1", - "lodash.chunk": "4.2.0", - "lodash.flatten": "4.4.0", - "lodash.snakecase": "4.1.1", - "merge-stream": "1.0.1", - "methmeth": "1.1.0", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" + "async": "1.5.2", + "glob": "7.1.2", + "resolve": "1.5.0" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - } - } - }, - "google-proto-files": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", - "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, - "@google-cloud/speech": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@google-cloud/speech/-/speech-0.10.3.tgz", - "integrity": "sha1-ovMmiSkCW2C1yL0yRkNPimGHgHs=", - "dev": true, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "requires": { - "extend": "3.0.1", - "google-gax": "0.13.5", - "google-proto-files": "0.13.1", - "pumpify": "1.4.0", - "stream-events": "1.0.2", - "through2": "2.0.3" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" }, "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - } - }, - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" + "is-obj": "1.0.1" } } } }, - "@google-cloud/storage": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", - "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", - "dev": true, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", "requires": { - "@google-cloud/common": "0.16.2", - "arrify": "1.0.1", - "async": "2.6.0", - "compressible": "2.0.13", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "extend": "3.0.1", - "gcs-resumable-upload": "0.9.0", - "hash-stream-validation": "0.2.1", - "is": "3.2.1", - "mime": "2.2.0", - "mime-types": "2.1.18", - "once": "1.4.0", - "pumpify": "1.4.0", - "request": "2.85.0", - "safe-buffer": "5.1.1", - "snakeize": "0.1.0", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - }, - "dependencies": { - "@google-cloud/common": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", - "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", - "dev": true, - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.9.7", - "is": "3.2.1", - "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" - } - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - } + "async-listener": "0.6.9", + "emitter-listener": "1.1.1" } }, - "@google-cloud/translate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@google-cloud/translate/-/translate-1.1.0.tgz", - "integrity": "sha512-UzllqCIb5aJys7qzX2pJ2eTrgJN8nd9TQurjPPBPoiIzuHojY5bTIdNUEEo01o1u9bQ/2trlaKEuwYXhoGXIww==", - "dev": true, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "@google-cloud/common": "0.13.6", - "arrify": "1.0.1", - "extend": "3.0.1", - "is": "3.2.1", - "is-html": "1.1.0", - "propprop": "0.3.1" + "capture-stack-trace": "1.0.0" } }, - "@google-cloud/video-intelligence": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@google-cloud/video-intelligence/-/video-intelligence-0.3.2.tgz", - "integrity": "sha1-46Q7CN7CdE6WVX+lqt2l7qFs+KY=", - "dev": true, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "extend": "3.0.1", - "google-gax": "0.14.5", - "protobufjs": "6.8.6" - }, - "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-gax": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.5.tgz", - "integrity": "sha512-3A6KbrtLDavrqZnnzurnSydRIJnyH+2Sm56fAvXciQ/62aEnSDaR43MCgWhtReCLVjeFjBiCEIdX5zV0LVLVBg==", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "7.1.1", - "google-auto-auth": "0.9.7", - "google-proto-files": "0.14.2", - "grpc": "1.7.3", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "google-proto-files": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.14.2.tgz", - "integrity": "sha512-wwm2TIlfTgAjDbjrxAb3akznO7vBM0PRLS6Xf2QfR3L7b0p+szD3iwOW0wMSFl3B0UbLv27hUVk+clePqCVmXA==", - "dev": true, - "requires": { - "globby": "7.1.1", - "power-assert": "1.4.4", - "prettier": "1.11.1", - "protobufjs": "6.8.6" - } - }, - "grpc": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.3.tgz", - "integrity": "sha512-7zXQJlDXMr/ZaDqdaIchgclViyoWo8GQxZSmFUAxR8GwSr28b6/BTgF221WG+2W693jpp74XJ/+I9DcPXsgt9Q==", - "dev": true, - "requires": { - "arguejs": "0.2.3", - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "glob": { - "version": "7.1.1", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "mime-db": { - "version": "1.30.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.2", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1.0.9", - "osenv": "0.1.4" - } - } - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", - "dev": true, - "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.1", - "yargs": "3.32.0" - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.2", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.4.1", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" } }, - "@google-cloud/vision": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-0.12.0.tgz", - "integrity": "sha1-/6sKGODm6oQebE6BJzzUaAn98D4=", - "dev": true, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "@google-cloud/common": "0.13.6", - "async": "2.6.0", - "extend": "3.0.1", - "google-gax": "0.13.5", - "google-proto-files": "0.12.1", - "is": "3.2.1" - }, - "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "dev": true, - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.85.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "dev": true, - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.10.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" - }, - "dependencies": { - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha512-CivI3rZ85dMPTCAyxq6lq9s7vDkeWEIFxweopC1vEjjRmFMJwOX/MOmFZ90a0BGal/Dsb63vq7Ael9ryeokz0g==", - "dev": true - } - } - }, - "google-proto-files": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", - "integrity": "sha512-d+BiTMpYP4/pN+Kgi0lWE+2/GaVN4jy8LCabjo2Wd16Ykm5oRO5bI40bo8u2U4rN/GpZkMyfxZAjWVPRjGe3nQ==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } + "array-find-index": "1.0.2" } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "ms": "2.0.0" } }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "@protobufjs/fetch": { + "decamelize-keys": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dev": true, + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/inquire": "1.1.0" + "decamelize": "1.2.0", + "map-obj": "1.0.1" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } } }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "@types/continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", - "dev": true, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", "requires": { - "@types/node": "9.4.7" + "shimmer": "1.2.0" } }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", - "dev": true - }, - "@types/end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha512-d0FD2A4vpFI8wyQeQbr9VDVKtA1PmeGO3Ntn+6j626QTtAQ9HSqWFACP7rTHaV2cspVhLijl00Vvkf/U2UZGWA==", - "dev": true, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "@types/node": "9.4.7" + "is-arrayish": "0.2.1" } }, - "@types/long": { - "version": "3.0.32", - "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==", - "dev": true - }, - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true - }, - "@types/node": { - "version": "9.4.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", - "dev": true - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true - }, - "@types/shimmer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", - "dev": true + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, - "@types/uuid": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", - "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", - "dev": true, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "@types/node": "9.4.7" + "cross-spawn": "5.1.0", + "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" } }, - "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", - "dev": true, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" } }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, - "acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", - "dev": true - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "escape-string-regexp": "1.0.5" } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "locate-path": "2.0.0" } }, - "ansi-escapes": { + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arguejs": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/arguejs/-/arguejs-0.2.3.tgz", - "integrity": "sha1-tvk59f4OPNHz+T4qqSYkJL8xKvc=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "dev": true, - "requires": { - "colour": "0.7.1", - "optjs": "3.2.2" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-listener": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", - "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", - "requires": { - "semver": "5.5.0", - "shimmer": "1.2.0" - } - }, - "async_hooks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", - "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "axios": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "dev": true, - "requires": { - "follow-redirects": "1.4.1", - "is-buffer": "1.1.6" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - } - } - }, - "base64url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", - "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "dev": true - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bun": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", - "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", - "dev": true, - "requires": { - "readable-stream": "1.0.34" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "dev": true, - "requires": { - "long": "3.2.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "checkpoint-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/checkpoint-stream/-/checkpoint-stream-0.1.1.tgz", - "integrity": "sha1-WQiFEfviO20sHoLq8C8oRZZn9jc=", - "dev": true, - "requires": { - "events-intercept": "2.0.0", - "pumpify": "1.4.0", - "split-array-stream": "1.0.3", - "through2": "2.0.3" - } - }, - "clang-format": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", - "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", - "dev": true, - "requires": { - "async": "1.5.2", - "glob": "7.1.2", - "resolve": "1.5.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compressible": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", - "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" - } - }, - "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "dev": true, - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - } - } - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "0.6.9", - "emitter-listener": "1.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "d64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d64/-/d64-1.0.0.tgz", - "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", - "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=", - "dev": true - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - } - }, - "dns-zonefile": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/dns-zonefile/-/dns-zonefile-0.1.18.tgz", - "integrity": "sha1-dWnHNx29/VC/jlPi2gdAZ5KSKZ4=", - "dev": true - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" - } - }, - "eastasianwidth": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", - "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", - "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", - "dev": true, - "requires": { - "base64url": "2.0.0", - "safe-buffer": "5.1.1" - } - }, - "emitter-listener": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", - "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", - "requires": { - "shimmer": "1.2.0" - } - }, - "empower": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", - "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "empower-core": "0.6.2" - } - }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", - "dev": true, - "requires": { - "call-signature": "0.0.2", - "core-js": "2.5.3" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "1.4.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "dev": true, - "requires": { - "core-js": "2.5.3" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "eventid": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eventid/-/eventid-0.1.2.tgz", - "integrity": "sha1-CyMtPiROpbHVKJhBQOpprH7IkhU=", - "dev": true, - "requires": { - "d64": "1.0.0", - "uuid": "3.2.1" - } - }, - "events-intercept": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/events-intercept/-/events-intercept-2.0.0.tgz", - "integrity": "sha1-rb84aBxaSyARxB7kH2GjTLpEiJc=", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "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" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-glob": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", - "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.1", - "micromatch": "3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", - "dev": true, - "requires": { - "debug": "3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gce-images": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/gce-images/-/gce-images-0.3.3.tgz", - "integrity": "sha512-J+/kX80uYl8sz0zT1P9KlLzMBpzC6rSFFwh3BSXMNfZsVk3r0hXBj/mUOKiJ8EUVjs7AbeGFGLCS8Pz3LhfccA==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "async": "1.5.2", - "google-auto-auth": "0.7.2", - "got": "4.2.0", - "object-assign": "3.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "gcp-metadata": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", - "integrity": "sha512-5kJPX/RXuqoLmHiOOgkSDk/LI0QaXpEvZ3pvQP4ifjGGDKZKVSOjL/GcDjXA5kLxppFCOjmmsu0Uoop9d1upaQ==", - "dev": true, - "requires": { - "extend": "3.0.1", - "retry-request": "3.3.1" - } - }, - "gcs-resumable-upload": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", - "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", - "dev": true, - "requires": { - "buffer-equal": "1.0.0", - "configstore": "3.1.1", - "google-auto-auth": "0.9.7", - "pumpify": "1.4.0", - "request": "2.85.0", - "stream-events": "1.0.2", - "through2": "2.0.3" - }, - "dependencies": { - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" - } - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - } - } - }, - "generic-pool": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", - "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -6359,2111 +552,28 @@ "path-is-absolute": "1.0.1" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "google-auth-library": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", - "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", - "dev": true, - "requires": { - "gtoken": "1.2.3", - "jws": "3.1.4", - "lodash.noop": "3.0.1", - "request": "2.85.0" - } - }, - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.3.1", - "google-auth-library": "0.10.0", - "request": "2.85.0" - } - }, - "google-cloud": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/google-cloud/-/google-cloud-0.57.0.tgz", - "integrity": "sha1-r+wKoY7K5TnBotJVVtcM152H3+U=", - "dev": true, - "requires": { - "@google-cloud/bigquery": "0.9.6", - "@google-cloud/bigtable": "0.10.2", - "@google-cloud/compute": "0.8.0", - "@google-cloud/datastore": "1.4.0", - "@google-cloud/dlp": "0.1.3", - "@google-cloud/dns": "0.6.2", - "@google-cloud/firestore": "0.8.2", - "@google-cloud/language": "0.12.1", - "@google-cloud/logging": "1.1.7", - "@google-cloud/monitoring": "0.3.0", - "@google-cloud/prediction": "0.6.2", - "@google-cloud/pubsub": "0.14.8", - "@google-cloud/resource": "0.7.3", - "@google-cloud/spanner": "0.7.1", - "@google-cloud/speech": "0.10.3", - "@google-cloud/storage": "1.6.0", - "@google-cloud/translate": "1.1.0", - "@google-cloud/video-intelligence": "0.3.2", - "@google-cloud/vision": "0.12.0", - "extend": "3.0.1" - } - }, - "google-gax": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.16.0.tgz", - "integrity": "sha512-sslPB7USGD8SrVUGlWFIGYVZrgZ6oj+fWUEW3f8Bk43+nxqeLyrNoI3iFBRpjLfwMCEYaXVziWNmatwLRP8azg==", - "dev": true, - "requires": { - "duplexify": "3.5.4", - "extend": "3.0.1", - "globby": "8.0.1", - "google-auto-auth": "0.9.7", - "google-proto-files": "0.15.1", - "grpc": "1.9.1", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "protobufjs": "6.8.6", - "through2": "2.0.3" - }, - "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", - "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-auto-auth": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", - "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", - "dev": true, - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "grpc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.9.1.tgz", - "integrity": "sha512-WNW3MWMuAoo63AwIlzFE3T0KzzvNBSvOkg67Hm8WhvHNkXFBlIk1QyJRE3Ocm0O5eIwS7JU8Ssota53QR1zllg==", - "dev": true, - "requires": { - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "mime-db": { - "version": "1.30.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "requires": { - "detect-libc": "1.0.3", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.4", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", - "dev": true, - "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "gtoken": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", - "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "mime": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", - "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } - } - }, - "google-p12-pem": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", - "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", - "dev": true, - "requires": { - "node-forge": "0.7.4" - } - }, - "google-proto-files": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.15.1.tgz", - "integrity": "sha512-ebtmWgi/ooR5Nl63qRVZZ6VLM6JOb5zTNxTT/ZAU8yfMOdcauoOZNNMOVg0pCmTjqWXeuuVbgPP0CwO5UHHzBQ==", - "dev": true, - "requires": { - "globby": "7.1.1", - "power-assert": "1.4.4", - "protobufjs": "6.8.6" - }, - "dependencies": { - "@types/node": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.0.tgz", - "integrity": "sha512-7IGHZQfRfa0bCd7zUBVUGFKFn31SpaLDFfNoCAqkTGQO5JlHC9BwQA/CG9KZlABFxIUtXznyFgechjPQEGrUTg==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "protobufjs": { - "version": "6.8.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", - "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" - } - } - } - }, - "googleapis": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-27.0.0.tgz", - "integrity": "sha512-Cz0BRsZmewc21N50x5nAUW5cqaGhJ9ETQKZMGqGL4BxmCV7ETELazSqmNi4oCDeRwM4Iub/fIJWAWZk2i6XLCg==", - "dev": true, - "requires": { - "google-auth-library": "1.4.0", - "pify": "3.0.0", - "qs": "6.5.1", - "string-template": "1.0.0", - "uuid": "3.2.1" - }, - "dependencies": { - "gcp-metadata": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", - "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", - "dev": true, - "requires": { - "axios": "0.18.0", - "extend": "3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.4.0.tgz", - "integrity": "sha512-vWRx6pJulK7Y5V/Xyr7MPMlx2mWfmrUVbcffZ7hpq8ElFg5S8WY6PvjMovdcr6JfuAwwpAX4R0I1XOcyWuBcUw==", - "dev": true, - "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.3.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" - } - }, - "google-p12-pem": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", - "dev": true, - "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" - } - }, - "gtoken": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz", - "integrity": "sha512-Jc9/8mV630cZE9FC5tIlJCZNdUjwunvlwOtCz6IDlaiB4Sz68ki29a1+q97sWTnTYroiuF9B135rod9zrQdHLw==", - "dev": true, - "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.2", - "pify": "3.0.0" - } - }, - "mime": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.2.tgz", - "integrity": "sha512-A7PDg4s48MkqFEcYg2b069m3DXOEq7hx+9q9rIFrSSYfzsh35GX+LOVMQ8Au0ko7d8bSQCIAuzkjp0vCtwENlQ==", - "dev": true - } - } - }, - "got": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/got/-/got-4.2.0.tgz", - "integrity": "sha1-r1n0YYNL+v1yLLoBrPTBSp3V2gY=", - "dev": true, "requires": { - "create-error-class": "2.0.1", - "duplexify": "3.5.4", - "is-plain-obj": "1.1.0", - "is-redirect": "1.0.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "node-status-codes": "1.0.0", - "object-assign": "3.0.0", - "parse-json": "2.2.0", - "pinkie-promise": "1.0.0", - "prepend-http": "1.0.4", - "read-all-stream": "3.1.0", - "timed-out": "2.0.0", - "unzip-response": "1.0.2" - }, - "dependencies": { - "create-error-class": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-2.0.1.tgz", - "integrity": "sha1-qHWe1cjSFKRh6B0Y5wqssz3WPJw=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0", - "inherits": "2.0.3" - } - } + "ini": "1.3.5" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "grpc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.10.0.tgz", - "integrity": "sha512-g6Na2dgNusGvSM1ud4hwDaajNP4VSPQhGHnRXzbGNbQJIqGpJhRl7GRgYxTP8rYozqCx2NaT74UL37o8nb0GKA==", - "dev": true, - "requires": { - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "mime-db": { - "version": "1.30.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "requires": { - "detect-libc": "1.0.3", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.4", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true - }, - "rc": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "gtoken": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", - "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", - "dev": true, - "requires": { - "google-p12-pem": "0.1.2", - "jws": "3.1.4", - "mime": "1.6.0", - "request": "2.85.0" - } + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", - "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -8476,107 +586,28 @@ "write-file-atomic": "2.3.0" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-stream-validation": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", - "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", - "dev": true, "requires": { - "through2": "2.0.3" + "ansi-regex": "2.1.1" } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -8584,67 +615,32 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "html-tags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz", - "integrity": "sha1-x43mW1Zjqll5id0rerSSANfk25g=", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -8653,20 +649,17 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -8687,20 +680,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -8710,119 +700,29 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } } } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "1.1.1" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-html": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz", - "integrity": "sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ=", - "dev": true, - "requires": { - "html-tags": "1.2.0" - } - }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -8831,57 +731,17 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -8889,201 +749,64 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - } + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-stream-ended": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.3.tgz", - "integrity": "sha1-oEc7Jnx1ZjVIa+7cfjNE5UnRUqw=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jwa": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", - "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", - "dev": true, - "requires": { - "base64url": "2.0.0", - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.9", - "safe-buffer": "5.1.1" - } - }, - "jws": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", - "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", - "dev": true, - "requires": { - "base64url": "2.0.0", - "jwa": "1.1.5", - "safe-buffer": "5.1.1" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, "requires": { "package-json": "4.0.1" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -9095,7 +818,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -9107,7 +829,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -9116,62 +837,12 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "lodash.chunk": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", - "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true - }, - "lodash.noop": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", - "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=", - "dev": true - }, - "lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -9180,14 +851,12 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -9197,7 +866,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -9205,35 +873,17 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -9249,85 +899,19 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "2.3.5" - } - }, - "merge2": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", - "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", - "dev": true - }, - "methmeth": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", - "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -9335,45 +919,21 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" } }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -9382,7 +942,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", - "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -9396,17 +955,6 @@ "supports-color": "4.4.0" } }, - "modelo": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", - "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==", - "dev": true - }, - "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9415,64 +963,17 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true - }, - "node-forge": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", - "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -9484,121 +985,10 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9611,43 +1001,24 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "1.2.0" } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -9656,7 +1027,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -9664,14 +1034,12 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -9683,7 +1051,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -9701,67 +1068,39 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" } } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -9772,256 +1111,34 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "3.0.0" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", - "dev": true - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", - "dev": true, - "requires": { - "pinkie": "1.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "power-assert": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.4.4.tgz", - "integrity": "sha1-kpXqdDcZb1pgH95CDwQmMRhtdRc=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "empower": "1.2.3", - "power-assert-formatter": "1.4.1", - "universal-deep-strict-equal": "1.2.2", - "xtend": "4.0.1" - } - }, - "power-assert-context-formatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", - "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-context-traversal": "1.1.1" - } - }, - "power-assert-context-reducer-ast": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", - "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "acorn-es7-plugin": "1.1.7", - "core-js": "2.5.3", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "power-assert-context-traversal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", - "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "estraverse": "4.2.0" - } - }, - "power-assert-formatter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", - "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-context-formatter": "1.1.1", - "power-assert-context-reducer-ast": "1.1.2", - "power-assert-renderer-assertion": "1.1.1", - "power-assert-renderer-comparison": "1.1.1", - "power-assert-renderer-diagram": "1.1.2", - "power-assert-renderer-file": "1.1.1" - } - }, - "power-assert-renderer-assertion": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", - "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", - "dev": true, - "requires": { - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1" - } - }, - "power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", - "dev": true - }, - "power-assert-renderer-comparison": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", - "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "diff-match-patch": "1.0.0", - "power-assert-renderer-base": "1.1.1", - "stringifier": "1.3.0", - "type-name": "2.0.2" - } - }, - "power-assert-renderer-diagram": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", - "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1", - "stringifier": "1.3.0" - } - }, - "power-assert-renderer-file": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", - "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", - "dev": true, - "requires": { - "power-assert-renderer-base": "1.1.1" - } - }, - "power-assert-util-string-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", - "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", - "dev": true, - "requires": { - "eastasianwidth": "0.1.1" - } + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", - "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "prop-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prop-assign/-/prop-assign-1.0.0.tgz", - "integrity": "sha1-l2eh+/1wk5CGR6boRtMbT+qnBFk=", - "dev": true - }, - "propprop": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz", - "integrity": "sha1-oEmjVouJZEAGfRXY7J8zc15XAXg=", - "dev": true - }, - "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", - "dev": true, - "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" - } + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", - "dev": true, - "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -10032,35 +1149,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.3.5" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -10068,7 +1157,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -10079,52 +1167,24 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" } }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -10134,62 +1194,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, "requires": { "rc": "1.2.6" } }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.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.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "require-in-the-middle": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-2.2.1.tgz", - "integrity": "sha512-uYi3hbukpYNEHPYSLKVmBvhvxInqwA1/BzNh6qBYPrHVvFbXFXDBtAkNKpJhHVxymnTREP8y4YJ8E0RpzYxv2g==", - "requires": { - "module-details-from-path": "1.0.3", - "resolve": "1.5.0" - } - }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -10198,49 +1206,19 @@ "path-parse": "1.0.5" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry-axios": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", - "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==", - "dev": true - }, - "retry-request": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", - "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", - "dev": true, - "requires": { - "request": "2.85.0", - "through2": "2.0.3" - } - }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "7.1.2" } @@ -10249,7 +1227,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "2.1.0" } @@ -10257,14 +1234,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -10272,17 +1247,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.5.0", @@ -10293,39 +1258,14 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, "requires": { "semver": "5.5.0" } }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -10333,8 +1273,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shimmer": { "version": "1.2.0", @@ -10344,208 +1283,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snakecase-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-1.1.1.tgz", - "integrity": "sha512-/7I66rMhAag18IH5o0jtWWCJH/f2cvICwBcSS+SBUxsorbDeBu4UvYDNlAn3MrHfk6re0rUECwaPhsZuV2P9Ng==", - "dev": true, - "requires": { - "map-obj": "2.0.0", - "to-snake-case": "0.1.2" - } - }, - "snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", - "dev": true, "requires": { "source-map": "0.6.1" }, @@ -10553,22 +1296,14 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -10577,14 +1312,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -10593,197 +1326,17 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-array-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", - "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", - "dev": true, - "requires": { - "async": "2.6.0", - "is-stream-ended": "0.1.3" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "stream-events": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.2.tgz", - "integrity": "sha1-q/OfZsCJCk63lbyNXoWbJhW1kLI=", - "dev": true, - "requires": { - "stubs": "3.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-format-obj": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", - "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==", - "dev": true - }, - "string-template": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", - "integrity": "sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringifier": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", - "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "traverse": "0.6.6", - "type-name": "2.0.2" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -10791,38 +1344,27 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -10831,7 +1373,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, "requires": { "execa": "0.7.0" } @@ -10839,126 +1380,25 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" - } - }, - "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "1.0.2" } }, - "to-no-case": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-0.1.1.tgz", - "integrity": "sha1-zzPHDg8oFo2V5BWavxUOjFQu+f4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - } - }, - "to-snake-case": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/to-snake-case/-/to-snake-case-0.1.2.tgz", - "integrity": "sha1-0Ee22/BI2uG9wmCzwpb1TKNO7Xw=", - "dev": true, - "requires": { - "to-space-case": "0.1.2" - } - }, - "to-space-case": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-0.1.2.tgz", - "integrity": "sha1-mma+Pr5T8nefaH8CYu/9H8W20V4=", - "dev": true, - "requires": { - "to-no-case": "0.1.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", - "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -10975,8 +1415,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -10984,7 +1423,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -10995,14 +1433,12 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", - "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -11021,8 +1457,7 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" } } }, @@ -11030,151 +1465,27 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", - "dev": true, "requires": { "tslib": "1.9.0" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==" }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, "requires": { "crypto-random-string": "1.0.0" } }, - "universal-deep-strict-equal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", - "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", - "dev": true, - "requires": { - "array-filter": "1.0.0", - "indexof": "0.0.1", - "object-keys": "1.0.11" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, "update-notifier": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -11187,36 +1498,14 @@ "xdg-basedir": "3.0.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, "requires": { "prepend-http": "1.0.4" } }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", @@ -11226,7 +1515,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", - "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -11235,28 +1523,15 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -11265,7 +1540,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -11273,20 +1547,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -11296,29 +1567,12 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } } } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -11328,7 +1582,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -11338,47 +1591,17 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "string-width": "1.0.2", - "window-size": "0.1.4", - "y18n": "3.2.1" - } + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 7306253ec..fa1c6008e 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -1,5 +1,5 @@ { - "name": "opencensus-nodejs-xp", + "name": "@opencensus/opencensus-core", "version": "0.0.1", "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", "main": "build/src/index.js", @@ -8,16 +8,7 @@ "scripts": { "build": "node_modules/.bin/tsc --declaration", "test": "npm run script run-unit-tests", - "compile-all": "npm run script compile-auto", - "compile-strict": "npm run script compile-auto-strict", - "compile": "npm run script compile-auto compile-auto-strict", - "clean": "rimraf build/*", - "fix": "gts fix", - "script": "ts-node -P ./scripts ./scripts", - "check": "gts check", - "prepare": "npm run compile", - "pretest": "npm run compile", - "posttest": "npm run check" + "clean": "rimraf build/*" }, "keywords": [ "opencensus", @@ -44,30 +35,21 @@ "devDependencies": { "@types/continuation-local-storage": "^3.2.1", "@types/debug": "0.0.30", - "@types/end-of-stream": "^1.4.0", "@types/mocha": "^2.2.48", "@types/node": "^9.4.7", "@types/semver": "^5.5.0", - "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", - "gts": "^0.5.4", - "ncp": "^2.0.0", - "google-cloud": "^0.57.0", - "googleapis": "^27.0.0", "gts": "^0.5.1", "mocha": "^5.0.4", "ncp": "^2.0.0", "ts-node": "^4.0.0", - "typescript": "~2.6.1" + "typescript": "^2.7.2" }, "dependencies": { "async_hooks": "^1.0.0", "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", - "end-of-stream": "^1.4.1", - "require-in-the-middle": "^2.2.1", "semver": "^5.5.0", - "shimmer": "^1.2.0", "uuid": "^3.2.1" } } diff --git a/packages/opencensus-core/scripts/compile.ts b/packages/opencensus-core/scripts/compile.ts index 6df3b8550..b41246343 100644 --- a/packages/opencensus-core/scripts/compile.ts +++ b/packages/opencensus-core/scripts/compile.ts @@ -11,9 +11,9 @@ export interface CompileOptions { export async function compile(options: CompileOptions) { let { strict, languageLevel } = options; if (languageLevel === 'auto') { - languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es2017' : 'es2015'; + languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es6' : 'es5'; } - await forkP(`node_modules/typescript/lib/tsc`, [ + await forkP(`node_modules/.bin/tsc`, [ '-p', strict ? '.' : './tsconfig.full.json', '--target', diff --git a/packages/opencensus-core/scripts/index.ts b/packages/opencensus-core/scripts/index.ts deleted file mode 100644 index 64a2857e6..000000000 --- a/packages/opencensus-core/scripts/index.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * The main entry point for cross-platform build scripts. - * Usage (in repository root directory): - * ts-node -P ./scripts ./scripts [step1] [step2 ... stepN] - * Alias for above: - * npm run script [step1] [step2 ... stepN] - */ - -const [, , ...steps] = process.argv; -const { - CI_PULL_REQUEST, - TRACE_TEST_EXCLUDE_INTEGRATION, - TRACE_SYSTEM_TEST_ENCRYPTED_CREDENTIALS_KEY, - TRACE_SYSTEM_TEST_ENCRYPTED_CREDENTIALS_IV -} = process.env; - -import { compile } from './compile'; -import { runTests } from './run-tests'; -import { BUILD_DIRECTORY, existsP, spawnP } from './utils'; - -// The identifying string in the service account credentials file path. -const keyID = 'de480e4f9023'; - -// Globs to exclude when running unit tests only. -const unitTestExcludeGlobs: string[] = TRACE_TEST_EXCLUDE_INTEGRATION ? [ - `${BUILD_DIRECTORY}/test/plugins/test-*`, - `${BUILD_DIRECTORY}/test/test-agent-stopped.js`, - `${BUILD_DIRECTORY}/test/test-grpc-context.js`, - `${BUILD_DIRECTORY}/test/test-mysql-pool.js`, - `${BUILD_DIRECTORY}/test/test-plugins-*`, - `${BUILD_DIRECTORY}/test/test-trace-web-frameworks.js`, - `${BUILD_DIRECTORY}/test/test-unpatch.js`, - `${BUILD_DIRECTORY}/test/test-trace.js` -] : []; - -/** - * Sequentially runs a list of commands. - */ -async function run(steps: string[]) { - for (const step of steps) { - console.log(`> Running step: ${step}`); - // If the step string is prefixed with "npm-", treat it as an "npm run" - // command, and then short-circuit. - if (step.indexOf('npm-') === 0) { - const moduleAndArgs = step.split('-'); - await spawnP( - 'npm', - [ - 'run', - moduleAndArgs.slice(1).join('-') - ] - ); - continue; - } else if (step.startsWith('compile-')) { - const [, languageLevel, strict] = step.split('-'); - await compile({ strict: !!strict, languageLevel }); - continue; - } else { - switch (step) { - case 'run-unit-tests': - await runTests({ - includeGlobs: [ - `${BUILD_DIRECTORY}/test/test-*.js`, - `${BUILD_DIRECTORY}/test/plugins/test-*.js` - ], - excludeGlobs: unitTestExcludeGlobs, - rootDir: BUILD_DIRECTORY, - coverage: false, - timeout: 4000 - }); - break; - default: - console.log(`> ${step}: not found`); - break; - } - } - } -} - -run(steps).catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/packages/opencensus-core/scripts/run-tests.ts b/packages/opencensus-core/scripts/run-tests.ts deleted file mode 100644 index 98cb936f6..000000000 --- a/packages/opencensus-core/scripts/run-tests.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as path from 'path'; -import { globP, forkP } from './utils'; - -export interface Options { - includeGlobs: string[], - excludeGlobs?: string[], - rootDir: string, - coverage?: boolean, - timeout?: number -} - -export async function runTests(options: Options) { - const { includeGlobs, excludeGlobs, rootDir, coverage, timeout } = options; - function nodule(nodule: string) { - return path.relative(rootDir, `node_modules/${nodule}`); - } - let testNum = 0; - const excludedFiles = ([] as string[]) - .concat(...await Promise.all((excludeGlobs || []).map(glob => globP(glob)))); - const includedFiles = ([] as string[]) - .concat(...await Promise.all(includeGlobs.map(glob => globP(glob)))); - // Take the difference - const files = includedFiles.filter(i => excludedFiles.indexOf(i) < 0); - for (const file of files) { - const moduleAndArgs = [ - ...coverage ? [ - nodule('.bin/nyc'), - '--reporter', - 'lcov', - '--report-dir', - `./coverage/${testNum++}`, - '--exclude', - 'build/test/**' - ] : [], - nodule('mocha/bin/_mocha'), - '--require', - 'source-map-support/register', - path.relative(rootDir, file), - ...timeout ? [ - '--timeout', - `${timeout}` - ] : [ - '--no-timeouts' - ] - ]; - - await forkP( - moduleAndArgs[0], - moduleAndArgs.slice(1), - { cwd: rootDir } - ); - } -} diff --git a/packages/opencensus-core/scripts/utils.ts b/packages/opencensus-core/scripts/utils.ts deleted file mode 100644 index 39432c41a..000000000 --- a/packages/opencensus-core/scripts/utils.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { mkdir, Stats, stat, readFile, writeFile } from 'fs'; -import * as glob from 'glob'; -import { ncp } from 'ncp'; -import * as path from 'path'; -import * as pify from 'pify'; -import { ChildProcess, ForkOptions, fork, SpawnOptions, spawn } from 'child_process'; -import * as once from 'once'; -import * as tmp from 'tmp'; - -export const BUILD_DIRECTORY = 'build'; - -export const globP: (pattern: string) => Promise = pify(glob); -export const mkdirP: (dir: string) => Promise = pify(mkdir); -export const ncpP: (src: string, dest: string) => Promise = pify(ncp); -export const readFileP: (path: string, encoding?: string) => Promise = pify(readFile); -export const writeFileP: (path: string, data: Buffer|string, encoding?: string) => Promise = pify(writeFile); -export const statP: (path: string) => Promise = pify(stat); -export const tmpDirP: () => Promise = pify(tmp.dir); - -export function nodule(nodule: string) { - return path.relative(BUILD_DIRECTORY, `node_modules/${nodule}`); -} - -export function flatten(arr: Array>): Array { - return arr.reduce((acc, e) => acc.concat(e), []); -} - -export function existsP(path: string): Promise { - return statP(path).then( - () => Promise.resolve(true), - () => Promise.resolve(false) - ); -} - -function promisifyChildProcess(childProcess: ChildProcess): Promise { - return new Promise((resolve, reject) => { - const exit = (err?: Error) => once(() => err ? reject(err) : resolve())(); - childProcess.on('error', exit); - childProcess.on('close', (code) => { - if (code === 0) { - exit(); - } else { - exit(new Error(`Process ${childProcess.pid} exited with code ${code}.`)); - } - }); - }); -} - -export function spawnP(command: string, args?: string[], options?: SpawnOptions): Promise { - const stringifiedCommand = `\`${command}${args ? (' ' + args.join(' ')) : ''}\``; - console.log(`> Running: ${stringifiedCommand}`); - return promisifyChildProcess(spawn(command, args, Object.assign({ - stdio: 'inherit', - shell: true - }, options))); -} - -export function forkP(moduleName: string, args?: string[], options?: ForkOptions): Promise { - const stringifiedCommand = `\`${moduleName}${args ? (' ' + args.join(' ')) : ''}\``; - console.log(`> Running: ${stringifiedCommand}`); - return promisifyChildProcess(fork(moduleName, args, Object.assign({ - stdio: 'inherit' - }, options))); -} diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts new file mode 100644 index 000000000..7bb5cf043 --- /dev/null +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -0,0 +1,138 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as uuidv4 from 'uuid/v4'; + +import {debug} from '../internal/util'; +import {RootSpan} from '../trace/model/rootspan'; +import {OnEndSpanEventListener} from '../trace/types/tracetypes'; + +import {Exporter} from './exporter'; +import {ExporterOptions} from './exporterOptions'; + +// TODO: Implement default size based on application size +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds + +/** + * Controls the sending of traces to exporters + */ +export class Buffer implements OnEndSpanEventListener { + private exporters: Exporter[]; + private bufferSize: number; + /** Trace queue of a buffer */ + private queue: RootSpan[]; + /** Max time for a buffer can wait before being sent */ + private bufferTimeout: number; + /** Manage when the buffer timeout needs to be reseted */ + private resetTimeout: boolean; + /** Indicates when the buffer timeout is running */ + private bufferTimeoutInProgress: boolean; + + constructor(bufferSize?: number, bufferTimeout?: number) { + this.queue = []; + this.bufferSize = bufferSize || DEFAULT_BUFFER_SIZE; + this.bufferTimeout = bufferTimeout || DEFAULT_BUFFER_TIMEOUT; + this.exporters = []; + this.resetTimeout = false; + this.bufferTimeoutInProgress = false; + return this; + } + + /** + * Set the buffer size value + * @param bufferSize The new buffer size + */ + setBufferSize(bufferSize: number) { + this.bufferSize = bufferSize; + return this; + } + + /** + * Add an exporter in exports array + * @param exporter Exporter to be registered + */ + registerExporter(exporter: Exporter) { + this.exporters.push(exporter); + return this; + } + + /** + * Event called when a span ends + * @param span Ended span + */ + onEndSpan(span) { + this.addToBuffer(span); + return this; + } + + /** + * Add a trace (rootSpan) in the buffer + * @param trace RootSpan to be added in the buffer + */ + addToBuffer(trace: RootSpan) { + this.queue.push(trace); + debug('BUFFER: added new trace'); + + if (this.queue.length > this.bufferSize) { + this.flush(); + } + + if (this.bufferTimeoutInProgress) { + this.resetBufferTimeout(); + } else { + this.setBufferTimeout(); + } + + return this; + } + + /** Reset the buffer timeout */ + private resetBufferTimeout() { + debug('BUFFER: reset timeout'); + this.resetTimeout = true; + } + + /** Start the buffer timeout, when finished calls flush method */ + private setBufferTimeout() { + debug('BUFFER: set timerout'); + this.bufferTimeoutInProgress = true; + + setTimeout(() => { + if (this.queue.length === 0) { + return; + } + + if (this.resetTimeout) { + this.resetTimeout = false; + this.setBufferTimeout(); + } else { + this.bufferTimeoutInProgress = false; + this.flush(); + } + }, this.bufferTimeout); + } + + /** Send the trace queue to all exporters */ + private flush() { + for (const exporter of this.exporters) { + exporter.publish(this.queue); + } + + this.queue = []; + return this; + } +} \ No newline at end of file diff --git a/packages/opencensus-core/src/exporters/exporter.ts b/packages/opencensus-core/src/exporters/exporter.ts new file mode 100644 index 000000000..b064e602f --- /dev/null +++ b/packages/opencensus-core/src/exporters/exporter.ts @@ -0,0 +1,52 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import {RootSpan} from '../trace/model/rootspan'; +import {OnEndSpanEventListener} from '../trace/types/tracetypes'; +import {ExporterOptions} from './exporterOptions'; + +export interface Exporter { publish(rootSpans: RootSpan[]); } + +/** Do not send span data */ +export class NoopExporter implements Exporter { + publish(rootSpans: RootSpan[]) {} +} + +/** Format and sends span data to the console. */ +export class ConsoleLogExporter implements Exporter { + /** + * Sends the spans information to the console. + * @param rootSpans + */ + publish(rootSpans: RootSpan[]) { + rootSpans.map((root) => { + const ROOT_STR: string = (` + RootSpan: {traceId: ${root.traceId}, + spanId: ${root.id}, + name: ${root.name} }`); + const SPANS_STR: string[] = root.spans.map((span) => ` ChildSpan: + {traceId: ${span.traceId}, + spanId: ${span.id}, + name: ${span.name} }`); + const result: string[] = []; + + result.push(ROOT_STR); + result.push(`${SPANS_STR.join('')}`); + console.log(`${result}`); + }); + } +} diff --git a/packages/opencensus-core/src/exporters b/packages/opencensus-core/src/exporters/exporterOptions.ts similarity index 100% rename from packages/opencensus-core/src/exporters rename to packages/opencensus-core/src/exporters/exporterOptions.ts diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts new file mode 100644 index 000000000..1b24b82b1 --- /dev/null +++ b/packages/opencensus-core/src/index.ts @@ -0,0 +1,29 @@ + +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './exporters/buffer'; +export * from './exporters/exporter'; +export * from './exporters/exporterOptions'; +export * from './internal/clock'; +export * from './internal/util'; +export * from './trace/config/sampler'; +export * from './trace/instrumentation/plugingtypes'; +export * from './trace/model/rootspan'; +export * from './trace/model/span'; +export * from './trace/model/tracer'; +export * from './trace/types/tracetypes'; + diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/plugingtypes.ts similarity index 100% rename from packages/opencensus-core/src/trace/instrumentation/types.ts rename to packages/opencensus-core/src/trace/instrumentation/plugingtypes.ts diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json index 5893f9982..a49a50d08 100644 --- a/packages/opencensus-core/tsconfig.json +++ b/packages/opencensus-core/tsconfig.json @@ -11,7 +11,7 @@ "strict": false, "module": "commonjs", "target": "es6", - "sourceMap": true + "sourceMap": false }, "exclude": [ "node_modules" diff --git a/scripts/update_lerna_modules_links.sh b/scripts/update_lerna_modules_links.sh new file mode 100755 index 000000000..891ab74ef --- /dev/null +++ b/scripts/update_lerna_modules_links.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +COMPONENT_NAME="opencensus" +CONTEXT="@opencensus" + +## declare an array variable +declare -a packages=( + "packages/${COMPONENT_NAME}-core" + "packages/${COMPONENT_NAME}-nodejs" + "packages/${COMPONENT_NAME}-instrumentation-http" + "packages/${COMPONENT_NAME}-instrumentation-https" + "packages/${COMPONENT_NAME}-instrumentation-mongodb-core" + "packages/${COMPONENT_NAME}-exporter-stackdriver" + "packages/${COMPONENT_NAME}-exporter-zipkin" + "packages/${COMPONENT_NAME}-propagation-b3" + "packages/${COMPONENT_NAME}-instrumentation-all" + ) +NUMPACKAGES=${#packages[@]} + +echo "01 - Lerna bootstrap" +#Lerna - package.ini + +#lerna bootstrap +node_modules/.bin/lerna bootstrap + + +#correct the link to build/src according to typescript build output +echo "02 - Fix modules link" +function correctModulesLinks { + CURRENT_PATH=`pwd` + for (( i=0; i<${NUMPACKAGES}; i++ )) + do + if [ $i -gt 0 ] + then + echo "Fix ${packages[$i]} to ${COMPONENT_NAME}-core" + cd ${packages[$i]}/node_modules/${CONTEXT} + ln -sfn ../../../${COMPONENT_NAME}-core/build/src ${COMPONENT_NAME}-core + cd $CURRENT_PATH + fi + done + + #fix nodejs - dependecies + echo "Fix ${packages[1]} dependecies" + cd ${packages[1]}/node_modules/${CONTEXT}/ + ln -sfn ../../../${COMPONENT_NAME}-instrumentation-all/build/src ${COMPONENT_NAME}-instrumentation-all + cd $CURRENT_PATH + + echo "Fix ${packages[2]} dependecies" + cd ${packages[2]}/node_modules/${CONTEXT}/ + ln -sfn ../../../${COMPONENT_NAME}-propagation-b3/build/src ${COMPONENT_NAME}-propagation-b3 + cd $CURRENT_PATH + + echo "Fix ${packages[3]} dependecies" + cd ${packages[3]}/node_modules/${CONTEXT}/ + ln -sfn ../../../${COMPONENT_NAME}-instrumentation-http/build/src ${COMPONENT_NAME}-instrumentation-http + cd $CURRENT_PATH + + #fix instrumentation-all dependecies + echo "Fix ${packages[8]} dependecies" + cd ${packages[8]}/node_modules/${CONTEXT}/ + ln -sfn ../../../${COMPONENT_NAME}-instrumentation-http/build/src ${COMPONENT_NAME}-instrumentation-http + ln -sfn ../../../${COMPONENT_NAME}-instrumentation-https/build/src ${COMPONENT_NAME}-instrumentation-https + ln -sfn ../../../${COMPONENT_NAME}-instrumentation-mongodb-core/build/src ${COMPONENT_NAME}-instrumentation-mongodb-core + cd $CURRENT_PATH + +} + +correctModulesLinks + +echo "Building modules" +node_modules/.bin/lerna run build + +echo "End update lerna links" \ No newline at end of file From 3d59c94ddd7d1687e8875e9a676183a08499050c Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Fri, 13 Apr 2018 14:53:14 -0300 Subject: [PATCH 069/110] refactor: create interfaces for model classes --- .../{plugingtypes.ts => types.ts} | 0 .../src/trace/model/root-span.ts | 92 ++--- .../src/trace/model/span-base-model.ts | 158 ++++++++ .../opencensus-core/src/trace/model/span.ts | 12 +- .../opencensus-core/src/trace/model/tracer.ts | 88 +++-- .../src/trace/types/tracetypes.ts | 347 +++++++----------- 6 files changed, 373 insertions(+), 324 deletions(-) rename packages/opencensus-core/src/trace/instrumentation/{plugingtypes.ts => types.ts} (100%) create mode 100644 packages/opencensus-core/src/trace/model/span-base-model.ts diff --git a/packages/opencensus-core/src/trace/instrumentation/plugingtypes.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts similarity index 100% rename from packages/opencensus-core/src/trace/instrumentation/plugingtypes.ts rename to packages/opencensus-core/src/trace/instrumentation/types.ts diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 052177de9..e0d445ab1 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,109 +18,91 @@ import * as uuid from 'uuid'; import {Clock} from '../../internal/clock'; import {debug} from '../../internal/util'; -import {OnEndSpanEventListener, SpanBaseModel, TraceContext, TraceOptions} from '../types/tracetypes'; -import {Span} from './span'; -import {Tracer} from './tracer'; +import {OnEndSpanEventListener, RootSpan, TraceContext, TraceOptions} from '../types'; + +import {SpanImpl} from './span'; +import {SpanBaseModel} from './spanbasemodel'; +import {TracerImpl} from './tracer'; /** Defines a root span */ -export class RootSpan extends SpanBaseModel implements OnEndSpanEventListener { - private tracer: Tracer; - readonly traceId: string; - private spansLocal: Span[] = []; +export class RootSpanImpl extends SpanBaseModel implements RootSpan { + private tracer: TracerImpl; + private spansLocal: SpanImpl[]; + private traceIdLocal: string; - /** - * Constructs a new RootSpan instance. - * @param tracer - * @param context - */ - constructor(tracer: Tracer, context?: TraceOptions) { + // TODO - improve root name setup + constructor(tracer: TracerImpl, context?: TraceOptions) { super(); this.tracer = tracer; - this.traceId = + this.traceIdLocal = context && context.traceContext && context.traceContext.traceId ? context.traceContext.traceId : (uuid.v4().split('-').join('')); - // TODO - improve root name setup this.name = context && context.name ? context.name : 'undefined'; if (context && context.traceContext) { - this.setParentSpanId(context.traceContext.spanId || ''); + this.parentSpanId = context.traceContext.spanId || ''; } + this.spansLocal = []; } - /** Returns a list of the trace's spans. */ get spans() { return this.spansLocal; } - /** Starts the root span. */ + get traceId() { + return this.traceIdLocal; + } + start() { super.start(); - debug('starting %s %o', this._className, { - traceId: this.traceId, - id: this.id, - parentSpanId: this.getParentSpanId() - }); + debug( + 'starting %s %o', this.className, + {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); } - /** Ends the root span. */ end() { super.end(); // TODO - Define logic for list of spans - this.spansLocal.map(span => { + for (const span of this.spansLocal) { if (span.ended || !span.started) return; span.truncate(); - }); - - debug('ending %s %o', this._className, { - id: this.id, - traceId: this.traceId, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration - }); + } this.tracer.onEndSpan(this); } - /** - * Happens when a span is ended. - * @param span - */ - onEndSpan(span: Span) { - debug('%s notified ending by %o', {id: span.id, name: span.name}); + onEndSpan(span: SpanImpl) { + debug('ending span %o', { + id: span.id, + traceId: span.traceId, + name: span.name, + startTime: span.startTime, + endTime: span.endTime, + duration: span.duration + }); } - /** - * Starts a span inside the respective trace. - * @param name Span's name - * @param type Spans's type - * @param parentSpanId Span's parent ID - */ startSpan(name: string, type: string, parentSpanId?: string) { if (!this.started) { debug( - 'calling %s.startSpan() on un-started %s %o', this._className, - this._className, {id: this.id, name: this.name, type: this.type}); + 'calling %s.startSpan() on un-started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); return; } if (this.ended) { debug( - 'calling %s.startSpan() on ended %s %o', this._className, - this._className, {id: this.id, name: this.name, type: this.type}); + 'calling %s.startSpan() on ended %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); return; } - const newSpan = new Span(this); + const newSpan = new SpanImpl(this); if (name) { newSpan.name = name; } if (type) { newSpan.type = type; } - if (type) { - newSpan.setParentSpanId(parentSpanId || ''); - } newSpan.start(); this.spansLocal.push(newSpan); return newSpan; diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts new file mode 100644 index 000000000..df2d140c3 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -0,0 +1,158 @@ +import { Clock } from '../../internal/clock'; +import { debug, randomSpanId } from '../../internal/util'; +import { Sampler } from '../config/sampler'; +import { TraceContext } from '../types'; + +export interface MapLabels { [propName: string]: string; } +export interface MapObjects { [propName: string]: any; } + +export abstract class SpanBaseModel { + protected className: string; + /** The clock used to mesure the beginning and ending of a span */ + private clock: Clock = null; + /** Indicates if this span was started */ + private startedLocal = false; + /** Indicates if this span was ended */ + private endedLocal = false; + /** A set of attributes, each in the format [KEY]:[VALUE] */ + private attributes: MapLabels = {}; + /** A set of attributes on the annotation describing an event */ + private annotations: MapObjects = {}; + /** Indicates if this span was forced to end */ + private truncated = false; + /** The Span ID of this span */ + readonly id: string; + remoteParent: string; + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId = ''; + /** The resource name of the span */ + name: string = null; + /** Type of span. Used to specify additional relationships between spans */ + type: string = null; + /** A final status for this span */ + status: number; + /** A sampler that will decide if the span will be sampled or not */ + sampler: Sampler; + + /** Constructs a new SpanBaseModel instance. */ + constructor() { + this.className = this.constructor.name; + this.id = randomSpanId(); + } + + abstract get traceId(): string; + + /** Indicates if span was started. */ + get started(): boolean { + return this.startedLocal; + } + + /** Indicates if span was ended. */ + get ended(): boolean { + return this.endedLocal; + } + + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + get startTime(): Date { + if (this.clock) return this.clock.startTime; + } + + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + get endTime(): Date { + if (this.clock) return this.clock.endTime; + } + + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + get duration(): number { + if (this.clock) return this.clock.duration; + } + + /** Gives the TraceContext of the span. */ + get traceContext(): TraceContext { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + parentSpanId: this.parentSpanId + } as TraceContext; + } + + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAtribute(key: string, value: string) { + // TODO: maybe key and values must be truncate + this.attributes[key] = value; + } + + /** + * Adds an annotation to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAnotation(key: string, value: string|number|boolean) { + // TODO: maybe keys and values must be truncate + this.annotations[key] = value; + } + + /** Starts a span. */ + start() { + if (this.started) { + debug( + 'calling %s.start() on already started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + this.clock = new Clock(); + this.startedLocal = true; + } + + /** Ends a span. */ + end(): void { + if (!this.started) { + debug( + 'calling %s.end() on un-started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + if (this.ended) { + debug( + 'calling %s.end() on already ended %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + this.startedLocal = false; + this.endedLocal = true; + this.clock.end(); + } + + + /** Forces to end a span. */ + truncate() { + // TODO: review + if (!this.started) { + debug( + 'calling truncate non-started %s - ignoring %o', this.className, + {id: this.id, name: this.name, type: this.type}); + return; + } else if (this.ended) { + debug( + 'calling truncate already ended %s - ignoring %o', this.className, + {id: this.id, name: this.name, type: this.type}); + return; + } + this.truncated = true; + this.end(); + debug('truncating %s %o', this.className, {id: this.id, name: this.name}); + } +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index b138c582e..bbd728e7c 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -16,20 +16,22 @@ import {Clock} from '../../internal/clock'; import {debug, randomSpanId} from '../../internal/util'; -import {SpanBaseModel, TraceContext} from '../types/tracetypes'; -import {RootSpan} from './rootspan'; +import {Span, TraceContext} from '../types'; + +import {RootSpanImpl} from './rootspan'; +import {SpanBaseModel} from './spanbasemodel'; /** * This class represent a span. */ -export class Span extends SpanBaseModel { - private root: RootSpan; +export class SpanImpl extends SpanBaseModel implements Span { + private root: RootSpanImpl; /** * Constructs a new Span instance. * @param root */ - constructor(root: RootSpan) { + constructor(root: RootSpanImpl) { super(); this.root = root; } diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 8a6adc87a..381abcc28 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -14,68 +14,66 @@ * limitations under the License. */ -import * as cls from '../../internal/cls' -import { RootSpan } from './rootspan' -import { Span } from './span' -import { debug } from '../../internal/util' -import { Sampler } from '../config/sampler' -import { TraceContext, TraceOptions, OnEndSpanEventListener, SpanBaseModel, TracerConfig, defaultConfig } from '../types/tracetypes'; - +import * as cls from '../../internal/cls'; +import { RootSpanImpl } from './rootspan'; +import { SpanImpl } from './span'; +import { debug } from '../../internal/util'; +import { Sampler } from '../config/sampler'; +import { TraceOptions, TracerConfig, defaultConfig, Tracer, OnEndSpanEventListener } from '../types'; export type Func = (...args: any[]) => T; - -export class Tracer implements OnEndSpanEventListener { +export class TracerImpl implements Tracer { readonly PLUGINS = ['http', 'https', 'mongodb-core']; //public buffer: Buffer; - private _active: boolean; + private activeLocal: boolean; private contextManager: cls.Namespace; private config: TracerConfig; //TODO: simple solution - to be rewied in future - private eventListeners: OnEndSpanEventListener[] = []; + private eventListenersLocal: OnEndSpanEventListener[] = []; //TODO: temp solution - private endedTraces: RootSpan[] = []; + private endedTraces: RootSpanImpl[] = []; constructor() { - this._active = false; + this.activeLocal = false; this.contextManager = cls.createNamespace(); } - public get currentRootSpan(): RootSpan { + get currentRootSpan(): RootSpanImpl { return this.contextManager.get('rootspan'); } - private setCurrentRootSpan(root: RootSpan) { + set currentRootSpan(root: RootSpanImpl) { this.contextManager.set('rootspan', root); } - public start(config?: TracerConfig): Tracer { - this._active = true; + start(config?: TracerConfig): Tracer { + this.activeLocal = true; this.config = config || defaultConfig; return this; } - public getEventListeners(): OnEndSpanEventListener[] { - return this.eventListeners; + get eventListeners(): OnEndSpanEventListener[] { + return this.eventListenersLocal; } - public stop() { - this._active = false; + stop() { + this.activeLocal = false; } - public get active(): boolean { - return this._active; + get active(): boolean { + return this.activeLocal; } - public startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + startRootSpan(options: TraceOptions, fn: (root: RootSpanImpl) => T): T { return this.contextManager.runAndReturn((root) => { - let newRoot = new RootSpan(this, options); - this.setCurrentRootSpan(newRoot); + const newRoot = new RootSpanImpl(this, options); + this.currentRootSpan = newRoot; if (!options) { - options = {} + options = {} as TraceOptions; } if (!options.sampler) { options.sampler = new Sampler(newRoot.traceId); @@ -91,39 +89,38 @@ export class Tracer implements OnEndSpanEventListener { }); } - - public onEndSpan(root: RootSpan): void { + onEndSpan(root: RootSpanImpl): void { if (!root) { - return debug('cannot end trace - no active trace found') + return debug('cannot end trace - no active trace found'); } - if (this.currentRootSpan != root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.') + if (this.currentRootSpan !== root) { + debug('currentRootSpan != root on notifyEnd. Need more investigation.'); } this.notifyEndSpan(root); //this.clearCurrentTrace(); } - public registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListeners.push(listner); + registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListenersLocal.push(listner); } - private notifyEndSpan(root: RootSpan) { + private notifyEndSpan(root: RootSpanImpl) { if (this.active) { - debug('starting to notify listeners the end of rootspans') - if (this.eventListeners && this.eventListeners.length > 0) { - this.eventListeners.forEach((listener) => listener.onEndSpan(root)) + debug('starting to notify listeners the end of rootspans'); + if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { + this.eventListenersLocal.forEach((listener) => listener.onEndSpan(root)); } } else { - debug('this tracer is inactivate cant notify endspan') + debug('this tracer is inactivate cant notify endspan'); } } - public clearCurrentTrace() { - this.setCurrentRootSpan(null); + clearCurrentTrace() { + this.currentRootSpan = null; } - public startSpan(name?: string, type?: string, parentSpanId?: string): Span { - let newSpan: Span = null; + startSpan(name?: string, type?: string, parentSpanId?: string): SpanImpl { + let newSpan: SpanImpl = null; if (!this.currentRootSpan) { debug('no current trace found - must start a new root span first'); } else { @@ -132,7 +129,7 @@ export class Tracer implements OnEndSpanEventListener { return newSpan; } - public wrap(fn: Func): Func { + wrap(fn: Func): Func { if (!this.active) { return fn; } @@ -142,7 +139,7 @@ export class Tracer implements OnEndSpanEventListener { return namespace.bind(fn); } - public wrapEmitter(emitter: NodeJS.EventEmitter): void { + wrapEmitter(emitter: NodeJS.EventEmitter): void { if (!this.active) { return; } @@ -151,7 +148,6 @@ export class Tracer implements OnEndSpanEventListener { const namespace = this.contextManager as cls.Namespace; namespace.bindEmitter(emitter); } - } diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types/tracetypes.ts index 7378db6df..8bbdd631a 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types/tracetypes.ts @@ -14,244 +14,155 @@ * limitations under the License. */ -import { Clock } from '../../internal/clock' -import { debug, randomSpanId } from '../../internal/util' -import { Sampler } from '../config/sampler' +import { Sampler } from './config/sampler'; +import { SpanBaseModel } from './model/spanbasemodel'; +/** Default type for functions */ +export type Func = (...args: any[]) => T; +/** Maps a label to a string. Used in spans' attributes. */ export interface MapLabels { [propName: string]: string; } -export interface MapObjects { [propName: string]: any; } +/** Maps a label to a string, number or boolean. Used in spans' annotations. */ +export interface MapObjects { [propName: string]: string|number|boolean; } + +/** Defines tracer configuration parameters */ export interface TracerConfig { - sampleRate?: number; - ignoreUrls?: Array; + /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ + sampleRate?: number; + /** Determines the ignored (or blacklisted) URLs */ + ignoreUrls?: Array; } +/** Defines a default tracer configuration */ export const defaultConfig: TracerConfig = { - sampleRate: 1.0 -} + sampleRate: 1.0 +}; +/** Defines the trace context */ export interface TraceContext { - traceId: string, - spanId: string, - options?: number, - sampleDecision?: boolean + /** Trace ID */ + traceId: string; + /** Span ID */ + spanId: string; + /** Options */ + options?: number; + /** Sample decision */ + sampleDecision?: boolean; } +/** Defines the trace options */ export interface TraceOptions { - name:string; - traceContext?:TraceContext; - sampler?:Sampler; - type?:string; + /** Root span name */ + name: string; + /** Trace context */ + traceContext?: TraceContext; + /** Sampler */ + sampler?: Sampler; + /** Span type */ + type?: string; } +/** Defines an end span event listener */ export interface OnEndSpanEventListener { - onEndSpan(span: SpanBaseModel): void; + /** Happens when a span is ended */ + onEndSpan(span: SpanBaseModel): void; } +/** Defines the span data */ export interface SpanData { - labels: { [key: string]: string }; - name: string; - spanId: string; - parentSpanId?: string; + /** A collection of labels associated with the span */ + labels: {[key: string]: string}; + /** The resource name of the span */ + name: string; + /** The Span ID of this span */ + spanId: string; + /** The span ID of this span's parent. If it's a root span, must be empty. */ + parentSpanId?: string; } -export abstract class SpanBaseModel { - - protected _className: string; - private _id: string; - private clock: Clock; - //--Tra---- - private _remoteParent: string; - private _parentSpanId: string; - private _name: string; - private _started: boolean; - private _ended: boolean; - private _type: string; - private _status: number; - private attributes: MapLabels = {}; - private annotations: MapObjects = {}; - //messageEvents - //links - //TODO truncated - private _truncated: boolean; - private _sampler: Sampler; - - constructor() { - this._className = this.constructor.name; - this._name = null; - this._type = null; - this._started = false; - this.clock = null; - this._truncated = false; - this._ended = false; - this._parentSpanId = '' - this.setId(randomSpanId()); - } - - - public get id(): string { - return this._id; - } - - protected setId(id: string) { - this._id = id; - } - - abstract get traceId(): string; - - public get name() { - return this._name; - } - - public get started(): boolean { - return this._started; - } - - public get ended(): boolean { - return this._ended; - } - - public set name(name: string) { - this._name = name; - } - - public setParentSpanId(parentSpanId: string) { - this._parentSpanId = parentSpanId; - } - - public getParentSpanId() { - return this._parentSpanId - } - - public get type(): string { - return this._type; - } - - public set type(type: string) { - this._type = type; - } - - public set remoteParent(remoteParent: string) { - this._remoteParent = remoteParent; - } - - public get remoteSpanId(): string { - return this._remoteParent; - } - - public get status(): number { - return this._status; - } - - public set status(status: number) { - this._status = status; - } - - public get startTime(): Date { - if (this.clock) { - return this.clock.startTime; - } - - } - - public get endTime(): Date { - if (this.clock) { - return this.clock.endTime; - } - } - - public get duration(): number { - if (this.clock) { - return this.clock.duration; - } - } - - public get traceContext(): TraceContext { - return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - parentSpanId: this.getParentSpanId - } - } - - //TODO: maybe key and values must be truncate - public addAtribute(key: string, value: string) { - this.attributes[key] = value; - } - - //TODO: maybe keys and values must be truncate - public addAnotation(key: string, value: {}) { - this.annotations[key] = value; - } - - public get sampler() { - return this._sampler; - } - - public set sampler(sampler: Sampler) { - this._sampler = sampler; - } - - public start() { - if (this.started) { - debug('calling %s.start() on already started %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - return - } - this.clock = new Clock(); - this._started = true; - } - - public end(): void { - if (!this.started) { - debug('calling %s.end() on un-started %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - return - } - if (this.ended) { - debug('calling %s.end() on already ended %s %o', - this._className, this._className, - { id: this.id, name: this.name, type: this.type }) - return - } - this._started = false; - this._ended = true; - this.clock.end(); - } - - - //TODO: review - public truncate() { - if (!this.started) { - debug('calling truncate non-started %s - ignoring %o', - this._className, - { - id: this.id, - name: this.name, - type: this.type - }) - return - } else if (this.ended) { - debug('calling truncate already ended %s - ignoring %o', - this._className, - { - id: this.id, - name: this.name, - type: this.type - }) - return - } - this._truncated = true - this.end() - debug('truncating %s %o', - this._className, - { - id: this.id, - name: this.name - }) - } +/** Interface for RootSpan */ +export interface RootSpan { + /** Get the span list from RootSpan instance */ + readonly spans: Span[]; + + /** Start the RootSpan instance */ + start(): void; + /** End the RootSpan instance */ + end(): void; + /** Start a new Span instance in the RootSpan instance */ + startSpan(name: string, type: string, parentSpanId?: string): Span; +} +/** Interface for Span */ +export interface Span { + /** Gets the traceId from span instance */ + readonly traceId: string; + /** Gets the parentSpanId from span instance */ + readonly parentSpanId: string; + /** Gets the traceContext from span instance */ + readonly traceContext: TraceContext; + + /** Starts a span instance. */ + start(): void; + /** Ends a span. */ + end(): void; } + +/** Interface for Tracer */ +export interface Tracer { + /** Get and set the currentRootSpan to tracer instance */ + currentRootSpan: RootSpan; + /** Get the eventListeners from tracer instance */ + readonly eventListeners: OnEndSpanEventListener[]; + /** Get the active status from tracer instance */ + readonly active: boolean; + + /** + * Start a tracer instance + * @param config Configuration for tracer instace + * @returns A tracer instance started + */ + start(config?: TracerConfig): Tracer; + /** Stop the tracer instance */ + stop(): void; + /** + * Start a new RootSpan to currentRootSpan + * @param options Options for tracer instance + * @param fn Callback function + * @returns The callback return + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; + /** + * Event called on the span end + * @param root The RootSpan that was ended + */ + onEndSpan(root: RootSpan): void; + /** + * Register a OnEndSpanEventListener on the tracer instance + * @param listner An OnEndSpanEventListener instance + */ + registerEndSpanListener(listner: OnEndSpanEventListener): void; + /** Clear the currentRootSpan from tracer instance */ + clearCurrentTrace(): void; + /** + * Start a new Span instance to the currentRootSpan + * @param name Span name + * @param type Span type + * @param parentSpanId Parent SpanId + * @returns The new Span instance started + */ + startSpan(name?: string, type?: string, parentSpanId?: string): Span; + /** + * Monkeypatch to contextManager + * @param fn Function that will wrap in contextManager + * @returns The contextManager class wrapped + */ + wrap(fn: Func): Func; + /** + * Monkeypatch to contextManager emitter + * @param emitter Function that will wrap in contextManager emitter + * @returns The contextManager emitter wrapped + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void; +} \ No newline at end of file From f7a6019e8292c8e88d9baaf8dcad35f3b82fb5cb Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Fri, 13 Apr 2018 15:40:11 -0300 Subject: [PATCH 070/110] refactor: update interface types --- .../opencensus-core/src/exporters/buffer.ts | 4 +- .../opencensus-core/src/exporters/exporter.ts | 4 +- packages/opencensus-core/src/index.ts | 4 +- .../src/trace/model/span-base-model.ts | 4 +- .../opencensus-core/src/trace/model/tracer.ts | 4 +- .../trace/{types/tracetypes.ts => types.ts} | 93 ++++++++++++++----- 6 files changed, 79 insertions(+), 34 deletions(-) rename packages/opencensus-core/src/trace/{types/tracetypes.ts => types.ts} (68%) diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 7bb5cf043..628644b18 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -17,8 +17,8 @@ import * as uuidv4 from 'uuid/v4'; import {debug} from '../internal/util'; -import {RootSpan} from '../trace/model/rootspan'; -import {OnEndSpanEventListener} from '../trace/types/tracetypes'; +import {RootSpan} from '../trace/types'; +import {OnEndSpanEventListener} from '../trace/types'; import {Exporter} from './exporter'; import {ExporterOptions} from './exporterOptions'; diff --git a/packages/opencensus-core/src/exporters/exporter.ts b/packages/opencensus-core/src/exporters/exporter.ts index b064e602f..5a42e9000 100644 --- a/packages/opencensus-core/src/exporters/exporter.ts +++ b/packages/opencensus-core/src/exporters/exporter.ts @@ -15,8 +15,8 @@ */ -import {RootSpan} from '../trace/model/rootspan'; -import {OnEndSpanEventListener} from '../trace/types/tracetypes'; +import {RootSpan} from '../trace/types'; +import {OnEndSpanEventListener} from '../trace/types'; import {ExporterOptions} from './exporterOptions'; export interface Exporter { publish(rootSpans: RootSpan[]); } diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 1b24b82b1..d976e0b3a 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -21,9 +21,9 @@ export * from './exporters/exporterOptions'; export * from './internal/clock'; export * from './internal/util'; export * from './trace/config/sampler'; -export * from './trace/instrumentation/plugingtypes'; +export * from './trace/instrumentation/types'; export * from './trace/model/rootspan'; export * from './trace/model/span'; export * from './trace/model/tracer'; -export * from './trace/types/tracetypes'; +export * from './trace/types'; diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index df2d140c3..b6f2c5ec0 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -1,12 +1,12 @@ import { Clock } from '../../internal/clock'; import { debug, randomSpanId } from '../../internal/util'; import { Sampler } from '../config/sampler'; -import { TraceContext } from '../types'; +import { TraceContext, Span } from '../types'; export interface MapLabels { [propName: string]: string; } export interface MapObjects { [propName: string]: any; } -export abstract class SpanBaseModel { +export abstract class SpanBaseModel implements Span { protected className: string; /** The clock used to mesure the beginning and ending of a span */ private clock: Clock = null; diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 381abcc28..7c8fd0672 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -19,9 +19,9 @@ import { RootSpanImpl } from './rootspan'; import { SpanImpl } from './span'; import { debug } from '../../internal/util'; import { Sampler } from '../config/sampler'; -import { TraceOptions, TracerConfig, defaultConfig, Tracer, OnEndSpanEventListener } from '../types'; +import { TraceOptions, TracerConfig, defaultConfig, Tracer, OnEndSpanEventListener, Func } from '../types'; -export type Func = (...args: any[]) => T; +//ßexport type Func = (...args: any[]) => T; export class TracerImpl implements Tracer { diff --git a/packages/opencensus-core/src/trace/types/tracetypes.ts b/packages/opencensus-core/src/trace/types.ts similarity index 68% rename from packages/opencensus-core/src/trace/types/tracetypes.ts rename to packages/opencensus-core/src/trace/types.ts index 8bbdd631a..f350ac231 100644 --- a/packages/opencensus-core/src/trace/types/tracetypes.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -15,7 +15,6 @@ */ import { Sampler } from './config/sampler'; -import { SpanBaseModel } from './model/spanbasemodel'; /** Default type for functions */ export type Func = (...args: any[]) => T; @@ -63,11 +62,6 @@ export interface TraceOptions { type?: string; } -/** Defines an end span event listener */ -export interface OnEndSpanEventListener { - /** Happens when a span is ended */ - onEndSpan(span: SpanBaseModel): void; -} /** Defines the span data */ export interface SpanData { @@ -81,32 +75,83 @@ export interface SpanData { parentSpanId?: string; } -/** Interface for RootSpan */ -export interface RootSpan { - /** Get the span list from RootSpan instance */ - readonly spans: Span[]; - - /** Start the RootSpan instance */ - start(): void; - /** End the RootSpan instance */ - end(): void; - /** Start a new Span instance in the RootSpan instance */ - startSpan(name: string, type: string, parentSpanId?: string): Span; -} /** Interface for Span */ export interface Span { - /** Gets the traceId from span instance */ + + /** The Span ID of this span */ + readonly id: string; + remoteParent: string; + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string; + /** The resource name of the span */ + name: string; + /** Type of span. Used to specify additional relationships between spans */ + type: string; + /** A final status for this span */ + status: number; + /** A sampler that will decide if the span will be sampled or not */ + sampler: Sampler; + /** Constructs a new SpanBaseModel instance. */ readonly traceId: string; - /** Gets the parentSpanId from span instance */ - readonly parentSpanId: string; - /** Gets the traceContext from span instance */ + /** Indicates if span was started. */ + readonly started: boolean; + /** Indicates if span was ended. */ + readonly ended: boolean; + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + readonly startTime: Date; + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + readonly endTime: Date; + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + readonly duration: number; + /** Gives the TraceContext of the span. */ readonly traceContext: TraceContext; - - /** Starts a span instance. */ + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAtribute(key: string, value: string): void; + /** + * Adds an annotation to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAnotation(key: string, value: string | number | boolean): void; + /** Starts a span. */ start(): void; /** Ends a span. */ end(): void; + /** Forces to end a span. */ + truncate(): void; +} + +/** Interface for RootSpan */ +export interface RootSpan extends Span { + /** Get the span list from RootSpan instance */ + readonly spans: Span[]; + + /** Start the RootSpan instance */ + start(): void; + /** End the RootSpan instance */ + end(): void; + /** Start a new Span instance in the RootSpan instance */ + startSpan(name: string, type: string, parentSpanId?: string): Span; +} + +/** Defines an end span event listener */ +export interface OnEndSpanEventListener { + /** Happens when a span is ended */ + onEndSpan(span: Span): void; } /** Interface for Tracer */ From fccd2688af52e5825add22a8204c3a1d0de19c38 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 15 Apr 2018 20:06:46 -0300 Subject: [PATCH 071/110] refactor: type, classes overall refactoring --- package.json | 5 +- packages/opencensus-core/package-lock.json | 450 +++++++++++++----- packages/opencensus-core/package.json | 4 +- .../opencensus-core/src/exporters/buffer.ts | 8 +- .../{exporter.ts => console-exporter.ts} | 9 +- .../{exporterOptions.ts => types.ts} | 5 + packages/opencensus-core/src/index.ts | 28 +- .../opencensus-core/src/trace/config/types.ts | 51 ++ .../src/trace/instrumentation/base-plugin.ts | 60 +++ .../src/trace/instrumentation/types.ts | 31 +- .../src/trace/model/root-span.ts | 10 +- .../src/trace/model/span-base-model.ts | 25 +- .../opencensus-core/src/trace/model/span.ts | 12 +- .../opencensus-core/src/trace/model/tracer.ts | 36 +- .../opencensus-core/src/trace/model/types.ts | 210 ++++++++ .../src/trace/sampler/sampler.ts | 3 +- packages/opencensus-core/src/trace/types.ts | 203 +------- .../opencensus-core/test/test-root-span.ts | 30 +- packages/opencensus-core/test/test-span.ts | 25 +- packages/opencensus-core/test/test-tracer.ts | 35 +- packages/opencensus-core/tsconfig.full.json | 12 +- packages/opencensus-core/tsconfig.json | 3 +- scripts/update_lerna_modules_links.sh | 73 --- 23 files changed, 811 insertions(+), 517 deletions(-) rename packages/opencensus-core/src/exporters/{exporter.ts => console-exporter.ts} (85%) rename packages/opencensus-core/src/exporters/{exporterOptions.ts => types.ts} (86%) create mode 100644 packages/opencensus-core/src/trace/config/types.ts create mode 100644 packages/opencensus-core/src/trace/instrumentation/base-plugin.ts create mode 100644 packages/opencensus-core/src/trace/model/types.ts delete mode 100755 scripts/update_lerna_modules_links.sh diff --git a/package.json b/package.json index 1dcafcab9..597d76985 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,10 @@ "types": "build/src/index.d.js", "repository": "census-instrumentation/opencensus-node", "scripts": { - "postinstall": "scripts/update_lerna_modules_links.sh" + "postinstall": "npm run bootstrap;npm run build;", + "build" : "node_modules/.bin/lerna run build", + "bootstrap": "node_modules/.bin/lerna bootstrap", + "bump": "node_modules/.bin/lerna publish" }, "keywords": [ "opencensus", diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index bce43c103..dc8c88afa 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,11 +1,14 @@ { - "requires": true, + "name": "@opencensus/opencensus-core", + "version": "0.0.1", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -13,37 +16,50 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", + "dev": true }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", + "dev": true }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true + }, + "@types/shimmer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", + "dev": true }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -52,6 +68,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -59,17 +76,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -79,6 +99,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -88,17 +109,20 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "1.9.1" } @@ -107,6 +131,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -114,12 +139,14 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "async-listener": { "version": "0.6.9", @@ -139,6 +166,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -148,12 +176,14 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -165,19 +195,22 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -191,22 +224,26 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -216,6 +253,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -226,6 +264,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -234,17 +273,20 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -254,19 +296,22 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -276,12 +321,14 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, "requires": { "has-flag": "3.0.0" } @@ -291,12 +338,14 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", + "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -306,19 +355,22 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -326,12 +378,14 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -339,22 +393,26 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -368,6 +426,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, "requires": { "is-obj": "1.0.1" } @@ -387,6 +446,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -395,6 +455,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -404,12 +465,14 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -425,12 +488,14 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -439,24 +504,28 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "emitter-listener": { "version": "1.1.1", @@ -470,6 +539,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -477,22 +547,26 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -507,6 +581,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -517,6 +592,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -525,6 +601,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "2.0.0" } @@ -532,17 +609,20 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -556,6 +636,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, "requires": { "ini": "1.3.5" } @@ -563,17 +644,20 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", + "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -590,6 +674,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -597,17 +682,20 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -615,32 +703,38 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -649,17 +743,20 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -680,17 +777,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -700,6 +800,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -709,12 +810,14 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -723,6 +826,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -731,17 +835,20 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -749,42 +856,50 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -793,12 +908,14 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, "requires": { "package-json": "4.0.1" } @@ -807,6 +924,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -818,6 +936,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -829,6 +948,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -837,12 +957,14 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -851,12 +973,14 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -866,6 +990,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, "requires": { "pify": "3.0.0" } @@ -873,17 +998,20 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -899,19 +1027,22 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -919,12 +1050,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -934,6 +1067,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -942,6 +1076,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -963,17 +1098,20 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -985,6 +1123,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "2.0.1" } @@ -993,6 +1132,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -1001,6 +1141,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -1008,17 +1149,20 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, "requires": { "p-try": "1.0.0" } @@ -1027,6 +1171,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "1.2.0" } @@ -1034,12 +1179,14 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -1051,6 +1198,7 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -1068,49 +1216,58 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true } } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { "pify": "3.0.0" } @@ -1118,27 +1275,32 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -1149,7 +1311,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -1157,6 +1320,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -1167,6 +1331,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -1176,6 +1341,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -1185,6 +1351,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -1194,6 +1361,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, "requires": { "rc": "1.2.6" } @@ -1202,6 +1370,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, "requires": { "path-parse": "1.0.5" } @@ -1210,6 +1379,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -1219,6 +1389,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" } @@ -1227,6 +1398,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { "is-promise": "2.1.0" } @@ -1234,12 +1406,14 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -1247,7 +1421,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -1258,6 +1433,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, "requires": { "semver": "5.5.0" } @@ -1266,6 +1442,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -1273,7 +1450,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shimmer": { "version": "1.2.0", @@ -1283,12 +1461,14 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, "requires": { "source-map": "0.6.1" }, @@ -1296,7 +1476,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -1304,6 +1485,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -1312,12 +1494,14 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -1326,17 +1510,20 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -1344,27 +1531,32 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -1373,6 +1565,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, "requires": { "execa": "0.7.0" } @@ -1380,12 +1573,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -1393,12 +1588,14 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -1415,7 +1612,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -1423,6 +1621,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -1433,12 +1632,14 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -1457,7 +1658,8 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true } } }, @@ -1465,6 +1667,7 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "dev": true, "requires": { "tslib": "1.9.0" } @@ -1472,12 +1675,14 @@ "typescript": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", - "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==" + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", + "dev": true }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -1486,6 +1691,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -1502,6 +1708,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -1515,6 +1722,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -1523,6 +1731,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -1532,6 +1741,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -1540,6 +1750,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -1547,17 +1758,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -1567,6 +1781,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -1576,12 +1791,14 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -1591,17 +1808,20 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index fa1c6008e..d96b7a192 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -7,7 +7,7 @@ "repository": "census-instrumentation/opencensus-node", "scripts": { "build": "node_modules/.bin/tsc --declaration", - "test": "npm run script run-unit-tests", + "test": "node_modules/.bin/mocha 'build/test/**/*.js' --reporter spec", "clean": "rimraf build/*" }, "keywords": [ @@ -38,6 +38,7 @@ "@types/mocha": "^2.2.48", "@types/node": "^9.4.7", "@types/semver": "^5.5.0", + "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", "gts": "^0.5.1", "mocha": "^5.0.4", @@ -50,6 +51,7 @@ "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", "semver": "^5.5.0", + "shimmer": "^1.2.0", "uuid": "^3.2.1" } } diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 628644b18..c29d128ef 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -17,11 +17,11 @@ import * as uuidv4 from 'uuid/v4'; import {debug} from '../internal/util'; -import {RootSpan} from '../trace/types'; -import {OnEndSpanEventListener} from '../trace/types'; +import {RootSpan} from '../trace/model/types'; +import {OnEndSpanEventListener} from '../trace/model/types'; -import {Exporter} from './exporter'; -import {ExporterOptions} from './exporterOptions'; +import {Exporter} from './types'; +import {ExporterOptions} from './types'; // TODO: Implement default size based on application size const DEFAULT_BUFFER_SIZE = 3; diff --git a/packages/opencensus-core/src/exporters/exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts similarity index 85% rename from packages/opencensus-core/src/exporters/exporter.ts rename to packages/opencensus-core/src/exporters/console-exporter.ts index 5a42e9000..f8fcb6e8c 100644 --- a/packages/opencensus-core/src/exporters/exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -14,16 +14,13 @@ * limitations under the License. */ +import { RootSpan } from '../trace/model/types'; +import { Exporter, ExporterOptions } from '../exporters/types'; -import {RootSpan} from '../trace/types'; -import {OnEndSpanEventListener} from '../trace/types'; -import {ExporterOptions} from './exporterOptions'; - -export interface Exporter { publish(rootSpans: RootSpan[]); } /** Do not send span data */ export class NoopExporter implements Exporter { - publish(rootSpans: RootSpan[]) {} + publish(rootSpans: RootSpan[]) { } } /** Format and sends span data to the console. */ diff --git a/packages/opencensus-core/src/exporters/exporterOptions.ts b/packages/opencensus-core/src/exporters/types.ts similarity index 86% rename from packages/opencensus-core/src/exporters/exporterOptions.ts rename to packages/opencensus-core/src/exporters/types.ts index d00baeb8a..9a50bb2de 100644 --- a/packages/opencensus-core/src/exporters/exporterOptions.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -14,6 +14,11 @@ * limitations under the License. */ + +import {RootSpan} from '../trace/model/types'; + +export interface Exporter { publish(rootSpans: RootSpan[]); } + /** * TODO: Interface to exporters options */ diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index d976e0b3a..293837094 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -1,4 +1,3 @@ - /** * Copyright 2018 Google Inc. All Rights Reserved. * @@ -15,15 +14,28 @@ * limitations under the License. */ -export * from './exporters/buffer'; -export * from './exporters/exporter'; -export * from './exporters/exporterOptions'; -export * from './internal/clock'; -export * from './internal/util'; -export * from './trace/config/sampler'; + +// opencensus core api interfaces +export * from './trace/types'; +export * from './trace/model/types'; +export * from './trace/config/types'; export * from './trace/instrumentation/types'; +export * from './exporters/types'; + +// domain models impls export * from './trace/model/rootspan'; export * from './trace/model/span'; export * from './trace/model/tracer'; -export * from './trace/types'; +// sampler impl +export * from './trace/config/sampler'; + +// base instrumetation class +export * from './trace/instrumentation/baseplugin'; + +// console exporter and buffer impls +export * from './exporters/buffer'; +export * from './exporters/consolelog-exporter'; + +// util +export * from './internal/util'; diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts new file mode 100644 index 000000000..da0d98d61 --- /dev/null +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -0,0 +1,51 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This interface represent the probability of a tracer. + */ +export interface Sampler { + + /** + * Set idUpperBound with MAX_NUMBER that is equivalent the probability be 1 + * @returns a Sampler object + */ + + always(): Sampler; + /** + * Set idUpperBound with MIN_NUMBER that is equivalent the probability be 0 + * @returns a Sampler object + */ + + never(): Sampler; + + /** + * Set idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1 + * @returns a Sampler object + */ + probability(probability: number): Sampler; + + /** + * Checks if trace belong the sample. + * @param traceId Used to check the probability + * @returns a boolean. True if the traceId is in probability + * False if the traceId is not in probability. + */ + shouldSample(traceId: string): boolean; +} diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts new file mode 100644 index 000000000..7abacd40b --- /dev/null +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as shimmer from 'shimmer'; +import {Tracer} from '../model/types'; + +/** + * This class represent the base to patch plugin + */ +export abstract class BasePlugin { + exporter: any; + moduleName: string; + tracer: Tracer; + version: string; + + constructor(moduleName: string) { + this.moduleName = moduleName; + } + /** + * Set modified plugin to the context. + * @param exporter object module to set on context + * @param tracer tracer relating to context + * @param version module version description + */ + protected setPluginContext(exporter: any, tracer: Tracer, version: string) { + this.exporter = exporter; + this.tracer = tracer; + this.version = version; + } + + protected wrap(nodule, name, wrapper ) { + shimmer.wrap(nodule, name, wrapper ) + } + + protected unwrap(nodule, name) { + shimmer.unwrap(nodule, name); + } + + protected massWrap(nodule,names, wrapper) { + shimmer.massWrap(nodule, names, wrapper); + } + + protected massUnwrap(nodule,names) { + shimmer.massUnwrap(nodule, names); + } + + +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index 94e884d2b..7ef805e94 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -14,33 +14,12 @@ * limitations under the License. */ +import {Tracer} from "../model/types"; + /** * Interface Plugin to apply patch. */ -export interface Plugin { - applyPatch(module: {}, tracer: T, version: string): void; +export interface Plugin { + applyPatch(module: {}, tracer: Tracer, version: string): any; + applyUnpatch(): void; } -/** - * This class represent the base to patch plugin - */ -export abstract class BasePlugin { - module: {}; - moduleName: string; - tracer: T; - version: string; - - constructor(moduleName: string) { - this.moduleName = moduleName; - } - /** - * Set modified plugin to the context. - * @param http object module to set on context - * @param tracer tracer relating to context - * @param version module version description - */ - setPluginContext(http: {}, tracer: T, version: string) { - this.module = http; - this.tracer = tracer; - this.version = version; - } -} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index e0d445ab1..f281f7034 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,7 +18,7 @@ import * as uuid from 'uuid'; import {Clock} from '../../internal/clock'; import {debug} from '../../internal/util'; -import {OnEndSpanEventListener, RootSpan, TraceContext, TraceOptions} from '../types'; +import {OnEndSpanEventListener, RootSpan, TraceContext, TraceOptions, Span, Tracer} from './types'; import {SpanImpl} from './span'; import {SpanBaseModel} from './spanbasemodel'; @@ -26,12 +26,12 @@ import {TracerImpl} from './tracer'; /** Defines a root span */ export class RootSpanImpl extends SpanBaseModel implements RootSpan { - private tracer: TracerImpl; - private spansLocal: SpanImpl[]; + private tracer: Tracer; + private spansLocal: Span[]; private traceIdLocal: string; // TODO - improve root name setup - constructor(tracer: TracerImpl, context?: TraceOptions) { + constructor(tracer: Tracer, context?: TraceOptions) { super(); this.tracer = tracer; this.traceIdLocal = @@ -72,7 +72,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.tracer.onEndSpan(this); } - onEndSpan(span: SpanImpl) { + onEndSpan(span: Span) { debug('ending span %o', { id: span.id, traceId: span.traceId, diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index b6f2c5ec0..e5a9bfd3e 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -1,10 +1,24 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { Clock } from '../../internal/clock'; import { debug, randomSpanId } from '../../internal/util'; -import { Sampler } from '../config/sampler'; -import { TraceContext, Span } from '../types'; +import { Sampler } from '../config/types'; +import { TraceContext, Span, MapLabels, MapObjects } from './types'; -export interface MapLabels { [propName: string]: string; } -export interface MapObjects { [propName: string]: any; } export abstract class SpanBaseModel implements Span { protected className: string; @@ -22,9 +36,10 @@ export abstract class SpanBaseModel implements Span { private truncated = false; /** The Span ID of this span */ readonly id: string; + remoteParent: string; /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId = ''; + parentSpanId: string = null; /** The resource name of the span */ name: string = null; /** Type of span. Used to specify additional relationships between spans */ diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index bbd728e7c..c96b0de7b 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import {Clock} from '../../internal/clock'; import {debug, randomSpanId} from '../../internal/util'; -import {Span, TraceContext} from '../types'; +import {Span, TraceContext, RootSpan} from './types'; import {RootSpanImpl} from './rootspan'; import {SpanBaseModel} from './spanbasemodel'; @@ -25,13 +24,13 @@ import {SpanBaseModel} from './spanbasemodel'; * This class represent a span. */ export class SpanImpl extends SpanBaseModel implements Span { - private root: RootSpanImpl; + private root: RootSpan; /** * Constructs a new Span instance. * @param root */ - constructor(root: RootSpanImpl) { + constructor(root: RootSpan) { super(); this.root = root; } @@ -41,11 +40,6 @@ export class SpanImpl extends SpanBaseModel implements Span { return this.root.traceId; } - /** Gets trace id of rootspan. */ - get parentSpanId(): string { - return this.root.id; - } - /** Gets trace context of rootspan. */ get traceContext(): TraceContext { return { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 7c8fd0672..a36c18d76 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -15,18 +15,18 @@ */ import * as cls from '../../internal/cls'; -import { RootSpanImpl } from './rootspan'; -import { SpanImpl } from './span'; -import { debug } from '../../internal/util'; -import { Sampler } from '../config/sampler'; -import { TraceOptions, TracerConfig, defaultConfig, Tracer, OnEndSpanEventListener, Func } from '../types'; +import {debug} from '../../internal/util'; +import {RootSpan, Span} from './types'; +import {TraceOptions, TracerConfig, defaultConfig, Tracer} from './types'; +import {OnEndSpanEventListener, Func } from './types'; +import {Sampler} from '../config/types'; +import {SpanImpl} from './span'; +import {SamplerImpl} from '../config/sampler' +import {RootSpanImpl} from './rootspan'; -//ßexport type Func = (...args: any[]) => T; export class TracerImpl implements Tracer { - readonly PLUGINS = ['http', 'https', 'mongodb-core']; - //public buffer: Buffer; private activeLocal: boolean; private contextManager: cls.Namespace; @@ -35,18 +35,18 @@ export class TracerImpl implements Tracer { //TODO: simple solution - to be rewied in future private eventListenersLocal: OnEndSpanEventListener[] = []; //TODO: temp solution - private endedTraces: RootSpanImpl[] = []; + private endedTraces: RootSpan[] = []; constructor() { this.activeLocal = false; this.contextManager = cls.createNamespace(); } - get currentRootSpan(): RootSpanImpl { + get currentRootSpan(): RootSpan { return this.contextManager.get('rootspan'); } - set currentRootSpan(root: RootSpanImpl) { + set currentRootSpan(root: RootSpan) { this.contextManager.set('rootspan', root); } @@ -68,15 +68,15 @@ export class TracerImpl implements Tracer { return this.activeLocal; } - startRootSpan(options: TraceOptions, fn: (root: RootSpanImpl) => T): T { + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { return this.contextManager.runAndReturn((root) => { - const newRoot = new RootSpanImpl(this, options); + const newRoot = new RootSpanImpl (this, options); this.currentRootSpan = newRoot; if (!options) { options = {} as TraceOptions; } if (!options.sampler) { - options.sampler = new Sampler(newRoot.traceId); + options.sampler = new SamplerImpl(newRoot.traceId); //options.sampler.probability(0.5); options.sampler.always(); } @@ -89,7 +89,7 @@ export class TracerImpl implements Tracer { }); } - onEndSpan(root: RootSpanImpl): void { + onEndSpan(root: RootSpan): void { if (!root) { return debug('cannot end trace - no active trace found'); } @@ -104,7 +104,7 @@ export class TracerImpl implements Tracer { this.eventListenersLocal.push(listner); } - private notifyEndSpan(root: RootSpanImpl) { + private notifyEndSpan(root: RootSpan) { if (this.active) { debug('starting to notify listeners the end of rootspans'); if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { @@ -119,8 +119,8 @@ export class TracerImpl implements Tracer { this.currentRootSpan = null; } - startSpan(name?: string, type?: string, parentSpanId?: string): SpanImpl { - let newSpan: SpanImpl = null; + startSpan(name?: string, type?: string, parentSpanId?: string): Span { + let newSpan: Span = null; if (!this.currentRootSpan) { debug('no current trace found - must start a new root span first'); } else { diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts new file mode 100644 index 000000000..04ecf8eee --- /dev/null +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -0,0 +1,210 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Sampler } from '../config/types'; + +/** Default type for functions */ +export type Func = (...args: any[]) => T; + +/** Maps a label to a string. Used in spans' attributes. */ +export interface MapLabels { [propName: string]: string; } + +/** Maps a label to a string, number or boolean. Used in spans' annotations. */ +export interface MapObjects { [propName: string]: string|number|boolean; } + +/** Defines tracer configuration parameters */ +export interface TracerConfig { + /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ + sampleRate?: number; + /** Determines the ignored (or blacklisted) URLs */ + ignoreUrls?: Array; +} + +/** Defines a default tracer configuration */ +export const defaultConfig: TracerConfig = { + sampleRate: 1.0 +}; + +/** Defines the trace options */ +export interface TraceOptions { + /** Root span name */ + name: string; + /** Trace context */ + traceContext?: TraceContext; + /** Sampler */ + sampler?: Sampler; + /** Span type */ + type?: string; +} + + +/** Defines the trace context */ +export interface TraceContext { + /** Trace ID */ + traceId: string; + /** Span ID */ + spanId: string; + /** Options */ + options?: number; + /** Sample decision */ + sampleDecision?: boolean; +} + + +/** Defines an end span event listener */ +export interface OnEndSpanEventListener { + /** Happens when a span is ended */ + onEndSpan(span: Span): void; +} + + +/** Interface for Span */ +export interface Span { + + /** The Span ID of this span */ + readonly id: string; + remoteParent: string; + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string; + /** The resource name of the span */ + name: string; + /** Type of span. Used to specify additional relationships between spans */ + type: string; + /** A final status for this span */ + status: number; + /** A sampler that will decide if the span will be sampled or not */ + sampler: Sampler; + /** Constructs a new SpanBaseModel instance. */ + readonly traceId: string; + /** Indicates if span was started. */ + readonly started: boolean; + /** Indicates if span was ended. */ + readonly ended: boolean; + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + readonly startTime: Date; + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + readonly endTime: Date; + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + readonly duration: number; + /** Gives the TraceContext of the span. */ + readonly traceContext: TraceContext; + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAtribute(key: string, value: string): void; + /** + * Adds an annotation to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAnotation(key: string, value: string | number | boolean): void; + /** Starts a span. */ + start(): void; + /** Ends a span. */ + end(): void; + /** Forces to end a span. */ + truncate(): void; +} + +/** Interface for RootSpan */ +export interface RootSpan extends Span, OnEndSpanEventListener { + /** Get the span list from RootSpan instance */ + readonly spans: Span[]; + + /** Start the RootSpan instance */ + start(): void; + /** End the RootSpan instance */ + end(): void; + /** Start a new Span instance in the RootSpan instance */ + startSpan(name: string, type: string, parentSpanId?: string): Span; +} + + +/** Interface for Tracer */ +export interface Tracer { + /** Get and set the currentRootSpan to tracer instance */ + currentRootSpan: RootSpan; + /** Get the eventListeners from tracer instance */ + readonly eventListeners: OnEndSpanEventListener[]; + /** Get the active status from tracer instance */ + readonly active: boolean; + + /** + * Start a tracer instance + * @param config Configuration for tracer instace + * @returns A tracer instance started + */ + start(config?: TracerConfig): Tracer; + + /** Stop the tracer instance */ + stop(): void; + + /** + * Start a new RootSpan to currentRootSpan + * @param options Options for tracer instance + * @param fn Callback function + * @returns The callback return + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; + + /** + * Event called on the span end + * @param root The RootSpan that was ended + */ + onEndSpan(root: RootSpan): void; + + /** + * Register a OnEndSpanEventListener on the tracer instance + * @param listner An OnEndSpanEventListener instance + */ + registerEndSpanListener(listner: OnEndSpanEventListener): void; + + /** Clear the currentRootSpan from tracer instance */ + clearCurrentTrace(): void; + + /** + * Start a new Span instance to the currentRootSpan + * @param name Span name + * @param type Span type + * @param parentSpanId Parent SpanId + * @returns The new Span instance started + */ + startSpan(name?: string, type?: string, parentSpanId?: string): Span; + + /** + * Wraper to contextManager + * @param fn Function that will wrap in contextManager + * @returns The contextManager class wrapped + */ + wrap(fn: Func): Func; + /** + * Wrapper to contextManager emitter + * @param emitter Function that will wrap in contextManager emitter + * @returns The contextManager emitter wrapped + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void; +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index be48cec49..a3386b5d0 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -15,6 +15,7 @@ */ import {debug, randomSpanId} from '../../internal/util'; +import {Sampler} from './types' const MIN_NUMBER = 1e-4; @@ -23,7 +24,7 @@ const MAX_NUMBER = 0xffffffffffffffff; /** * This class represent the probability of a tracer. */ -export class Sampler { +export class SamplerImpl { private traceId: string; private idUpperBound: number; diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index f350ac231..40cb9ef9f 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -14,200 +14,15 @@ * limitations under the License. */ -import { Sampler } from './config/sampler'; +import {Tracer} from './model/types'; +import {Sampler} from './config/types'; +import {Exporter} from '../exporters/types'; -/** Default type for functions */ -export type Func = (...args: any[]) => T; -/** Maps a label to a string. Used in spans' attributes. */ -export interface MapLabels { [propName: string]: string; } - -/** Maps a label to a string, number or boolean. Used in spans' annotations. */ -export interface MapObjects { [propName: string]: string|number|boolean; } - -/** Defines tracer configuration parameters */ -export interface TracerConfig { - /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ - sampleRate?: number; - /** Determines the ignored (or blacklisted) URLs */ - ignoreUrls?: Array; -} - -/** Defines a default tracer configuration */ -export const defaultConfig: TracerConfig = { - sampleRate: 1.0 -}; - -/** Defines the trace context */ -export interface TraceContext { - /** Trace ID */ - traceId: string; - /** Span ID */ - spanId: string; - /** Options */ - options?: number; - /** Sample decision */ - sampleDecision?: boolean; -} - -/** Defines the trace options */ -export interface TraceOptions { - /** Root span name */ - name: string; - /** Trace context */ - traceContext?: TraceContext; - /** Sampler */ - sampler?: Sampler; - /** Span type */ - type?: string; -} - - -/** Defines the span data */ -export interface SpanData { - /** A collection of labels associated with the span */ - labels: {[key: string]: string}; - /** The resource name of the span */ - name: string; - /** The Span ID of this span */ - spanId: string; - /** The span ID of this span's parent. If it's a root span, must be empty. */ - parentSpanId?: string; +export interface Tracing { + readonly tracer: Tracer; + readonly sampler: Sampler; + readonly exporter: Exporter; + start(): Tracing; + stop(): void; } - - -/** Interface for Span */ -export interface Span { - - /** The Span ID of this span */ - readonly id: string; - remoteParent: string; - /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId: string; - /** The resource name of the span */ - name: string; - /** Type of span. Used to specify additional relationships between spans */ - type: string; - /** A final status for this span */ - status: number; - /** A sampler that will decide if the span will be sampled or not */ - sampler: Sampler; - /** Constructs a new SpanBaseModel instance. */ - readonly traceId: string; - /** Indicates if span was started. */ - readonly started: boolean; - /** Indicates if span was ended. */ - readonly ended: boolean; - /** - * Gives a timestap that indicates the span's start time in RFC3339 UTC - * "Zulu" format. - */ - readonly startTime: Date; - /** - * Gives a timestap that indicates the span's end time in RFC3339 UTC - * "Zulu" format. - */ - readonly endTime: Date; - /** - * Gives a timestap that indicates the span's duration in RFC3339 UTC - * "Zulu" format. - */ - readonly duration: number; - /** Gives the TraceContext of the span. */ - readonly traceContext: TraceContext; - /** - * Adds an atribute to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAtribute(key: string, value: string): void; - /** - * Adds an annotation to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAnotation(key: string, value: string | number | boolean): void; - /** Starts a span. */ - start(): void; - /** Ends a span. */ - end(): void; - /** Forces to end a span. */ - truncate(): void; -} - -/** Interface for RootSpan */ -export interface RootSpan extends Span { - /** Get the span list from RootSpan instance */ - readonly spans: Span[]; - - /** Start the RootSpan instance */ - start(): void; - /** End the RootSpan instance */ - end(): void; - /** Start a new Span instance in the RootSpan instance */ - startSpan(name: string, type: string, parentSpanId?: string): Span; -} - -/** Defines an end span event listener */ -export interface OnEndSpanEventListener { - /** Happens when a span is ended */ - onEndSpan(span: Span): void; -} - -/** Interface for Tracer */ -export interface Tracer { - /** Get and set the currentRootSpan to tracer instance */ - currentRootSpan: RootSpan; - /** Get the eventListeners from tracer instance */ - readonly eventListeners: OnEndSpanEventListener[]; - /** Get the active status from tracer instance */ - readonly active: boolean; - - /** - * Start a tracer instance - * @param config Configuration for tracer instace - * @returns A tracer instance started - */ - start(config?: TracerConfig): Tracer; - /** Stop the tracer instance */ - stop(): void; - /** - * Start a new RootSpan to currentRootSpan - * @param options Options for tracer instance - * @param fn Callback function - * @returns The callback return - */ - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; - /** - * Event called on the span end - * @param root The RootSpan that was ended - */ - onEndSpan(root: RootSpan): void; - /** - * Register a OnEndSpanEventListener on the tracer instance - * @param listner An OnEndSpanEventListener instance - */ - registerEndSpanListener(listner: OnEndSpanEventListener): void; - /** Clear the currentRootSpan from tracer instance */ - clearCurrentTrace(): void; - /** - * Start a new Span instance to the currentRootSpan - * @param name Span name - * @param type Span type - * @param parentSpanId Parent SpanId - * @returns The new Span instance started - */ - startSpan(name?: string, type?: string, parentSpanId?: string): Span; - /** - * Monkeypatch to contextManager - * @param fn Function that will wrap in contextManager - * @returns The contextManager class wrapped - */ - wrap(fn: Func): Func; - /** - * Monkeypatch to contextManager emitter - * @param emitter Function that will wrap in contextManager emitter - * @returns The contextManager emitter wrapped - */ - wrapEmitter(emitter: NodeJS.EventEmitter): void; -} \ No newline at end of file diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index 17f9a87ad..618becc48 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -15,13 +15,13 @@ */ import * as assert from 'assert'; +import * as mocha from 'mocha'; -import {RootSpan} from '../src/trace/model/rootspan'; -import {Span} from '../src/trace/model/span'; -import {Tracer} from '../src/trace/model/tracer'; -import {SpanBaseModel} from '../src/trace/types/tracetypes'; - -let tracer = new Tracer(); +import {Span,RootSpan,Tracer} from '../src/trace/model/types'; +import {SpanImpl} from '../src/trace/model/span'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {TracerImpl} from '../src/trace/model/tracer'; +let tracer = new TracerImpl(); describe('RootSpan', function() { /** @@ -29,8 +29,8 @@ describe('RootSpan', function() { */ describe('new RootSpan()', function() { it('should create a RootSpan instance', function() { - let root = new RootSpan(tracer); - assert.ok(root instanceof SpanBaseModel); + let root = new RootSpanImpl(tracer); + assert.ok(root instanceof SpanImpl); }); }); @@ -39,7 +39,7 @@ describe('RootSpan', function() { */ describe('start()', function() { it('should start a RootSpan instance', function() { - let root = new RootSpan(tracer); + let root = new RootSpanImpl(tracer); root.start(); assert.ok(root.started); }); @@ -52,13 +52,13 @@ describe('RootSpan', function() { let root, span; before(function() { - root = new RootSpan(tracer); + root = new RootSpanImpl(tracer); root.start(); span = root.startSpan('spanName', 'spanType'); }); it('should check span instance type', function() { - assert.ok(span instanceof Span); + assert.ok(span instanceof SpanImpl); }); it('should check if a new span was started', function() { @@ -71,7 +71,7 @@ describe('RootSpan', function() { */ describe('end()', function() { it('should end the trace', function() { - let root = new RootSpan(tracer); + let root = new RootSpanImpl(tracer); root.start(); root.end(); assert.ok(root.ended); @@ -83,7 +83,7 @@ describe('RootSpan', function() { */ describe('end() before trace started', function() { it('should not end trace', function() { - let root = new RootSpan(tracer); + let root = new RootSpanImpl(tracer); root.end(); assert.ok(!root.ended); }); @@ -94,7 +94,7 @@ describe('RootSpan', function() { */ describe('startSpan() before trace started', function() { it('should not create span', function() { - let root = new RootSpan(tracer); + let root = new RootSpanImpl(tracer); let span = root.startSpan('spanName', 'spanType'); assert.ok(span == null); }); @@ -105,7 +105,7 @@ describe('RootSpan', function() { */ describe('startSpan() after trace ended', function() { it('should not create span', function() { - let root = new RootSpan(tracer); + let root = new RootSpanImpl(tracer); root.start(); root.end(); let span = root.startSpan('spanName', 'spanType'); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 9eb6c7077..3cef9139d 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -15,13 +15,14 @@ */ import * as assert from 'assert'; +import * as mocha from 'mocha'; -import {RootSpan} from '../src/trace/model/rootspan'; -import {Span} from '../src/trace/model/span'; -import {Tracer} from '../src/trace/model/tracer'; -import {SpanBaseModel} from '../src/trace/types/tracetypes'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {SpanImpl} from '../src/trace/model/span'; +import {TracerImpl} from '../src/trace/model/tracer'; +import {Span} from '../src/trace/model/types'; -let tracer = new Tracer(); +let tracer = new TracerImpl(); describe('Span', function() { /** @@ -29,17 +30,17 @@ describe('Span', function() { */ describe('startSpan()', function() { it('should create an span', function() { - const rootSpan = new RootSpan(tracer); - assert.ok(rootSpan instanceof SpanBaseModel); + const rootSpan = new RootSpanImpl(tracer); + assert.ok(rootSpan instanceof SpanImpl); rootSpan.start(); const span = rootSpan.startSpan('spanName', 'typeSpan'); - assert.ok(span instanceof Span); + assert.ok(span instanceof SpanImpl); assert.ok(span.id); }); it('should start a span', function() { - const rootSpan = new RootSpan(tracer); + const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); const span = rootSpan.startSpan('spanName', 'typeSpan'); span.start(); @@ -47,7 +48,7 @@ describe('Span', function() { }); it('should end a span', function() { - const rootSpan = new RootSpan(tracer); + const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); const span = rootSpan.startSpan('spanName', 'typeSpan'); span.start(); @@ -61,7 +62,7 @@ describe('Span', function() { */ describe('Span checking after creation', function() { it('should not start span after it ended', function() { - const root = new RootSpan(tracer); + const root = new RootSpanImpl(tracer); root.start(); const span = root.startSpan('spanName', 'typeSpan'); span.start(); @@ -77,7 +78,7 @@ describe('Span', function() { */ describe('Span data', function() { it('should create an unique numeric span ID strings', function() { - const root = new RootSpan(tracer); + const root = new RootSpanImpl(tracer); root.start(); var numberOfSpansToCheck = 5; diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 3262ed77b..62f7a308c 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -14,12 +14,15 @@ * limitations under the License. */ -import { Tracer } from '../src/trace/model/tracer'; -import { RootSpan } from '../src/trace/model/rootspan'; -import { Span } from '../src/trace/model/span'; -import { Exporter } from '../src/exporters/exporter'; +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {Span,RootSpan,Tracer} from '../src/trace/model/types'; +import { Exporter } from '../src/exporters/types'; +import { TracerImpl } from '../src/trace/model/tracer'; +import { RootSpanImpl } from '../src/trace/model/rootspan'; +import { SpanImpl } from '../src/trace/model/span'; -let assert = require('assert'); describe('Tracer', function () { const options = { name: "test" }; @@ -27,20 +30,20 @@ describe('Tracer', function () { describe('new Tracer()', function () { it('should create a Tracer instance', function () { - let tracer = new Tracer(); - assert.ok(tracer instanceof Tracer); + let tracer = new TracerImpl(); + assert.ok(tracer instanceof TracerImpl); }); }); describe('start()', function () { it('should return a tracer instance', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let tracerStarted = tracer.start(); - assert.ok(tracerStarted instanceof Tracer); + assert.ok(tracerStarted instanceof TracerImpl); }); it('the trace was started', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let tracerStarted = tracer.start(); assert.ok(tracerStarted.active); }); @@ -49,7 +52,7 @@ describe('Tracer', function () { describe('startRootSpan()', function () { it('should start the rootSpan', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); tracer.start(); let rootSpan = tracer.startRootSpan(options, callback); @@ -59,7 +62,7 @@ describe('Tracer', function () { describe('end()', function () { it('should end current trace', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let rootSpan = tracer.startRootSpan(options, callback); rootSpan.end(); assert.ok(rootSpan.ended); @@ -68,7 +71,7 @@ describe('Tracer', function () { describe('clearCurrentRootSpan()', function () { it('should set the current root span to null', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let rootSpan = tracer.startRootSpan(options, callback); tracer.clearCurrentTrace(); @@ -78,14 +81,14 @@ describe('Tracer', function () { describe('startSpan()', function () { it('should return a Span instance', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let rootSpan = tracer.startRootSpan(options, callback); let span = tracer.startSpan("spanName", "spanType"); - assert.ok(span instanceof Span); + assert.ok(span instanceof SpanImpl); }); it('should start a span', function () { - let tracer = new Tracer(); + let tracer = new TracerImpl(); let rootSpan = tracer.startRootSpan(options, callback); let span = tracer.startSpan("spanName", "spanType"); assert.ok(span.started); diff --git a/packages/opencensus-core/tsconfig.full.json b/packages/opencensus-core/tsconfig.full.json index 336e867a2..9743ebde5 100644 --- a/packages/opencensus-core/tsconfig.full.json +++ b/packages/opencensus-core/tsconfig.full.json @@ -3,17 +3,15 @@ "compilerOptions": { "rootDir": ".", "outDir": "build", - "target": "es2015", + "target": "es6", "allowUnreachableCode": true, "noUnusedParameters": false, "noImplicitAny": false, "noImplicitThis": false, "noEmitOnError": false }, - "include": [ - "src/*.ts", - "src/plugins/*.ts", - "test/*.ts", - "test/plugins/*.ts" - ] +"include": [ + "src/**/*.ts", + "test/**/*.ts" + ] } diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json index a49a50d08..feb5628a3 100644 --- a/packages/opencensus-core/tsconfig.json +++ b/packages/opencensus-core/tsconfig.json @@ -17,7 +17,8 @@ "node_modules" ], "include": [ - "src/**/*.ts" + "src/**/*.ts", + "test/**/*.ts" ] } \ No newline at end of file diff --git a/scripts/update_lerna_modules_links.sh b/scripts/update_lerna_modules_links.sh deleted file mode 100755 index 891ab74ef..000000000 --- a/scripts/update_lerna_modules_links.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -COMPONENT_NAME="opencensus" -CONTEXT="@opencensus" - -## declare an array variable -declare -a packages=( - "packages/${COMPONENT_NAME}-core" - "packages/${COMPONENT_NAME}-nodejs" - "packages/${COMPONENT_NAME}-instrumentation-http" - "packages/${COMPONENT_NAME}-instrumentation-https" - "packages/${COMPONENT_NAME}-instrumentation-mongodb-core" - "packages/${COMPONENT_NAME}-exporter-stackdriver" - "packages/${COMPONENT_NAME}-exporter-zipkin" - "packages/${COMPONENT_NAME}-propagation-b3" - "packages/${COMPONENT_NAME}-instrumentation-all" - ) -NUMPACKAGES=${#packages[@]} - -echo "01 - Lerna bootstrap" -#Lerna - package.ini - -#lerna bootstrap -node_modules/.bin/lerna bootstrap - - -#correct the link to build/src according to typescript build output -echo "02 - Fix modules link" -function correctModulesLinks { - CURRENT_PATH=`pwd` - for (( i=0; i<${NUMPACKAGES}; i++ )) - do - if [ $i -gt 0 ] - then - echo "Fix ${packages[$i]} to ${COMPONENT_NAME}-core" - cd ${packages[$i]}/node_modules/${CONTEXT} - ln -sfn ../../../${COMPONENT_NAME}-core/build/src ${COMPONENT_NAME}-core - cd $CURRENT_PATH - fi - done - - #fix nodejs - dependecies - echo "Fix ${packages[1]} dependecies" - cd ${packages[1]}/node_modules/${CONTEXT}/ - ln -sfn ../../../${COMPONENT_NAME}-instrumentation-all/build/src ${COMPONENT_NAME}-instrumentation-all - cd $CURRENT_PATH - - echo "Fix ${packages[2]} dependecies" - cd ${packages[2]}/node_modules/${CONTEXT}/ - ln -sfn ../../../${COMPONENT_NAME}-propagation-b3/build/src ${COMPONENT_NAME}-propagation-b3 - cd $CURRENT_PATH - - echo "Fix ${packages[3]} dependecies" - cd ${packages[3]}/node_modules/${CONTEXT}/ - ln -sfn ../../../${COMPONENT_NAME}-instrumentation-http/build/src ${COMPONENT_NAME}-instrumentation-http - cd $CURRENT_PATH - - #fix instrumentation-all dependecies - echo "Fix ${packages[8]} dependecies" - cd ${packages[8]}/node_modules/${CONTEXT}/ - ln -sfn ../../../${COMPONENT_NAME}-instrumentation-http/build/src ${COMPONENT_NAME}-instrumentation-http - ln -sfn ../../../${COMPONENT_NAME}-instrumentation-https/build/src ${COMPONENT_NAME}-instrumentation-https - ln -sfn ../../../${COMPONENT_NAME}-instrumentation-mongodb-core/build/src ${COMPONENT_NAME}-instrumentation-mongodb-core - cd $CURRENT_PATH - -} - -correctModulesLinks - -echo "Building modules" -node_modules/.bin/lerna run build - -echo "End update lerna links" \ No newline at end of file From b5a0635f6c1f62510138e511acf9393611430c2c Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 17 Apr 2018 10:28:32 -0300 Subject: [PATCH 072/110] refactor: modify sampler config to use optionsTracing --- .../opencensus-core/src/trace/model/tracer.ts | 14 ++++++----- .../opencensus-core/src/trace/model/types.ts | 3 +++ .../src/trace/sampler/sampler.ts | 24 +++++++++++++++---- packages/opencensus-core/src/trace/types.ts | 9 ++++--- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index a36c18d76..cfcf8dca8 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -37,6 +37,8 @@ export class TracerImpl implements Tracer { //TODO: temp solution private endedTraces: RootSpan[] = []; + samplingRate: number; + constructor() { this.activeLocal = false; this.contextManager = cls.createNamespace(); @@ -75,12 +77,12 @@ export class TracerImpl implements Tracer { if (!options) { options = {} as TraceOptions; } - if (!options.sampler) { - options.sampler = new SamplerImpl(newRoot.traceId); - //options.sampler.probability(0.5); - options.sampler.always(); - } - newRoot.sampler = options.sampler; + // if (!options.sampler) { + // options.sampler = new SamplerImpl(newRoot.traceId); + // options.sampler.always(); + // } + // newRoot.sampler = options.sampler; + newRoot.sampler = new SamplerImpl().probability(this.samplingRate); if (newRoot.sampler.shouldSample(newRoot.traceId)) { newRoot.start(); return fn(newRoot); diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 04ecf8eee..863a92d6b 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -148,6 +148,9 @@ export interface RootSpan extends Span, OnEndSpanEventListener { export interface Tracer { /** Get and set the currentRootSpan to tracer instance */ currentRootSpan: RootSpan; + + samplingRate: number; + /** Get the eventListeners from tracer instance */ readonly eventListeners: OnEndSpanEventListener[]; /** Get the active status from tracer instance */ diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index a3386b5d0..bfde56407 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -64,14 +64,14 @@ export class SamplerImpl { * @param probability probability between 0 and 1 * @returns a Sampler object */ - probability(probability: number): Sampler { - if (probability < MIN_NUMBER) { - return this.never(); - - } else if (probability > MAX_NUMBER) { + probability(probability?: number): Sampler { + if(!probability || probability > MAX_NUMBER) { return this.always(); } + else if (probability < MIN_NUMBER) { + return this.never(); + } this.idUpperBound = probability * MAX_NUMBER; return this; } @@ -93,4 +93,18 @@ export class SamplerImpl { return false; } } + + // setRate(samplerRate?:number){ + // if(samplerRate){ + // if(samplerRate <= MIN_NUMBER){ + // this.never(); + // }else if(samplerRate >= MAX_NUMBER){ + // this.always(); + // }else{ + // this.probability(samplerRate); + // } + // }else{ + // this.always(); + // } + // } } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 40cb9ef9f..8846424a0 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -19,10 +19,13 @@ import {Sampler} from './config/types'; import {Exporter} from '../exporters/types'; -export interface Tracing { +export interface Tracing { readonly tracer: Tracer; - readonly sampler: Sampler; + // readonly sampler: Sampler; readonly exporter: Exporter; - start(): Tracing; + start(opstion?:OptionsTracing): Tracing; stop(): void; } +export interface OptionsTracing { + samplingRate ?: number; +} From 4adaa33839daf8c1c95b32f99241081cdd80a54c Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Mon, 16 Apr 2018 13:13:57 -0300 Subject: [PATCH 073/110] fix: fixed span tests --- packages/opencensus-core/package.json | 5 +- .../opencensus-core/src/trace/model/span.ts | 9 +- packages/opencensus-core/test/test-span.ts | 97 +++++++++++-------- 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index d96b7a192..67a436ca2 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -7,7 +7,7 @@ "repository": "census-instrumentation/opencensus-node", "scripts": { "build": "node_modules/.bin/tsc --declaration", - "test": "node_modules/.bin/mocha 'build/test/**/*.js' --reporter spec", + "test": "nyc --reporter=html --reporter=text mocha 'build/test/**/*.js'", "clean": "rimraf build/*" }, "keywords": [ @@ -44,7 +44,8 @@ "mocha": "^5.0.4", "ncp": "^2.0.0", "ts-node": "^4.0.0", - "typescript": "^2.7.2" + "typescript": "^2.7.2", + "nyc": "11.6.0" }, "dependencies": { "async_hooks": "^1.0.0", diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index c96b0de7b..423204221 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -35,12 +35,12 @@ export class SpanImpl extends SpanBaseModel implements Span { this.root = root; } - /** Gets trace id of rootspan. */ + /** Gets trace id of span. */ get traceId(): string { return this.root.traceId; } - /** Gets trace context of rootspan. */ + /** Gets trace context of span. */ get traceContext(): TraceContext { return { traceId: this.traceId.toString(), @@ -64,6 +64,11 @@ export class SpanImpl extends SpanBaseModel implements Span { /** Ends the span. */ end(): void { + if (!this.started) { + debug("calling end() on un-started span"); + return; + } + super.end(); this.notifyEnd(); debug('ending span %o', { diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 3cef9139d..1d1fab754 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -26,75 +26,88 @@ let tracer = new TracerImpl(); describe('Span', function() { /** - * Should create, start and end a rootspan + * Should create a span */ - describe('startSpan()', function() { - it('should create an span', function() { + describe('new Span()', function() { + it('should create a Span instance', function() { const rootSpan = new RootSpanImpl(tracer); - assert.ok(rootSpan instanceof SpanImpl); + const span = new SpanImpl(rootSpan); + assert.ok(span instanceof SpanImpl); + }); + }); + /** + * Should return the Trace ID + */ + describe('get traceId()', function() { + it('should return the trace id', function() { + const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); - assert.ok(span instanceof SpanImpl); - assert.ok(span.id); + const span = new SpanImpl(rootSpan); + assert.equal(span.traceId, rootSpan.traceId); }); + }); - it('should start a span', function() { + /** + * Should the trace context of span + */ + describe('get traceContext()', function() { + it('should the trace context of span', function() { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); - span.start(); - assert.ok(span.started); + + const span = new SpanImpl(rootSpan); + const context = span.traceContext; + + assert.equal(context.traceId, rootSpan.traceId); + assert.equal(context.spanId, span.id); + assert.equal(context.options, 1); }); + }); - it('should end a span', function() { + /** + * Should start a span instance + */ + describe('start()', function() { + it('should start a span instance', function() { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - const span = rootSpan.startSpan('spanName', 'typeSpan'); + + const span = new SpanImpl(rootSpan); span.start(); - span.end(); - assert.ok(span.ended); + + assert.ok(span.started); }); }); /** - * Should not start span after it ended + * Should end a span instance */ - describe('Span checking after creation', function() { - it('should not start span after it ended', function() { - const root = new RootSpanImpl(tracer); - root.start(); - const span = root.startSpan('spanName', 'typeSpan'); + describe('end()', function() { + it('should end a span instance', function() { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); span.start(); span.end(); - span.start(); - assert.equal(span.ended, true); + assert.ok(span.ended); }); }); /** - * Should an unique ID for spans + * Should not end a span instance */ - describe('Span data', function() { - it('should create an unique numeric span ID strings', function() { - const root = new RootSpanImpl(tracer); - root.start(); - - var numberOfSpansToCheck = 5; - for (var i = 0; i < numberOfSpansToCheck; i++) { - var span = root.startSpan('spanName' + i, 'typeSpan' + i); - var spanId = span.id; - assert.ok(typeof spanId === 'string'); - assert.ok(spanId.match(/\d+/)); - assert.ok(Number(spanId) > 0); - assert.strictEqual(Number(spanId).toString(), spanId); - } - }); + describe('end() before start the span', function() { + it('should not end a span instance', function() { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.end(); - // TODO - it('should truncate namespace', function() { - this.skip(); + assert.ok(!span.ended); }); }); }); \ No newline at end of file From d543d2bf9ab04edb1fc05e2a0a66273923bfb331 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Mon, 16 Apr 2018 14:32:50 -0300 Subject: [PATCH 074/110] test: added GTS scripts --- packages/opencensus-core/package.json | 12 +++++++++--- packages/opencensus-core/tsconfig.json | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 67a436ca2..3009493e8 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -8,7 +8,13 @@ "scripts": { "build": "node_modules/.bin/tsc --declaration", "test": "nyc --reporter=html --reporter=text mocha 'build/test/**/*.js'", - "clean": "rimraf build/*" + "clean": "rimraf build/*", + "check": "gts check", + "compile": "tsc -p .", + "fix": "gts fix", + "prepare": "npm run compile", + "pretest": "npm run compile", + "posttest": "npm run check" }, "keywords": [ "opencensus", @@ -40,11 +46,11 @@ "@types/semver": "^5.5.0", "@types/shimmer": "^1.0.1", "@types/uuid": "^3.4.3", - "gts": "^0.5.1", + "gts": "^0.5.4", "mocha": "^5.0.4", "ncp": "^2.0.0", "ts-node": "^4.0.0", - "typescript": "^2.7.2", + "typescript": "~2.6.1", "nyc": "11.6.0" }, "dependencies": { diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json index feb5628a3..4f7b0dc24 100644 --- a/packages/opencensus-core/tsconfig.json +++ b/packages/opencensus-core/tsconfig.json @@ -1,4 +1,5 @@ { + "extends": "./node_modules/gts/tsconfig-google.json", "compilerOptions": { "rootDir": ".", "outDir": "build", @@ -13,12 +14,11 @@ "target": "es6", "sourceMap": false }, + "include": [ + "src/*.ts", + "test/*.ts", + ], "exclude": [ "node_modules" - ], - "include": [ - "src/**/*.ts", - "test/**/*.ts" ] - -} \ No newline at end of file +} From 6b05124db2844f278108ccb5045dd9cf82cb5e22 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Mon, 16 Apr 2018 15:56:34 -0300 Subject: [PATCH 075/110] fix: fixed gts issues --- .../src/trace/model/span-base-model.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index e5a9bfd3e..297ca4085 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -72,7 +72,12 @@ export abstract class SpanBaseModel implements Span { * "Zulu" format. */ get startTime(): Date { - if (this.clock) return this.clock.startTime; + if (!this.clock) { + debug("calling startTime() on null clock"); + return null; + } + + return this.clock.startTime; } /** @@ -80,7 +85,12 @@ export abstract class SpanBaseModel implements Span { * "Zulu" format. */ get endTime(): Date { - if (this.clock) return this.clock.endTime; + if (!this.clock) { + debug("calling endTime() on null clock"); + return null; + } + + return this.clock.endTime; } /** @@ -88,7 +98,12 @@ export abstract class SpanBaseModel implements Span { * "Zulu" format. */ get duration(): number { - if (this.clock) return this.clock.duration; + if (!this.clock) { + debug("calling duration() on null clock"); + return null; + } + + return this.clock.duration; } /** Gives the TraceContext of the span. */ From 2201ed61da69d85c460a0004022c1136c7629fb5 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Mon, 16 Apr 2018 16:37:29 -0300 Subject: [PATCH 076/110] refactor: update buffer and exporters --- packages/opencensus-core/package-lock.json | 447 +++++------------- .../opencensus-core/src/exporters/buffer.ts | 40 +- .../src/exporters/console-exporter.ts | 19 +- .../opencensus-core/src/exporters/types.ts | 9 +- 4 files changed, 146 insertions(+), 369 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index dc8c88afa..5b0fa3326 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,14 +1,11 @@ { - "name": "@opencensus/opencensus-core", - "version": "0.0.1", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -16,50 +13,42 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", - "dev": true + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", - "dev": true + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" }, "@types/shimmer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", - "dev": true + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -68,7 +57,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -76,20 +64,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -99,7 +84,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -109,20 +93,17 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "1.9.1" } @@ -131,7 +112,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -139,14 +119,12 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "async-listener": { "version": "0.6.9", @@ -166,7 +144,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -176,14 +153,12 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -195,22 +170,19 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -224,26 +196,22 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -253,7 +221,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -264,7 +231,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -273,20 +239,17 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -296,22 +259,19 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -321,14 +281,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -338,14 +296,12 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", - "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -355,22 +311,19 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -378,14 +331,12 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -393,26 +344,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -426,7 +373,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, "requires": { "is-obj": "1.0.1" } @@ -446,7 +392,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -455,7 +400,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -465,14 +409,12 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -488,14 +430,12 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -504,28 +444,24 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "emitter-listener": { "version": "1.1.1", @@ -539,7 +475,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -547,26 +482,22 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -581,7 +512,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -592,7 +522,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -601,7 +530,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "2.0.0" } @@ -609,20 +537,17 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -636,7 +561,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, "requires": { "ini": "1.3.5" } @@ -644,20 +568,17 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", - "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -674,7 +595,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -682,20 +602,17 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -703,38 +620,32 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -743,20 +654,17 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -777,20 +685,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -800,7 +705,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -810,14 +714,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -826,7 +728,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -835,20 +736,17 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -856,50 +754,42 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -908,14 +798,12 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, "requires": { "package-json": "4.0.1" } @@ -924,7 +812,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -936,7 +823,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -948,7 +834,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -957,14 +842,12 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -973,14 +856,12 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -990,7 +871,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -998,20 +878,17 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -1027,22 +904,19 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -1050,14 +924,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -1067,7 +939,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1076,7 +947,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", - "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -1098,20 +968,17 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -1123,7 +990,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -1132,7 +998,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -1141,7 +1006,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -1149,20 +1013,17 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -1171,7 +1032,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -1179,14 +1039,12 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -1198,7 +1056,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -1216,58 +1073,49 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" } } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -1275,32 +1123,27 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -1311,8 +1154,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -1320,7 +1162,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -1331,7 +1172,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -1341,7 +1181,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -1351,7 +1190,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -1361,7 +1199,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, "requires": { "rc": "1.2.6" } @@ -1370,7 +1207,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, "requires": { "path-parse": "1.0.5" } @@ -1379,7 +1215,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -1389,7 +1224,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "7.1.2" } @@ -1398,7 +1232,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "2.1.0" } @@ -1406,14 +1239,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -1421,8 +1252,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.5.0", @@ -1433,7 +1263,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, "requires": { "semver": "5.5.0" } @@ -1442,7 +1271,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -1450,8 +1278,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shimmer": { "version": "1.2.0", @@ -1461,14 +1288,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", - "dev": true, "requires": { "source-map": "0.6.1" }, @@ -1476,8 +1301,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -1485,7 +1309,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -1494,14 +1317,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -1510,20 +1331,17 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -1531,32 +1349,27 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -1565,7 +1378,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, "requires": { "execa": "0.7.0" } @@ -1573,14 +1385,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -1588,14 +1398,12 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", - "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -1612,8 +1420,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -1621,7 +1428,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -1632,14 +1438,12 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", - "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -1658,8 +1462,7 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" } } }, @@ -1667,7 +1470,6 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", - "dev": true, "requires": { "tslib": "1.9.0" } @@ -1675,14 +1477,12 @@ "typescript": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", - "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", - "dev": true + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==" }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -1691,7 +1491,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -1708,7 +1507,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -1722,7 +1520,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", - "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -1731,7 +1528,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -1741,7 +1537,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -1750,7 +1545,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -1758,20 +1552,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -1781,7 +1572,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -1791,14 +1581,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -1808,20 +1596,17 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index c29d128ef..7bc7ee566 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -30,25 +30,22 @@ const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds /** * Controls the sending of traces to exporters */ -export class Buffer implements OnEndSpanEventListener { - private exporters: Exporter[]; +export class Buffer { + private exporter: Exporter; private bufferSize: number; /** Trace queue of a buffer */ - private queue: RootSpan[]; + private queue: RootSpan[] = []; /** Max time for a buffer can wait before being sent */ private bufferTimeout: number; /** Manage when the buffer timeout needs to be reseted */ - private resetTimeout: boolean; + private resetTimeout: boolean = false; /** Indicates when the buffer timeout is running */ - private bufferTimeoutInProgress: boolean; + private bufferTimeoutInProgress: boolean = false; - constructor(bufferSize?: number, bufferTimeout?: number) { - this.queue = []; + constructor(exporter: Exporter, bufferSize?: number, bufferTimeout?: number) { this.bufferSize = bufferSize || DEFAULT_BUFFER_SIZE; this.bufferTimeout = bufferTimeout || DEFAULT_BUFFER_TIMEOUT; - this.exporters = []; - this.resetTimeout = false; - this.bufferTimeoutInProgress = false; + this.exporter = exporter; return this; } @@ -61,24 +58,6 @@ export class Buffer implements OnEndSpanEventListener { return this; } - /** - * Add an exporter in exports array - * @param exporter Exporter to be registered - */ - registerExporter(exporter: Exporter) { - this.exporters.push(exporter); - return this; - } - - /** - * Event called when a span ends - * @param span Ended span - */ - onEndSpan(span) { - this.addToBuffer(span); - return this; - } - /** * Add a trace (rootSpan) in the buffer * @param trace RootSpan to be added in the buffer @@ -128,10 +107,7 @@ export class Buffer implements OnEndSpanEventListener { /** Send the trace queue to all exporters */ private flush() { - for (const exporter of this.exporters) { - exporter.publish(this.queue); - } - + this.exporter.publish(this.queue); this.queue = []; return this; } diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index f8fcb6e8c..78ca983a7 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -14,17 +14,30 @@ * limitations under the License. */ -import { RootSpan } from '../trace/model/types'; -import { Exporter, ExporterOptions } from '../exporters/types'; +import {Exporter, ExporterOptions} from '../exporters/types'; +import {RootSpan} from '../trace/model/types'; + +import {Buffer} from './buffer'; /** Do not send span data */ export class NoopExporter implements Exporter { - publish(rootSpans: RootSpan[]) { } + onEndSpan(root: RootSpan) {} + publish(rootSpans: RootSpan[]) {} } /** Format and sends span data to the console. */ export class ConsoleLogExporter implements Exporter { + private buffer: Buffer; + + constructor(options: ExporterOptions) { + this.buffer = new Buffer(this, options.bufferSize, options.bufferTimeout); + } + + onEndSpan(root: RootSpan) { + this.buffer.addToBuffer(root); + } + /** * Sends the spans information to the console. * @param rootSpans diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 9a50bb2de..5ef75e076 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -15,13 +15,16 @@ */ -import {RootSpan} from '../trace/model/types'; +import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; -export interface Exporter { publish(rootSpans: RootSpan[]); } +export interface Exporter extends OnEndSpanEventListener { + publish(rootSpans: RootSpan[]); +} /** * TODO: Interface to exporters options */ export interface ExporterOptions { - + bufferSize?: number; + bufferTimeout?: number; } \ No newline at end of file From 4a3d279031ffedb2ba2c4d4152a4cc49cc9df3ee Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 17 Apr 2018 10:29:06 -0300 Subject: [PATCH 077/110] fix: fixed typescript code style --- .../opencensus-core/src/internal/cls-ah.ts | 8 ++--- packages/opencensus-core/src/internal/cls.ts | 19 +++++----- .../src/trace/model/root-span.ts | 20 +++++++++-- packages/opencensus-core/test/test-span.ts | 36 +++++++++---------- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts index 60a23cfae..e8f66fd89 100644 --- a/packages/opencensus-core/src/internal/cls-ah.ts +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import * as asyncHook from 'async_hooks' -import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage' -import {EventEmitter} from 'events' -import * as shimmer from 'shimmer' +import * as asyncHook from 'async_hooks'; +import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; +import {EventEmitter} from 'events'; +import * as shimmer from 'shimmer'; const wrappedSymbol = Symbol('context_wrapped'); let contexts: {[asyncId: number]: Context;} = {}; diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index 9eb285328..779f4822a 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -14,20 +14,23 @@ * limitations under the License. */ -import * as CLS from 'continuation-local-storage' -import * as semver from 'semver' -import { debug } from './util' +import * as CLS from 'continuation-local-storage'; +import * as semver from 'semver'; + +import * as cls_ah from './cls-ah'; +import {debug} from './util'; export type Namespace = CLS.Namespace; export type Func = CLS.Func; -const useAsyncHooks: boolean = semver.satisfies(process.version, '>=8') ;//&& - // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; +const useAsyncHooks: boolean = semver.satisfies( + process.version, '>=8'); //&& + // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; -debug('useAsyncHooks = %s',useAsyncHooks); +debug('useAsyncHooks = %s', useAsyncHooks); const cls: typeof CLS = - useAsyncHooks ? require('./cls-ah') : require('continuation-local-storage'); + useAsyncHooks ? cls_ah : CLS; const TRACE_NAMESPACE = 'opencensus.io'; @@ -51,5 +54,3 @@ export function destroyNamespace(): void { export function getNamespace(): CLS.Namespace { return cls.getNamespace(TRACE_NAMESPACE); } - - diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index f281f7034..aaf9cb422 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,11 +18,11 @@ import * as uuid from 'uuid'; import {Clock} from '../../internal/clock'; import {debug} from '../../internal/util'; -import {OnEndSpanEventListener, RootSpan, TraceContext, TraceOptions, Span, Tracer} from './types'; import {SpanImpl} from './span'; import {SpanBaseModel} from './spanbasemodel'; import {TracerImpl} from './tracer'; +import {OnEndSpanEventListener, RootSpan, Span, TraceContext, TraceOptions, Tracer} from './types'; /** Defines a root span */ export class RootSpanImpl extends SpanBaseModel implements RootSpan { @@ -45,14 +45,17 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.spansLocal = []; } - get spans() { + /** Get span list from rootspan instance */ + get spans(): Span[] { return this.spansLocal; } - get traceId() { + /** Get trace id from rootspan instance */ + get traceId(): string { return this.traceIdLocal; } + /** Start a rootspan instance */ start() { super.start(); debug( @@ -60,6 +63,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); } + /** End a rootspan instance */ end() { super.end(); @@ -72,6 +76,10 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.tracer.onEndSpan(this); } + /** + * Event called when a span ended + * @param span Span ended + */ onEndSpan(span: Span) { debug('ending span %o', { id: span.id, @@ -83,6 +91,12 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { }); } + /** + * Start a new span linked with the rootspan + * @param name Span name + * @param type Span type + * @param parentSpanId Span parent ID + */ startSpan(name: string, type: string, parentSpanId?: string) { if (!this.started) { debug( diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 1d1fab754..1a5c2bb1d 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -22,14 +22,14 @@ import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; import {Span} from '../src/trace/model/types'; -let tracer = new TracerImpl(); +const tracer = new TracerImpl(); -describe('Span', function() { +describe('Span', () => { /** * Should create a span */ - describe('new Span()', function() { - it('should create a Span instance', function() { + describe('new Span()', () => { + it('should create a Span instance', () => { const rootSpan = new RootSpanImpl(tracer); const span = new SpanImpl(rootSpan); assert.ok(span instanceof SpanImpl); @@ -39,8 +39,8 @@ describe('Span', function() { /** * Should return the Trace ID */ - describe('get traceId()', function() { - it('should return the trace id', function() { + describe('get traceId()', () => { + it('should return the trace id', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); const span = new SpanImpl(rootSpan); @@ -51,11 +51,11 @@ describe('Span', function() { /** * Should the trace context of span */ - describe('get traceContext()', function() { - it('should the trace context of span', function() { + describe('get traceContext()', () => { + it('should the trace context of span', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); const context = span.traceContext; @@ -68,11 +68,11 @@ describe('Span', function() { /** * Should start a span instance */ - describe('start()', function() { - it('should start a span instance', function() { + describe('start()', () => { + it('should start a span instance', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); @@ -83,11 +83,11 @@ describe('Span', function() { /** * Should end a span instance */ - describe('end()', function() { - it('should end a span instance', function() { + describe('end()', () => { + it('should end a span instance', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); span.end(); @@ -99,11 +99,11 @@ describe('Span', function() { /** * Should not end a span instance */ - describe('end() before start the span', function() { - it('should not end a span instance', function() { + describe('end() before start the span', () => { + it('should not end a span instance', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.end(); From 0e9774d5790bbc09376c349cb9ccb3cf5cd5d805 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Tue, 17 Apr 2018 11:44:16 -0300 Subject: [PATCH 078/110] test: created rootspan test --- .gitignore | 3 +- packages/opencensus-core/package.json | 2 +- .../src/trace/model/root-span.ts | 15 +- .../opencensus-core/test/test-root-span.ts | 131 +++++++++++++----- 4 files changed, 104 insertions(+), 47 deletions(-) diff --git a/.gitignore b/.gitignore index ec67649c6..558cddceb 100644 --- a/.gitignore +++ b/.gitignore @@ -37,5 +37,6 @@ build/ #log files *.log - +#istanbul files +coverage/ diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 3009493e8..41ced317e 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -7,7 +7,7 @@ "repository": "census-instrumentation/opencensus-node", "scripts": { "build": "node_modules/.bin/tsc --declaration", - "test": "nyc --reporter=html --reporter=text mocha 'build/test/**/*.js'", + "test": "nyc -x '**/test/**' --reporter=html --reporter=text mocha 'build/test/**/*.js'", "clean": "rimraf build/*", "check": "gts check", "compile": "tsc -p .", diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index aaf9cb422..efdd3886d 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -69,8 +69,9 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { // TODO - Define logic for list of spans for (const span of this.spansLocal) { - if (span.ended || !span.started) return; - span.truncate(); + if (!span.ended && span.started) { + span.truncate(); + } } this.tracer.onEndSpan(this); @@ -98,18 +99,18 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { * @param parentSpanId Span parent ID */ startSpan(name: string, type: string, parentSpanId?: string) { - if (!this.started) { + if (this.ended) { debug( - 'calling %s.startSpan() on un-started %s %o', this.className, + 'calling %s.startSpan() on ended %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; } - if (this.ended) { + if (!this.started) { debug( - 'calling %s.startSpan() on ended %s %o', this.className, + 'calling %s.startSpan() on un-started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; - } + } const newSpan = new SpanImpl(this); if (name) { newSpan.name = name; diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index 618becc48..eb719eef9 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -17,99 +17,154 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {Span,RootSpan,Tracer} from '../src/trace/model/types'; -import {SpanImpl} from '../src/trace/model/span'; import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -let tracer = new TracerImpl(); +import {RootSpan, Span, TraceOptions, Tracer} from '../src/trace/model/types'; + +const tracer = new TracerImpl(); -describe('RootSpan', function() { +describe('RootSpan', () => { /** * Should create a RootSpan instance */ - describe('new RootSpan()', function() { - it('should create a RootSpan instance', function() { - let root = new RootSpanImpl(tracer); - assert.ok(root instanceof SpanImpl); + describe('new RootSpan()', () => { + it('should create a RootSpan instance', () => { + const root = new RootSpanImpl(tracer); + assert.ok(root instanceof RootSpanImpl); + }); + }); + + /** + * Should create a RootSpan instance with options + */ + describe('new RootSpan() with options', () => { + it('should create a RootSpan instance with options', () => { + const trace = new RootSpanImpl(tracer); + const options = {name: 'test', traceContext: trace.traceContext} as + TraceOptions; + const root = new RootSpanImpl(tracer, options); + assert.ok(root instanceof RootSpanImpl); + }); + }); + + /** + * Should get span list from rootspan instance + */ + describe('get spans()', () => { + it('should get span list from rootspan instance', () => { + const root = new RootSpanImpl(tracer); + root.start(); + const span = root.startSpan('spanName', 'spanType'); + + for (const span of root.spans) { + assert.ok(span instanceof SpanImpl); + } + }); + }); + + /** + * Should get trace id from rootspan instance + */ + describe('new traceId()', () => { + it('should get trace id from rootspan instance', () => { + const root = new RootSpanImpl(tracer); + assert.equal(root.traceId, root.traceContext.traceId); }); }); /** * Should create and start a RootSpan instance */ - describe('start()', function() { - it('should start a RootSpan instance', function() { - let root = new RootSpanImpl(tracer); + describe('start()', () => { + it('should start a RootSpan instance', () => { + const root = new RootSpanImpl(tracer); root.start(); assert.ok(root.started); }); }); /** - * Should check type and a span was started + * Should create and start a new span instance */ - describe('startSpan()', function() { + describe('startSpan()', () => { let root, span; - before(function() { + before(() => { root = new RootSpanImpl(tracer); root.start(); span = root.startSpan('spanName', 'spanType'); }); - it('should check span instance type', function() { + it('should create span instance', () => { assert.ok(span instanceof SpanImpl); }); - it('should check if a new span was started', function() { + it('should start a span instance', () => { assert.ok(span.started); }); }); /** - * Should start and end a rootspan properly + * Should not start a span from a not started rootspan + */ + describe('startSpan() before start rootspan', () => { + it('should not create span', () => { + const root = new RootSpanImpl(tracer); + const span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); + }); + }); + + /** + * Should not create a span from a ended rootspan */ - describe('end()', function() { - it('should end the trace', function() { - let root = new RootSpanImpl(tracer); + describe('startSpan() after rootspan ended', () => { + it('should not create span', () => { + const root = new RootSpanImpl(tracer); root.start(); root.end(); - assert.ok(root.ended); + const span = root.startSpan('spanName', 'spanType'); + assert.ok(span == null); }); }); /** - * Should not end a rootspan which was not started + * Should end a rootspan instance */ - describe('end() before trace started', function() { - it('should not end trace', function() { - let root = new RootSpanImpl(tracer); + describe('end()', () => { + it('should end the rootspan instance', () => { + const root = new RootSpanImpl(tracer); + root.start(); root.end(); - assert.ok(!root.ended); + assert.ok(root.ended); }); }); /** - * Should not start a span from a not started rootspan + * Should not end a rootspan which was not started */ - describe('startSpan() before trace started', function() { - it('should not create span', function() { - let root = new RootSpanImpl(tracer); - let span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); + describe('end() before start rootspan', () => { + it('should not end rootspan', () => { + const root = new RootSpanImpl(tracer); + root.end(); + assert.ok(!root.ended); }); }); /** - * Should not create a span from a ended rootspan + * Should end all spans inside rootspan */ - describe('startSpan() after trace ended', function() { - it('should not create span', function() { - let root = new RootSpanImpl(tracer); + describe('end() before end all spans', () => { + it('should end all spans inside rootspan', () => { + const root = new RootSpanImpl(tracer); root.start(); + const span = root.startSpan('spanName', 'spanType'); root.end(); - let span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); + + for (const span of root.spans) { + assert.ok(span.ended); + } }); }); }); From 7837f51b7b7c80d014dbbd58f065eb5542b46c27 Mon Sep 17 00:00:00 2001 From: Luana Date: Tue, 17 Apr 2018 14:44:26 -0300 Subject: [PATCH 079/110] refactor: apply code guidelines rules to util.ts --- packages/opencensus-core/src/internal/util.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts index 76f758318..5a8cbf0b9 100644 --- a/packages/opencensus-core/src/internal/util.ts +++ b/packages/opencensus-core/src/internal/util.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import * as crypto from 'crypto' -import * as Debug from "debug" +import * as crypto from 'crypto'; +import * as Debug from 'debug'; -export const debug = Debug("opencensus"); +export const debug = Debug('opencensus'); -//TODO: rethink this snippet aproach -//--- Code snippet from Stackdriver Trace Agent +// TODO: rethink this snippet aproach +//--- Code snippet from Stackdriver Trace Agent // Use 6 bytes of randomness only as JS numbers are doubles not 64-bit ints. const SPAN_ID_RANDOM_BYTES = 6; @@ -35,6 +35,6 @@ const spanRandomBuffer = randomFillSync ? () => randomBytes(SPAN_ID_RANDOM_BYTES); export function randomSpanId() { - // tslint:disable-next-line:ban Needed to parse hexadecimal. - return parseInt(spanRandomBuffer().toString('hex'), 16).toString(); -} \ No newline at end of file + // tslint:disable-next-line:ban Needed to parse hexadecimal. + return parseInt(spanRandomBuffer().toString('hex'), 16).toString(); +} \ No newline at end of file From 84623b07f0534c94422144d0ac71c9bf09b000bc Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 17 Apr 2018 15:39:20 -0300 Subject: [PATCH 080/110] feat: added spans optional parameters --- .../src/trace/model/span-base-model.ts | 69 ++++++++++--- .../opencensus-core/src/trace/model/types.ts | 72 ++++++++++++-- .../opencensus-core/test/test-root-span.ts | 89 ++++++++++++++++- packages/opencensus-core/test/test-span.ts | 97 ++++++++++++++++++- 4 files changed, 302 insertions(+), 25 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 297ca4085..0020c9ecf 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -17,7 +17,8 @@ import { Clock } from '../../internal/clock'; import { debug, randomSpanId } from '../../internal/util'; import { Sampler } from '../config/types'; -import { TraceContext, Span, MapLabels, MapObjects } from './types'; +import { TraceContext, Span, Annotation, Attributes, + Link, MessageEvent } from './types'; export abstract class SpanBaseModel implements Span { @@ -28,16 +29,20 @@ export abstract class SpanBaseModel implements Span { private startedLocal = false; /** Indicates if this span was ended */ private endedLocal = false; - /** A set of attributes, each in the format [KEY]:[VALUE] */ - private attributes: MapLabels = {}; - /** A set of attributes on the annotation describing an event */ - private annotations: MapObjects = {}; /** Indicates if this span was forced to end */ private truncated = false; /** The Span ID of this span */ readonly id: string; - - remoteParent: string; + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: Attributes = {}; + /** A text annotation with a set of attributes. */ + annotations: Annotation[] = []; + /** An event describing a message sent/received between Spans. */ + messageEvents: MessageEvent[] = []; + /** Pointers from the current span to another span */ + links: Link[] = []; + /** If the parent span is in another process. */ + remoteParent: boolean; /** The span ID of this span's parent. If it's a root span, must be empty */ parentSpanId: string = null; /** The resource name of the span */ @@ -56,7 +61,8 @@ export abstract class SpanBaseModel implements Span { } abstract get traceId(): string; - + + /** Indicates if span was started. */ get started(): boolean { return this.startedLocal; @@ -120,19 +126,52 @@ export abstract class SpanBaseModel implements Span { * @param key Describes the value added. * @param value The result of an operation. */ - addAtribute(key: string, value: string) { - // TODO: maybe key and values must be truncate + addAtribute(key: string, value: string | number | boolean) { this.attributes[key] = value; } /** * Adds an annotation to the span. - * @param key Describes the value added. - * @param value The result of an operation. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation(description: string, timestamp: number, + attributes?: Attributes) { + this.annotations.push({ + description: description, + timestamp: timestamp, + attributes: attributes, + } as Annotation) + } + + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink(traceId: string, spanId: string, type: string, + attributes?: Attributes) { + this.links.push({ + traceId: traceId, + SpanId: spanId, + type: type, + attributes: attributes + } as Link) + } + + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. */ - addAnotation(key: string, value: string|number|boolean) { - // TODO: maybe keys and values must be truncate - this.annotations[key] = value; + addMessageEvent(type: string, id: string) { + this.messageEvents.push({ + type: type, + id: id, + } as MessageEvent) } /** Starts a span. */ diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 863a92d6b..ba65c814b 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -19,11 +19,41 @@ import { Sampler } from '../config/types'; /** Default type for functions */ export type Func = (...args: any[]) => T; -/** Maps a label to a string. Used in spans' attributes. */ -export interface MapLabels { [propName: string]: string; } +/** Maps a label to a string, number or boolean. */ +export interface Attributes { [attributeKey: string]: string|number|boolean; } -/** Maps a label to a string, number or boolean. Used in spans' annotations. */ -export interface MapObjects { [propName: string]: string|number|boolean; } +/** A text annotation with a set of attributes. */ +export interface Annotation { + /** A user-supplied message describing the event. */ + description: string, + /** A timestamp that maks the event. */ + timestamp: number, + /** A set of attributes on the annotation. */ + attributes: Attributes +} + +/** An event describing a message sent/received between Spans. */ +export interface MessageEvent { + /** Indicates whether the message was sent or received. */ + type: string, + /** An identifier for the MessageEvent's message. */ + id: string, +} + +/** + * A pointer from the current span to another span in the same trace or in a + * different trace. + */ +export interface Link { + /** The trace ID for a trace within a project. */ + traceId: string, + /** The span ID for a span within a trace. */ + SpanId: string, + /** The relationship of the current span relative to the linked. */ + type: string, + /** A set of attributes on the link. */ + attributes: Attributes +} /** Defines tracer configuration parameters */ export interface TracerConfig { @@ -76,7 +106,8 @@ export interface Span { /** The Span ID of this span */ readonly id: string; - remoteParent: string; + /** If the parent span is in another process. */ + remoteParent: boolean; /** The span ID of this span's parent. If it's a root span, must be empty */ parentSpanId: string; /** The resource name of the span */ @@ -85,6 +116,14 @@ export interface Span { type: string; /** A final status for this span */ status: number; + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: Attributes; + /** A text annotation with a set of attributes. */ + annotations: Annotation[]; + /** An event describing a message sent/received between Spans. */ + messageEvents: MessageEvent[]; + /** Pointers from the current span to another span */ + links: Link[]; /** A sampler that will decide if the span will be sampled or not */ sampler: Sampler; /** Constructs a new SpanBaseModel instance. */ @@ -118,10 +157,27 @@ export interface Span { addAtribute(key: string, value: string): void; /** * Adds an annotation to the span. - * @param key Describes the value added. - * @param value The result of an operation. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation(description: string, timestamp: number, + attributes?: Attributes): void; + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink(traceId: string, spanId: string, type: string, + attributes?: Attributes): void; + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. */ - addAnotation(key: string, value: string | number | boolean): void; + addMessageEvent(type: string, id: string): void; /** Starts a span. */ start(): void; /** Ends a span. */ diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index eb719eef9..687fe52cf 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -20,7 +20,8 @@ import * as mocha from 'mocha'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -import {RootSpan, Span, TraceOptions, Tracer} from '../src/trace/model/types'; +import {RootSpan, Span, TraceOptions, Tracer, Link, Annotation, Attributes, MessageEvent} + from '../src/trace/model/types'; const tracer = new TracerImpl(); @@ -167,4 +168,90 @@ describe('RootSpan', () => { } }); }); + + + /** + * Should add an attrinbutes + */ + describe('addAtribute()', function() { + it('should add an attribute', function() { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + ['String', 'Number', 'Boolean'].map(attType => { + rootSpan.addAtribute('testKey'+attType, 'testValue'+attType) + assert.equal(rootSpan.attributes['testKey'+attType], 'testValue'+attType); + }) + }); + }); + + /** + * Should add an annotation + */ + describe('addAnnotation()', function() { + it('should add an annotation', function() { + + function instanceOfAnnotation(object: any): object is Annotation { + return 'description' in object + && 'timestamp' in object + && 'attributes' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + rootSpan.addAnnotation('description test', Date.now(), {} as Attributes); + + assert.ok(rootSpan.annotations.length > 0) + assert.ok(instanceOfAnnotation(rootSpan.annotations[0])) + }); + }); + + /** + * Should add a Link. + */ + describe('addLink()', function() { + it('should add a Link', function() { + + function instanceOfLink(object: any): object is Link { + return 'traceId' in object + && 'SpanId' in object + && 'type' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.start(); + + const LINK_TYPE = 'CHILD_LINKED_SPAN' + rootSpan.addLink(rootSpan.traceId, span.id, LINK_TYPE) + + assert.ok(rootSpan.links.length > 0) + assert.ok(instanceOfLink(rootSpan.links[0])) + }); + }); + + /** + * Should add a Message Event. + */ + describe('addMessageEvent()', function() { + it('should add a Message Event', function() { + + function instanceOfLink(object: any): object is Link { + return 'type' in object + && 'id' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id') + + assert.ok(rootSpan.messageEvents.length > 0) + assert.ok(instanceOfLink(rootSpan.messageEvents[0])) + }); + }); + }); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 1a5c2bb1d..774450c5e 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -20,7 +20,8 @@ import * as mocha from 'mocha'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -import {Span} from '../src/trace/model/types'; +import {Span, Attributes, Annotation, Link, MessageEvent} + from '../src/trace/model/types'; const tracer = new TracerImpl(); @@ -110,4 +111,98 @@ describe('Span', () => { assert.ok(!span.ended); }); }); + + /** + * Should add an attrinbutes + */ + describe('addAtribute()', function() { + it('should add an attribute', function() { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.start(); + + ['String', 'Number', 'Boolean'].map(attType => { + span.addAtribute('testKey'+attType, 'testValue'+attType) + assert.equal(span.attributes['testKey'+attType], 'testValue'+attType); + }) + }); + }); + + /** + * Should add an annotation + */ + describe('addAnnotation()', function() { + it('should add an annotation', function() { + + function instanceOfAnnotation(object: any): object is Annotation { + return 'description' in object + && 'timestamp' in object + && 'attributes' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.start(); + + span.addAnnotation('description test', Date.now(), {} as Attributes); + + assert.ok(span.annotations.length > 0) + assert.ok(instanceOfAnnotation(span.annotations[0])) + }); + }); + + /** + * Should add a Link. + */ + describe('addLink()', function() { + it('should add a Link', function() { + + function instanceOfLink(object: any): object is Link { + return 'traceId' in object + && 'SpanId' in object + && 'type' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.start(); + + const LINK_TYPE = 'PARENT_LINKED_SPAN' + span.addLink(span.traceId, rootSpan.id, LINK_TYPE) + + assert.ok(span.links.length > 0) + assert.ok(instanceOfLink(span.links[0])) + }); + }); + + /** + * Should add a Message Event. + */ + describe('addMessageEvent()', function() { + it('should add a Message Event', function() { + + function instanceOfLink(object: any): object is Link { + return 'type' in object + && 'id' in object + } + + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + + const span = new SpanImpl(rootSpan); + span.start(); + + span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id') + + assert.ok(span.messageEvents.length > 0) + assert.ok(instanceOfLink(span.messageEvents[0])) + }); + }); + }); \ No newline at end of file From 89db611e01f21815cd60f699675148a277d7fdde Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 17 Apr 2018 16:59:11 -0300 Subject: [PATCH 081/110] feat: more general config interface --- .../opencensus-core/src/exporters/buffer.ts | 11 ++--- .../src/exporters/console-exporter.ts | 8 ++-- .../opencensus-core/src/exporters/types.ts | 9 +--- .../opencensus-core/src/trace/config/types.ts | 45 ++++++++++++------- .../src/trace/instrumentation/types.ts | 2 + .../src/trace/model/span-base-model.ts | 2 - .../opencensus-core/src/trace/model/tracer.ts | 41 ++++++++--------- .../opencensus-core/src/trace/model/types.ts | 26 +++-------- packages/opencensus-core/src/trace/types.ts | 8 ++-- packages/opencensus-core/test/test-tracer.ts | 19 +++++--- 10 files changed, 85 insertions(+), 86 deletions(-) diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 7bc7ee566..a681991be 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -21,11 +21,8 @@ import {RootSpan} from '../trace/model/types'; import {OnEndSpanEventListener} from '../trace/model/types'; import {Exporter} from './types'; -import {ExporterOptions} from './types'; +import {Config, BufferConfig} from '../trace/config/types'; -// TODO: Implement default size based on application size -const DEFAULT_BUFFER_SIZE = 3; -const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds /** * Controls the sending of traces to exporters @@ -42,10 +39,10 @@ export class Buffer { /** Indicates when the buffer timeout is running */ private bufferTimeoutInProgress: boolean = false; - constructor(exporter: Exporter, bufferSize?: number, bufferTimeout?: number) { - this.bufferSize = bufferSize || DEFAULT_BUFFER_SIZE; - this.bufferTimeout = bufferTimeout || DEFAULT_BUFFER_TIMEOUT; + constructor(exporter: Exporter, config: BufferConfig) { this.exporter = exporter; + this.bufferSize = config.bufferSize; + this.bufferTimeout = config.bufferTimeout; return this; } diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index 78ca983a7..38ba62f60 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -14,12 +14,12 @@ * limitations under the License. */ -import {Exporter, ExporterOptions} from '../exporters/types'; +import {Exporter, ExporterConfig} from '../exporters/types'; import {RootSpan} from '../trace/model/types'; - import {Buffer} from './buffer'; + /** Do not send span data */ export class NoopExporter implements Exporter { onEndSpan(root: RootSpan) {} @@ -30,8 +30,8 @@ export class NoopExporter implements Exporter { export class ConsoleLogExporter implements Exporter { private buffer: Buffer; - constructor(options: ExporterOptions) { - this.buffer = new Buffer(this, options.bufferSize, options.bufferTimeout); + constructor(config: ExporterConfig) { + this.buffer = new Buffer(this, config); } onEndSpan(root: RootSpan) { diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 5ef75e076..06d8ac0b8 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -16,15 +16,10 @@ import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; +import { BufferConfig } from '../trace/config/types'; export interface Exporter extends OnEndSpanEventListener { publish(rootSpans: RootSpan[]); } -/** - * TODO: Interface to exporters options - */ -export interface ExporterOptions { - bufferSize?: number; - bufferTimeout?: number; -} \ No newline at end of file +export type ExporterConfig = BufferConfig; diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index da0d98d61..bef67f62c 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -1,18 +1,5 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +import {Exporter} from '../../exporters/types'; +import {PluginNames} from '../instrumentation/types'; /** * This interface represent the probability of a tracer. @@ -49,3 +36,31 @@ export interface Sampler { */ shouldSample(traceId: string): boolean; } + +/** + * Interface configuration for a buffer + */ +export interface BufferConfig { + bufferSize?: number; + bufferTimeout?: number +} + +/** Defines tracer configuration parameters */ +export interface TracerConfig { + /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ + samplingRate?: number; + /** Determines the ignored (or blacklisted) URLs */ + ignoreUrls?: Array; +} + +/** Available configuration options. */ +export interface TracingConfig { + logLevel?: number; + maximumLabelValueSize?: number; + plugins?: PluginNames; + exporter?: Exporter; +} + +export type Config = TracingConfig&TracerConfig&BufferConfig; + + diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index 7ef805e94..bb835f42c 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -23,3 +23,5 @@ export interface Plugin { applyPatch(module: {}, tracer: Tracer, version: string): any; applyUnpatch(): void; } + +export type PluginNames = {[pluginName: string]: string;}; diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 0020c9ecf..d31dad29d 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -51,8 +51,6 @@ export abstract class SpanBaseModel implements Span { type: string = null; /** A final status for this span */ status: number; - /** A sampler that will decide if the span will be sampled or not */ - sampler: Sampler; /** Constructs a new SpanBaseModel instance. */ constructor() { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index cfcf8dca8..43165c7a6 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -17,9 +17,10 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; import {RootSpan, Span} from './types'; -import {TraceOptions, TracerConfig, defaultConfig, Tracer} from './types'; +import {TraceOptions, Tracer} from './types'; import {OnEndSpanEventListener, Func } from './types'; -import {Sampler} from '../config/types'; +import {Sampler, TracerConfig} from '../config/types'; +import {Config} from '../config/types'; import {SpanImpl} from './span'; import {SamplerImpl} from '../config/sampler' import {RootSpanImpl} from './rootspan'; @@ -31,12 +32,14 @@ export class TracerImpl implements Tracer { private activeLocal: boolean; private contextManager: cls.Namespace; private config: TracerConfig; + sampler: Sampler; //TODO: simple solution - to be rewied in future private eventListenersLocal: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; - + + samplingRate: number; constructor() { @@ -52,9 +55,10 @@ export class TracerImpl implements Tracer { this.contextManager.set('rootspan', root); } - start(config?: TracerConfig): Tracer { + start(config: TracerConfig): Tracer { this.activeLocal = true; - this.config = config || defaultConfig; + this.config = config; + this.sampler = new SamplerImpl().probability(config.samplingRate); return this; } @@ -72,22 +76,19 @@ export class TracerImpl implements Tracer { startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { return this.contextManager.runAndReturn((root) => { - const newRoot = new RootSpanImpl (this, options); - this.currentRootSpan = newRoot; - if (!options) { - options = {} as TraceOptions; - } - // if (!options.sampler) { - // options.sampler = new SamplerImpl(newRoot.traceId); - // options.sampler.always(); - // } - // newRoot.sampler = options.sampler; - newRoot.sampler = new SamplerImpl().probability(this.samplingRate); - if (newRoot.sampler.shouldSample(newRoot.traceId)) { - newRoot.start(); - return fn(newRoot); + let newRoot = null; + if(this.active) { + newRoot = new RootSpanImpl (this, options); + this.currentRootSpan = newRoot; + + if (this.sampler.shouldSample(newRoot.traceId)) { + newRoot.start(); + return fn(newRoot); + } + } else { + debug("Tracer is inactive, can't start new RootSpan") } - return fn(null); + return fn(newRoot); }); } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index ba65c814b..d114bb382 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Sampler } from '../config/types'; +import { Sampler, Config, TracerConfig } from '../config/types'; /** Default type for functions */ export type Func = (...args: any[]) => T; @@ -55,18 +55,6 @@ export interface Link { attributes: Attributes } -/** Defines tracer configuration parameters */ -export interface TracerConfig { - /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ - sampleRate?: number; - /** Determines the ignored (or blacklisted) URLs */ - ignoreUrls?: Array; -} - -/** Defines a default tracer configuration */ -export const defaultConfig: TracerConfig = { - sampleRate: 1.0 -}; /** Defines the trace options */ export interface TraceOptions { @@ -74,8 +62,6 @@ export interface TraceOptions { name: string; /** Trace context */ traceContext?: TraceContext; - /** Sampler */ - sampler?: Sampler; /** Span type */ type?: string; } @@ -124,8 +110,6 @@ export interface Span { messageEvents: MessageEvent[]; /** Pointers from the current span to another span */ links: Link[]; - /** A sampler that will decide if the span will be sampled or not */ - sampler: Sampler; /** Constructs a new SpanBaseModel instance. */ readonly traceId: string; /** Indicates if span was started. */ @@ -202,10 +186,12 @@ export interface RootSpan extends Span, OnEndSpanEventListener { /** Interface for Tracer */ export interface Tracer { + /** Get and set the currentRootSpan to tracer instance */ currentRootSpan: RootSpan; - - samplingRate: number; + + /** A sampler that will decide if the span will be sampled or not */ + sampler: Sampler; /** Get the eventListeners from tracer instance */ readonly eventListeners: OnEndSpanEventListener[]; @@ -217,7 +203,7 @@ export interface Tracer { * @param config Configuration for tracer instace * @returns A tracer instance started */ - start(config?: TracerConfig): Tracer; + start(config: TracerConfig): Tracer; /** Stop the tracer instance */ stop(): void; diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 8846424a0..51c6a054a 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -17,15 +17,15 @@ import {Tracer} from './model/types'; import {Sampler} from './config/types'; import {Exporter} from '../exporters/types'; +import {Config} from './config/types'; export interface Tracing { readonly tracer: Tracer; // readonly sampler: Sampler; readonly exporter: Exporter; - start(opstion?:OptionsTracing): Tracing; + start(config?:Config): Tracing; stop(): void; + registerExporter(exporter: Exporter): Tracing; } -export interface OptionsTracing { - samplingRate ?: number; -} + diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 62f7a308c..3839f48a5 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -18,10 +18,15 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import {Span,RootSpan,Tracer} from '../src/trace/model/types'; -import { Exporter } from '../src/exporters/types'; -import { TracerImpl } from '../src/trace/model/tracer'; -import { RootSpanImpl } from '../src/trace/model/rootspan'; -import { SpanImpl } from '../src/trace/model/span'; +import {Exporter} from '../src/exporters/types'; +import {TracerImpl} from '../src/trace/model/tracer'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {SpanImpl} from '../src/trace/model/span'; +import {TracerConfig} from '../src/trace/config/types'; + + const defaultConfig: TracerConfig = { + samplingRate: 1 +} describe('Tracer', function () { @@ -38,13 +43,13 @@ describe('Tracer', function () { describe('start()', function () { it('should return a tracer instance', function () { let tracer = new TracerImpl(); - let tracerStarted = tracer.start(); + let tracerStarted = tracer.start(defaultConfig); assert.ok(tracerStarted instanceof TracerImpl); }); it('the trace was started', function () { let tracer = new TracerImpl(); - let tracerStarted = tracer.start(); + let tracerStarted = tracer.start(defaultConfig); assert.ok(tracerStarted.active); }); }); @@ -53,7 +58,7 @@ describe('Tracer', function () { it('should start the rootSpan', function () { let tracer = new TracerImpl(); - tracer.start(); + tracer.start(defaultConfig); let rootSpan = tracer.startRootSpan(options, callback); assert.ok(rootSpan.started); From 19b9bceaafee7b79c05640eb5aff0a7d4c0ff63b Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 17 Apr 2018 16:59:18 -0300 Subject: [PATCH 082/110] test: adding unit test to buffer.ts --- packages/opencensus-core/test/test-buffer.ts | 92 ++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 packages/opencensus-core/test/test-buffer.ts diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts new file mode 100644 index 000000000..b51596a1f --- /dev/null +++ b/packages/opencensus-core/test/test-buffer.ts @@ -0,0 +1,92 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {Buffer} from '../src/exporters/buffer'; +import {NoopExporter} from '../src/exporters/consolelog-exporter'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {TracerImpl} from '../src/trace/model/tracer'; + +const exporter = new NoopExporter(); +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds +const tracer = new TracerImpl(); + + +describe('Buffer', () => { + /** + * Should create a Buffer with exporter, DEFAULT_BUFFER_SIZE and + * DEFAULT_BUFFER_TIMEOUT + */ + describe('new Buffer()', () => { + it('should create a Buffer instance', () => { + const buffer = + new Buffer(exporter, DEFAULT_BUFFER_SIZE, DEFAULT_BUFFER_TIMEOUT); + assert.ok(buffer instanceof Buffer); + }); + }); + + /** + * Should return the Buffer + */ + describe('setBufferSize', () => { + it('should return the Buffer instance', () => { + const buffer = new Buffer(exporter); + const bufferResize = buffer.setBufferSize(DEFAULT_BUFFER_SIZE); + assert.ok(bufferResize instanceof Buffer); + }); + }); + + /** + * Should return the Buffer with rootspan + */ + describe('addToBuffer', () => { + it('should return the Buffer instance', () => { + const buffer = new Buffer(exporter); + const rootSpan = new RootSpanImpl(tracer); + const bufferAdd = buffer.addToBuffer(rootSpan); + assert.ok(bufferAdd instanceof Buffer); + }); + }); + + /** + * Should return the Buffer without rootspan + */ + describe('addToBuffer force flush ', () => { + it('should return the Buffer instance', () => { + const buffer = new Buffer(exporter); + const bufferResize = buffer.setBufferSize(0); + const rootSpan = new RootSpanImpl(tracer); + const bufferAdd = bufferResize.addToBuffer(rootSpan); + assert.ok(bufferAdd instanceof Buffer); + }); + }); + + /** + * Should return the Buffer without rootspan + */ + describe('addToBuffer force flush by timeout ', () => { + it('should return the Buffer instance', () => { + const buffer = new Buffer(exporter, DEFAULT_BUFFER_SIZE, 0); + const rootSpan = new RootSpanImpl(tracer); + let bufferAdd = buffer.addToBuffer(rootSpan); + bufferAdd = buffer.addToBuffer(rootSpan); + assert.ok(bufferAdd instanceof Buffer); + }); + }); +}); \ No newline at end of file From 1d0bafe5f15874612575bbbe54e7312e9b489723 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 17 Apr 2018 18:56:02 -0300 Subject: [PATCH 083/110] fix: some tests and tslint issues --- .../opencensus-core/src/exporters/buffer.ts | 4 +- packages/opencensus-core/src/index.ts | 4 +- .../opencensus-core/src/trace/config/types.ts | 2 +- .../src/trace/instrumentation/base-plugin.ts | 6 +- .../src/trace/instrumentation/types.ts | 1 + .../src/trace/model/span-base-model.ts | 24 ++-- .../opencensus-core/src/trace/model/tracer.ts | 10 +- .../opencensus-core/src/trace/model/types.ts | 19 +-- packages/opencensus-core/src/trace/types.ts | 34 +++++- packages/opencensus-core/test/test-buffer.ts | 16 ++- .../opencensus-core/test/test-root-span.ts | 71 +++++------ packages/opencensus-core/test/test-span.ts | 77 ++++++------ packages/opencensus-core/test/test-tracer.ts | 114 +++++++++--------- 13 files changed, 205 insertions(+), 177 deletions(-) diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index a681991be..4d851792f 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -35,9 +35,9 @@ export class Buffer { /** Max time for a buffer can wait before being sent */ private bufferTimeout: number; /** Manage when the buffer timeout needs to be reseted */ - private resetTimeout: boolean = false; + private resetTimeout = false; /** Indicates when the buffer timeout is running */ - private bufferTimeoutInProgress: boolean = false; + private bufferTimeoutInProgress = false; constructor(exporter: Exporter, config: BufferConfig) { this.exporter = exporter; diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 293837094..5389e0570 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -15,7 +15,7 @@ */ -// opencensus core api interfaces +// opencensus core api interfaces export * from './trace/types'; export * from './trace/model/types'; export * from './trace/config/types'; @@ -33,7 +33,7 @@ export * from './trace/config/sampler'; // base instrumetation class export * from './trace/instrumentation/baseplugin'; -// console exporter and buffer impls +// console exporter and buffer impls export * from './exporters/buffer'; export * from './exporters/consolelog-exporter'; diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index bef67f62c..82b0d11fb 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -42,7 +42,7 @@ export interface Sampler { */ export interface BufferConfig { bufferSize?: number; - bufferTimeout?: number + bufferTimeout?: number; } /** Defines tracer configuration parameters */ diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 7abacd40b..ceb8c7a89 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -20,6 +20,7 @@ import {Tracer} from '../model/types'; * This class represent the base to patch plugin */ export abstract class BasePlugin { + // tslint:disable:no-any exporter: any; moduleName: string; tracer: Tracer; @@ -34,14 +35,15 @@ export abstract class BasePlugin { * @param tracer tracer relating to context * @param version module version description */ + // tslint:disable:no-any protected setPluginContext(exporter: any, tracer: Tracer, version: string) { this.exporter = exporter; this.tracer = tracer; this.version = version; } - protected wrap(nodule, name, wrapper ) { - shimmer.wrap(nodule, name, wrapper ) + protected wrap(nodule, name, wrapper) { + shimmer.wrap(nodule, name, wrapper); } protected unwrap(nodule, name) { diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index bb835f42c..731e368f7 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -20,6 +20,7 @@ import {Tracer} from "../model/types"; * Interface Plugin to apply patch. */ export interface Plugin { + // tslint:disable:no-any applyPatch(module: {}, tracer: Tracer, version: string): any; applyUnpatch(): void; } diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index d31dad29d..152ea501e 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -137,10 +137,10 @@ export abstract class SpanBaseModel implements Span { addAnnotation(description: string, timestamp: number, attributes?: Attributes) { this.annotations.push({ - description: description, - timestamp: timestamp, - attributes: attributes, - } as Annotation) + 'description': description, + 'timestamp': timestamp, + 'attributes': attributes, + } as Annotation); } /** @@ -153,11 +153,11 @@ export abstract class SpanBaseModel implements Span { addLink(traceId: string, spanId: string, type: string, attributes?: Attributes) { this.links.push({ - traceId: traceId, - SpanId: spanId, - type: type, - attributes: attributes - } as Link) + 'traceId': traceId, + 'spanId': spanId, + 'type': type, + 'attributes': attributes + } as Link); } /** @@ -167,9 +167,9 @@ export abstract class SpanBaseModel implements Span { */ addMessageEvent(type: string, id: string) { this.messageEvents.push({ - type: type, - id: id, - } as MessageEvent) + 'type': type, + 'id': id, + } as MessageEvent); } /** Starts a span. */ diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 43165c7a6..aacae8aab 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -22,7 +22,7 @@ import {OnEndSpanEventListener, Func } from './types'; import {Sampler, TracerConfig} from '../config/types'; import {Config} from '../config/types'; import {SpanImpl} from './span'; -import {SamplerImpl} from '../config/sampler' +import {SamplerImpl} from '../config/sampler'; import {RootSpanImpl} from './rootspan'; @@ -38,9 +38,6 @@ export class TracerImpl implements Tracer { private eventListenersLocal: OnEndSpanEventListener[] = []; //TODO: temp solution private endedTraces: RootSpan[] = []; - - - samplingRate: number; constructor() { this.activeLocal = false; @@ -79,14 +76,13 @@ export class TracerImpl implements Tracer { let newRoot = null; if(this.active) { newRoot = new RootSpanImpl (this, options); - this.currentRootSpan = newRoot; - if (this.sampler.shouldSample(newRoot.traceId)) { newRoot.start(); + this.currentRootSpan = newRoot; return fn(newRoot); } } else { - debug("Tracer is inactive, can't start new RootSpan") + debug("Tracer is inactive, can't start new RootSpan"); } return fn(newRoot); }); diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index d114bb382..01295bf5e 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -17,6 +17,7 @@ import { Sampler, Config, TracerConfig } from '../config/types'; /** Default type for functions */ +// tslint:disable:no-any export type Func = (...args: any[]) => T; /** Maps a label to a string, number or boolean. */ @@ -25,19 +26,19 @@ export interface Attributes { [attributeKey: string]: string|number|boolean; } /** A text annotation with a set of attributes. */ export interface Annotation { /** A user-supplied message describing the event. */ - description: string, + description: string; /** A timestamp that maks the event. */ - timestamp: number, + timestamp: number; /** A set of attributes on the annotation. */ - attributes: Attributes + attributes: Attributes; } /** An event describing a message sent/received between Spans. */ export interface MessageEvent { /** Indicates whether the message was sent or received. */ - type: string, + type: string; /** An identifier for the MessageEvent's message. */ - id: string, + id: string; } /** @@ -46,13 +47,13 @@ export interface MessageEvent { */ export interface Link { /** The trace ID for a trace within a project. */ - traceId: string, + traceId: string; /** The span ID for a span within a trace. */ - SpanId: string, + spanId: string; /** The relationship of the current span relative to the linked. */ - type: string, + type: string; /** A set of attributes on the link. */ - attributes: Attributes + attributes: Attributes; } diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 51c6a054a..5da4da791 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -19,13 +19,43 @@ import {Sampler} from './config/types'; import {Exporter} from '../exporters/types'; import {Config} from './config/types'; +//TODO: Improve JSDoc +/** + * Main interface for tracing. Holds instances for {@link Tracer} and + * {@link Exporter}. + * + */ export interface Tracing { + + /** + * Returns the {@link Tracer} object responsible for managing a trace. + * @return the {@link Tracer} implementation. + */ readonly tracer: Tracer; - // readonly sampler: Sampler; + + /** + * Returns the {@link Exportert} + * @return the {@link ExportComponent} implementation. + */ readonly exporter: Exporter; - start(config?:Config): Tracing; + + /** + * Enable tracing process. + * @param userConfig Configuration provided by a client + */ + start(userConfig?:Config): Tracing; + + /** + * Stop tracing. + * + */ stop(): void; + + /** + * Registers an exporter to send the collected traces to. + * @param exporter The exporter to send the traces to. + */ registerExporter(exporter: Exporter): Tracing; } diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts index b51596a1f..84a6d4fd4 100644 --- a/packages/opencensus-core/test/test-buffer.ts +++ b/packages/opencensus-core/test/test-buffer.ts @@ -27,6 +27,10 @@ const DEFAULT_BUFFER_SIZE = 3; const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds const tracer = new TracerImpl(); +const defaultBufferConfig = { + bufferSize: DEFAULT_BUFFER_SIZE, + bufferTimeout: DEFAULT_BUFFER_TIMEOUT +}; describe('Buffer', () => { /** @@ -35,8 +39,7 @@ describe('Buffer', () => { */ describe('new Buffer()', () => { it('should create a Buffer instance', () => { - const buffer = - new Buffer(exporter, DEFAULT_BUFFER_SIZE, DEFAULT_BUFFER_TIMEOUT); + const buffer = new Buffer(exporter, defaultBufferConfig); assert.ok(buffer instanceof Buffer); }); }); @@ -46,7 +49,7 @@ describe('Buffer', () => { */ describe('setBufferSize', () => { it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter); + const buffer = new Buffer(exporter, defaultBufferConfig); const bufferResize = buffer.setBufferSize(DEFAULT_BUFFER_SIZE); assert.ok(bufferResize instanceof Buffer); }); @@ -57,7 +60,7 @@ describe('Buffer', () => { */ describe('addToBuffer', () => { it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter); + const buffer = new Buffer(exporter, defaultBufferConfig); const rootSpan = new RootSpanImpl(tracer); const bufferAdd = buffer.addToBuffer(rootSpan); assert.ok(bufferAdd instanceof Buffer); @@ -69,7 +72,7 @@ describe('Buffer', () => { */ describe('addToBuffer force flush ', () => { it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter); + const buffer = new Buffer(exporter, defaultBufferConfig); const bufferResize = buffer.setBufferSize(0); const rootSpan = new RootSpanImpl(tracer); const bufferAdd = bufferResize.addToBuffer(rootSpan); @@ -82,7 +85,8 @@ describe('Buffer', () => { */ describe('addToBuffer force flush by timeout ', () => { it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter, DEFAULT_BUFFER_SIZE, 0); + const buffer = new Buffer( + exporter, {bufferSize: DEFAULT_BUFFER_SIZE, bufferTimeout: 0}); const rootSpan = new RootSpanImpl(tracer); let bufferAdd = buffer.addToBuffer(rootSpan); bufferAdd = buffer.addToBuffer(rootSpan); diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index 687fe52cf..7ec45a30a 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -20,8 +20,7 @@ import * as mocha from 'mocha'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -import {RootSpan, Span, TraceOptions, Tracer, Link, Annotation, Attributes, MessageEvent} - from '../src/trace/model/types'; +import {Annotation, Attributes, Link, MessageEvent, RootSpan, Span, TraceOptions, Tracer} from '../src/trace/model/types'; const tracer = new TracerImpl(); @@ -173,85 +172,81 @@ describe('RootSpan', () => { /** * Should add an attrinbutes */ - describe('addAtribute()', function() { - it('should add an attribute', function() { + describe('addAtribute()', () => { + it('should add an attribute', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); ['String', 'Number', 'Boolean'].map(attType => { - rootSpan.addAtribute('testKey'+attType, 'testValue'+attType) - assert.equal(rootSpan.attributes['testKey'+attType], 'testValue'+attType); - }) + rootSpan.addAtribute('testKey' + attType, 'testValue' + attType); + assert.equal( + rootSpan.attributes['testKey' + attType], 'testValue' + attType); + }); }); }); /** * Should add an annotation */ - describe('addAnnotation()', function() { - it('should add an annotation', function() { - + describe('addAnnotation()', () => { + it('should add an annotation', () => { + // tslint:disable:no-any function instanceOfAnnotation(object: any): object is Annotation { - return 'description' in object - && 'timestamp' in object - && 'attributes' in object + return 'description' in object && 'timestamp' in object && + 'attributes' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); rootSpan.addAnnotation('description test', Date.now(), {} as Attributes); - - assert.ok(rootSpan.annotations.length > 0) - assert.ok(instanceOfAnnotation(rootSpan.annotations[0])) + + assert.ok(rootSpan.annotations.length > 0); + assert.ok(instanceOfAnnotation(rootSpan.annotations[0])); }); }); /** * Should add a Link. */ - describe('addLink()', function() { - it('should add a Link', function() { - + describe('addLink()', () => { + it('should add a Link', () => { + // tslint:disable:no-any function instanceOfLink(object: any): object is Link { - return 'traceId' in object - && 'SpanId' in object - && 'type' in object + return 'traceId' in object && 'spanId' in object && 'type' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); - const LINK_TYPE = 'CHILD_LINKED_SPAN' - rootSpan.addLink(rootSpan.traceId, span.id, LINK_TYPE) - - assert.ok(rootSpan.links.length > 0) - assert.ok(instanceOfLink(rootSpan.links[0])) + const LINK_TYPE = 'CHILD_LINKED_SPAN'; + rootSpan.addLink(rootSpan.traceId, span.id, LINK_TYPE); + + assert.ok(rootSpan.links.length > 0); + assert.ok(instanceOfLink(rootSpan.links[0])); }); }); /** * Should add a Message Event. */ - describe('addMessageEvent()', function() { - it('should add a Message Event', function() { - + describe('addMessageEvent()', () => { + it('should add a Message Event', () => { + // tslint:disable:no-any function instanceOfLink(object: any): object is Link { - return 'type' in object - && 'id' in object + return 'type' in object && 'id' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id') - - assert.ok(rootSpan.messageEvents.length > 0) - assert.ok(instanceOfLink(rootSpan.messageEvents[0])) + rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); + + assert.ok(rootSpan.messageEvents.length > 0); + assert.ok(instanceOfLink(rootSpan.messageEvents[0])); }); }); - }); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 774450c5e..2451aad49 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -20,8 +20,7 @@ import * as mocha from 'mocha'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -import {Span, Attributes, Annotation, Link, MessageEvent} - from '../src/trace/model/types'; +import {Annotation, Attributes, Link, MessageEvent, Span} from '../src/trace/model/types'; const tracer = new TracerImpl(); @@ -115,94 +114,90 @@ describe('Span', () => { /** * Should add an attrinbutes */ - describe('addAtribute()', function() { - it('should add an attribute', function() { + describe('addAtribute()', () => { + it('should add an attribute', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); ['String', 'Number', 'Boolean'].map(attType => { - span.addAtribute('testKey'+attType, 'testValue'+attType) - assert.equal(span.attributes['testKey'+attType], 'testValue'+attType); - }) + span.addAtribute('testKey' + attType, 'testValue' + attType); + assert.equal( + span.attributes['testKey' + attType], 'testValue' + attType); + }); }); }); /** * Should add an annotation */ - describe('addAnnotation()', function() { - it('should add an annotation', function() { - + describe('addAnnotation()', () => { + it('should add an annotation', () => { + // tslint:disable:no-any function instanceOfAnnotation(object: any): object is Annotation { - return 'description' in object - && 'timestamp' in object - && 'attributes' in object + return 'description' in object && 'timestamp' in object && + 'attributes' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); span.addAnnotation('description test', Date.now(), {} as Attributes); - - assert.ok(span.annotations.length > 0) - assert.ok(instanceOfAnnotation(span.annotations[0])) + + assert.ok(span.annotations.length > 0); + assert.ok(instanceOfAnnotation(span.annotations[0])); }); }); /** * Should add a Link. */ - describe('addLink()', function() { - it('should add a Link', function() { - + describe('addLink()', () => { + it('should add a Link', () => { + // tslint:disable:no-any function instanceOfLink(object: any): object is Link { - return 'traceId' in object - && 'SpanId' in object - && 'type' in object + return 'traceId' in object && 'spanId' in object && 'type' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); - const LINK_TYPE = 'PARENT_LINKED_SPAN' - span.addLink(span.traceId, rootSpan.id, LINK_TYPE) - - assert.ok(span.links.length > 0) - assert.ok(instanceOfLink(span.links[0])) + const LINK_TYPE = 'PARENT_LINKED_SPAN'; + span.addLink(span.traceId, rootSpan.id, LINK_TYPE); + + assert.ok(span.links.length > 0); + assert.ok(instanceOfLink(span.links[0])); }); }); /** * Should add a Message Event. */ - describe('addMessageEvent()', function() { - it('should add a Message Event', function() { - + describe('addMessageEvent()', () => { + it('should add a Message Event', () => { + // tslint:disable:no-any function instanceOfLink(object: any): object is Link { - return 'type' in object - && 'id' in object + return 'type' in object && 'id' in object; } const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); - + const span = new SpanImpl(rootSpan); span.start(); - span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id') - - assert.ok(span.messageEvents.length > 0) - assert.ok(instanceOfLink(span.messageEvents[0])) + span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); + + assert.ok(span.messageEvents.length > 0); + assert.ok(instanceOfLink(span.messageEvents[0])); }); }); - }); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 3839f48a5..26f5a0047 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -17,87 +17,91 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {Span,RootSpan,Tracer} from '../src/trace/model/types'; import {Exporter} from '../src/exporters/types'; -import {TracerImpl} from '../src/trace/model/tracer'; +import {TracerConfig} from '../src/trace/config/types'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; -import {TracerConfig} from '../src/trace/config/types'; +import {TracerImpl} from '../src/trace/model/tracer'; +import {RootSpan, Span, Tracer} from '../src/trace/model/types'; - const defaultConfig: TracerConfig = { +const defaultConfig: TracerConfig = { samplingRate: 1 -} +}; -describe('Tracer', function () { - const options = { name: "test" }; - const callback = (root) => { return root; } +describe('Tracer', () => { + const options = {name: 'test'}; - describe('new Tracer()', function () { - it('should create a Tracer instance', function () { - let tracer = new TracerImpl(); + describe('new Tracer()', () => { + it('should create a Tracer instance', () => { + const tracer = new TracerImpl(); assert.ok(tracer instanceof TracerImpl); }); }); - describe('start()', function () { - it('should return a tracer instance', function () { - let tracer = new TracerImpl(); - let tracerStarted = tracer.start(defaultConfig); + describe('start()', () => { + it('should return a tracer instance', () => { + const tracer = new TracerImpl(); + const tracerStarted = tracer.start(defaultConfig); assert.ok(tracerStarted instanceof TracerImpl); }); - it('the trace was started', function () { - let tracer = new TracerImpl(); - let tracerStarted = tracer.start(defaultConfig); + it('the trace was started', () => { + const tracer = new TracerImpl(); + const tracerStarted = tracer.start(defaultConfig); assert.ok(tracerStarted.active); }); }); - describe('startRootSpan()', function () { - - it('should start the rootSpan', function () { - let tracer = new TracerImpl(); + describe('startRootSpan()', () => { + it('should start the rootSpan', () => { + const tracer = new TracerImpl(); tracer.start(defaultConfig); - let rootSpan = tracer.startRootSpan(options, callback); - - assert.ok(rootSpan.started); + tracer.startRootSpan(options, (root) => { + assert.ok(root.started); + }); }); - }); - describe('end()', function () { - it('should end current trace', function () { - let tracer = new TracerImpl(); - let rootSpan = tracer.startRootSpan(options, callback); - rootSpan.end(); - assert.ok(rootSpan.ended); + describe('end()', () => { + it('should end current trace', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + const rootSpan = tracer.startRootSpan(options, (root) => { + root.end(); + assert.ok(root.ended); + }); + }); }); - }); - - describe('clearCurrentRootSpan()', function () { - it('should set the current root span to null', function () { - let tracer = new TracerImpl(); - let rootSpan = tracer.startRootSpan(options, callback); - tracer.clearCurrentTrace(); - - assert.ok(tracer.currentRootSpan == null); - }); - }); - describe('startSpan()', function () { - it('should return a Span instance', function () { - let tracer = new TracerImpl(); - let rootSpan = tracer.startRootSpan(options, callback); - let span = tracer.startSpan("spanName", "spanType"); - assert.ok(span instanceof SpanImpl); + describe('clearCurrentRootSpan()', () => { + it('should set the current root span to null', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (root) => { + tracer.clearCurrentTrace(); + assert.ok(tracer.currentRootSpan == null); + }); + }); }); - it('should start a span', function () { - let tracer = new TracerImpl(); - let rootSpan = tracer.startRootSpan(options, callback); - let span = tracer.startSpan("spanName", "spanType"); - assert.ok(span.started); + describe('startSpan()', () => { + it('should return a Span instance', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (root) => { + const span = tracer.startSpan('spanName', 'spanType'); + assert.ok(span instanceof SpanImpl); + }); + }); + + it('should start a span', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (root) => { + const span = tracer.startSpan('spanName', 'spanType'); + assert.ok(span.started); + }); + }); }); }); - }); \ No newline at end of file From 34a77444c5d073e01efba2f575da4d2e6ef633e2 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Wed, 18 Apr 2018 09:34:34 -0300 Subject: [PATCH 084/110] doc: added readme.md files --- README.md | 106 +++++++++++++++++++++++++++-- packages/opencensus-core/README.md | 21 ++++-- 2 files changed, 117 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b2808a59d..1ad37d97c 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,109 @@ -# OpenCensus - A stats collection and distributed tracing framework +# OpenCensus Libraries for Node.js [![Gitter chat][gitter-image]][gitter-url] -OpenCensus is a toolkit for collecting application performance and behavior data. It currently -includes 3 apis: stats, tracing and tags. +OpenCensus Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. Right now OpenCensus for Node.js supports custom tracing and automatic tracing for http and mongodb. The library is in alpha stage and the API is subject to change. -Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this -project. +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. + +Note: This code was tested on the following Node versions: +- v6.10.0 (for console exporter only) +- v9.8.0 (for Stackdriver and Zipkin exporters) + +___ + +## OpenCensus Setup + +1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> +```bash +git clone https://github.com/census-instrumentation/opencensus-node.git +``` + +**TODO Ver com Fábio se o usuário terá que compilar** + +2. Switch to branch `dev` with: +```bash +git checkout dev +``` + +3. Navigate to the OpenCensus Node project folder and install the dependencies with: +```bash +cd opencensus-node +npm install +``` + +4. Compile the TypeScript code into JavaScript with: +``` +node_modules/.bin/tsc +``` + +___ + +## Instrumenting an Application + +Navigate to your application folder. Inside it's `node_modules` folder, create a directory named `@opencensus`: +``` +cd node_modules +mkdir @opencensus +``` + +Navigate to your new `@opencensus` folder and create a symlink to OpenCensus Node package with: +```bash +cd @opencensus +ln -s /packages/opencensus-nodejs/ opencensus-nodejs +``` + +### Using Stackdriver Exporter + +To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: +```bash +export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json +``` + +Add the OpenCensus Stackdriver Exporter package to your project's `node_modules/@opencensus` folder with: +``` +cd node_modules/@opencensus +ln -s /packages/opencensus-exporter-stackdriver/ opencensus-exporter-stackdriver +``` + +Finally, on top of your application, add the following lines of code: +```javascript +var tracing = require('@opencensus/opencensus-nodejs'); +var stackdriver = require('@opencensus/opencensus-exporter-stackdriver'); + +// Add your project id to the Stackdriver options +var options = new stackdriver.StackdriverOptions('your-project-id'); +var exporter = new stackdriver.Stackdriver(options); + +tracing.registerExporter(exporter).start(); +``` + +### Using Zipkin Exporter + +To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: +```bash +wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' +java -jar zipkin.jar +``` + +Add the OpenCensus Zipkin Exporter package to your project's `node_modules/@opencensus` folder with: +``` +cd node_modules/@opencensus +ln -s /packages/opencensus-exporter-zipkin/ opencensus-exporter-zipkin +``` + +Finally, on top of your application, add the following lines of code: +```javascript +var tracing = require('@opencensus/opencensus-nodejs'); +var zipkin = require('@opencensus/opencensus-exporter-zipkin'); + +// Add your zipkin url and application name to the Zipkin options +var options = new zipkin.ZipkinOptions("your-zipkin-url", "your-application-name") +var exporter = new zipkin.Zipkin(options); + +tracing.registerExporter(exporter).start(); +``` [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff --git a/packages/opencensus-core/README.md b/packages/opencensus-core/README.md index b2808a59d..1775e9e22 100644 --- a/packages/opencensus-core/README.md +++ b/packages/opencensus-core/README.md @@ -1,13 +1,24 @@ -# OpenCensus - A stats collection and distributed tracing framework +# OpenCensus Core Node.js [![Gitter chat][gitter-image]][gitter-url] -OpenCensus is a toolkit for collecting application performance and behavior data. It currently -includes 3 apis: stats, tracing and tags. +OpenCensus Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. Right now OpenCensus for Node.js supports custom tracing and automatic tracing for http and mongodb. The library is in alpha stage and the API is subject to change. -Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this -project. +OpenCensus Core allow exporters and plugins to be built on it. To instrument an application, please visit [OpenCensus Node.js](https://github.com/census-instrumentation/opencensus-node) + +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. + +Note: This code was tested on the following Node versions: +- v6.10.0 (for console exporter only) +- v9.8.0 (for Stackdriver and Zipkin exporters) + + + +## Useful links +- For more information on OpenCensus, visit: +- To checkout the OpenCensus for Node.js, visit: +- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge From 677eef40cd215c6e8ee0ea6636cbef41841375a7 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Wed, 18 Apr 2018 11:03:53 -0300 Subject: [PATCH 085/110] doc: update README.md --- README.md | 90 ------------------------------------------------------- 1 file changed, 90 deletions(-) diff --git a/README.md b/README.md index 1ad37d97c..9bf553947 100644 --- a/README.md +++ b/README.md @@ -13,97 +13,7 @@ Note: This code was tested on the following Node versions: ___ -## OpenCensus Setup -1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> -```bash -git clone https://github.com/census-instrumentation/opencensus-node.git -``` - -**TODO Ver com Fábio se o usuário terá que compilar** - -2. Switch to branch `dev` with: -```bash -git checkout dev -``` - -3. Navigate to the OpenCensus Node project folder and install the dependencies with: -```bash -cd opencensus-node -npm install -``` - -4. Compile the TypeScript code into JavaScript with: -``` -node_modules/.bin/tsc -``` - -___ - -## Instrumenting an Application - -Navigate to your application folder. Inside it's `node_modules` folder, create a directory named `@opencensus`: -``` -cd node_modules -mkdir @opencensus -``` - -Navigate to your new `@opencensus` folder and create a symlink to OpenCensus Node package with: -```bash -cd @opencensus -ln -s /packages/opencensus-nodejs/ opencensus-nodejs -``` - -### Using Stackdriver Exporter - -To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: -```bash -export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json -``` - -Add the OpenCensus Stackdriver Exporter package to your project's `node_modules/@opencensus` folder with: -``` -cd node_modules/@opencensus -ln -s /packages/opencensus-exporter-stackdriver/ opencensus-exporter-stackdriver -``` - -Finally, on top of your application, add the following lines of code: -```javascript -var tracing = require('@opencensus/opencensus-nodejs'); -var stackdriver = require('@opencensus/opencensus-exporter-stackdriver'); - -// Add your project id to the Stackdriver options -var options = new stackdriver.StackdriverOptions('your-project-id'); -var exporter = new stackdriver.Stackdriver(options); - -tracing.registerExporter(exporter).start(); -``` - -### Using Zipkin Exporter - -To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: -```bash -wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' -java -jar zipkin.jar -``` - -Add the OpenCensus Zipkin Exporter package to your project's `node_modules/@opencensus` folder with: -``` -cd node_modules/@opencensus -ln -s /packages/opencensus-exporter-zipkin/ opencensus-exporter-zipkin -``` - -Finally, on top of your application, add the following lines of code: -```javascript -var tracing = require('@opencensus/opencensus-nodejs'); -var zipkin = require('@opencensus/opencensus-exporter-zipkin'); - -// Add your zipkin url and application name to the Zipkin options -var options = new zipkin.ZipkinOptions("your-zipkin-url", "your-application-name") -var exporter = new zipkin.Zipkin(options); - -tracing.registerExporter(exporter).start(); -``` [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge From fc929802cd0db646562481a41d171e5d4a096e48 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Wed, 18 Apr 2018 14:59:57 -0300 Subject: [PATCH 086/110] test: created new tests for trace --- .../opencensus-core/src/trace/model/tracer.ts | 230 ++++++++--------- .../src/trace/sampler/sampler.ts | 21 +- packages/opencensus-core/test/test-tracer.ts | 242 +++++++++++++++--- 3 files changed, 321 insertions(+), 172 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index aacae8aab..bdca8ff27 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -16,138 +16,138 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; -import {RootSpan, Span} from './types'; -import {TraceOptions, Tracer} from './types'; -import {OnEndSpanEventListener, Func } from './types'; +import {SamplerImpl} from '../config/sampler'; import {Sampler, TracerConfig} from '../config/types'; import {Config} from '../config/types'; -import {SpanImpl} from './span'; -import {SamplerImpl} from '../config/sampler'; -import {RootSpanImpl} from './rootspan'; +import {RootSpanImpl} from './rootspan'; +import {SpanImpl} from './span'; +import {RootSpan, Span} from './types'; +import {TraceOptions, Tracer} from './types'; +import {Func, OnEndSpanEventListener} from './types'; export class TracerImpl implements Tracer { - - //public buffer: Buffer; - private activeLocal: boolean; - private contextManager: cls.Namespace; - private config: TracerConfig; - sampler: Sampler; - - //TODO: simple solution - to be rewied in future - private eventListenersLocal: OnEndSpanEventListener[] = []; - //TODO: temp solution - private endedTraces: RootSpan[] = []; - - constructor() { - this.activeLocal = false; - this.contextManager = cls.createNamespace(); - } - - get currentRootSpan(): RootSpan { - return this.contextManager.get('rootspan'); - } - - set currentRootSpan(root: RootSpan) { - this.contextManager.set('rootspan', root); - } - - start(config: TracerConfig): Tracer { - this.activeLocal = true; - this.config = config; - this.sampler = new SamplerImpl().probability(config.samplingRate); - return this; - } - - get eventListeners(): OnEndSpanEventListener[] { - return this.eventListenersLocal; - } - - stop() { - this.activeLocal = false; - } - - get active(): boolean { - return this.activeLocal; - } - - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { - return this.contextManager.runAndReturn((root) => { - let newRoot = null; - if(this.active) { - newRoot = new RootSpanImpl (this, options); - if (this.sampler.shouldSample(newRoot.traceId)) { - newRoot.start(); - this.currentRootSpan = newRoot; - return fn(newRoot); - } - } else { - debug("Tracer is inactive, can't start new RootSpan"); - } - return fn(newRoot); - }); - } - - onEndSpan(root: RootSpan): void { - if (!root) { - return debug('cannot end trace - no active trace found'); - } - if (this.currentRootSpan !== root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + // public buffer: Buffer; + private activeLocal: boolean; + private contextManager: cls.Namespace; + private config: TracerConfig; + sampler: Sampler; + + // TODO: simple solution - to be rewied in future + private eventListenersLocal: OnEndSpanEventListener[] = []; + // TODO: temp solution + private endedTraces: RootSpan[] = []; + + constructor() { + this.activeLocal = false; + this.contextManager = cls.createNamespace(); + this.clearCurrentTrace(); + } + + get currentRootSpan(): RootSpan { + return this.contextManager.get('rootspan'); + } + + set currentRootSpan(root: RootSpan) { + this.contextManager.set('rootspan', root); + } + + start(config: TracerConfig): Tracer { + this.activeLocal = true; + this.config = config; + this.sampler = new SamplerImpl().probability(config.samplingRate); + return this; + } + + get eventListeners(): OnEndSpanEventListener[] { + return this.eventListenersLocal; + } + + stop() { + this.activeLocal = false; + } + + get active(): boolean { + return this.activeLocal; + } + + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + return this.contextManager.runAndReturn((root) => { + let newRoot = null; + if (this.active) { + newRoot = new RootSpanImpl(this, options); + if (this.sampler.shouldSample(newRoot.traceId)) { + newRoot.start(); + this.currentRootSpan = newRoot; + return fn(newRoot); } - this.notifyEndSpan(root); - //this.clearCurrentTrace(); + } else { + debug('Tracer is inactive, can\'t start new RootSpan'); + } + return fn(newRoot); + }); + } + + onEndSpan(root: RootSpan): void { + if (!root) { + debug('cannot end trace - no active trace found'); + return; } - - registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListenersLocal.push(listner); + if (this.currentRootSpan !== root) { + debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + return; } - - private notifyEndSpan(root: RootSpan) { - if (this.active) { - debug('starting to notify listeners the end of rootspans'); - if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { - this.eventListenersLocal.forEach((listener) => listener.onEndSpan(root)); - } - } else { - debug('this tracer is inactivate cant notify endspan'); + this.notifyEndSpan(root); + // this.clearCurrentTrace(); + } + + registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListenersLocal.push(listner); + } + + private notifyEndSpan(root: RootSpan) { + if (this.active) { + debug('starting to notify listeners the end of rootspans'); + if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { + for (const listener of this.eventListenersLocal) { + listener.onEndSpan(root); } + } + } else { + debug('this tracer is inactivate cant notify endspan'); } + } - clearCurrentTrace() { - this.currentRootSpan = null; - } + clearCurrentTrace() { + this.currentRootSpan = null; + } - startSpan(name?: string, type?: string, parentSpanId?: string): Span { - let newSpan: Span = null; - if (!this.currentRootSpan) { - debug('no current trace found - must start a new root span first'); - } else { - newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); - } - return newSpan; + startSpan(name?: string, type?: string, parentSpanId?: string): Span { + if (!this.currentRootSpan) { + debug('no current trace found - must start a new root span first'); + return null; } - wrap(fn: Func): Func { - if (!this.active) { - return fn; - } + return this.currentRootSpan.startSpan(name, type, parentSpanId); + } - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - return namespace.bind(fn); + wrap(fn: Func): Func { + if (!this.active) { + return fn; } - wrapEmitter(emitter: NodeJS.EventEmitter): void { - if (!this.active) { - return; - } + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + return namespace.bind(fn); + } - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - namespace.bindEmitter(emitter); + wrapEmitter(emitter: NodeJS.EventEmitter): void { + if (!this.active) { + return; } -} - - + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + namespace.bindEmitter(emitter); + } +} diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index bfde56407..c9beded81 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -30,10 +30,8 @@ export class SamplerImpl { /** * @param traceId Used for probability calculation - * @param spanId todo: integration with propagation class - * @param isRemote todo: integration with propagation class - */ - constructor(traceId?: string, spanId?: string, isRemote?: boolean) { + */ + constructor(traceId?: string) { if (traceId) { this.traceId = traceId; } @@ -65,7 +63,7 @@ export class SamplerImpl { * @returns a Sampler object */ probability(probability?: number): Sampler { - if(!probability || probability > MAX_NUMBER) { + if (probability == null || probability > MAX_NUMBER) { return this.always(); } else if (probability < MIN_NUMBER) { @@ -94,17 +92,4 @@ export class SamplerImpl { } } - // setRate(samplerRate?:number){ - // if(samplerRate){ - // if(samplerRate <= MIN_NUMBER){ - // this.never(); - // }else if(samplerRate >= MAX_NUMBER){ - // this.always(); - // }else{ - // this.probability(samplerRate); - // } - // }else{ - // this.always(); - // } - // } } \ No newline at end of file diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 26f5a0047..29ac33dfb 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -15,6 +15,7 @@ */ import * as assert from 'assert'; +import {EventEmitter} from 'events'; import * as mocha from 'mocha'; import {Exporter} from '../src/exporters/types'; @@ -22,16 +23,25 @@ import {TracerConfig} from '../src/trace/config/types'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; -import {RootSpan, Span, Tracer} from '../src/trace/model/types'; +import {OnEndSpanEventListener, RootSpan, Span, Tracer} from '../src/trace/model/types'; + +class OnEndSpanClass implements OnEndSpanEventListener { + /** Counter for test use */ + testCount = 0; + /** Happens when a span is ended */ + onEndSpan(span: Span): void { + this.testCount++; + } +} const defaultConfig: TracerConfig = { samplingRate: 1 }; - describe('Tracer', () => { const options = {name: 'test'}; + /** Should create a Tracer instance */ describe('new Tracer()', () => { it('should create a Tracer instance', () => { const tracer = new TracerImpl(); @@ -39,69 +49,223 @@ describe('Tracer', () => { }); }); + /** Should get/set the current RootSpan from tracer instance */ + describe('get/set currentRootSpan()', () => { + let tracer, rootSpan; + before(() => { + tracer = new TracerImpl(); + rootSpan = new RootSpanImpl(tracer); + tracer.currentRootSpan = rootSpan; + }); + it('should get the current RootSpan from tracer instance', () => { + assert.ok(tracer.currentRootSpan instanceof RootSpanImpl); + }); + it('should set the current RootSpan from tracer instance', () => { + assert.equal(tracer.currentRootSpan, rootSpan); + }); + }); + + /** Should return a started tracer instance */ describe('start()', () => { - it('should return a tracer instance', () => { + let tracerStarted; + before(() => { const tracer = new TracerImpl(); - const tracerStarted = tracer.start(defaultConfig); + tracerStarted = tracer.start(defaultConfig); + }); + it('should return a tracer instance', () => { assert.ok(tracerStarted instanceof TracerImpl); }); it('the trace was started', () => { - const tracer = new TracerImpl(); - const tracerStarted = tracer.start(defaultConfig); assert.ok(tracerStarted.active); }); }); + /** Should return an OnEndSpanEventListener list */ + describe('registerEndSpanListener() / get eventListeners()', () => { + let tracer, onEndSpan; + before(() => { + tracer = new TracerImpl(); + onEndSpan = new OnEndSpanClass(); + tracer.registerEndSpanListener(onEndSpan); + }); + + it('should register a new OnEndSpanEventListener on listners list', () => { + const listner = tracer.eventListeners[0]; + assert.equal(listner, onEndSpan); + }); + + it('should return an OnEndSpanEventListener list', () => { + for (const listner of tracer.eventListeners) { + assert.ok(listner instanceof OnEndSpanClass); + } + }); + }); + + /** Should stop the trace instance */ + describe('stop()', () => { + it('should stop the trace instance', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.stop(); + assert.ok(!tracer.active); + }); + }); + + /** Should check if the trace instance is started or stop */ + describe('get active()', () => { + let tracer: Tracer; + before(() => { + tracer = new TracerImpl(); + }); + it('should check if the trace instance is started', () => { + tracer.start(defaultConfig); + assert.ok(tracer.active); + }); + it('should check if the trace instance is stoped', () => { + tracer.stop(); + assert.ok(!tracer.active); + }); + }); + + /** Should create and start a new RootSpan instance */ describe('startRootSpan()', () => { + let rootSpanLocal; + before(() => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(null, (rootSpan) => { + rootSpanLocal = rootSpan; + }); + }); + it('should create a new RootSpan instance', () => { + assert.ok(rootSpanLocal instanceof RootSpanImpl); + }); it('should start the rootSpan', () => { + assert.ok(rootSpanLocal.started); + }); + }); + + /** Should create and start a new RootSpan instance with options */ + describe('startRootSpan() with options', () => { + let rootSpanLocal; + before(() => { const tracer = new TracerImpl(); tracer.start(defaultConfig); - tracer.startRootSpan(options, (root) => { - assert.ok(root.started); + tracer.startRootSpan(options, (rootSpan) => { + rootSpanLocal = rootSpan; }); }); + it('should create a new RootSpan instance', () => { + assert.ok(rootSpanLocal instanceof RootSpanImpl); + }); + it('should start the rootSpan', () => { + assert.ok(rootSpanLocal.started); + }); + }); - describe('end()', () => { - it('should end current trace', () => { - const tracer = new TracerImpl(); - tracer.start(defaultConfig); - const rootSpan = tracer.startRootSpan(options, (root) => { - root.end(); - assert.ok(root.ended); - }); + /** Should not start the new RootSpan instance */ + describe('startRootSpan() with sampler never', () => { + it('should not start the new RootSpan instance', () => { + const tracer = new TracerImpl(); + const config = {samplingRate: 0} as TracerConfig; + tracer.start(config); + tracer.startRootSpan(options, (rootSpan) => { + assert.ok(!rootSpan.started); + }); + }); + }); + + /** Should not create the new RootSpan instance */ + describe('startRootSpan() before start()', () => { + it('should not create the new RootSpan instance', () => { + const tracer = new TracerImpl(); + tracer.startRootSpan(options, (rootSpan) => { + assert.equal(rootSpan, null); }); }); + }); - describe('clearCurrentRootSpan()', () => { - it('should set the current root span to null', () => { - const tracer = new TracerImpl(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (root) => { - tracer.clearCurrentTrace(); - assert.ok(tracer.currentRootSpan == null); - }); + /** Should set the current root span to null */ + describe('clearCurrentRootSpan()', () => { + it('should set the current root span to null', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (rootSpan) => { + tracer.clearCurrentTrace(); + assert.ok(tracer.currentRootSpan == null); }); }); + }); - describe('startSpan()', () => { - it('should return a Span instance', () => { - const tracer = new TracerImpl(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (root) => { - const span = tracer.startSpan('spanName', 'spanType'); - assert.ok(span instanceof SpanImpl); - }); + /** Should create and start a Span instance into a rootSpan */ + describe('startSpan()', () => { + let span; + before(() => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (rootSpan) => { + span = tracer.startSpan('spanName', 'spanType'); }); + }); + it('should create a Span instance', () => { + assert.ok(span instanceof SpanImpl); + }); + it('should start a span', () => { + assert.ok(span.started); + }); + }); + + /** Should not create a Span instance */ + describe('startSpan() before startRootSpan()', () => { + it('should not create a Span instance', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + const span = tracer.startSpan('spanName', 'spanType'); + assert.equal(span, null); + }); + }); - it('should start a span', () => { - const tracer = new TracerImpl(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (root) => { - const span = tracer.startSpan('spanName', 'spanType'); - assert.ok(span.started); - }); + /** Should run eventListeners when the rootSpan ends */ + describe('onEndSpan()', () => { + it('should run eventListeners when the rootSpan ends', () => { + const tracer = new TracerImpl(); + const eventListener = new OnEndSpanClass(); + tracer.registerEndSpanListener(eventListener); + tracer.start(defaultConfig); + + tracer.startRootSpan(options, (rootSpan) => { + rootSpan.end(); + assert.equal(eventListener.testCount, tracer.eventListeners.length); }); }); }); + + + /** Testing void functions */ + describe('void functions', () => { + it('wrap()', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + assert.ok(tracer.wrap(() => {}) instanceof Function); + }); + + it('wrap() before start()', () => { + const tracer = new TracerImpl(); + assert.ok(tracer.wrap(() => {}) instanceof Function); + }); + + it('wrapEmitter()', () => { + const tracer = new TracerImpl(); + tracer.start(defaultConfig); + assert.strictEqual( + typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); + }); + + it('wrapEmitter() before start()', () => { + const tracer = new TracerImpl(); + assert.strictEqual( + typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); + }); + }); }); \ No newline at end of file From 4a9731a5534585a2215c921e3d314a6a0e484e18 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Wed, 18 Apr 2018 17:13:35 -0300 Subject: [PATCH 087/110] refactor: add jsdoc to core package --- .../opencensus-core/src/exporters/buffer.ts | 19 +- .../src/exporters/console-exporter.ts | 11 +- .../opencensus-core/src/exporters/types.ts | 8 +- .../opencensus-core/src/internal/clock.ts | 25 +- .../opencensus-core/src/trace/config/types.ts | 28 +- .../src/trace/instrumentation/base-plugin.ts | 38 ++- .../src/trace/instrumentation/types.ts | 4 +- .../src/trace/model/root-span.ts | 29 +- .../src/trace/model/span-base-model.ts | 12 +- .../opencensus-core/src/trace/model/span.ts | 7 +- .../opencensus-core/src/trace/model/tracer.ts | 271 ++++++++++-------- .../opencensus-core/src/trace/model/types.ts | 43 ++- .../src/trace/sampler/sampler.ts | 12 +- packages/opencensus-core/src/trace/types.ts | 31 +- 14 files changed, 325 insertions(+), 213 deletions(-) diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 4d851792f..323b9a65e 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -24,11 +24,11 @@ import {Exporter} from './types'; import {Config, BufferConfig} from '../trace/config/types'; -/** - * Controls the sending of traces to exporters - */ +/** Controls the sending of traces to exporters. */ export class Buffer { + /** The service to send the collected spans. */ private exporter: Exporter; + /** Maximum size of a buffer. */ private bufferSize: number; /** Trace queue of a buffer */ private queue: RootSpan[] = []; @@ -39,6 +39,11 @@ export class Buffer { /** Indicates when the buffer timeout is running */ private bufferTimeoutInProgress = false; + /** + * Constructs a new Buffer instance. + * @param exporter The service to send the collected spans. + * @param config A buffer configuration object to create a buffer. + */ constructor(exporter: Exporter, config: BufferConfig) { this.exporter = exporter; this.bufferSize = config.bufferSize; @@ -47,8 +52,8 @@ export class Buffer { } /** - * Set the buffer size value - * @param bufferSize The new buffer size + * Set the buffer size value. + * @param bufferSize The new buffer size. */ setBufferSize(bufferSize: number) { this.bufferSize = bufferSize; @@ -56,8 +61,8 @@ export class Buffer { } /** - * Add a trace (rootSpan) in the buffer - * @param trace RootSpan to be added in the buffer + * Add a trace (rootSpan) in the buffer. + * @param trace RootSpan to be added in the buffer. */ addToBuffer(trace: RootSpan) { this.queue.push(trace); diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index 38ba62f60..d9f0e8ef1 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -19,7 +19,6 @@ import {RootSpan} from '../trace/model/types'; import {Buffer} from './buffer'; - /** Do not send span data */ export class NoopExporter implements Exporter { onEndSpan(root: RootSpan) {} @@ -28,12 +27,22 @@ export class NoopExporter implements Exporter { /** Format and sends span data to the console. */ export class ConsoleLogExporter implements Exporter { + /** Buffer object to store the spans. */ private buffer: Buffer; + /** + * Constructs a new ConsoleLogExporter instance. + * @param config Exporter configuration object to create a console log + * exporter. + */ constructor(config: ExporterConfig) { this.buffer = new Buffer(this, config); } + /** + * Event called when a span is ended. + * @param root Ended span. + */ onEndSpan(root: RootSpan) { this.buffer.addToBuffer(root); } diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 06d8ac0b8..9cae12d7d 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -16,9 +16,15 @@ import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; -import { BufferConfig } from '../trace/config/types'; +import {BufferConfig} from '../trace/config/types'; +/** Defines an exporter interface. */ export interface Exporter extends OnEndSpanEventListener { + + /** + * Sends a list of root spans to the service. + * @param rootSpans A list of root spans to publish. + */ publish(rootSpans: RootSpan[]); } diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index c3d54c0eb..809c49ee9 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -14,19 +14,24 @@ * limitations under the License. */ +/** Defines a Clock. */ export class Clock { - private endedLocal: boolean; + /** Indicates if the clock is endend. */ + private endedLocal = false; + /** Indicates the clock's start time. */ private startTimeLocal: Date; + /** The time in high resolution in a [seconds, nanoseconds]. */ private hrtimeLocal: [number, number]; - private diff: [number, number]; + /** The duration between start and end of the clock. */ + private diff: [number, number] = null; + /** Constructs a new SamplerImpl instance. */ constructor() { - this.endedLocal = false; this.startTimeLocal = new Date(); this.hrtimeLocal = process.hrtime(); - this.diff = null; } + /** Ends the clock. */ end(): void { if (this.endedLocal) { return; @@ -35,6 +40,7 @@ export class Clock { this.endedLocal = true; } + /** Gets the duration of the clock. */ get duration(): number { if (!this.endedLocal) { return null; @@ -43,6 +49,10 @@ export class Clock { return ns / 1e6; } + /** + * Compares clock with another one. + * @param timer A clock object to compare. + */ offset(timer: Clock): number { const a = timer.hrtime; const b = this.hrtime; @@ -50,14 +60,20 @@ export class Clock { return ns / 1e6; } + /** Gets the time in high definition. */ get hrtime(): [number, number] { return this.hrtimeLocal; } + /** Starts the clock. */ get startTime(): Date { return this.startTimeLocal; } + /** + * Gets the time so far. + * @returns A Date object with the current duration. + */ get endTime(): Date { let result: Date = null; if (this.ended) { @@ -66,6 +82,7 @@ export class Clock { return result; } + /** Indicates if the clock was ended. */ get ended(): boolean { return this.endedLocal; } diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index 82b0d11fb..2cc56e0c0 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -1,45 +1,39 @@ import {Exporter} from '../../exporters/types'; import {PluginNames} from '../instrumentation/types'; -/** - * This interface represent the probability of a tracer. - */ +/** This interface represent the probability of a tracer. */ export interface Sampler { - /** - * Set idUpperBound with MAX_NUMBER that is equivalent the probability be 1 - * @returns a Sampler object + * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. + * @returns a Sampler object. */ - always(): Sampler; + /** - * Set idUpperBound with MIN_NUMBER that is equivalent the probability be 0 - * @returns a Sampler object + * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0. + * @returns a Sampler object. */ - never(): Sampler; /** - * Set idUpperBound with the probability. If probability + * Sets idUpperBound with the probability. If probability * parameter is bigger then 1 set always. If probability parameter less * than 0, set never. - * @param probability probability between 0 and 1 - * @returns a Sampler object + * @param probability probability between 0 and 1. + * @returns a Sampler object. */ probability(probability: number): Sampler; /** * Checks if trace belong the sample. - * @param traceId Used to check the probability + * @param traceId Used to check the probability. * @returns a boolean. True if the traceId is in probability * False if the traceId is not in probability. */ shouldSample(traceId: string): boolean; } -/** - * Interface configuration for a buffer - */ +/** Interface configuration for a buffer. */ export interface BufferConfig { bufferSize?: number; bufferTimeout?: number; diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index ceb8c7a89..0d04ae6a6 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -16,21 +16,28 @@ import * as shimmer from 'shimmer'; import {Tracer} from '../model/types'; -/** - * This class represent the base to patch plugin - */ +/** This class represent the base to patch plugin. */ export abstract class BasePlugin { + /** The service to send the collected traces */ // tslint:disable:no-any exporter: any; + /** The module name */ moduleName: string; + /** A tracer object. */ tracer: Tracer; + /** The module version. */ version: string; + /** + * Constructs a new BasePlugin instance. + * @param moduleName The module name. + */ constructor(moduleName: string) { this.moduleName = moduleName; } + /** - * Set modified plugin to the context. + * Sets modified plugin to the context. * @param exporter object module to set on context * @param tracer tracer relating to context * @param version module version description @@ -42,21 +49,42 @@ export abstract class BasePlugin { this.version = version; } + /** + * Wraps a function. + * @param nodule The module. + * @param name The function name. + * @param wrapper The wrapper. + */ protected wrap(nodule, name, wrapper) { shimmer.wrap(nodule, name, wrapper); } + /** + * Unwraps a function. + * @param nodule The module. + * @param name The function name. + */ protected unwrap(nodule, name) { shimmer.unwrap(nodule, name); } + /** + * Wraps one or more funcitons. + * @param nodule The module. + * @param names A list of function names. + * @param wrapper The wrapper. + */ protected massWrap(nodule,names, wrapper) { shimmer.massWrap(nodule, names, wrapper); } + /** + * Unwraps one or more functions. + * @param nodule The module. + * @param names The list of function names. + */ protected massUnwrap(nodule,names) { shimmer.massUnwrap(nodule, names); } - } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index 731e368f7..ee47ae0e9 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -16,9 +16,7 @@ import {Tracer} from "../model/types"; -/** - * Interface Plugin to apply patch. - */ +/** Interface Plugin to apply patch. */ export interface Plugin { // tslint:disable:no-any applyPatch(module: {}, tracer: Tracer, version: string): any; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index efdd3886d..c30f0bb0e 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -26,11 +26,18 @@ import {OnEndSpanEventListener, RootSpan, Span, TraceContext, TraceOptions, Trac /** Defines a root span */ export class RootSpanImpl extends SpanBaseModel implements RootSpan { + /** A tracer object */ private tracer: Tracer; + /** A list of child spans. */ private spansLocal: Span[]; + /** It's trace ID. */ private traceIdLocal: string; - // TODO - improve root name setup + /** + * Constructs a new RootSpanImpl instance. + * @param tracer A tracer object. + * @param context A trace options object to build the root span. + */ constructor(tracer: Tracer, context?: TraceOptions) { super(); this.tracer = tracer; @@ -45,17 +52,17 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.spansLocal = []; } - /** Get span list from rootspan instance */ + /** Gets span list from rootspan instance. */ get spans(): Span[] { return this.spansLocal; } - /** Get trace id from rootspan instance */ + /** Gets trace id from rootspan instance. */ get traceId(): string { return this.traceIdLocal; } - /** Start a rootspan instance */ + /** Starts a rootspan instance. */ start() { super.start(); debug( @@ -63,7 +70,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); } - /** End a rootspan instance */ + /** Ends a rootspan instance. */ end() { super.end(); @@ -78,8 +85,8 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { } /** - * Event called when a span ended - * @param span Span ended + * Event called when a span is ended. + * @param span Span ended. */ onEndSpan(span: Span) { debug('ending span %o', { @@ -93,10 +100,10 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { } /** - * Start a new span linked with the rootspan - * @param name Span name - * @param type Span type - * @param parentSpanId Span parent ID + * Starts a new child span in the root span. + * @param name Span name. + * @param type Span type. + * @param parentSpanId Span parent ID. */ startSpan(name: string, type: string, parentSpanId?: string) { if (this.ended) { diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 152ea501e..663ac4694 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -20,7 +20,7 @@ import { Sampler } from '../config/types'; import { TraceContext, Span, Annotation, Attributes, Link, MessageEvent } from './types'; - +/** Defines a base model for spans. */ export abstract class SpanBaseModel implements Span { protected className: string; /** The clock used to mesure the beginning and ending of a span */ @@ -37,7 +37,7 @@ export abstract class SpanBaseModel implements Span { attributes: Attributes = {}; /** A text annotation with a set of attributes. */ annotations: Annotation[] = []; - /** An event describing a message sent/received between Spans. */ + /** An event describing a message sent/received between Spans */ messageEvents: MessageEvent[] = []; /** Pointers from the current span to another span */ links: Link[] = []; @@ -58,9 +58,9 @@ export abstract class SpanBaseModel implements Span { this.id = randomSpanId(); } + /** Gets the trace ID. */ abstract get traceId(): string; - /** Indicates if span was started. */ get started(): boolean { return this.startedLocal; @@ -172,7 +172,7 @@ export abstract class SpanBaseModel implements Span { } as MessageEvent); } - /** Starts a span. */ + /** Starts the span. */ start() { if (this.started) { debug( @@ -184,7 +184,7 @@ export abstract class SpanBaseModel implements Span { this.startedLocal = true; } - /** Ends a span. */ + /** Ends the span. */ end(): void { if (!this.started) { debug( @@ -204,7 +204,7 @@ export abstract class SpanBaseModel implements Span { } - /** Forces to end a span. */ + /** Forces the span to end. */ truncate() { // TODO: review if (!this.started) { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 423204221..9053e3163 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -16,18 +16,15 @@ import {debug, randomSpanId} from '../../internal/util'; import {Span, TraceContext, RootSpan} from './types'; - import {RootSpanImpl} from './rootspan'; import {SpanBaseModel} from './spanbasemodel'; -/** - * This class represent a span. - */ +/** Defines a Span. */ export class SpanImpl extends SpanBaseModel implements Span { private root: RootSpan; /** - * Constructs a new Span instance. + * Constructs a new SpanImpl instance. * @param root */ constructor(root: RootSpan) { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index bdca8ff27..14e0ffc72 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -16,138 +16,179 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; -import {SamplerImpl} from '../config/sampler'; +import {RootSpan, Span} from './types'; +import {TraceOptions, Tracer} from './types'; +import {OnEndSpanEventListener, Func } from './types'; import {Sampler, TracerConfig} from '../config/types'; import {Config} from '../config/types'; - -import {RootSpanImpl} from './rootspan'; import {SpanImpl} from './span'; -import {RootSpan, Span} from './types'; -import {TraceOptions, Tracer} from './types'; -import {Func, OnEndSpanEventListener} from './types'; +import {SamplerImpl} from '../config/sampler'; +import {RootSpanImpl} from './rootspan'; +/** + * This class represent a tracer. + */ export class TracerImpl implements Tracer { - // public buffer: Buffer; - private activeLocal: boolean; - private contextManager: cls.Namespace; - private config: TracerConfig; - sampler: Sampler; - - // TODO: simple solution - to be rewied in future - private eventListenersLocal: OnEndSpanEventListener[] = []; - // TODO: temp solution - private endedTraces: RootSpan[] = []; - - constructor() { - this.activeLocal = false; - this.contextManager = cls.createNamespace(); - this.clearCurrentTrace(); - } - - get currentRootSpan(): RootSpan { - return this.contextManager.get('rootspan'); - } - - set currentRootSpan(root: RootSpan) { - this.contextManager.set('rootspan', root); - } - - start(config: TracerConfig): Tracer { - this.activeLocal = true; - this.config = config; - this.sampler = new SamplerImpl().probability(config.samplingRate); - return this; - } - - get eventListeners(): OnEndSpanEventListener[] { - return this.eventListenersLocal; - } - - stop() { - this.activeLocal = false; - } - - get active(): boolean { - return this.activeLocal; - } - - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { - return this.contextManager.runAndReturn((root) => { - let newRoot = null; - if (this.active) { - newRoot = new RootSpanImpl(this, options); - if (this.sampler.shouldSample(newRoot.traceId)) { - newRoot.start(); - this.currentRootSpan = newRoot; - return fn(newRoot); - } - } else { - debug('Tracer is inactive, can\'t start new RootSpan'); - } - return fn(newRoot); - }); - } - - onEndSpan(root: RootSpan): void { - if (!root) { - debug('cannot end trace - no active trace found'); - return; + /** Indicates if the tracer is active */ + private activeLocal: boolean; + /** TODO */ + private contextManager: cls.Namespace; + /** A configuration for starting the tracer */ + private config: TracerConfig; + /** A list of end span event listeners */ + private eventListenersLocal: OnEndSpanEventListener[] = []; + /** A list of ended root spans */ + private endedTraces: RootSpan[] = []; + /** A sampler used to make sample decisions */ + sampler: Sampler; + + /** Constructs a new TraceImpl instance. */ + constructor() { + this.activeLocal = false; + this.contextManager = cls.createNamespace(); + this.clearCurrentTrace(); } - if (this.currentRootSpan !== root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.'); - return; + + /** Gets the current root span. */ + get currentRootSpan(): RootSpan { + return this.contextManager.get('rootspan'); + } + + /** Sets the current root span. */ + set currentRootSpan(root: RootSpan) { + this.contextManager.set('rootspan', root); + } + + /** + * Starts a tracer. + * @param config A tracer configuration object to start a tracer. + */ + start(config: TracerConfig): Tracer { + this.activeLocal = true; + this.config = config; + this.sampler = new SamplerImpl().probability(config.samplingRate); + return this; + } + + /** Gets the list of event listners. */ + get eventListeners(): OnEndSpanEventListener[] { + return this.eventListenersLocal; } - this.notifyEndSpan(root); - // this.clearCurrentTrace(); - } - - registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListenersLocal.push(listner); - } - - private notifyEndSpan(root: RootSpan) { - if (this.active) { - debug('starting to notify listeners the end of rootspans'); - if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { - for (const listener of this.eventListenersLocal) { - listener.onEndSpan(root); + + /** Stops the tracer. */ + stop() { + this.activeLocal = false; + } + + /** Indicates if the tracer is active or not. */ + get active(): boolean { + return this.activeLocal; + } + + /** + * Starts a root span. + * @param options A TraceOptions object to start a root span. + * @param fn A callback function to run after starting a root span. + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + return this.contextManager.runAndReturn((root) => { + let newRoot = null; + if(this.active) { + newRoot = new RootSpanImpl (this, options); + if (this.sampler.shouldSample(newRoot.traceId)) { + newRoot.start(); + this.currentRootSpan = newRoot; + return fn(newRoot); + } + } else { + debug("Tracer is inactive, can't start new RootSpan"); + } + return fn(newRoot); + }); + } + + /** + * Is called when a span is ended. + * @param root The ended span. + */ + onEndSpan(root: RootSpan): void { + if (!root) { + return debug('cannot end trace - no active trace found'); } - } - } else { - debug('this tracer is inactivate cant notify endspan'); + if (this.currentRootSpan !== root) { + debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + } + this.notifyEndSpan(root); + //this.clearCurrentTrace(); } - } - clearCurrentTrace() { - this.currentRootSpan = null; - } + /** + * Registers an end span event listener. + * @param listener The listener to register. + */ + registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListenersLocal.push(listner); + } - startSpan(name?: string, type?: string, parentSpanId?: string): Span { - if (!this.currentRootSpan) { - debug('no current trace found - must start a new root span first'); - return null; + private notifyEndSpan(root: RootSpan) { + if (this.active) { + debug('starting to notify listeners the end of rootspans'); + if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { + this.eventListenersLocal.forEach((listener) => listener.onEndSpan(root)); + } + } else { + debug('this tracer is inactivate cant notify endspan'); + } } - return this.currentRootSpan.startSpan(name, type, parentSpanId); - } + /** Clears the current root span. */ + clearCurrentTrace() { + this.currentRootSpan = null; + } - wrap(fn: Func): Func { - if (!this.active) { - return fn; + /** + * Starts a span. + * @param name The span name. + * @param type The span type. + * @param parentSpanId The parent span ID. + */ + startSpan(name?: string, type?: string, parentSpanId?: string): Span { + let newSpan: Span = null; + if (!this.currentRootSpan) { + debug('no current trace found - must start a new root span first'); + } else { + newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); + } + return newSpan; } - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - return namespace.bind(fn); - } + /** + * Wraps a function. + * @param fn Function to wrap. + */ + wrap(fn: Func): Func { + if (!this.active) { + return fn; + } - wrapEmitter(emitter: NodeJS.EventEmitter): void { - if (!this.active) { - return; + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + return namespace.bind(fn); } - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - namespace.bindEmitter(emitter); - } + /** + * The wrap emitter. + * @param emitter The emitter. + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void { + if (!this.active) { + return; + } + + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + namespace.bindEmitter(emitter); + } } + + diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 01295bf5e..5427fc8b9 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -90,56 +90,73 @@ export interface OnEndSpanEventListener { /** Interface for Span */ export interface Span { - /** The Span ID of this span */ readonly id: string; + /** If the parent span is in another process. */ remoteParent: boolean; + /** The span ID of this span's parent. If it's a root span, must be empty */ parentSpanId: string; + /** The resource name of the span */ name: string; + /** Type of span. Used to specify additional relationships between spans */ type: string; + /** A final status for this span */ status: number; + /** A set of attributes, each in the format [KEY]:[VALUE] */ attributes: Attributes; + /** A text annotation with a set of attributes. */ annotations: Annotation[]; + /** An event describing a message sent/received between Spans. */ messageEvents: MessageEvent[]; + /** Pointers from the current span to another span */ links: Link[]; + /** Constructs a new SpanBaseModel instance. */ readonly traceId: string; + /** Indicates if span was started. */ readonly started: boolean; + /** Indicates if span was ended. */ readonly ended: boolean; + /** * Gives a timestap that indicates the span's start time in RFC3339 UTC * "Zulu" format. */ readonly startTime: Date; + /** * Gives a timestap that indicates the span's end time in RFC3339 UTC * "Zulu" format. */ readonly endTime: Date; + /** * Gives a timestap that indicates the span's duration in RFC3339 UTC * "Zulu" format. */ readonly duration: number; + /** Gives the TraceContext of the span. */ readonly traceContext: TraceContext; + /** * Adds an atribute to the span. * @param key Describes the value added. * @param value The result of an operation. */ addAtribute(key: string, value: string): void; + /** * Adds an annotation to the span. * @param description Describes the event. @@ -148,6 +165,7 @@ export interface Span { */ addAnnotation(description: string, timestamp: number, attributes?: Attributes): void; + /** * Adds a link to the span. * @param traceId The trace ID for a trace within a project. @@ -157,16 +175,20 @@ export interface Span { */ addLink(traceId: string, spanId: string, type: string, attributes?: Attributes): void; + /** * Adds a message event to the span. * @param type The type of message event. * @param id An identifier for the message event. */ addMessageEvent(type: string, id: string): void; + /** Starts a span. */ start(): void; + /** Ends a span. */ end(): void; + /** Forces to end a span. */ truncate(): void; } @@ -176,39 +198,41 @@ export interface RootSpan extends Span, OnEndSpanEventListener { /** Get the span list from RootSpan instance */ readonly spans: Span[]; - /** Start the RootSpan instance */ + /** Starts the RootSpan instance */ start(): void; - /** End the RootSpan instance */ + + /** Ends the RootSpan instance */ end(): void; - /** Start a new Span instance in the RootSpan instance */ + + /** Starts a new Span instance in the RootSpan instance */ startSpan(name: string, type: string, parentSpanId?: string): Span; } /** Interface for Tracer */ export interface Tracer { - /** Get and set the currentRootSpan to tracer instance */ currentRootSpan: RootSpan; - + /** A sampler that will decide if the span will be sampled or not */ sampler: Sampler; /** Get the eventListeners from tracer instance */ readonly eventListeners: OnEndSpanEventListener[]; + /** Get the active status from tracer instance */ readonly active: boolean; - + /** * Start a tracer instance * @param config Configuration for tracer instace * @returns A tracer instance started */ start(config: TracerConfig): Tracer; - + /** Stop the tracer instance */ stop(): void; - + /** * Start a new RootSpan to currentRootSpan * @param options Options for tracer instance @@ -247,6 +271,7 @@ export interface Tracer { * @returns The contextManager class wrapped */ wrap(fn: Func): Func; + /** * Wrapper to contextManager emitter * @param emitter Function that will wrap in contextManager emitter diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index c9beded81..c070c7a42 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -17,18 +17,16 @@ import {debug, randomSpanId} from '../../internal/util'; import {Sampler} from './types' - const MIN_NUMBER = 1e-4; const MAX_NUMBER = 0xffffffffffffffff; -/** - * This class represent the probability of a tracer. - */ +/** This class represent the probability of a tracer. */ export class SamplerImpl { private traceId: string; private idUpperBound: number; /** + * Constructs a new SamplerImpl instance. * @param traceId Used for probability calculation */ constructor(traceId?: string) { @@ -38,7 +36,7 @@ export class SamplerImpl { } /** - * Set idUpperBound with MAX_NUMBER that is equivalent the probability be 1 + * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1 * @returns a Sampler object */ always(): Sampler { @@ -47,7 +45,7 @@ export class SamplerImpl { } /** - * Set idUpperBound with MIN_NUMBER that is equivalent the probability be 0 + * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0 * @returns a Sampler object */ never(): Sampler { @@ -56,7 +54,7 @@ export class SamplerImpl { } /** - * Set idUpperBound with the probability. If probability + * Sets idUpperBound with the probability. If probability * parameter is bigger then 1 set always. If probability parameter less * than 0, set never. * @param probability probability between 0 and 1 diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 5da4da791..4516df55f 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -19,42 +19,29 @@ import {Sampler} from './config/types'; import {Exporter} from '../exporters/types'; import {Config} from './config/types'; -//TODO: Improve JSDoc - -/** - * Main interface for tracing. Holds instances for {@link Tracer} and - * {@link Exporter}. - * - */ +/** Main interface for tracing. */ export interface Tracing { - /** - * Returns the {@link Tracer} object responsible for managing a trace. - * @return the {@link Tracer} implementation. - */ + /** Object responsible for managing a trace. */ readonly tracer: Tracer; - /** - * Returns the {@link Exportert} - * @return the {@link ExportComponent} implementation. - */ + /** Service to send collected traces to. */ readonly exporter: Exporter; /** - * Enable tracing process. - * @param userConfig Configuration provided by a client + * Enables the tracing process. + * @param userConfig A configuration object. + * @returns The tracing object. */ - start(userConfig?:Config): Tracing; + start(userConfig?: Config): Tracing; - /** - * Stop tracing. - * - */ + /** Stops tracing. */ stop(): void; /** * Registers an exporter to send the collected traces to. * @param exporter The exporter to send the traces to. + * @returns The tracing object. */ registerExporter(exporter: Exporter): Tracing; } From 6fdca2522a13a35f2670fa41d291cc39f9d86e85 Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Thu, 19 Apr 2018 09:09:25 -0300 Subject: [PATCH 088/110] test: created tests for spanbasemodel --- .../src/trace/model/root-span.ts | 2 +- .../src/trace/model/span-base-model.ts | 382 +++++++++--------- .../opencensus-core/src/trace/model/span.ts | 8 +- .../opencensus-core/src/trace/model/tracer.ts | 315 ++++++++------- .../opencensus-core/src/trace/model/types.ts | 350 ++++++++-------- packages/opencensus-core/test/test-span.ts | 57 ++- 6 files changed, 577 insertions(+), 537 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index c30f0bb0e..396c5fe68 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -117,7 +117,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { 'calling %s.startSpan() on un-started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; - } + } const newSpan = new SpanImpl(this); if (name) { newSpan.name = name; diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 663ac4694..e7c97c0e8 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -14,212 +14,202 @@ * limitations under the License. */ -import { Clock } from '../../internal/clock'; -import { debug, randomSpanId } from '../../internal/util'; -import { Sampler } from '../config/types'; -import { TraceContext, Span, Annotation, Attributes, - Link, MessageEvent } from './types'; +import {Clock} from '../../internal/clock'; +import {debug, randomSpanId} from '../../internal/util'; +import {Sampler} from '../config/types'; + +import {Annotation, Attributes, Link, MessageEvent, Span, TraceContext} from './types'; /** Defines a base model for spans. */ export abstract class SpanBaseModel implements Span { - protected className: string; - /** The clock used to mesure the beginning and ending of a span */ - private clock: Clock = null; - /** Indicates if this span was started */ - private startedLocal = false; - /** Indicates if this span was ended */ - private endedLocal = false; - /** Indicates if this span was forced to end */ - private truncated = false; - /** The Span ID of this span */ - readonly id: string; - /** A set of attributes, each in the format [KEY]:[VALUE] */ - attributes: Attributes = {}; - /** A text annotation with a set of attributes. */ - annotations: Annotation[] = []; - /** An event describing a message sent/received between Spans */ - messageEvents: MessageEvent[] = []; - /** Pointers from the current span to another span */ - links: Link[] = []; - /** If the parent span is in another process. */ - remoteParent: boolean; - /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId: string = null; - /** The resource name of the span */ - name: string = null; - /** Type of span. Used to specify additional relationships between spans */ - type: string = null; - /** A final status for this span */ - status: number; - - /** Constructs a new SpanBaseModel instance. */ - constructor() { - this.className = this.constructor.name; - this.id = randomSpanId(); - } - - /** Gets the trace ID. */ - abstract get traceId(): string; + protected className: string; + /** The clock used to mesure the beginning and ending of a span */ + private clock: Clock = null; + /** Indicates if this span was started */ + private startedLocal = false; + /** Indicates if this span was ended */ + private endedLocal = false; + /** Indicates if this span was forced to end */ + private truncated = false; + /** The Span ID of this span */ + readonly id: string; + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: Attributes = {}; + /** A text annotation with a set of attributes. */ + annotations: Annotation[] = []; + /** An event describing a message sent/received between Spans */ + messageEvents: MessageEvent[] = []; + /** Pointers from the current span to another span */ + links: Link[] = []; + /** If the parent span is in another process. */ + remoteParent: boolean; + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string = null; + /** The resource name of the span */ + name: string = null; + /** Type of span. Used to specify additional relationships between spans */ + type: string = null; + /** A final status for this span */ + status: number; - /** Indicates if span was started. */ - get started(): boolean { - return this.startedLocal; - } - - /** Indicates if span was ended. */ - get ended(): boolean { - return this.endedLocal; - } - - /** - * Gives a timestap that indicates the span's start time in RFC3339 UTC - * "Zulu" format. - */ - get startTime(): Date { - if (!this.clock) { - debug("calling startTime() on null clock"); - return null; - } - - return this.clock.startTime; - } - - /** - * Gives a timestap that indicates the span's end time in RFC3339 UTC - * "Zulu" format. - */ - get endTime(): Date { - if (!this.clock) { - debug("calling endTime() on null clock"); - return null; - } - - return this.clock.endTime; - } - - /** - * Gives a timestap that indicates the span's duration in RFC3339 UTC - * "Zulu" format. - */ - get duration(): number { - if (!this.clock) { - debug("calling duration() on null clock"); - return null; - } - - return this.clock.duration; - } - - /** Gives the TraceContext of the span. */ - get traceContext(): TraceContext { - return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - parentSpanId: this.parentSpanId - } as TraceContext; - } - - /** - * Adds an atribute to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAtribute(key: string, value: string | number | boolean) { - this.attributes[key] = value; - } - - /** - * Adds an annotation to the span. - * @param description Describes the event. - * @param timestamp A timestamp that maks the event. - * @param attributes A set of attributes on the annotation. - */ - addAnnotation(description: string, timestamp: number, - attributes?: Attributes) { - this.annotations.push({ - 'description': description, - 'timestamp': timestamp, - 'attributes': attributes, - } as Annotation); + /** Constructs a new SpanBaseModel instance. */ + constructor() { + this.className = this.constructor.name; + this.id = randomSpanId(); + } + + /** Gets the trace ID. */ + abstract get traceId(): string; + + + /** Indicates if span was started. */ + get started(): boolean { + return this.startedLocal; + } + + /** Indicates if span was ended. */ + get ended(): boolean { + return this.endedLocal; + } + + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + get startTime(): Date { + if (!this.clock) { + debug('calling startTime() on null clock'); + return null; } - /** - * Adds a link to the span. - * @param traceId The trace ID for a trace within a project. - * @param spanId The span ID for a span within a trace. - * @param type The relationship of the current span relative to the linked. - * @param attributes A set of attributes on the link. - */ - addLink(traceId: string, spanId: string, type: string, - attributes?: Attributes) { - this.links.push({ - 'traceId': traceId, - 'spanId': spanId, - 'type': type, - 'attributes': attributes - } as Link); + return this.clock.startTime; + } + + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + get endTime(): Date { + if (!this.clock) { + debug('calling endTime() on null clock'); + return null; } - /** - * Adds a message event to the span. - * @param type The type of message event. - * @param id An identifier for the message event. - */ - addMessageEvent(type: string, id: string) { - this.messageEvents.push({ - 'type': type, - 'id': id, - } as MessageEvent); + return this.clock.endTime; + } + + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + get duration(): number { + if (!this.clock) { + debug('calling duration() on null clock'); + return null; } - - /** Starts the span. */ - start() { - if (this.started) { - debug( - 'calling %s.start() on already started %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - this.clock = new Clock(); - this.startedLocal = true; + + return this.clock.duration; + } + + /** Gives the TraceContext of the span. */ + get traceContext(): TraceContext { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + parentSpanId: this.parentSpanId + } as TraceContext; + } + + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAtribute(key: string, value: string|number|boolean) { + this.attributes[key] = value; + } + + /** + * Adds an annotation to the span. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation( + description: string, timestamp: number, attributes?: Attributes) { + this.annotations.push({ + 'description': description, + 'timestamp': timestamp, + 'attributes': attributes, + } as Annotation); + } + + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink( + traceId: string, spanId: string, type: string, attributes?: Attributes) { + this.links.push({ + 'traceId': traceId, + 'spanId': spanId, + 'type': type, + 'attributes': attributes + } as Link); + } + + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. + */ + addMessageEvent(type: string, id: string) { + this.messageEvents.push({ + 'type': type, + 'id': id, + } as MessageEvent); + } + + /** Starts the span. */ + start() { + if (this.started) { + debug( + 'calling %s.start() on already started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; } - - /** Ends the span. */ - end(): void { - if (!this.started) { - debug( - 'calling %s.end() on un-started %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - if (this.ended) { - debug( - 'calling %s.end() on already ended %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - this.startedLocal = false; - this.endedLocal = true; - this.clock.end(); + this.clock = new Clock(); + this.startedLocal = true; + } + + /** Ends the span. */ + end(): void { + if (this.ended) { + debug( + 'calling %s.end() on already ended %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; } - - - /** Forces the span to end. */ - truncate() { - // TODO: review - if (!this.started) { - debug( - 'calling truncate non-started %s - ignoring %o', this.className, - {id: this.id, name: this.name, type: this.type}); - return; - } else if (this.ended) { - debug( - 'calling truncate already ended %s - ignoring %o', this.className, - {id: this.id, name: this.name, type: this.type}); - return; - } - this.truncated = true; - this.end(); - debug('truncating %s %o', this.className, {id: this.id, name: this.name}); + if (!this.started) { + debug( + 'calling %s.end() on un-started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; } + this.startedLocal = false; + this.endedLocal = true; + this.clock.end(); + } + + + /** Forces the span to end. */ + truncate() { + // TODO: review + this.truncated = true; + this.end(); + debug('truncating %s %o', this.className, {id: this.id, name: this.name}); + } } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 9053e3163..ecdb2c79e 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -15,9 +15,10 @@ */ import {debug, randomSpanId} from '../../internal/util'; -import {Span, TraceContext, RootSpan} from './types'; + import {RootSpanImpl} from './rootspan'; import {SpanBaseModel} from './spanbasemodel'; +import {RootSpan, Span, TraceContext} from './types'; /** Defines a Span. */ export class SpanImpl extends SpanBaseModel implements Span { @@ -61,11 +62,6 @@ export class SpanImpl extends SpanBaseModel implements Span { /** Ends the span. */ end(): void { - if (!this.started) { - debug("calling end() on un-started span"); - return; - } - super.end(); this.notifyEnd(); debug('ending span %o', { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 14e0ffc72..97b653271 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -16,179 +16,180 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; -import {RootSpan, Span} from './types'; -import {TraceOptions, Tracer} from './types'; -import {OnEndSpanEventListener, Func } from './types'; +import {SamplerImpl} from '../config/sampler'; import {Sampler, TracerConfig} from '../config/types'; import {Config} from '../config/types'; -import {SpanImpl} from './span'; -import {SamplerImpl} from '../config/sampler'; + import {RootSpanImpl} from './rootspan'; +import {SpanImpl} from './span'; +import {RootSpan, Span} from './types'; +import {TraceOptions, Tracer} from './types'; +import {Func, OnEndSpanEventListener} from './types'; /** * This class represent a tracer. */ export class TracerImpl implements Tracer { - /** Indicates if the tracer is active */ - private activeLocal: boolean; - /** TODO */ - private contextManager: cls.Namespace; - /** A configuration for starting the tracer */ - private config: TracerConfig; - /** A list of end span event listeners */ - private eventListenersLocal: OnEndSpanEventListener[] = []; - /** A list of ended root spans */ - private endedTraces: RootSpan[] = []; - /** A sampler used to make sample decisions */ - sampler: Sampler; - - /** Constructs a new TraceImpl instance. */ - constructor() { - this.activeLocal = false; - this.contextManager = cls.createNamespace(); - this.clearCurrentTrace(); - } - - /** Gets the current root span. */ - get currentRootSpan(): RootSpan { - return this.contextManager.get('rootspan'); - } - - /** Sets the current root span. */ - set currentRootSpan(root: RootSpan) { - this.contextManager.set('rootspan', root); - } - - /** - * Starts a tracer. - * @param config A tracer configuration object to start a tracer. - */ - start(config: TracerConfig): Tracer { - this.activeLocal = true; - this.config = config; - this.sampler = new SamplerImpl().probability(config.samplingRate); - return this; - } - - /** Gets the list of event listners. */ - get eventListeners(): OnEndSpanEventListener[] { - return this.eventListenersLocal; - } - - /** Stops the tracer. */ - stop() { - this.activeLocal = false; - } - - /** Indicates if the tracer is active or not. */ - get active(): boolean { - return this.activeLocal; - } - - /** - * Starts a root span. - * @param options A TraceOptions object to start a root span. - * @param fn A callback function to run after starting a root span. - */ - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { - return this.contextManager.runAndReturn((root) => { - let newRoot = null; - if(this.active) { - newRoot = new RootSpanImpl (this, options); - if (this.sampler.shouldSample(newRoot.traceId)) { - newRoot.start(); - this.currentRootSpan = newRoot; - return fn(newRoot); - } - } else { - debug("Tracer is inactive, can't start new RootSpan"); - } - return fn(newRoot); - }); - } - - /** - * Is called when a span is ended. - * @param root The ended span. - */ - onEndSpan(root: RootSpan): void { - if (!root) { - return debug('cannot end trace - no active trace found'); - } - if (this.currentRootSpan !== root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + /** Indicates if the tracer is active */ + private activeLocal: boolean; + /** TODO */ + private contextManager: cls.Namespace; + /** A configuration for starting the tracer */ + private config: TracerConfig; + /** A list of end span event listeners */ + private eventListenersLocal: OnEndSpanEventListener[] = []; + /** A list of ended root spans */ + private endedTraces: RootSpan[] = []; + /** A sampler used to make sample decisions */ + sampler: Sampler; + + /** Constructs a new TraceImpl instance. */ + constructor() { + this.activeLocal = false; + this.contextManager = cls.createNamespace(); + this.clearCurrentTrace(); + } + + /** Gets the current root span. */ + get currentRootSpan(): RootSpan { + return this.contextManager.get('rootspan'); + } + + /** Sets the current root span. */ + set currentRootSpan(root: RootSpan) { + this.contextManager.set('rootspan', root); + } + + /** + * Starts a tracer. + * @param config A tracer configuration object to start a tracer. + */ + start(config: TracerConfig): Tracer { + this.activeLocal = true; + this.config = config; + this.sampler = new SamplerImpl().probability(config.samplingRate); + return this; + } + + /** Gets the list of event listners. */ + get eventListeners(): OnEndSpanEventListener[] { + return this.eventListenersLocal; + } + + /** Stops the tracer. */ + stop() { + this.activeLocal = false; + } + + /** Indicates if the tracer is active or not. */ + get active(): boolean { + return this.activeLocal; + } + + /** + * Starts a root span. + * @param options A TraceOptions object to start a root span. + * @param fn A callback function to run after starting a root span. + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + return this.contextManager.runAndReturn((root) => { + let newRoot = null; + if (this.active) { + newRoot = new RootSpanImpl(this, options); + if (this.sampler.shouldSample(newRoot.traceId)) { + newRoot.start(); + this.currentRootSpan = newRoot; + return fn(newRoot); } - this.notifyEndSpan(root); - //this.clearCurrentTrace(); + } else { + debug('Tracer is inactive, can\'t start new RootSpan'); + } + return fn(newRoot); + }); + } + + /** + * Is called when a span is ended. + * @param root The ended span. + */ + onEndSpan(root: RootSpan): void { + if (!root) { + return debug('cannot end trace - no active trace found'); } - - /** - * Registers an end span event listener. - * @param listener The listener to register. - */ - registerEndSpanListener(listner: OnEndSpanEventListener) { - this.eventListenersLocal.push(listner); + if (this.currentRootSpan !== root) { + debug('currentRootSpan != root on notifyEnd. Need more investigation.'); } - - private notifyEndSpan(root: RootSpan) { - if (this.active) { - debug('starting to notify listeners the end of rootspans'); - if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { - this.eventListenersLocal.forEach((listener) => listener.onEndSpan(root)); - } - } else { - debug('this tracer is inactivate cant notify endspan'); + this.notifyEndSpan(root); + // this.clearCurrentTrace(); + } + + /** + * Registers an end span event listener. + * @param listener The listener to register. + */ + registerEndSpanListener(listner: OnEndSpanEventListener) { + this.eventListenersLocal.push(listner); + } + + private notifyEndSpan(root: RootSpan) { + if (this.active) { + debug('starting to notify listeners the end of rootspans'); + if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { + for (const listener of this.eventListenersLocal) { + listener.onEndSpan(root); } + } + } else { + debug('this tracer is inactivate cant notify endspan'); } - - /** Clears the current root span. */ - clearCurrentTrace() { - this.currentRootSpan = null; + } + + /** Clears the current root span. */ + clearCurrentTrace() { + this.currentRootSpan = null; + } + + /** + * Starts a span. + * @param name The span name. + * @param type The span type. + * @param parentSpanId The parent span ID. + */ + startSpan(name?: string, type?: string, parentSpanId?: string): Span { + let newSpan: Span = null; + if (!this.currentRootSpan) { + debug('no current trace found - must start a new root span first'); + } else { + newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); } - - /** - * Starts a span. - * @param name The span name. - * @param type The span type. - * @param parentSpanId The parent span ID. - */ - startSpan(name?: string, type?: string, parentSpanId?: string): Span { - let newSpan: Span = null; - if (!this.currentRootSpan) { - debug('no current trace found - must start a new root span first'); - } else { - newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); - } - return newSpan; + return newSpan; + } + + /** + * Wraps a function. + * @param fn Function to wrap. + */ + wrap(fn: Func): Func { + if (!this.active) { + return fn; } - /** - * Wraps a function. - * @param fn Function to wrap. - */ - wrap(fn: Func): Func { - if (!this.active) { - return fn; - } - - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - return namespace.bind(fn); + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + return namespace.bind(fn); + } + + /** + * The wrap emitter. + * @param emitter The emitter. + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void { + if (!this.active) { + return; } - /** - * The wrap emitter. - * @param emitter The emitter. - */ - wrapEmitter(emitter: NodeJS.EventEmitter): void { - if (!this.active) { - return; - } - - // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; - namespace.bindEmitter(emitter); - } + // This is safe because isActive checks the value of this.namespace. + const namespace = this.contextManager as cls.Namespace; + namespace.bindEmitter(emitter); + } } - - diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 5427fc8b9..d89565e0e 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { Sampler, Config, TracerConfig } from '../config/types'; +import {Config, Sampler, TracerConfig} from '../config/types'; + /** Default type for functions */ // tslint:disable:no-any @@ -56,7 +57,6 @@ export interface Link { attributes: Attributes; } - /** Defines the trace options */ export interface TraceOptions { /** Root span name */ @@ -67,7 +67,6 @@ export interface TraceOptions { type?: string; } - /** Defines the trace context */ export interface TraceContext { /** Trace ID */ @@ -80,117 +79,116 @@ export interface TraceContext { sampleDecision?: boolean; } - /** Defines an end span event listener */ export interface OnEndSpanEventListener { /** Happens when a span is ended */ onEndSpan(span: Span): void; } - /** Interface for Span */ -export interface Span { - /** The Span ID of this span */ - readonly id: string; - - /** If the parent span is in another process. */ - remoteParent: boolean; - - /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId: string; - - /** The resource name of the span */ - name: string; - - /** Type of span. Used to specify additional relationships between spans */ - type: string; - - /** A final status for this span */ - status: number; - - /** A set of attributes, each in the format [KEY]:[VALUE] */ - attributes: Attributes; - - /** A text annotation with a set of attributes. */ - annotations: Annotation[]; - - /** An event describing a message sent/received between Spans. */ - messageEvents: MessageEvent[]; - - /** Pointers from the current span to another span */ - links: Link[]; - - /** Constructs a new SpanBaseModel instance. */ - readonly traceId: string; - - /** Indicates if span was started. */ - readonly started: boolean; - - /** Indicates if span was ended. */ - readonly ended: boolean; - - /** - * Gives a timestap that indicates the span's start time in RFC3339 UTC - * "Zulu" format. - */ - readonly startTime: Date; - - /** - * Gives a timestap that indicates the span's end time in RFC3339 UTC - * "Zulu" format. - */ - readonly endTime: Date; - - /** - * Gives a timestap that indicates the span's duration in RFC3339 UTC - * "Zulu" format. - */ - readonly duration: number; - - /** Gives the TraceContext of the span. */ - readonly traceContext: TraceContext; - - /** - * Adds an atribute to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAtribute(key: string, value: string): void; - - /** - * Adds an annotation to the span. - * @param description Describes the event. - * @param timestamp A timestamp that maks the event. - * @param attributes A set of attributes on the annotation. - */ - addAnnotation(description: string, timestamp: number, - attributes?: Attributes): void; - - /** - * Adds a link to the span. - * @param traceId The trace ID for a trace within a project. - * @param spanId The span ID for a span within a trace. - * @param type The relationship of the current span relative to the linked. - * @param attributes A set of attributes on the link. - */ - addLink(traceId: string, spanId: string, type: string, +export interface Span { + /** The Span ID of this span */ + readonly id: string; + + /** If the parent span is in another process. */ + remoteParent: boolean; + + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string; + + /** The resource name of the span */ + name: string; + + /** Type of span. Used to specify additional relationships between spans */ + type: string; + + /** A final status for this span */ + status: number; + + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: Attributes; + + /** A text annotation with a set of attributes. */ + annotations: Annotation[]; + + /** An event describing a message sent/received between Spans. */ + messageEvents: MessageEvent[]; + + /** Pointers from the current span to another span */ + links: Link[]; + + /** Constructs a new SpanBaseModel instance. */ + readonly traceId: string; + + /** Indicates if span was started. */ + readonly started: boolean; + + /** Indicates if span was ended. */ + readonly ended: boolean; + + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + readonly startTime: Date; + + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + readonly endTime: Date; + + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + readonly duration: number; + + /** Gives the TraceContext of the span. */ + readonly traceContext: TraceContext; + + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAtribute(key: string, value: string): void; + + /** + * Adds an annotation to the span. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation( + description: string, timestamp: number, attributes?: Attributes): void; + + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink( + traceId: string, spanId: string, type: string, attributes?: Attributes): void; - - /** - * Adds a message event to the span. - * @param type The type of message event. - * @param id An identifier for the message event. - */ - addMessageEvent(type: string, id: string): void; - - /** Starts a span. */ - start(): void; - - /** Ends a span. */ - end(): void; - - /** Forces to end a span. */ - truncate(): void; + + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. + */ + addMessageEvent(type: string, id: string): void; + + /** Starts a span. */ + start(): void; + + /** Ends a span. */ + end(): void; + + /** Forces to end a span. */ + truncate(): void; } /** Interface for RootSpan */ @@ -200,82 +198,82 @@ export interface RootSpan extends Span, OnEndSpanEventListener { /** Starts the RootSpan instance */ start(): void; - + /** Ends the RootSpan instance */ end(): void; - + /** Starts a new Span instance in the RootSpan instance */ startSpan(name: string, type: string, parentSpanId?: string): Span; } /** Interface for Tracer */ -export interface Tracer { - /** Get and set the currentRootSpan to tracer instance */ - currentRootSpan: RootSpan; - - /** A sampler that will decide if the span will be sampled or not */ - sampler: Sampler; - - /** Get the eventListeners from tracer instance */ - readonly eventListeners: OnEndSpanEventListener[]; - - /** Get the active status from tracer instance */ - readonly active: boolean; - - /** - * Start a tracer instance - * @param config Configuration for tracer instace - * @returns A tracer instance started - */ - start(config: TracerConfig): Tracer; - - /** Stop the tracer instance */ - stop(): void; - - /** - * Start a new RootSpan to currentRootSpan - * @param options Options for tracer instance - * @param fn Callback function - * @returns The callback return - */ - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; - - /** - * Event called on the span end - * @param root The RootSpan that was ended - */ - onEndSpan(root: RootSpan): void; - - /** - * Register a OnEndSpanEventListener on the tracer instance - * @param listner An OnEndSpanEventListener instance - */ - registerEndSpanListener(listner: OnEndSpanEventListener): void; - - /** Clear the currentRootSpan from tracer instance */ - clearCurrentTrace(): void; - - /** - * Start a new Span instance to the currentRootSpan - * @param name Span name - * @param type Span type - * @param parentSpanId Parent SpanId - * @returns The new Span instance started - */ - startSpan(name?: string, type?: string, parentSpanId?: string): Span; - - /** - * Wraper to contextManager - * @param fn Function that will wrap in contextManager - * @returns The contextManager class wrapped - */ - wrap(fn: Func): Func; - - /** - * Wrapper to contextManager emitter - * @param emitter Function that will wrap in contextManager emitter - * @returns The contextManager emitter wrapped - */ - wrapEmitter(emitter: NodeJS.EventEmitter): void; +export interface Tracer { + /** Get and set the currentRootSpan to tracer instance */ + currentRootSpan: RootSpan; + + /** A sampler that will decide if the span will be sampled or not */ + sampler: Sampler; + + /** Get the eventListeners from tracer instance */ + readonly eventListeners: OnEndSpanEventListener[]; + + /** Get the active status from tracer instance */ + readonly active: boolean; + + /** + * Start a tracer instance + * @param config Configuration for tracer instace + * @returns A tracer instance started + */ + start(config: TracerConfig): Tracer; + + /** Stop the tracer instance */ + stop(): void; + + /** + * Start a new RootSpan to currentRootSpan + * @param options Options for tracer instance + * @param fn Callback function + * @returns The callback return + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; + + /** + * Event called on the span end + * @param root The RootSpan that was ended + */ + onEndSpan(root: RootSpan): void; + + /** + * Register a OnEndSpanEventListener on the tracer instance + * @param listner An OnEndSpanEventListener instance + */ + registerEndSpanListener(listner: OnEndSpanEventListener): void; + + /** Clear the currentRootSpan from tracer instance */ + clearCurrentTrace(): void; + + /** + * Start a new Span instance to the currentRootSpan + * @param name Span name + * @param type Span type + * @param parentSpanId Parent SpanId + * @returns The new Span instance started + */ + startSpan(name?: string, type?: string, parentSpanId?: string): Span; + + /** + * Wraper to contextManager + * @param fn Function that will wrap in contextManager + * @returns The contextManager class wrapped + */ + wrap(fn: Func): Func; + + /** + * Wrapper to contextManager emitter + * @param emitter Function that will wrap in contextManager emitter + * @returns The contextManager emitter wrapped + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void; } \ No newline at end of file diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 2451aad49..583642130 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -65,6 +65,28 @@ describe('Span', () => { }); }); + /** + * startTime, endTime and durantion proprieties called before start() - no + * clock instance created + */ + describe('get time properties before start()', () => { + let span; + before(() => { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + span = new SpanImpl(rootSpan); + }); + it('should get startTime() return null', () => { + assert.equal(span.startTime, null); + }); + it('should get endTime() return null', () => { + assert.equal(span.endTime, null); + }); + it('should get duration() return null', () => { + assert.equal(span.duration, null); + }); + }); + /** * Should start a span instance */ @@ -80,6 +102,22 @@ describe('Span', () => { }); }); + /** + * Should not change the initial startTime + */ + describe('start() an already started span', () => { + it('should not change the initial startTime', () => { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + const span = new SpanImpl(rootSpan); + span.start(); + const initialStartTime = span.startTime; + span.start(); + + assert.equal(span.startTime, initialStartTime); + }); + }); + /** * Should end a span instance */ @@ -99,7 +137,7 @@ describe('Span', () => { /** * Should not end a span instance */ - describe('end() before start the span', () => { + describe('end() before start()', () => { it('should not end a span instance', () => { const rootSpan = new RootSpanImpl(tracer); rootSpan.start(); @@ -111,6 +149,23 @@ describe('Span', () => { }); }); + /** + * Should not change the endTime + */ + describe('end() an already ended span', () => { + it('should not change the endTime', () => { + const rootSpan = new RootSpanImpl(tracer); + rootSpan.start(); + const span = new SpanImpl(rootSpan); + span.start(); + span.end(); + const initialEndTime = span.endTime; + span.end(); + + assert.equal(span.endTime.getTime(), initialEndTime.getTime()); + }); + }); + /** * Should add an attrinbutes */ From 517eff0ff6c5cec0e98d517fe70f4bbbafb18660 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Wed, 18 Apr 2018 17:00:49 -0300 Subject: [PATCH 089/110] feat: Add console logger --- packages/opencensus-core/package-lock.json | 3443 +++++++++++++++-- packages/opencensus-core/package.json | 1 + .../src/common/console-logger.ts | 49 + packages/opencensus-core/src/common/types.ts | 33 + .../test/test-console-logger.ts | 19 + 5 files changed, 3319 insertions(+), 226 deletions(-) create mode 100644 packages/opencensus-core/src/common/console-logger.ts create mode 100644 packages/opencensus-core/src/common/types.ts create mode 100644 packages/opencensus-core/test/test-console-logger.ts diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 5b0fa3326..55106d161 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,11 +1,14 @@ { - "requires": true, + "name": "@opencensus/opencensus-core", + "version": "0.0.1", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -13,42 +16,50 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", + "dev": true }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", + "dev": true }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true }, "@types/shimmer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", + "dev": true }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -57,6 +68,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -64,17 +76,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -84,6 +99,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -93,17 +109,20 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "1.9.1" } @@ -112,6 +131,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -119,12 +139,14 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "async-listener": { "version": "0.6.9", @@ -144,6 +166,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -153,12 +176,14 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -170,19 +195,22 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -196,22 +224,26 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -221,6 +253,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -231,6 +264,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -239,17 +273,20 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -259,19 +296,22 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -281,12 +321,14 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, "requires": { "has-flag": "3.0.0" } @@ -296,12 +338,14 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", + "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -311,19 +355,22 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -331,12 +378,14 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -344,22 +393,26 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -373,6 +426,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, "requires": { "is-obj": "1.0.1" } @@ -392,6 +446,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -400,6 +455,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -409,12 +465,14 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -430,12 +488,14 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -444,24 +504,28 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "emitter-listener": { "version": "1.1.1", @@ -475,6 +539,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -482,22 +547,26 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -512,6 +581,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -522,6 +592,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -530,6 +601,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "2.0.0" } @@ -537,17 +609,20 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -561,6 +636,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, "requires": { "ini": "1.3.5" } @@ -568,17 +644,20 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", + "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -595,6 +674,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -602,17 +682,20 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -620,32 +703,38 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -654,17 +743,20 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -685,17 +777,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -705,6 +800,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -714,12 +810,14 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -728,6 +826,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -736,17 +835,20 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -754,42 +856,50 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -798,12 +908,14 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, "requires": { "package-json": "4.0.1" } @@ -812,6 +924,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -823,6 +936,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -834,6 +948,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -842,12 +957,19 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -856,12 +978,14 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -871,6 +995,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, "requires": { "pify": "3.0.0" } @@ -878,17 +1003,20 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -904,19 +1032,22 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -924,12 +1055,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -939,6 +1072,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -947,6 +1081,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -968,17 +1103,20 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -990,160 +1128,2955 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "2.0.1" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "nyc": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", + "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", + "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.3", + "istanbul-reports": "1.3.0", + "md5-hex": "1.3.0", + "merge-source-map": "1.1.0", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.2.1", + "yargs": "11.1.0", + "yargs-parser": "8.1.0" }, "dependencies": { - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "atob": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.1", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.3", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "base": { + "version": "0.11.2", + "bundled": true, + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "class-utils": { + "version": "0.3.6", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "bundled": true, + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.5.3", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "5.1.0", "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } } }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } }, - "unzip-response": { + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - } - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fragment-cache": { + "version": "0.2.1", + "bundled": true, + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "get-value": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "has-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hosted-git-info": { + "version": "2.6.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-odd": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "bundled": true, + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "lodash": { + "version": "4.17.5", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true, + "requires": { + "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" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "ret": { + "version": "0.1.15", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-regex": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "set-value": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "split-string": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.9", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "braces": { + "version": "2.3.1", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "union-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "bundled": true, + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "bundled": true, + "dev": true + }, + "use": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.1.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + } + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -1154,7 +4087,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -1162,6 +4096,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -1172,6 +4107,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -1181,6 +4117,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -1190,6 +4127,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -1199,6 +4137,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, "requires": { "rc": "1.2.6" } @@ -1207,6 +4146,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, "requires": { "path-parse": "1.0.5" } @@ -1215,6 +4155,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -1224,6 +4165,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" } @@ -1232,6 +4174,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { "is-promise": "2.1.0" } @@ -1239,12 +4182,14 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -1252,7 +4197,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -1263,6 +4209,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, "requires": { "semver": "5.5.0" } @@ -1271,6 +4218,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -1278,7 +4226,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shimmer": { "version": "1.2.0", @@ -1288,12 +4237,14 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, "requires": { "source-map": "0.6.1" }, @@ -1301,7 +4252,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -1309,6 +4261,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -1317,12 +4270,14 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -1331,17 +4286,20 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -1349,27 +4307,32 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -1378,6 +4341,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, "requires": { "execa": "0.7.0" } @@ -1385,12 +4349,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -1398,12 +4364,14 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -1420,7 +4388,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -1428,6 +4397,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -1438,12 +4408,14 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -1462,7 +4434,8 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true } } }, @@ -1470,19 +4443,22 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "dev": true, "requires": { "tslib": "1.9.0" } }, "typescript": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", - "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -1491,6 +4467,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -1507,6 +4484,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -1520,6 +4498,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -1528,6 +4507,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -1537,6 +4517,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -1545,6 +4526,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -1552,17 +4534,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -1572,6 +4557,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -1581,12 +4567,14 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -1596,17 +4584,20 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index 41ced317e..c818e77d8 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -57,6 +57,7 @@ "async_hooks": "^1.0.0", "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", + "log-driver": "^1.2.7", "semver": "^5.5.0", "shimmer": "^1.2.0", "uuid": "^3.2.1" diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts new file mode 100644 index 000000000..26af8e83d --- /dev/null +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -0,0 +1,49 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Logger, LoggerOptions} from './types'; +let logDriver = require('log-driver'); + + +export class ConsoleLogger implements Logger { + + private logger:any; + + constructor(options?: LoggerOptions|string) { + this.logger = logDriver(options); + } + + error(message: any, ...args: any[]): void { + this.logger.error(arguments); + } + + warn(message: any, ...args: any[]): void { + this.logger.warn(arguments); + } + + info(message: any, ...args: any[]): void { + this.logger.info(arguments); + } + + debug (message: any, ...args: any[]): void { + this.logger.debug(arguments); + } + + silly (message: any, ...args: any[]): void { + this.logger.silly(arguments); + } +} + diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts new file mode 100644 index 000000000..e18c9c52c --- /dev/null +++ b/packages/opencensus-core/src/common/types.ts @@ -0,0 +1,33 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type LogFunction = (message: any, ...args: any[]) => void; + +export interface Logger { + error: LogFunction; + warn: LogFunction; + info: LogFunction; + debug: LogFunction; + silly: LogFunction; +} + +export interface LoggerOptions { + level?: string; + levels?: string[]; + tag?: string; +} + + export let logger: {(options?: LoggerOptions|string): Logger; LEVELS: string[];}; diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts new file mode 100644 index 000000000..af35646c2 --- /dev/null +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -0,0 +1,19 @@ +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {ConsoleLogger} from '../src/common/consolelogger'; + + +describe('ConsoleLogger', () => { + describe('new RootSpan()', () => { + it('should create a RootSpan instance', () => { + const consoleLogger = new ConsoleLogger({level: 'error'}); + + consoleLogger.info("info"); + consoleLogger.error("error"); + + assert.ok(true); + }); + }); +}); + From 1831409b3d382bfbcaf19da9c71db770e9d4cf21 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Thu, 19 Apr 2018 13:40:32 -0300 Subject: [PATCH 090/110] feat: update console log --- packages/opencensus-core/package-lock.json | 5 ++++ .../src/common/console-logger.ts | 29 +++++++++++++++++-- packages/opencensus-core/src/common/types.ts | 2 -- .../test/test-console-logger.ts | 4 +-- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 55106d161..c03dbd8b7 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -807,6 +807,11 @@ } } }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 26af8e83d..339192a87 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -15,15 +15,29 @@ */ import {Logger, LoggerOptions} from './types'; + let logDriver = require('log-driver'); -export class ConsoleLogger implements Logger { + class ConsoleLogger implements Logger { private logger:any; + static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; constructor(options?: LoggerOptions|string) { - this.logger = logDriver(options); + let opt: LoggerOptions = {}; + if (typeof options === "string") { + opt = { + level: options + } + } else { + opt = options || {}; + } + + this.logger = logDriver({ + levels: ConsoleLogger.LEVELS, + level: opt.level || 'error' + }); } error(message: any, ...args: any[]): void { @@ -47,3 +61,14 @@ export class ConsoleLogger implements Logger { } } +let defaultLogger = null; + +let logger = function(options?: LoggerOptions|string){ + defaultLogger = new ConsoleLogger(options); + logger['logger'] = defaultLogger; + return defaultLogger; +}; + +logger(); + +export = logger; \ No newline at end of file diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts index e18c9c52c..622d1b489 100644 --- a/packages/opencensus-core/src/common/types.ts +++ b/packages/opencensus-core/src/common/types.ts @@ -26,8 +26,6 @@ export interface Logger { export interface LoggerOptions { level?: string; - levels?: string[]; tag?: string; } - export let logger: {(options?: LoggerOptions|string): Logger; LEVELS: string[];}; diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index af35646c2..003dbe7f1 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -1,13 +1,13 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {ConsoleLogger} from '../src/common/consolelogger'; +import * as logger from '../src/common/consolelogger'; describe('ConsoleLogger', () => { describe('new RootSpan()', () => { it('should create a RootSpan instance', () => { - const consoleLogger = new ConsoleLogger({level: 'error'}); + const consoleLogger = logger({level: 'error'}); consoleLogger.info("info"); consoleLogger.error("error"); From 14e8854c8c77e97f6dd4256839c0a20e3f58afdf Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Thu, 19 Apr 2018 17:08:23 -0300 Subject: [PATCH 091/110] test: add unit test to consolelogger.ts --- packages/opencensus-core/package-lock.json | 56 +++++- packages/opencensus-core/package.json | 1 + .../src/common/console-logger.ts | 12 +- packages/opencensus-core/src/common/types.ts | 1 + .../test/test-console-logger.ts | 182 ++++++++++++++++-- 5 files changed, 234 insertions(+), 18 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index c03dbd8b7..976878d9c 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -807,10 +807,13 @@ } } }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + "intercept-stdout": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", + "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", + "requires": { + "lodash.toarray": "3.0.2" + } }, "is-arrayish": { "version": "0.2.1", @@ -965,6 +968,51 @@ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.toarray": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", + "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._basevalues": "3.0.0", + "lodash.keys": "3.1.2" + } + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index c818e77d8..e8df2b911 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -57,6 +57,7 @@ "async_hooks": "^1.0.0", "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", + "intercept-stdout": "^0.1.2", "log-driver": "^1.2.7", "semver": "^5.5.0", "shimmer": "^1.2.0", diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 339192a87..b6979fb92 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -16,11 +16,12 @@ import {Logger, LoggerOptions} from './types'; -let logDriver = require('log-driver'); +const logDriver = require('log-driver'); class ConsoleLogger implements Logger { + // tslint:disable:no-any private logger:any; static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; @@ -29,7 +30,7 @@ let logDriver = require('log-driver'); if (typeof options === "string") { opt = { level: options - } + }; } else { opt = options || {}; } @@ -40,22 +41,27 @@ let logDriver = require('log-driver'); }); } + // tslint:disable:no-any error(message: any, ...args: any[]): void { this.logger.error(arguments); } + // tslint:disable:no-any warn(message: any, ...args: any[]): void { this.logger.warn(arguments); } + // tslint:disable:no-any info(message: any, ...args: any[]): void { this.logger.info(arguments); } + // tslint:disable:no-any debug (message: any, ...args: any[]): void { this.logger.debug(arguments); } + // tslint:disable:no-any silly (message: any, ...args: any[]): void { this.logger.silly(arguments); } @@ -63,7 +69,7 @@ let logDriver = require('log-driver'); let defaultLogger = null; -let logger = function(options?: LoggerOptions|string){ +const logger = (options?: LoggerOptions|string) => { defaultLogger = new ConsoleLogger(options); logger['logger'] = defaultLogger; return defaultLogger; diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts index 622d1b489..4705cab73 100644 --- a/packages/opencensus-core/src/common/types.ts +++ b/packages/opencensus-core/src/common/types.ts @@ -14,6 +14,7 @@ * limitations under the License. */ + // tslint:disable:no-any export type LogFunction = (message: any, ...args: any[]) => void; export interface Logger { diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 003dbe7f1..a69237495 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -1,19 +1,179 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import * as assert from 'assert'; import * as mocha from 'mocha'; - import * as logger from '../src/common/consolelogger'; +const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; +let consoleTxt = ''; + + + describe('ConsoleLogger', () => { - describe('new RootSpan()', () => { - it('should create a RootSpan instance', () => { - const consoleLogger = logger({level: 'error'}); - - consoleLogger.info("info"); - consoleLogger.error("error"); - - assert.ok(true); - }); + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + describe('new ConsoleLogger()', () => { + it('should levels from consoleLogger equals default levels', () => { + const consoleLogger = logger(); + assert.equal(LEVELS.length, consoleLogger.logger.levels.length); + }); + + it('should level from consoleLogger equal error', () => { + const consoleLogger = logger(LEVELS[0]); + assert.strictEqual(LEVELS[0], consoleLogger.logger.level); + }); + }); + + /** + * + */ + describe('error logger', () => { + const consoleLogger = logger(LEVELS[0]); + + it('should logger error in console', () => { + consoleTxt = ''; + consoleLogger.error('error test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('error'); + + assert.ok(validateString >= 0); + }); + + it('should not logger warn in console', () => { + consoleTxt = ''; + consoleLogger.warn('warn test logger in console'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('warn'); + + assert.equal(validateString, -1); + }); + + it('should not logger info in console', () => { + consoleTxt = ''; + consoleLogger.info('info test logger in console'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('info'); + + assert.equal(validateString, -1); + }); + + it('should not logger debug in console', () => { + consoleTxt = ''; + consoleLogger.debug('debug test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('debug'); + + assert.equal(validateString, -1); + }); + + it('should not logger silly in console', () => { + consoleTxt = ''; + consoleLogger.silly('silly test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('silly'); + + assert.equal(validateString, -1); + }); + }); + + describe('info logger', () => { + + const consoleLogger = logger(LEVELS[2]); + + it('should logger error in console', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + + consoleTxt = ''; + consoleLogger.error('error test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('error'); + + assert.ok(validateString >= 0); + }); + + it('should not logger warn in console', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + + consoleTxt = ''; + consoleLogger.warn('warn test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('warn'); + + assert.ok(validateString >= 0); + }); + + it('should logger info in console', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + + consoleTxt = ''; + consoleLogger.info('info test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('info'); + + assert.ok(validateString >= 0); + }); + + it('should not logger debug in console', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + + consoleTxt = ''; + consoleLogger.debug('debug test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('debug'); + + assert.equal(validateString, -1); + }); + + it('should not logger silly in console', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; }); -}); + + consoleTxt = ''; + consoleLogger.silly('silly test logger in console'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('silly'); + assert.equal(validateString, -1); + }); + }); + +}); \ No newline at end of file From 50957829941f193ff7d871b2f4ecad987fc23794 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Fri, 20 Apr 2018 10:59:05 -0300 Subject: [PATCH 092/110] docs: add jsdoc to consolelogger --- .../src/common/console-logger.ts | 59 ++++++++++++++----- packages/opencensus-core/src/common/types.ts | 5 +- .../test/test-console-logger.ts | 55 +++++++++-------- 3 files changed, 75 insertions(+), 44 deletions(-) diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index b6979fb92..4e5b1b919 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -19,57 +19,88 @@ import {Logger, LoggerOptions} from './types'; const logDriver = require('log-driver'); - class ConsoleLogger implements Logger { - +/** + * This class represente a console-logger + */ +class ConsoleLogger implements Logger { // tslint:disable:no-any - private logger:any; + private logger: any; static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; + /** + * Constructs a new ConsoleLogger instance + * @param options A logger configuration object. + */ constructor(options?: LoggerOptions|string) { let opt: LoggerOptions = {}; - if (typeof options === "string") { - opt = { - level: options - }; + if (typeof options === 'string') { + opt = {level: options}; } else { opt = options || {}; } - this.logger = logDriver({ - levels: ConsoleLogger.LEVELS, - level: opt.level || 'error' - }); + this.logger = + logDriver({levels: ConsoleLogger.LEVELS, level: opt.level || 'error'}); } + /** + * Logger error function. + * @param message menssage erro to log in console + * @param args arguments to log in console + */ // tslint:disable:no-any error(message: any, ...args: any[]): void { this.logger.error(arguments); } + /** + * Logger warning function. + * @param message menssage warning to log in console + * @param args arguments to log in console + */ // tslint:disable:no-any warn(message: any, ...args: any[]): void { this.logger.warn(arguments); } + /** + * Logger info function. + * @param message menssage info to log in console + * @param args arguments to log in console + */ // tslint:disable:no-any info(message: any, ...args: any[]): void { this.logger.info(arguments); } + /** + * Logger debug function. + * @param message menssage debug to log in console + * @param args arguments to log in console + */ // tslint:disable:no-any - debug (message: any, ...args: any[]): void { + debug(message: any, ...args: any[]): void { this.logger.debug(arguments); } + /** + * Logger silly function. + * @param message menssage silly to log in console + * @param args arguments to log in console + */ // tslint:disable:no-any - silly (message: any, ...args: any[]): void { + silly(message: any, ...args: any[]): void { this.logger.silly(arguments); } } let defaultLogger = null; -const logger = (options?: LoggerOptions|string) => { +/** + * Function logger exported to others classes. + * @param options A logger options or strig to logger in console + */ +const logger = (options?: LoggerOptions|string) => { defaultLogger = new ConsoleLogger(options); logger['logger'] = defaultLogger; return defaultLogger; diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts index 4705cab73..65b39385b 100644 --- a/packages/opencensus-core/src/common/types.ts +++ b/packages/opencensus-core/src/common/types.ts @@ -14,9 +14,10 @@ * limitations under the License. */ - // tslint:disable:no-any +// tslint:disable:no-any export type LogFunction = (message: any, ...args: any[]) => void; +/** Defines an logger interface. */ export interface Logger { error: LogFunction; warn: LogFunction; @@ -25,8 +26,8 @@ export interface Logger { silly: LogFunction; } +/** Defines an logger options interface. */ export interface LoggerOptions { level?: string; tag?: string; } - diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index a69237495..fe62d922e 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -22,44 +22,42 @@ const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; let consoleTxt = ''; - - describe('ConsoleLogger', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; return txt; }); + +/** Should create a new ConsoleLogger */ describe('new ConsoleLogger()', () => { - it('should levels from consoleLogger equals default levels', () => { + it('should consoleLogger with default levels', () => { const consoleLogger = logger(); assert.equal(LEVELS.length, consoleLogger.logger.levels.length); }); - it('should level from consoleLogger equal error', () => { + it('should consoleLogger with error', () => { const consoleLogger = logger(LEVELS[0]); assert.strictEqual(LEVELS[0], consoleLogger.logger.level); }); }); - /** - * - */ + /** Should logger only error log */ describe('error logger', () => { const consoleLogger = logger(LEVELS[0]); - it('should logger error in console', () => { + it('should logger error', () => { consoleTxt = ''; - consoleLogger.error('error test logger in console'); + consoleLogger.error('error test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('error'); assert.ok(validateString >= 0); }); - it('should not logger warn in console', () => { + it('should not logger warn', () => { consoleTxt = ''; - consoleLogger.warn('warn test logger in console'); + consoleLogger.warn('warn test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('warn'); @@ -67,9 +65,9 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger info in console', () => { + it('should not logger info', () => { consoleTxt = ''; - consoleLogger.info('info test logger in console'); + consoleLogger.info('info test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('info'); @@ -77,30 +75,31 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger debug in console', () => { + it('should not logger debug', () => { consoleTxt = ''; - consoleLogger.debug('debug test logger in console'); + consoleLogger.debug('debug test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('debug'); assert.equal(validateString, -1); }); - it('should not logger silly in console', () => { + it('should not logger silly', () => { consoleTxt = ''; - consoleLogger.silly('silly test logger in console'); + consoleLogger.silly('silly test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('silly'); assert.equal(validateString, -1); }); }); - + + /** Should logger error, warn and info log */ describe('info logger', () => { const consoleLogger = logger(LEVELS[2]); - it('should logger error in console', () => { + it('should logger error', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; @@ -108,14 +107,14 @@ describe('ConsoleLogger', () => { }); consoleTxt = ''; - consoleLogger.error('error test logger in console'); + consoleLogger.error('error test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('error'); assert.ok(validateString >= 0); }); - it('should not logger warn in console', () => { + it('should not logger warn', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; @@ -123,14 +122,14 @@ describe('ConsoleLogger', () => { }); consoleTxt = ''; - consoleLogger.warn('warn test logger in console'); + consoleLogger.warn('warn test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('warn'); assert.ok(validateString >= 0); }); - it('should logger info in console', () => { + it('should logger info', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; @@ -138,14 +137,14 @@ describe('ConsoleLogger', () => { }); consoleTxt = ''; - consoleLogger.info('info test logger in console'); + consoleLogger.info('info test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('info'); assert.ok(validateString >= 0); }); - it('should not logger debug in console', () => { + it('should not logger debug', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; @@ -153,14 +152,14 @@ describe('ConsoleLogger', () => { }); consoleTxt = ''; - consoleLogger.debug('debug test logger in console'); + consoleLogger.debug('debug test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('debug'); assert.equal(validateString, -1); }); - it('should not logger silly in console', () => { + it('should not logger silly', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { consoleTxt = txt; @@ -168,7 +167,7 @@ describe('ConsoleLogger', () => { }); consoleTxt = ''; - consoleLogger.silly('silly test logger in console'); + consoleLogger.silly('silly test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('silly'); From eba9b692774d0b0c24aa8349f5ba2e18b21579af Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Fri, 20 Apr 2018 16:56:53 -0300 Subject: [PATCH 093/110] refactor: add logger to ather classes --- package.json | 2 +- packages/opencensus-core/package-lock.json | 1070 ++++------------- .../src/common/console-logger.ts | 8 +- .../opencensus-core/src/exporters/buffer.ts | 13 +- .../src/exporters/console-exporter.ts | 4 + .../opencensus-core/src/exporters/types.ts | 3 + packages/opencensus-core/src/index.ts | 3 +- .../opencensus-core/src/trace/config/types.ts | 5 + .../src/trace/model/root-span.ts | 11 +- .../src/trace/model/span-base-model.ts | 18 +- .../opencensus-core/src/trace/model/span.ts | 7 +- .../opencensus-core/src/trace/model/tracer.ts | 18 +- .../opencensus-core/src/trace/model/types.ts | 7 + .../test/test-console-logger.ts | 50 +- 14 files changed, 374 insertions(+), 845 deletions(-) diff --git a/package.json b/package.json index 597d76985..dbd3c8834 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "repository": "census-instrumentation/opencensus-node", "scripts": { "postinstall": "npm run bootstrap;npm run build;", - "build" : "node_modules/.bin/lerna run build", + "build": "node_modules/.bin/lerna run build", "bootstrap": "node_modules/.bin/lerna bootstrap", "bump": "node_modules/.bin/lerna publish" }, diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 976878d9c..91a86ae4c 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,14 +1,11 @@ { - "name": "@opencensus/opencensus-core", - "version": "0.0.1", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -16,50 +13,42 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", - "dev": true + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", - "dev": true + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" }, "@types/shimmer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", - "dev": true + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -68,7 +57,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -76,20 +64,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -99,7 +84,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -109,20 +93,17 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "1.9.1" } @@ -131,7 +112,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -139,14 +119,12 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "async-listener": { "version": "0.6.9", @@ -166,7 +144,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -176,14 +153,12 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -195,22 +170,19 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -224,26 +196,22 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -253,7 +221,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -264,7 +231,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -273,20 +239,17 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -296,22 +259,19 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -321,14 +281,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -338,14 +296,12 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", - "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -355,22 +311,19 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -378,14 +331,12 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -393,26 +344,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -426,7 +373,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, "requires": { "is-obj": "1.0.1" } @@ -446,7 +392,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -455,7 +400,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -465,14 +409,12 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -488,14 +430,12 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -504,28 +444,24 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "emitter-listener": { "version": "1.1.1", @@ -539,7 +475,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -547,26 +482,22 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -581,7 +512,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -592,7 +522,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -601,7 +530,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "2.0.0" } @@ -609,20 +537,17 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -636,7 +561,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, "requires": { "ini": "1.3.5" } @@ -644,20 +568,17 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", - "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -674,7 +595,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -682,20 +602,17 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -703,38 +620,32 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -743,20 +654,17 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -777,20 +685,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -800,7 +705,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -818,14 +722,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -834,7 +736,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -843,20 +744,17 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -864,50 +762,42 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -916,14 +806,12 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, "requires": { "package-json": "4.0.1" } @@ -932,7 +820,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -944,7 +831,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -956,7 +842,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -965,8 +850,7 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._arraycopy": { "version": "3.0.0", @@ -1022,7 +906,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -1031,14 +914,12 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -1048,7 +929,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -1056,20 +936,17 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -1085,22 +962,19 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -1108,14 +982,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -1125,7 +997,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1134,7 +1005,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", - "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -1156,20 +1026,17 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -1181,7 +1048,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -1190,7 +1056,6 @@ "version": "11.6.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", - "dev": true, "requires": { "archy": "1.0.0", "arrify": "1.0.1", @@ -1224,7 +1089,6 @@ "align-text": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2", "longest": "1.0.1", @@ -1233,79 +1097,65 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, - "dev": true + "bundled": true }, "append-transform": { "version": "0.4.0", "bundled": true, - "dev": true, "requires": { "default-require-extensions": "1.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-diff": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "arr-flatten": "1.1.0" } }, "arr-flatten": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-union": { "version": "3.1.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "arrify": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "assign-symbols": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "async": { "version": "1.5.2", - "bundled": true, - "dev": true + "bundled": true }, "atob": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "babel-code-frame": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -1315,7 +1165,6 @@ "babel-generator": { "version": "6.26.1", "bundled": true, - "dev": true, "requires": { "babel-messages": "6.23.0", "babel-runtime": "6.26.0", @@ -1330,7 +1179,6 @@ "babel-messages": { "version": "6.23.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0" } @@ -1338,7 +1186,6 @@ "babel-runtime": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "core-js": "2.5.3", "regenerator-runtime": "0.11.1" @@ -1347,7 +1194,6 @@ "babel-template": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0", "babel-traverse": "6.26.0", @@ -1359,7 +1205,6 @@ "babel-traverse": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", @@ -1375,7 +1220,6 @@ "babel-types": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", @@ -1385,18 +1229,15 @@ }, "babylon": { "version": "6.18.0", - "bundled": true, - "dev": true + "bundled": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "base": { "version": "0.11.2", "bundled": true, - "dev": true, "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", @@ -1410,22 +1251,19 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1434,7 +1272,6 @@ "braces": { "version": "1.8.5", "bundled": true, - "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -1443,13 +1280,11 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, - "dev": true + "bundled": true }, "cache-base": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "collection-visit": "1.0.0", "component-emitter": "1.2.1", @@ -1464,15 +1299,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "caching-transform": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "md5-hex": "1.3.0", "mkdirp": "0.5.1", @@ -1482,13 +1315,11 @@ "camelcase": { "version": "1.2.1", "bundled": true, - "dev": true, "optional": true }, "center-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "0.1.4", @@ -1498,7 +1329,6 @@ "chalk": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -1510,7 +1340,6 @@ "class-utils": { "version": "0.3.6", "bundled": true, - "dev": true, "requires": { "arr-union": "3.1.0", "define-property": "0.2.5", @@ -1521,7 +1350,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -1529,7 +1357,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1537,7 +1364,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1547,7 +1373,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1555,7 +1380,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1565,7 +1389,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -1574,20 +1397,17 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "cliui": { "version": "2.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "center-align": "0.1.3", @@ -1598,20 +1418,17 @@ "wordwrap": { "version": "0.0.2", "bundled": true, - "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "collection-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "map-visit": "1.0.0", "object-visit": "1.0.1" @@ -1619,38 +1436,31 @@ }, "commondir": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "component-emitter": { "version": "1.2.1", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "convert-source-map": { "version": "1.5.1", - "bundled": true, - "dev": true + "bundled": true }, "copy-descriptor": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "core-js": { "version": "2.5.3", - "bundled": true, - "dev": true + "bundled": true }, "cross-spawn": { "version": "4.0.2", "bundled": true, - "dev": true, "requires": { "lru-cache": "4.1.2", "which": "1.3.0" @@ -1659,30 +1469,25 @@ "debug": { "version": "2.6.9", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } }, "debug-log": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "decamelize": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true, - "dev": true + "bundled": true }, "default-require-extensions": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "strip-bom": "2.0.0" } @@ -1690,7 +1495,6 @@ "define-property": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2", "isobject": "3.0.1" @@ -1698,15 +1502,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "detect-indent": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "repeating": "2.0.1" } @@ -1714,25 +1516,21 @@ "error-ex": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "is-arrayish": "0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "esutils": { "version": "2.0.2", - "bundled": true, - "dev": true + "bundled": true }, "execa": { "version": "0.7.0", "bundled": true, - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -1746,7 +1544,6 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, - "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -1758,7 +1555,6 @@ "expand-brackets": { "version": "0.1.5", "bundled": true, - "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -1766,7 +1562,6 @@ "expand-range": { "version": "1.8.2", "bundled": true, - "dev": true, "requires": { "fill-range": "2.2.3" } @@ -1774,7 +1569,6 @@ "extend-shallow": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "assign-symbols": "1.0.0", "is-extendable": "1.0.1" @@ -1783,7 +1577,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -1793,20 +1586,17 @@ "extglob": { "version": "0.3.2", "bundled": true, - "dev": true, "requires": { "is-extglob": "1.0.0" } }, "filename-regex": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "fill-range": { "version": "2.2.3", "bundled": true, - "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -1818,7 +1608,6 @@ "find-cache-dir": { "version": "0.1.1", "bundled": true, - "dev": true, "requires": { "commondir": "1.0.1", "mkdirp": "0.5.1", @@ -1828,20 +1617,17 @@ "find-up": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "locate-path": "2.0.0" } }, "for-in": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "for-own": { "version": "0.1.5", "bundled": true, - "dev": true, "requires": { "for-in": "1.0.2" } @@ -1849,7 +1635,6 @@ "foreground-child": { "version": "1.5.6", "bundled": true, - "dev": true, "requires": { "cross-spawn": "4.0.2", "signal-exit": "3.0.2" @@ -1858,35 +1643,29 @@ "fragment-cache": { "version": "0.2.1", "bundled": true, - "dev": true, "requires": { "map-cache": "0.2.2" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "get-stream": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-value": { "version": "2.0.6", - "bundled": true, - "dev": true + "bundled": true }, "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1899,7 +1678,6 @@ "glob-base": { "version": "0.3.0", "bundled": true, - "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -1908,25 +1686,21 @@ "glob-parent": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-glob": "2.0.1" } }, "globals": { "version": "9.18.0", - "bundled": true, - "dev": true + "bundled": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "dev": true + "bundled": true }, "handlebars": { "version": "4.0.11", "bundled": true, - "dev": true, "requires": { "async": "1.5.2", "optimist": "0.6.1", @@ -1937,7 +1711,6 @@ "source-map": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "amdefine": "1.0.1" } @@ -1947,20 +1720,17 @@ "has-ansi": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "has-flag": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "has-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "1.0.0", @@ -1969,15 +1739,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "has-values": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -1986,7 +1754,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1994,7 +1761,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2004,7 +1770,6 @@ "kind-of": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2013,18 +1778,15 @@ }, "hosted-git-info": { "version": "2.6.0", - "bundled": true, - "dev": true + "bundled": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -2032,51 +1794,43 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "invariant": { "version": "2.2.3", "bundled": true, - "dev": true, "requires": { "loose-envify": "1.3.1" } }, "invert-kv": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-arrayish": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-buffer": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -2084,22 +1838,19 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", "is-data-descriptor": "1.0.0", @@ -2108,51 +1859,43 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-dotfile": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "is-equal-shallow": { "version": "0.1.3", "bundled": true, - "dev": true, "requires": { "is-primitive": "2.0.0" } }, "is-extendable": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-extglob": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-finite": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-glob": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -2160,7 +1903,6 @@ "is-number": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2168,85 +1910,71 @@ "is-odd": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "is-plain-object": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "is-posix-bracket": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-primitive": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-stream": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "is-utf8": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-windows": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isexe": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "isarray": "1.0.0" } }, "istanbul-lib-coverage": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-hook": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "append-transform": "0.4.0" } @@ -2254,7 +1982,6 @@ "istanbul-lib-instrument": { "version": "1.10.1", "bundled": true, - "dev": true, "requires": { "babel-generator": "6.26.1", "babel-template": "6.26.0", @@ -2268,7 +1995,6 @@ "istanbul-lib-report": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", @@ -2279,7 +2005,6 @@ "supports-color": { "version": "3.2.3", "bundled": true, - "dev": true, "requires": { "has-flag": "1.0.0" } @@ -2289,7 +2014,6 @@ "istanbul-lib-source-maps": { "version": "1.2.3", "bundled": true, - "dev": true, "requires": { "debug": "3.1.0", "istanbul-lib-coverage": "1.2.0", @@ -2301,7 +2025,6 @@ "debug": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } @@ -2311,25 +2034,21 @@ "istanbul-reports": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "handlebars": "4.0.11" } }, "js-tokens": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "jsesc": { "version": "1.3.0", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2337,13 +2056,11 @@ "lazy-cache": { "version": "1.0.4", "bundled": true, - "dev": true, "optional": true }, "lcid": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "invert-kv": "1.0.0" } @@ -2351,7 +2068,6 @@ "load-json-file": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", @@ -2363,7 +2079,6 @@ "locate-path": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -2371,25 +2086,21 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "lodash": { "version": "4.17.5", - "bundled": true, - "dev": true + "bundled": true }, "longest": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "loose-envify": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "js-tokens": "3.0.2" } @@ -2397,7 +2108,6 @@ "lru-cache": { "version": "4.1.2", "bundled": true, - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -2405,13 +2115,11 @@ }, "map-cache": { "version": "0.2.2", - "bundled": true, - "dev": true + "bundled": true }, "map-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "object-visit": "1.0.1" } @@ -2419,20 +2127,17 @@ "md5-hex": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "md5-o-matic": "0.1.1" } }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "mem": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -2440,22 +2145,19 @@ "merge-source-map": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "source-map": "0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, - "dev": true + "bundled": true } } }, "micromatch": { "version": "2.3.11", "bundled": true, - "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2474,26 +2176,22 @@ }, "mimic-fn": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "mixin-deep": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -2502,7 +2200,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -2512,20 +2209,17 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "nanomatch": { "version": "1.2.9", "bundled": true, - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -2543,25 +2237,21 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -2572,7 +2262,6 @@ "normalize-path": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -2580,25 +2269,21 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "path-key": "2.0.1" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "object-assign": { "version": "4.1.1", - "bundled": true, - "dev": true + "bundled": true }, "object-copy": { "version": "0.1.0", "bundled": true, - "dev": true, "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", @@ -2608,7 +2293,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2616,7 +2300,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2624,7 +2307,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2632,7 +2314,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2641,8 +2322,7 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -2651,22 +2331,19 @@ "object-visit": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "object.omit": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" @@ -2675,22 +2352,19 @@ "object.pick": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -2698,7 +2372,6 @@ "optimist": { "version": "0.6.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8", "wordwrap": "0.0.3" @@ -2706,13 +2379,11 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "os-locale": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -2721,13 +2392,11 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "p-limit": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "p-try": "1.0.0" } @@ -2735,20 +2404,17 @@ "p-locate": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-limit": "1.2.0" } }, "p-try": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "parse-glob": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -2759,43 +2425,36 @@ "parse-json": { "version": "2.2.0", "bundled": true, - "dev": true, "requires": { "error-ex": "1.3.1" } }, "pascalcase": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "path-exists": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "pinkie-promise": "2.0.1" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-key": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-parse": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "path-type": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "pify": "2.3.0", @@ -2804,18 +2463,15 @@ }, "pify": { "version": "2.3.0", - "bundled": true, - "dev": true + "bundled": true }, "pinkie": { "version": "2.0.4", - "bundled": true, - "dev": true + "bundled": true }, "pinkie-promise": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "pinkie": "2.0.4" } @@ -2823,7 +2479,6 @@ "pkg-dir": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "find-up": "1.1.2" }, @@ -2831,7 +2486,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2841,23 +2495,19 @@ }, "posix-character-classes": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "preserve": { "version": "0.2.0", - "bundled": true, - "dev": true + "bundled": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "randomatic": { "version": "1.1.7", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -2866,7 +2516,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2874,7 +2523,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2884,7 +2532,6 @@ "kind-of": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2894,7 +2541,6 @@ "read-pkg": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", @@ -2904,7 +2550,6 @@ "read-pkg-up": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "find-up": "1.1.2", "read-pkg": "1.1.0" @@ -2913,7 +2558,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2923,13 +2567,11 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true, - "dev": true + "bundled": true }, "regex-cache": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -2937,7 +2579,6 @@ "regex-not": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "extend-shallow": "3.0.2", "safe-regex": "1.1.0" @@ -2945,56 +2586,46 @@ }, "remove-trailing-separator": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "repeat-element": { "version": "1.1.2", - "bundled": true, - "dev": true + "bundled": true }, "repeat-string": { "version": "1.6.1", - "bundled": true, - "dev": true + "bundled": true }, "repeating": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-finite": "1.0.2" } }, "require-directory": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "resolve-from": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "resolve-url": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "ret": { "version": "0.1.15", - "bundled": true, - "dev": true + "bundled": true }, "right-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "0.1.4" @@ -3003,7 +2634,6 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "requires": { "glob": "7.1.2" } @@ -3011,25 +2641,21 @@ "safe-regex": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "ret": "0.1.15" } }, "semver": { "version": "5.5.0", - "bundled": true, - "dev": true + "bundled": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "set-value": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -3040,7 +2666,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3050,30 +2675,25 @@ "shebang-command": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "shebang-regex": "1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "slide": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "snapdragon": { "version": "0.8.2", "bundled": true, - "dev": true, "requires": { "base": "0.11.2", "debug": "2.6.9", @@ -3088,7 +2708,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3096,7 +2715,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3104,7 +2722,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3112,7 +2729,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3122,7 +2738,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3130,7 +2745,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3140,7 +2754,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3149,15 +2762,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "snapdragon-node": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "define-property": "1.0.0", "isobject": "3.0.1", @@ -3167,35 +2778,30 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "snapdragon-util": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } }, "source-map": { "version": "0.5.7", - "bundled": true, - "dev": true + "bundled": true }, "source-map-resolve": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "atob": "2.0.3", "decode-uri-component": "0.2.0", @@ -3206,13 +2812,11 @@ }, "source-map-url": { "version": "0.4.0", - "bundled": true, - "dev": true + "bundled": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, - "dev": true, "requires": { "foreground-child": "1.5.6", "mkdirp": "0.5.1", @@ -3225,7 +2829,6 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -3233,13 +2836,11 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, - "dev": true + "bundled": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -3247,13 +2848,11 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "split-string": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "3.0.2" } @@ -3261,7 +2860,6 @@ "static-extend": { "version": "0.1.2", "bundled": true, - "dev": true, "requires": { "define-property": "0.2.5", "object-copy": "0.1.0" @@ -3270,7 +2868,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3278,7 +2875,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3286,7 +2882,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3296,7 +2891,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3304,7 +2898,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3314,7 +2907,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3323,15 +2915,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "string-width": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -3339,13 +2929,11 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -3355,7 +2943,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -3363,25 +2950,21 @@ "strip-bom": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-utf8": "0.2.1" } }, "strip-eof": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "supports-color": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "test-exclude": { "version": "4.2.1", "bundled": true, - "dev": true, "requires": { "arrify": "1.0.1", "micromatch": "3.1.9", @@ -3392,18 +2975,15 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "braces": { "version": "2.3.1", "bundled": true, - "dev": true, "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -3422,7 +3002,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3430,7 +3009,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3440,7 +3018,6 @@ "expand-brackets": { "version": "2.1.4", "bundled": true, - "dev": true, "requires": { "debug": "2.6.9", "define-property": "0.2.5", @@ -3454,7 +3031,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3462,7 +3038,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3470,7 +3045,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3479,15 +3053,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "extglob": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "array-unique": "0.3.2", "define-property": "1.0.0", @@ -3502,7 +3074,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3510,7 +3081,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3520,7 +3090,6 @@ "fill-range": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-number": "3.0.0", @@ -3531,7 +3100,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3541,7 +3109,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3549,7 +3116,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3559,7 +3125,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3567,7 +3132,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3577,7 +3141,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3585,7 +3148,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3594,18 +3156,15 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true }, "micromatch": { "version": "3.1.9", "bundled": true, - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -3626,13 +3185,11 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "to-object-path": { "version": "0.3.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3640,7 +3197,6 @@ "to-regex": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "define-property": "2.0.2", "extend-shallow": "3.0.2", @@ -3651,7 +3207,6 @@ "to-regex-range": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "repeat-string": "1.6.1" @@ -3660,7 +3215,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3669,13 +3223,11 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "uglify-js": { "version": "2.8.29", "bundled": true, - "dev": true, "optional": true, "requires": { "source-map": "0.5.7", @@ -3686,7 +3238,6 @@ "yargs": { "version": "3.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "camelcase": "1.2.1", @@ -3700,13 +3251,11 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "union-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", @@ -3717,7 +3266,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3725,7 +3273,6 @@ "set-value": { "version": "0.4.3", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -3738,7 +3285,6 @@ "unset-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "has-value": "0.3.1", "isobject": "3.0.1" @@ -3747,7 +3293,6 @@ "has-value": { "version": "0.3.1", "bundled": true, - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "0.1.4", @@ -3757,7 +3302,6 @@ "isobject": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "isarray": "1.0.0" } @@ -3766,40 +3310,34 @@ }, "has-values": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "urix": { "version": "0.1.0", - "bundled": true, - "dev": true + "bundled": true }, "use": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "validate-npm-package-license": { "version": "3.0.3", "bundled": true, - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -3808,31 +3346,26 @@ "which": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isexe": "2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "window-size": { "version": "0.1.0", "bundled": true, - "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, - "dev": true + "bundled": true }, "wrap-ansi": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" @@ -3841,7 +3374,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -3849,7 +3381,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -3860,13 +3391,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "write-file-atomic": { "version": "1.3.4", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -3875,18 +3404,15 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "2.1.2", - "bundled": true, - "dev": true + "bundled": true }, "yargs": { "version": "11.1.0", "bundled": true, - "dev": true, "requires": { "cliui": "4.0.0", "decamelize": "1.2.0", @@ -3904,18 +3430,15 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true }, "cliui": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "string-width": "2.1.1", "strip-ansi": "4.0.0", @@ -3925,7 +3448,6 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -3933,7 +3455,6 @@ "yargs-parser": { "version": "9.0.2", "bundled": true, - "dev": true, "requires": { "camelcase": "4.1.0" } @@ -3943,15 +3464,13 @@ "yargs-parser": { "version": "8.1.0", "bundled": true, - "dev": true, "requires": { "camelcase": "4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -3961,7 +3480,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -3970,7 +3488,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -3978,20 +3495,17 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -4000,7 +3514,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -4008,14 +3521,12 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -4027,7 +3538,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -4045,58 +3555,49 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" } } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -4104,32 +3605,27 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -4140,8 +3636,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4149,7 +3644,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -4160,7 +3654,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -4170,7 +3663,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -4180,7 +3672,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -4190,7 +3681,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, "requires": { "rc": "1.2.6" } @@ -4199,7 +3689,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, "requires": { "path-parse": "1.0.5" } @@ -4208,7 +3697,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -4218,7 +3706,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "7.1.2" } @@ -4227,7 +3714,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "2.1.0" } @@ -4235,14 +3721,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -4250,8 +3734,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.5.0", @@ -4262,7 +3745,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, "requires": { "semver": "5.5.0" } @@ -4271,7 +3753,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -4279,8 +3760,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shimmer": { "version": "1.2.0", @@ -4290,14 +3770,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", - "dev": true, "requires": { "source-map": "0.6.1" }, @@ -4305,8 +3783,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -4314,7 +3791,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -4323,14 +3799,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -4339,20 +3813,17 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -4360,32 +3831,27 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -4394,7 +3860,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, "requires": { "execa": "0.7.0" } @@ -4402,14 +3867,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -4417,14 +3880,12 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", - "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -4441,8 +3902,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4450,7 +3910,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -4461,14 +3920,12 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", - "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -4487,8 +3944,7 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" } } }, @@ -4496,7 +3952,6 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", - "dev": true, "requires": { "tslib": "1.9.0" } @@ -4504,14 +3959,12 @@ "typescript": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -4520,7 +3973,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -4537,7 +3989,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -4551,7 +4002,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", - "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -4560,7 +4010,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -4570,7 +4019,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -4579,7 +4027,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -4587,20 +4034,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -4610,7 +4054,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -4620,14 +4063,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -4637,20 +4078,17 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 4e5b1b919..d93c4e7f6 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -24,7 +24,7 @@ const logDriver = require('log-driver'); */ class ConsoleLogger implements Logger { // tslint:disable:no-any - private logger: any; + private logger: any; static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; /** @@ -39,8 +39,10 @@ class ConsoleLogger implements Logger { opt = options || {}; } - this.logger = - logDriver({levels: ConsoleLogger.LEVELS, level: opt.level || 'error'}); + this.logger = logDriver({ + levels: ConsoleLogger.LEVELS, + level: opt.level || 'silly' + }); } /** diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 323b9a65e..ea9f4f4fb 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -19,10 +19,12 @@ import * as uuidv4 from 'uuid/v4'; import {debug} from '../internal/util'; import {RootSpan} from '../trace/model/types'; import {OnEndSpanEventListener} from '../trace/model/types'; - +import {Logger} from '../common/types'; import {Exporter} from './types'; import {Config, BufferConfig} from '../trace/config/types'; +import * as logger from '../common/consolelogger'; + /** Controls the sending of traces to exporters. */ export class Buffer { @@ -38,6 +40,8 @@ export class Buffer { private resetTimeout = false; /** Indicates when the buffer timeout is running */ private bufferTimeoutInProgress = false; + /** An object to log information to */ + logger: Logger; /** * Constructs a new Buffer instance. @@ -46,6 +50,7 @@ export class Buffer { */ constructor(exporter: Exporter, config: BufferConfig) { this.exporter = exporter; + this.logger = config.logger || logger(); this.bufferSize = config.bufferSize; this.bufferTimeout = config.bufferTimeout; return this; @@ -66,7 +71,7 @@ export class Buffer { */ addToBuffer(trace: RootSpan) { this.queue.push(trace); - debug('BUFFER: added new trace'); + this.logger.debug('BUFFER: added new trace'); if (this.queue.length > this.bufferSize) { this.flush(); @@ -83,13 +88,13 @@ export class Buffer { /** Reset the buffer timeout */ private resetBufferTimeout() { - debug('BUFFER: reset timeout'); + this.logger.debug('BUFFER: reset timeout'); this.resetTimeout = true; } /** Start the buffer timeout, when finished calls flush method */ private setBufferTimeout() { - debug('BUFFER: set timerout'); + this.logger.debug('BUFFER: set timerout'); this.bufferTimeoutInProgress = true; setTimeout(() => { diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index d9f0e8ef1..a839b612c 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -17,10 +17,12 @@ import {Exporter, ExporterConfig} from '../exporters/types'; import {RootSpan} from '../trace/model/types'; import {Buffer} from './buffer'; +import {Logger} from '../common/types'; /** Do not send span data */ export class NoopExporter implements Exporter { + logger: Logger onEndSpan(root: RootSpan) {} publish(rootSpans: RootSpan[]) {} } @@ -29,6 +31,7 @@ export class NoopExporter implements Exporter { export class ConsoleLogExporter implements Exporter { /** Buffer object to store the spans. */ private buffer: Buffer; + logger: Logger; /** * Constructs a new ConsoleLogExporter instance. @@ -37,6 +40,7 @@ export class ConsoleLogExporter implements Exporter { */ constructor(config: ExporterConfig) { this.buffer = new Buffer(this, config); + this.logger = config.logger; } /** diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 9cae12d7d..7d6f307b1 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -17,9 +17,12 @@ import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; import {BufferConfig} from '../trace/config/types'; +import {Logger} from '../common/types' /** Defines an exporter interface. */ export interface Exporter extends OnEndSpanEventListener { + /** An object to log information to */ + logger: Logger /** * Sends a list of root spans to the service. diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 5389e0570..ed6effa7e 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -21,6 +21,7 @@ export * from './trace/model/types'; export * from './trace/config/types'; export * from './trace/instrumentation/types'; export * from './exporters/types'; +export * from './common/types'; // domain models impls export * from './trace/model/rootspan'; @@ -38,4 +39,4 @@ export * from './exporters/buffer'; export * from './exporters/consolelog-exporter'; // util -export * from './internal/util'; +export * from './internal/util'; \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index 2cc56e0c0..d31d14771 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -1,5 +1,6 @@ import {Exporter} from '../../exporters/types'; import {PluginNames} from '../instrumentation/types'; +import {Logger} from '../../common/types'; /** This interface represent the probability of a tracer. */ export interface Sampler { @@ -37,6 +38,7 @@ export interface Sampler { export interface BufferConfig { bufferSize?: number; bufferTimeout?: number; + logger?: Logger; } /** Defines tracer configuration parameters */ @@ -45,6 +47,8 @@ export interface TracerConfig { samplingRate?: number; /** Determines the ignored (or blacklisted) URLs */ ignoreUrls?: Array; + /** A logger object to show infos */ + logger?: Logger; } /** Available configuration options. */ @@ -53,6 +57,7 @@ export interface TracingConfig { maximumLabelValueSize?: number; plugins?: PluginNames; exporter?: Exporter; + logger?: Logger; } export type Config = TracingConfig&TracerConfig&BufferConfig; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 396c5fe68..86e061e62 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -24,6 +24,8 @@ import {SpanBaseModel} from './spanbasemodel'; import {TracerImpl} from './tracer'; import {OnEndSpanEventListener, RootSpan, Span, TraceContext, TraceOptions, Tracer} from './types'; +import * as logger from '../../common/consolelogger'; + /** Defines a root span */ export class RootSpanImpl extends SpanBaseModel implements RootSpan { /** A tracer object */ @@ -50,6 +52,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.parentSpanId = context.traceContext.spanId || ''; } this.spansLocal = []; + this.logger = tracer.logger || logger(); } /** Gets span list from rootspan instance. */ @@ -65,7 +68,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { /** Starts a rootspan instance. */ start() { super.start(); - debug( + this.logger.debug( 'starting %s %o', this.className, {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); } @@ -89,7 +92,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { * @param span Span ended. */ onEndSpan(span: Span) { - debug('ending span %o', { + this.logger.debug('ending span %o', { id: span.id, traceId: span.traceId, name: span.name, @@ -107,13 +110,13 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { */ startSpan(name: string, type: string, parentSpanId?: string) { if (this.ended) { - debug( + this.logger.debug( 'calling %s.startSpan() on ended %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; } if (!this.started) { - debug( + this.logger.debug( 'calling %s.startSpan() on un-started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index e7c97c0e8..9fa4f03c2 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -19,6 +19,7 @@ import {debug, randomSpanId} from '../../internal/util'; import {Sampler} from '../config/types'; import {Annotation, Attributes, Link, MessageEvent, Span, TraceContext} from './types'; +import {Logger} from '../../common/types'; /** Defines a base model for spans. */ export abstract class SpanBaseModel implements Span { @@ -33,6 +34,8 @@ export abstract class SpanBaseModel implements Span { private truncated = false; /** The Span ID of this span */ readonly id: string; + /** An object to log information to */ + logger: Logger; /** A set of attributes, each in the format [KEY]:[VALUE] */ attributes: Attributes = {}; /** A text annotation with a set of attributes. */ @@ -78,7 +81,7 @@ export abstract class SpanBaseModel implements Span { */ get startTime(): Date { if (!this.clock) { - debug('calling startTime() on null clock'); + this.logger.debug('calling startTime() on null clock'); return null; } @@ -91,7 +94,7 @@ export abstract class SpanBaseModel implements Span { */ get endTime(): Date { if (!this.clock) { - debug('calling endTime() on null clock'); + this.logger.debug('calling endTime() on null clock'); return null; } @@ -104,7 +107,7 @@ export abstract class SpanBaseModel implements Span { */ get duration(): number { if (!this.clock) { - debug('calling duration() on null clock'); + this.logger.debug('calling duration() on null clock'); return null; } @@ -176,7 +179,7 @@ export abstract class SpanBaseModel implements Span { /** Starts the span. */ start() { if (this.started) { - debug( + this.logger.debug( 'calling %s.start() on already started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; @@ -188,13 +191,13 @@ export abstract class SpanBaseModel implements Span { /** Ends the span. */ end(): void { if (this.ended) { - debug( + this.logger.debug( 'calling %s.end() on already ended %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; } if (!this.started) { - debug( + this.logger.debug( 'calling %s.end() on un-started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); return; @@ -210,6 +213,7 @@ export abstract class SpanBaseModel implements Span { // TODO: review this.truncated = true; this.end(); - debug('truncating %s %o', this.className, {id: this.id, name: this.name}); + this.logger.debug( + 'truncating %s %o', this.className, {id: this.id, name: this.name}); } } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index ecdb2c79e..121fe969f 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -20,6 +20,8 @@ import {RootSpanImpl} from './rootspan'; import {SpanBaseModel} from './spanbasemodel'; import {RootSpan, Span, TraceContext} from './types'; +import * as logger from '../../common/consolelogger'; + /** Defines a Span. */ export class SpanImpl extends SpanBaseModel implements Span { private root: RootSpan; @@ -31,6 +33,7 @@ export class SpanImpl extends SpanBaseModel implements Span { constructor(root: RootSpan) { super(); this.root = root; + this.logger = this.root.logger || logger(); } /** Gets trace id of span. */ @@ -50,7 +53,7 @@ export class SpanImpl extends SpanBaseModel implements Span { /** Starts the span instance. */ start() { super.start(); - debug( + this.logger.debug( 'starting span %o', {traceId: this.traceId, spanId: this.id, name: this.name}); } @@ -64,7 +67,7 @@ export class SpanImpl extends SpanBaseModel implements Span { end(): void { super.end(); this.notifyEnd(); - debug('ending span %o', { + this.logger.debug('ending span %o', { spanId: this.id, traceId: this.traceId, name: this.name, diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 97b653271..0c5e844c5 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -25,6 +25,9 @@ import {SpanImpl} from './span'; import {RootSpan, Span} from './types'; import {TraceOptions, Tracer} from './types'; import {Func, OnEndSpanEventListener} from './types'; +import {Logger} from '../../common/types'; + +import * as logger from '../../common/consolelogger'; /** * This class represent a tracer. @@ -42,6 +45,8 @@ export class TracerImpl implements Tracer { private endedTraces: RootSpan[] = []; /** A sampler used to make sample decisions */ sampler: Sampler; + /** A configuration for starting the tracer */ + logger: Logger = logger(); /** Constructs a new TraceImpl instance. */ constructor() { @@ -67,6 +72,7 @@ export class TracerImpl implements Tracer { start(config: TracerConfig): Tracer { this.activeLocal = true; this.config = config; + this.logger = this.config.logger || logger(); this.sampler = new SamplerImpl().probability(config.samplingRate); return this; } @@ -102,7 +108,7 @@ export class TracerImpl implements Tracer { return fn(newRoot); } } else { - debug('Tracer is inactive, can\'t start new RootSpan'); + this.logger.debug('Tracer is inactive, can\'t start new RootSpan'); } return fn(newRoot); }); @@ -114,10 +120,10 @@ export class TracerImpl implements Tracer { */ onEndSpan(root: RootSpan): void { if (!root) { - return debug('cannot end trace - no active trace found'); + return this.logger.debug('cannot end trace - no active trace found'); } if (this.currentRootSpan !== root) { - debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + this.logger.debug('currentRootSpan != root on notifyEnd. Need more investigation.'); } this.notifyEndSpan(root); // this.clearCurrentTrace(); @@ -133,14 +139,14 @@ export class TracerImpl implements Tracer { private notifyEndSpan(root: RootSpan) { if (this.active) { - debug('starting to notify listeners the end of rootspans'); + this.logger.debug('starting to notify listeners the end of rootspans'); if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { for (const listener of this.eventListenersLocal) { listener.onEndSpan(root); } } } else { - debug('this tracer is inactivate cant notify endspan'); + this.logger.debug('this tracer is inactivate cant notify endspan'); } } @@ -158,7 +164,7 @@ export class TracerImpl implements Tracer { startSpan(name?: string, type?: string, parentSpanId?: string): Span { let newSpan: Span = null; if (!this.currentRootSpan) { - debug('no current trace found - must start a new root span first'); + this.logger.debug('no current trace found - must start a new root span first'); } else { newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index d89565e0e..99eb98359 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -15,6 +15,7 @@ */ import {Config, Sampler, TracerConfig} from '../config/types'; +import {Logger} from '../../common/types' /** Default type for functions */ @@ -102,6 +103,9 @@ export interface Span { /** Type of span. Used to specify additional relationships between spans */ type: string; + /** An object to log information to */ + logger: Logger; + /** A final status for this span */ status: number; @@ -215,6 +219,9 @@ export interface Tracer { /** A sampler that will decide if the span will be sampled or not */ sampler: Sampler; + /** A configuration for starting the tracer */ + logger: Logger; + /** Get the eventListeners from tracer instance */ readonly eventListeners: OnEndSpanEventListener[]; diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index fe62d922e..e3b4ac107 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -18,10 +18,17 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import * as logger from '../src/common/consolelogger'; +import {Logger} from '../src/common/types' +import {RootSpanImpl} from '../src/trace/model/rootspan' +import {TracerImpl} from '../src/trace/model/tracer'; +import {TracerConfig, BufferConfig} from '../src/trace/config/types'; +import {TraceOptions} from '../src/trace/model/types'; +import {Buffer} from '../src/exporters/buffer'; +import {ConsoleLogExporter} from '../src/exporters/consolelog-exporter' + const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; let consoleTxt = ''; - describe('ConsoleLogger', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { @@ -174,5 +181,46 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); }); + + describe('Model classes has a logger', () => { + // tslint:disable:no-any + function instanceOfLogger(object: any): object is Logger { + return 'error' in object + && 'warn' in object + && 'info' in object + && 'debug' in object + && 'silly' in object; + } + + const consoleLogger = logger('debug'); + + const tracer = new TracerImpl(); + tracer.start({logger: consoleLogger}); + + it('checks if Tracer has a logger', () => { + assert.ok(instanceOfLogger(tracer.logger)); + }); + + it('checks if RootSpanImpl and SpanImpl has a logger', () => { + tracer.startRootSpan({name: 'rootSpanTest'} as TraceOptions, (root) => { + assert.ok(instanceOfLogger(root.logger)); + + let span = tracer.startSpan('spanTest') + assert.ok(instanceOfLogger(span.logger)); + }); + }); + + let exporterConfig = {logger: consoleLogger}; + let exporter = new ConsoleLogExporter(exporterConfig); + + it('checks if exporter has a logger', () => { + assert.ok(instanceOfLogger(exporter.logger)); + }); + + it('checks if buffer has a logger', () => { + let buffer = new Buffer(exporter, exporterConfig) + assert.ok(instanceOfLogger(buffer.logger)); + }); + }); }); \ No newline at end of file From 2fe4fe496bee7701dc50165a128a52d07f75a814 Mon Sep 17 00:00:00 2001 From: Luana Date: Fri, 20 Apr 2018 15:58:46 -0300 Subject: [PATCH 094/110] test: add unit tests for consolelog-exporter --- .../test/test-console-exporter.ts | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 packages/opencensus-core/test/test-console-exporter.ts diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts new file mode 100644 index 000000000..ee9985557 --- /dev/null +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -0,0 +1,83 @@ +/** + * Copyright 2018 Google LLC. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {Buffer} from '../src/exporters/buffer'; +import {ConsoleLogExporter, NoopExporter} from '../src/exporters/consolelog-exporter'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {TracerImpl} from '../src/trace/model/tracer'; +import {RootSpan} from '../src/trace/model/types'; + +const tracer = new TracerImpl(); +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds +const defaultBufferConfig = { + bufferSize: DEFAULT_BUFFER_SIZE, + bufferTimeout: DEFAULT_BUFFER_TIMEOUT +}; + +describe('NoopExporter', () => { + /** Should do anything when calling onEndSpan() */ + describe('onEndSpan()', () => { + it('should do anything', () => { + const exporter = new NoopExporter(); + const rootSpan = new RootSpanImpl(tracer); + exporter.onEndSpan(rootSpan); + assert.ok(true); + }); + }); + + /** Should do anything when calling publish() */ + describe('publish()', () => { + it('should do anything', () => { + const exporter = new NoopExporter(); + const rootSpan = new RootSpanImpl(tracer); + const queue: RootSpan[] = []; + queue.push(rootSpan); + + exporter.publish(queue); + assert.ok(true); + }); + }); +}); + +describe('ConsoleLogExporter', () => { + /** Should end a span */ + describe('onEndSpan()', () => { + it('should end a span', () => { + const exporter = new ConsoleLogExporter(defaultBufferConfig); + const rootSpan = new RootSpanImpl(tracer); + exporter.onEndSpan(rootSpan); + assert.ok(true); + }); + }); + + /** Should publish the rootspan in queue */ + describe('publish()', () => { + it('should publish the rootspans in queue', () => { + const exporter = new ConsoleLogExporter(defaultBufferConfig); + const rootSpan = new RootSpanImpl(tracer); + rootSpan.startSpan('name', 'type', rootSpan.traceId); + const queue: RootSpan[] = []; + queue.push(rootSpan); + + exporter.publish(queue); + assert.ok(true); + }); + }); +}); \ No newline at end of file From f40be382cd750e4883590bd2f05657d2db6d84ec Mon Sep 17 00:00:00 2001 From: Djonathas Cardoso Date: Fri, 20 Apr 2018 16:24:30 -0300 Subject: [PATCH 095/110] test: created testes for pluginloader --- packages/opencensus-core/test/test-tracer.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 29ac33dfb..e0e4759b9 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -16,9 +16,7 @@ import * as assert from 'assert'; import {EventEmitter} from 'events'; -import * as mocha from 'mocha'; -import {Exporter} from '../src/exporters/types'; import {TracerConfig} from '../src/trace/config/types'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {SpanImpl} from '../src/trace/model/span'; From e94e0c47662da7715731fa5080cb47b745f862ca Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Sun, 22 Apr 2018 08:45:00 -0300 Subject: [PATCH 096/110] test: add sampler test --- .../src/trace/sampler/sampler.ts | 11 +- packages/opencensus-core/test/test-sampler.ts | 106 ++++++++++++++++++ 2 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 packages/opencensus-core/test/test-sampler.ts diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index c070c7a42..883b453b4 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -15,7 +15,7 @@ */ import {debug, randomSpanId} from '../../internal/util'; -import {Sampler} from './types' +import {Sampler} from './types'; const MIN_NUMBER = 1e-4; const MAX_NUMBER = 0xffffffffffffffff; @@ -28,7 +28,7 @@ export class SamplerImpl { /** * Constructs a new SamplerImpl instance. * @param traceId Used for probability calculation - */ + */ constructor(traceId?: string) { if (traceId) { this.traceId = traceId; @@ -63,10 +63,8 @@ export class SamplerImpl { probability(probability?: number): Sampler { if (probability == null || probability > MAX_NUMBER) { return this.always(); - } - else if (probability < MIN_NUMBER) { + } else if (probability < MIN_NUMBER) { return this.never(); - } this.idUpperBound = probability * MAX_NUMBER; return this; @@ -76,7 +74,7 @@ export class SamplerImpl { * Checks if trace belong the sample. * @param traceId Used to check the probability * @returns a boolean. True if the traceId is in probability - * False if the traceId is not in probability. + * False if the traceId is not in probability. */ shouldSample(traceId: string): boolean { const LOWER_BYTES = traceId.substring(16); @@ -89,5 +87,4 @@ export class SamplerImpl { return false; } } - } \ No newline at end of file diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts new file mode 100644 index 000000000..e5e7f9d18 --- /dev/null +++ b/packages/opencensus-core/test/test-sampler.ts @@ -0,0 +1,106 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {SamplerImpl} from '../src/trace/config/sampler'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {TracerImpl} from '../src/trace/model/tracer'; + +const tracer = new TracerImpl(); + +describe('Sampler', () => { + /** + * Should create a sampler + */ + describe('new Sampler()', () => { + it('should create a Sampler instance', () => { + const sampler = new SamplerImpl(); + assert.ok(sampler instanceof SamplerImpl); + }); + }); + + /** + * Should create a sampler with traceId + */ + describe('new Sampler(traceId)', () => { + it('should create a Sampler instance', () => { + const root = new RootSpanImpl(tracer); + const sampler = new SamplerImpl(root.traceId); + assert.ok(sampler instanceof SamplerImpl); + }); + }); + + /** + * Should return the SamplerImpl + */ + describe('always()', () => { + it('should return a sampler instance', () => { + const sampler = new SamplerImpl(); + const samplerAlways = sampler.always(); + assert.ok(samplerAlways instanceof SamplerImpl); + }); + }); + + /** + * Should return the SamplerImpl + */ + describe('never()', () => { + it('should return a sampler instance', () => { + const sampler = new SamplerImpl(); + const samplerNever = sampler.never(); + assert.ok(samplerNever instanceof SamplerImpl); + }); + }); + + /** + * Should return the SamplerImpl + */ + describe('probability()', () => { + it('should return a sampler instance', () => { + const PROBABILITY = 0.5; + const sampler = new SamplerImpl(); + const samplerProbability = sampler.probability(PROBABILITY); + assert.ok(samplerProbability instanceof SamplerImpl); + }); + }); + + /** + * Should return true + */ + describe('shouldSample() always', () => { + it('should return true', () => { + const root = new RootSpanImpl(tracer); + const sampler = new SamplerImpl(); + sampler.always(); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.ok(samplerShouldSampler); + }); + }); + /** + * Should return false + */ + describe('shouldSample() never', () => { + it('should return false', () => { + const root = new RootSpanImpl(tracer); + const sampler = new SamplerImpl(); + sampler.never(); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.ok(!samplerShouldSampler); + }); + }); +}); \ No newline at end of file From 05cee7710eef7e71b1420fa5a92f2f0f6387db10 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 22 Apr 2018 18:27:30 -0300 Subject: [PATCH 097/110] fix: minor tslint issues --- .../src/exporters/console-exporter.ts | 4 +- .../opencensus-core/src/exporters/types.ts | 4 +- .../opencensus-core/src/trace/model/types.ts | 2 +- .../test/test-console-exporter.ts | 6 +-- .../test/test-console-logger.ts | 53 +++++++++---------- 5 files changed, 32 insertions(+), 37 deletions(-) diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index a839b612c..0be92e67c 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -22,13 +22,13 @@ import {Logger} from '../common/types'; /** Do not send span data */ export class NoopExporter implements Exporter { - logger: Logger + logger: Logger; onEndSpan(root: RootSpan) {} publish(rootSpans: RootSpan[]) {} } /** Format and sends span data to the console. */ -export class ConsoleLogExporter implements Exporter { +export class ConsoleExporter implements Exporter { /** Buffer object to store the spans. */ private buffer: Buffer; logger: Logger; diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 7d6f307b1..ad2986d4b 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -17,12 +17,12 @@ import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; import {BufferConfig} from '../trace/config/types'; -import {Logger} from '../common/types' +import {Logger} from '../common/types'; /** Defines an exporter interface. */ export interface Exporter extends OnEndSpanEventListener { /** An object to log information to */ - logger: Logger + logger: Logger; /** * Sends a list of root spans to the service. diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 99eb98359..079643874 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -15,7 +15,7 @@ */ import {Config, Sampler, TracerConfig} from '../config/types'; -import {Logger} from '../../common/types' +import {Logger} from '../../common/types'; /** Default type for functions */ diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts index ee9985557..dd8300089 100644 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -18,7 +18,7 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import {Buffer} from '../src/exporters/buffer'; -import {ConsoleLogExporter, NoopExporter} from '../src/exporters/consolelog-exporter'; +import {ConsoleExporter, NoopExporter} from '../src/exporters/consolelog-exporter'; import {RootSpanImpl} from '../src/trace/model/rootspan'; import {TracerImpl} from '../src/trace/model/tracer'; import {RootSpan} from '../src/trace/model/types'; @@ -60,7 +60,7 @@ describe('ConsoleLogExporter', () => { /** Should end a span */ describe('onEndSpan()', () => { it('should end a span', () => { - const exporter = new ConsoleLogExporter(defaultBufferConfig); + const exporter = new ConsoleExporter(defaultBufferConfig); const rootSpan = new RootSpanImpl(tracer); exporter.onEndSpan(rootSpan); assert.ok(true); @@ -70,7 +70,7 @@ describe('ConsoleLogExporter', () => { /** Should publish the rootspan in queue */ describe('publish()', () => { it('should publish the rootspans in queue', () => { - const exporter = new ConsoleLogExporter(defaultBufferConfig); + const exporter = new ConsoleExporter(defaultBufferConfig); const rootSpan = new RootSpanImpl(tracer); rootSpan.startSpan('name', 'type', rootSpan.traceId); const queue: RootSpan[] = []; diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index e3b4ac107..030984d03 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -16,15 +16,15 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import * as logger from '../src/common/consolelogger'; -import {Logger} from '../src/common/types' -import {RootSpanImpl} from '../src/trace/model/rootspan' +import * as logger from '../src/common/consolelogger'; +import {Logger} from '../src/common/types'; +import {Buffer} from '../src/exporters/buffer'; +import {ConsoleExporter} from '../src/exporters/consolelog-exporter'; +import {BufferConfig, TracerConfig} from '../src/trace/config/types'; +import {RootSpanImpl} from '../src/trace/model/rootspan'; import {TracerImpl} from '../src/trace/model/tracer'; -import {TracerConfig, BufferConfig} from '../src/trace/config/types'; import {TraceOptions} from '../src/trace/model/types'; -import {Buffer} from '../src/exporters/buffer'; -import {ConsoleLogExporter} from '../src/exporters/consolelog-exporter' const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; let consoleTxt = ''; @@ -36,7 +36,7 @@ describe('ConsoleLogger', () => { return txt; }); -/** Should create a new ConsoleLogger */ + /** Should create a new ConsoleLogger */ describe('new ConsoleLogger()', () => { it('should consoleLogger with default levels', () => { const consoleLogger = logger(); @@ -100,10 +100,9 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); }); - + /** Should logger error, warn and info log */ - describe('info logger', () => { - + describe('info logger', () => { const consoleLogger = logger(LEVELS[2]); it('should logger error', () => { @@ -112,7 +111,7 @@ describe('ConsoleLogger', () => { consoleTxt = txt; return txt; }); - + consoleTxt = ''; consoleLogger.error('error test logger'); unhookIntercept(); @@ -127,7 +126,7 @@ describe('ConsoleLogger', () => { consoleTxt = txt; return txt; }); - + consoleTxt = ''; consoleLogger.warn('warn test logger'); unhookIntercept(); @@ -142,7 +141,7 @@ describe('ConsoleLogger', () => { consoleTxt = txt; return txt; }); - + consoleTxt = ''; consoleLogger.info('info test logger'); unhookIntercept(); @@ -157,7 +156,7 @@ describe('ConsoleLogger', () => { consoleTxt = txt; return txt; }); - + consoleTxt = ''; consoleLogger.debug('debug test logger'); unhookIntercept(); @@ -172,7 +171,7 @@ describe('ConsoleLogger', () => { consoleTxt = txt; return txt; }); - + consoleTxt = ''; consoleLogger.silly('silly test logger'); unhookIntercept(); @@ -185,13 +184,10 @@ describe('ConsoleLogger', () => { describe('Model classes has a logger', () => { // tslint:disable:no-any function instanceOfLogger(object: any): object is Logger { - return 'error' in object - && 'warn' in object - && 'info' in object - && 'debug' in object - && 'silly' in object; + return 'error' in object && 'warn' in object && 'info' in object && + 'debug' in object && 'silly' in object; } - + const consoleLogger = logger('debug'); const tracer = new TracerImpl(); @@ -204,23 +200,22 @@ describe('ConsoleLogger', () => { it('checks if RootSpanImpl and SpanImpl has a logger', () => { tracer.startRootSpan({name: 'rootSpanTest'} as TraceOptions, (root) => { assert.ok(instanceOfLogger(root.logger)); - - let span = tracer.startSpan('spanTest') + + const span = tracer.startSpan('spanTest'); assert.ok(instanceOfLogger(span.logger)); }); }); - - let exporterConfig = {logger: consoleLogger}; - let exporter = new ConsoleLogExporter(exporterConfig); - + + const exporterConfig = {logger: consoleLogger}; + const exporter = new ConsoleExporter(exporterConfig); + it('checks if exporter has a logger', () => { assert.ok(instanceOfLogger(exporter.logger)); }); it('checks if buffer has a logger', () => { - let buffer = new Buffer(exporter, exporterConfig) + const buffer = new Buffer(exporter, exporterConfig); assert.ok(instanceOfLogger(buffer.logger)); }); }); - }); \ No newline at end of file From 74c614a878fe299e4d176800c7eba53cc27f2316 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Sun, 22 Apr 2018 19:34:11 -0300 Subject: [PATCH 098/110] refactor: rework after review --- .../opencensus-core/src/exporters/buffer.ts | 2 +- packages/opencensus-core/src/index.ts | 9 ++-- .../opencensus-core/src/internal/clock.ts | 15 ------ .../opencensus-core/src/trace/config/types.ts | 50 +++++++----------- .../src/trace/instrumentation/base-plugin.ts | 18 +++++-- .../src/trace/instrumentation/types.ts | 2 +- .../src/trace/model/root-span.ts | 4 +- .../src/trace/model/span-base-model.ts | 4 +- .../opencensus-core/src/trace/model/span.ts | 6 +-- .../opencensus-core/src/trace/model/tracer.ts | 14 ++--- .../opencensus-core/src/trace/model/types.ts | 9 ++-- .../src/trace/sampler/sampler.ts | 12 ++--- .../src/trace/sampler/types.ts | 51 +++++++++++++++++++ packages/opencensus-core/src/trace/types.ts | 2 +- packages/opencensus-core/test/test-buffer.ts | 4 +- .../test/test-console-exporter.ts | 4 +- .../test/test-console-logger.ts | 6 +-- .../opencensus-core/test/test-root-span.ts | 4 +- packages/opencensus-core/test/test-sampler.ts | 6 +-- packages/opencensus-core/test/test-span.ts | 4 +- packages/opencensus-core/test/test-tracer.ts | 2 +- 21 files changed, 127 insertions(+), 101 deletions(-) create mode 100644 packages/opencensus-core/src/trace/sampler/types.ts diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index ea9f4f4fb..e32a7bcdd 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -23,7 +23,7 @@ import {Logger} from '../common/types'; import {Exporter} from './types'; import {Config, BufferConfig} from '../trace/config/types'; -import * as logger from '../common/consolelogger'; +import * as logger from '../common/console-logger'; /** Controls the sending of traces to exporters. */ diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index ed6effa7e..a3ec9fca3 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -19,24 +19,25 @@ export * from './trace/types'; export * from './trace/model/types'; export * from './trace/config/types'; +export * from './trace/sampler/types'; export * from './trace/instrumentation/types'; export * from './exporters/types'; export * from './common/types'; // domain models impls -export * from './trace/model/rootspan'; +export * from './trace/model/root-span'; export * from './trace/model/span'; export * from './trace/model/tracer'; // sampler impl -export * from './trace/config/sampler'; +export * from './trace/sampler/sampler'; // base instrumetation class -export * from './trace/instrumentation/baseplugin'; +export * from './trace/instrumentation/base-plugin'; // console exporter and buffer impls export * from './exporters/buffer'; -export * from './exporters/consolelog-exporter'; +export * from './exporters/console-exporter'; // util export * from './internal/util'; \ No newline at end of file diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index 809c49ee9..a96feaa37 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -49,21 +49,6 @@ export class Clock { return ns / 1e6; } - /** - * Compares clock with another one. - * @param timer A clock object to compare. - */ - offset(timer: Clock): number { - const a = timer.hrtime; - const b = this.hrtime; - const ns = (b[0] - a[0]) * 1e9 + (b[1] - a[1]); - return ns / 1e6; - } - - /** Gets the time in high definition. */ - get hrtime(): [number, number] { - return this.hrtimeLocal; - } /** Starts the clock. */ get startTime(): Date { diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index d31d14771..965cc26df 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -1,39 +1,23 @@ -import {Exporter} from '../../exporters/types'; +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + import {Exporter} from '../../exporters/types'; import {PluginNames} from '../instrumentation/types'; import {Logger} from '../../common/types'; -/** This interface represent the probability of a tracer. */ -export interface Sampler { - /** - * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. - * @returns a Sampler object. - */ - always(): Sampler; - - /** - * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0. - * @returns a Sampler object. - */ - never(): Sampler; - - /** - * Sets idUpperBound with the probability. If probability - * parameter is bigger then 1 set always. If probability parameter less - * than 0, set never. - * @param probability probability between 0 and 1. - * @returns a Sampler object. - */ - probability(probability: number): Sampler; - - /** - * Checks if trace belong the sample. - * @param traceId Used to check the probability. - * @returns a boolean. True if the traceId is in probability - * False if the traceId is not in probability. - */ - shouldSample(traceId: string): boolean; -} - /** Interface configuration for a buffer. */ export interface BufferConfig { bufferSize?: number; diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 0d04ae6a6..6e752fcb6 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -14,19 +14,20 @@ * limitations under the License. */ import * as shimmer from 'shimmer'; +import {Plugin} from './types'; import {Tracer} from '../model/types'; /** This class represent the base to patch plugin. */ -export abstract class BasePlugin { +export abstract class BasePlugin implements Plugin { /** The service to send the collected traces */ // tslint:disable:no-any - exporter: any; + protected exporter: any; /** The module name */ - moduleName: string; + protected moduleName: string; /** A tracer object. */ - tracer: Tracer; + protected tracer: Tracer; /** The module version. */ - version: string; + protected version: string; /** * Constructs a new BasePlugin instance. @@ -87,4 +88,11 @@ export abstract class BasePlugin { shimmer.massUnwrap(nodule, names); } + // tslint:disable:no-any + applyPatch(exporter: any, tracer: Tracer, version: string): any{ + this.setPluginContext(exporter, tracer, version); + } + + abstract applyUnpatch(): void; + } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index ee47ae0e9..b26f8a09a 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -19,7 +19,7 @@ import {Tracer} from "../model/types"; /** Interface Plugin to apply patch. */ export interface Plugin { // tslint:disable:no-any - applyPatch(module: {}, tracer: Tracer, version: string): any; + applyPatch(exporter: any, tracer: Tracer, version: string): any; applyUnpatch(): void; } diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 86e061e62..628f16b19 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -20,11 +20,11 @@ import {Clock} from '../../internal/clock'; import {debug} from '../../internal/util'; import {SpanImpl} from './span'; -import {SpanBaseModel} from './spanbasemodel'; +import {SpanBaseModel} from './span-base-model'; import {TracerImpl} from './tracer'; import {OnEndSpanEventListener, RootSpan, Span, TraceContext, TraceOptions, Tracer} from './types'; -import * as logger from '../../common/consolelogger'; +import * as logger from '../../common/console-logger'; /** Defines a root span */ export class RootSpanImpl extends SpanBaseModel implements RootSpan { diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 9fa4f03c2..fe3edb2fb 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -16,7 +16,7 @@ import {Clock} from '../../internal/clock'; import {debug, randomSpanId} from '../../internal/util'; -import {Sampler} from '../config/types'; +import {Sampler} from '../sampler/types'; import {Annotation, Attributes, Link, MessageEvent, Span, TraceContext} from './types'; import {Logger} from '../../common/types'; @@ -128,7 +128,7 @@ export abstract class SpanBaseModel implements Span { * @param key Describes the value added. * @param value The result of an operation. */ - addAtribute(key: string, value: string|number|boolean) { + addAttribute(key: string, value: string|number|boolean) { this.attributes[key] = value; } diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 121fe969f..f05f50506 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -16,11 +16,11 @@ import {debug, randomSpanId} from '../../internal/util'; -import {RootSpanImpl} from './rootspan'; -import {SpanBaseModel} from './spanbasemodel'; +import {RootSpanImpl} from './root-span'; +import {SpanBaseModel} from './span-base-model'; import {RootSpan, Span, TraceContext} from './types'; -import * as logger from '../../common/consolelogger'; +import * as logger from '../../common/console-logger'; /** Defines a Span. */ export class SpanImpl extends SpanBaseModel implements Span { diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 0c5e844c5..2148918fc 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -16,18 +16,20 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; -import {SamplerImpl} from '../config/sampler'; -import {Sampler, TracerConfig} from '../config/types'; +import {SamplerImpl} from '../sampler/sampler'; +import {TracerConfig} from '../config/types'; +import {Sampler} from '../sampler/types'; + import {Config} from '../config/types'; -import {RootSpanImpl} from './rootspan'; +import {RootSpanImpl} from './root-span'; import {SpanImpl} from './span'; import {RootSpan, Span} from './types'; import {TraceOptions, Tracer} from './types'; import {Func, OnEndSpanEventListener} from './types'; import {Logger} from '../../common/types'; -import * as logger from '../../common/consolelogger'; +import * as logger from '../../common/console-logger'; /** * This class represent a tracer. @@ -181,7 +183,7 @@ export class TracerImpl implements Tracer { } // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; + const namespace = this.contextManager; return namespace.bind(fn); } @@ -195,7 +197,7 @@ export class TracerImpl implements Tracer { } // This is safe because isActive checks the value of this.namespace. - const namespace = this.contextManager as cls.Namespace; + const namespace = this.contextManager; namespace.bindEmitter(emitter); } } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 079643874..d6292333a 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import {Config, Sampler, TracerConfig} from '../config/types'; +import {Config, TracerConfig} from '../config/types'; +import {Sampler} from '../sampler/types'; import {Logger} from '../../common/types'; @@ -156,7 +157,7 @@ export interface Span { * @param key Describes the value added. * @param value The result of an operation. */ - addAtribute(key: string, value: string): void; + addAttribute(key: string, value: string): void; /** * Adds an annotation to the span. @@ -254,9 +255,9 @@ export interface Tracer { /** * Register a OnEndSpanEventListener on the tracer instance - * @param listner An OnEndSpanEventListener instance + * @param listener An OnEndSpanEventListener instance */ - registerEndSpanListener(listner: OnEndSpanEventListener): void; + registerEndSpanListener(listener: OnEndSpanEventListener): void; /** Clear the currentRootSpan from tracer instance */ clearCurrentTrace(): void; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 883b453b4..8226cfb8d 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -21,19 +21,13 @@ const MIN_NUMBER = 1e-4; const MAX_NUMBER = 0xffffffffffffffff; /** This class represent the probability of a tracer. */ -export class SamplerImpl { - private traceId: string; +export class SamplerImpl implements Sampler { private idUpperBound: number; /** * Constructs a new SamplerImpl instance. - * @param traceId Used for probability calculation */ - constructor(traceId?: string) { - if (traceId) { - this.traceId = traceId; - } - } + constructor() {} /** * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1 @@ -77,7 +71,7 @@ export class SamplerImpl { * False if the traceId is not in probability. */ shouldSample(traceId: string): boolean { - const LOWER_BYTES = traceId.substring(16); + const LOWER_BYTES = traceId?traceId.substring(16):'0'; // tslint:disable-next-line:ban Needed to parse hexadecimal. const LOWER_LONG = parseInt(LOWER_BYTES, 16); diff --git a/packages/opencensus-core/src/trace/sampler/types.ts b/packages/opencensus-core/src/trace/sampler/types.ts new file mode 100644 index 000000000..2924873cc --- /dev/null +++ b/packages/opencensus-core/src/trace/sampler/types.ts @@ -0,0 +1,51 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Exporter} from '../../exporters/types'; +import {PluginNames} from '../instrumentation/types'; +import {Logger} from '../../common/types'; + +/** This interface represent the probability of a tracer. */ +export interface Sampler { + /** + * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. + * @returns a Sampler object. + */ + always(): Sampler; + + /** + * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0. + * @returns a Sampler object. + */ + never(): Sampler; + + /** + * Sets idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1. + * @returns a Sampler object. + */ + probability(probability: number): Sampler; + + /** + * Checks if trace belong the sample. + * @param traceId Used to check the probability. + * @returns a boolean. True if the traceId is in probability + * False if the traceId is not in probability. + */ + shouldSample(traceId: string): boolean; +} diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 4516df55f..4991120f2 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -15,7 +15,7 @@ */ import {Tracer} from './model/types'; -import {Sampler} from './config/types'; +import {Sampler} from './sampler/types'; import {Exporter} from '../exporters/types'; import {Config} from './config/types'; diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts index 84a6d4fd4..50c1414f2 100644 --- a/packages/opencensus-core/test/test-buffer.ts +++ b/packages/opencensus-core/test/test-buffer.ts @@ -18,8 +18,8 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import {Buffer} from '../src/exporters/buffer'; -import {NoopExporter} from '../src/exporters/consolelog-exporter'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {NoopExporter} from '../src/exporters/console-exporter'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {TracerImpl} from '../src/trace/model/tracer'; const exporter = new NoopExporter(); diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts index dd8300089..5c32c5f62 100644 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -18,8 +18,8 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import {Buffer} from '../src/exporters/buffer'; -import {ConsoleExporter, NoopExporter} from '../src/exporters/consolelog-exporter'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {ConsoleExporter, NoopExporter} from '../src/exporters/console-exporter'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {TracerImpl} from '../src/trace/model/tracer'; import {RootSpan} from '../src/trace/model/types'; diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 030984d03..49a8c0a41 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -17,12 +17,12 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import * as logger from '../src/common/consolelogger'; +import * as logger from '../src/common/console-logger'; import {Logger} from '../src/common/types'; import {Buffer} from '../src/exporters/buffer'; -import {ConsoleExporter} from '../src/exporters/consolelog-exporter'; +import {ConsoleExporter} from '../src/exporters/console-exporter'; import {BufferConfig, TracerConfig} from '../src/trace/config/types'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {TracerImpl} from '../src/trace/model/tracer'; import {TraceOptions} from '../src/trace/model/types'; diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index 7ec45a30a..b076fe8e0 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; import {Annotation, Attributes, Link, MessageEvent, RootSpan, Span, TraceOptions, Tracer} from '../src/trace/model/types'; @@ -178,7 +178,7 @@ describe('RootSpan', () => { rootSpan.start(); ['String', 'Number', 'Boolean'].map(attType => { - rootSpan.addAtribute('testKey' + attType, 'testValue' + attType); + rootSpan.addAttribute('testKey' + attType, 'testValue' + attType); assert.equal( rootSpan.attributes['testKey' + attType], 'testValue' + attType); }); diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts index e5e7f9d18..9b71b26d4 100644 --- a/packages/opencensus-core/test/test-sampler.ts +++ b/packages/opencensus-core/test/test-sampler.ts @@ -17,9 +17,9 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {SamplerImpl} from '../src/trace/config/sampler'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {TracerImpl} from '../src/trace/model/tracer'; +import {SamplerImpl} from '../src/trace/sampler/sampler'; const tracer = new TracerImpl(); @@ -40,7 +40,7 @@ describe('Sampler', () => { describe('new Sampler(traceId)', () => { it('should create a Sampler instance', () => { const root = new RootSpanImpl(tracer); - const sampler = new SamplerImpl(root.traceId); + const sampler = new SamplerImpl(); assert.ok(sampler instanceof SamplerImpl); }); }); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 583642130..4ae8d73f1 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; import {Annotation, Attributes, Link, MessageEvent, Span} from '../src/trace/model/types'; @@ -178,7 +178,7 @@ describe('Span', () => { span.start(); ['String', 'Number', 'Boolean'].map(attType => { - span.addAtribute('testKey' + attType, 'testValue' + attType); + span.addAttribute('testKey' + attType, 'testValue' + attType); assert.equal( span.attributes['testKey' + attType], 'testValue' + attType); }); diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index e0e4759b9..1d2744727 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -18,7 +18,7 @@ import * as assert from 'assert'; import {EventEmitter} from 'events'; import {TracerConfig} from '../src/trace/config/types'; -import {RootSpanImpl} from '../src/trace/model/rootspan'; +import {RootSpanImpl} from '../src/trace/model/root-span'; import {SpanImpl} from '../src/trace/model/span'; import {TracerImpl} from '../src/trace/model/tracer'; import {OnEndSpanEventListener, RootSpan, Span, Tracer} from '../src/trace/model/types'; From d12e7b344f8c57dee1a3fb23a1713979ecb6b0d3 Mon Sep 17 00:00:00 2001 From: Eduardo Emery Date: Tue, 24 Apr 2018 08:40:37 -0300 Subject: [PATCH 099/110] fix: make buffer queue public --- packages/opencensus-core/src/exporters/buffer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index e32a7bcdd..405b814c4 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -32,8 +32,6 @@ export class Buffer { private exporter: Exporter; /** Maximum size of a buffer. */ private bufferSize: number; - /** Trace queue of a buffer */ - private queue: RootSpan[] = []; /** Max time for a buffer can wait before being sent */ private bufferTimeout: number; /** Manage when the buffer timeout needs to be reseted */ @@ -42,6 +40,8 @@ export class Buffer { private bufferTimeoutInProgress = false; /** An object to log information to */ logger: Logger; + /** Trace queue of a buffer */ + queue: RootSpan[] = []; /** * Constructs a new Buffer instance. From 39e6feaccf299f013ff197844604dfe36bae222b Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 24 Apr 2018 09:21:33 -0300 Subject: [PATCH 100/110] refactor: add index-types.ts --- packages/opencensus-core/src/index-types.ts | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 packages/opencensus-core/src/index-types.ts diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts new file mode 100644 index 000000000..2ad26e162 --- /dev/null +++ b/packages/opencensus-core/src/index-types.ts @@ -0,0 +1,24 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './trace/types'; +export * from './trace/model/types'; +export * from './trace/config/types'; +export * from './trace/sampler/types'; +export * from './trace/instrumentation/types'; +export * from './exporters/types'; +export * from './common/types'; + From 81f9dfbb49dcd0f50cfd2411b9bc3c43228a8283 Mon Sep 17 00:00:00 2001 From: Eldrey Galindo Date: Tue, 24 Apr 2018 11:39:08 -0300 Subject: [PATCH 101/110] fix: export logger to others packages --- packages/opencensus-core/package-lock.json | 1070 +++++++++++++---- .../src/common/console-logger.ts | 2 +- .../opencensus-core/src/exporters/buffer.ts | 2 +- packages/opencensus-core/src/index.ts | 1 + .../src/trace/model/root-span.ts | 2 +- .../opencensus-core/src/trace/model/span.ts | 2 +- .../opencensus-core/src/trace/model/tracer.ts | 4 +- .../test/test-console-logger.ts | 12 +- 8 files changed, 830 insertions(+), 265 deletions(-) diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 91a86ae4c..976878d9c 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,11 +1,14 @@ { - "requires": true, + "name": "@opencensus/opencensus-core", + "version": "0.0.1", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -13,42 +16,50 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", + "dev": true }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", + "dev": true }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true }, "@types/shimmer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", + "dev": true }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", + "dev": true, "requires": { "@types/node": "9.4.7" } @@ -57,6 +68,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -64,17 +76,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -84,6 +99,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -93,17 +109,20 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "1.9.1" } @@ -112,6 +131,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -119,12 +139,14 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "async-listener": { "version": "0.6.9", @@ -144,6 +166,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -153,12 +176,14 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -170,19 +195,22 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -196,22 +224,26 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -221,6 +253,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -231,6 +264,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -239,17 +273,20 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -259,19 +296,22 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -281,12 +321,14 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, "requires": { "has-flag": "3.0.0" } @@ -296,12 +338,14 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", + "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -311,19 +355,22 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -331,12 +378,14 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -344,22 +393,26 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -373,6 +426,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, "requires": { "is-obj": "1.0.1" } @@ -392,6 +446,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -400,6 +455,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -409,12 +465,14 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -430,12 +488,14 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -444,24 +504,28 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "emitter-listener": { "version": "1.1.1", @@ -475,6 +539,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -482,22 +547,26 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -512,6 +581,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -522,6 +592,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -530,6 +601,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "2.0.0" } @@ -537,17 +609,20 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -561,6 +636,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, "requires": { "ini": "1.3.5" } @@ -568,17 +644,20 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", + "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -595,6 +674,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -602,17 +682,20 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -620,32 +703,38 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -654,17 +743,20 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -685,17 +777,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -705,6 +800,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -722,12 +818,14 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -736,6 +834,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -744,17 +843,20 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -762,42 +864,50 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -806,12 +916,14 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, "requires": { "package-json": "4.0.1" } @@ -820,6 +932,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -831,6 +944,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -842,6 +956,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -850,7 +965,8 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true }, "lodash._arraycopy": { "version": "3.0.0", @@ -906,6 +1022,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -914,12 +1031,14 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -929,6 +1048,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, "requires": { "pify": "3.0.0" } @@ -936,17 +1056,20 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -962,19 +1085,22 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -982,12 +1108,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -997,6 +1125,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -1005,6 +1134,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -1026,17 +1156,20 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -1048,6 +1181,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "2.0.1" } @@ -1056,6 +1190,7 @@ "version": "11.6.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", + "dev": true, "requires": { "archy": "1.0.0", "arrify": "1.0.1", @@ -1089,6 +1224,7 @@ "align-text": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2", "longest": "1.0.1", @@ -1097,65 +1233,79 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true + "bundled": true, + "dev": true }, "append-transform": { "version": "0.4.0", "bundled": true, + "dev": true, "requires": { "default-require-extensions": "1.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "arr-diff": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "arr-flatten": "1.1.0" } }, "arr-flatten": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "arr-union": { "version": "3.1.0", - "bundled": true + "bundled": true, + "dev": true }, "array-unique": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "assign-symbols": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "async": { "version": "1.5.2", - "bundled": true + "bundled": true, + "dev": true }, "atob": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "babel-code-frame": { "version": "6.26.0", "bundled": true, + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -1165,6 +1315,7 @@ "babel-generator": { "version": "6.26.1", "bundled": true, + "dev": true, "requires": { "babel-messages": "6.23.0", "babel-runtime": "6.26.0", @@ -1179,6 +1330,7 @@ "babel-messages": { "version": "6.23.0", "bundled": true, + "dev": true, "requires": { "babel-runtime": "6.26.0" } @@ -1186,6 +1338,7 @@ "babel-runtime": { "version": "6.26.0", "bundled": true, + "dev": true, "requires": { "core-js": "2.5.3", "regenerator-runtime": "0.11.1" @@ -1194,6 +1347,7 @@ "babel-template": { "version": "6.26.0", "bundled": true, + "dev": true, "requires": { "babel-runtime": "6.26.0", "babel-traverse": "6.26.0", @@ -1205,6 +1359,7 @@ "babel-traverse": { "version": "6.26.0", "bundled": true, + "dev": true, "requires": { "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", @@ -1220,6 +1375,7 @@ "babel-types": { "version": "6.26.0", "bundled": true, + "dev": true, "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", @@ -1229,15 +1385,18 @@ }, "babylon": { "version": "6.18.0", - "bundled": true + "bundled": true, + "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "base": { "version": "0.11.2", "bundled": true, + "dev": true, "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", @@ -1251,19 +1410,22 @@ "define-property": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1272,6 +1434,7 @@ "braces": { "version": "1.8.5", "bundled": true, + "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -1280,11 +1443,13 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "cache-base": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "collection-visit": "1.0.0", "component-emitter": "1.2.1", @@ -1299,13 +1464,15 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "caching-transform": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "md5-hex": "1.3.0", "mkdirp": "0.5.1", @@ -1315,11 +1482,13 @@ "camelcase": { "version": "1.2.1", "bundled": true, + "dev": true, "optional": true }, "center-align": { "version": "0.1.3", "bundled": true, + "dev": true, "optional": true, "requires": { "align-text": "0.1.4", @@ -1329,6 +1498,7 @@ "chalk": { "version": "1.1.3", "bundled": true, + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -1340,6 +1510,7 @@ "class-utils": { "version": "0.3.6", "bundled": true, + "dev": true, "requires": { "arr-union": "3.1.0", "define-property": "0.2.5", @@ -1350,6 +1521,7 @@ "define-property": { "version": "0.2.5", "bundled": true, + "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -1357,6 +1529,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1364,6 +1537,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1373,6 +1547,7 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1380,6 +1555,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1389,6 +1565,7 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -1397,17 +1574,20 @@ }, "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true }, "kind-of": { "version": "5.1.0", - "bundled": true + "bundled": true, + "dev": true } } }, "cliui": { "version": "2.1.0", "bundled": true, + "dev": true, "optional": true, "requires": { "center-align": "0.1.3", @@ -1418,17 +1598,20 @@ "wordwrap": { "version": "0.0.2", "bundled": true, + "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "collection-visit": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "map-visit": "1.0.0", "object-visit": "1.0.1" @@ -1436,31 +1619,38 @@ }, "commondir": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "component-emitter": { "version": "1.2.1", - "bundled": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "convert-source-map": { "version": "1.5.1", - "bundled": true + "bundled": true, + "dev": true }, "copy-descriptor": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "core-js": { "version": "2.5.3", - "bundled": true + "bundled": true, + "dev": true }, "cross-spawn": { "version": "4.0.2", "bundled": true, + "dev": true, "requires": { "lru-cache": "4.1.2", "which": "1.3.0" @@ -1469,25 +1659,30 @@ "debug": { "version": "2.6.9", "bundled": true, + "dev": true, "requires": { "ms": "2.0.0" } }, "debug-log": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true + "bundled": true, + "dev": true }, "default-require-extensions": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "strip-bom": "2.0.0" } @@ -1495,6 +1690,7 @@ "define-property": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "is-descriptor": "1.0.2", "isobject": "3.0.1" @@ -1502,13 +1698,15 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "detect-indent": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "repeating": "2.0.1" } @@ -1516,21 +1714,25 @@ "error-ex": { "version": "1.3.1", "bundled": true, + "dev": true, "requires": { "is-arrayish": "0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true + "bundled": true, + "dev": true }, "esutils": { "version": "2.0.2", - "bundled": true + "bundled": true, + "dev": true }, "execa": { "version": "0.7.0", "bundled": true, + "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -1544,6 +1746,7 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, + "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -1555,6 +1758,7 @@ "expand-brackets": { "version": "0.1.5", "bundled": true, + "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -1562,6 +1766,7 @@ "expand-range": { "version": "1.8.2", "bundled": true, + "dev": true, "requires": { "fill-range": "2.2.3" } @@ -1569,6 +1774,7 @@ "extend-shallow": { "version": "3.0.2", "bundled": true, + "dev": true, "requires": { "assign-symbols": "1.0.0", "is-extendable": "1.0.1" @@ -1577,6 +1783,7 @@ "is-extendable": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -1586,17 +1793,20 @@ "extglob": { "version": "0.3.2", "bundled": true, + "dev": true, "requires": { "is-extglob": "1.0.0" } }, "filename-regex": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "fill-range": { "version": "2.2.3", "bundled": true, + "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -1608,6 +1818,7 @@ "find-cache-dir": { "version": "0.1.1", "bundled": true, + "dev": true, "requires": { "commondir": "1.0.1", "mkdirp": "0.5.1", @@ -1617,17 +1828,20 @@ "find-up": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "locate-path": "2.0.0" } }, "for-in": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "for-own": { "version": "0.1.5", "bundled": true, + "dev": true, "requires": { "for-in": "1.0.2" } @@ -1635,6 +1849,7 @@ "foreground-child": { "version": "1.5.6", "bundled": true, + "dev": true, "requires": { "cross-spawn": "4.0.2", "signal-exit": "3.0.2" @@ -1643,29 +1858,35 @@ "fragment-cache": { "version": "0.2.1", "bundled": true, + "dev": true, "requires": { "map-cache": "0.2.2" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "get-stream": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "get-value": { "version": "2.0.6", - "bundled": true + "bundled": true, + "dev": true }, "glob": { "version": "7.1.2", "bundled": true, + "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1678,6 +1899,7 @@ "glob-base": { "version": "0.3.0", "bundled": true, + "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -1686,21 +1908,25 @@ "glob-parent": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "is-glob": "2.0.1" } }, "globals": { "version": "9.18.0", - "bundled": true + "bundled": true, + "dev": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "bundled": true, + "dev": true }, "handlebars": { "version": "4.0.11", "bundled": true, + "dev": true, "requires": { "async": "1.5.2", "optimist": "0.6.1", @@ -1711,6 +1937,7 @@ "source-map": { "version": "0.4.4", "bundled": true, + "dev": true, "requires": { "amdefine": "1.0.1" } @@ -1720,17 +1947,20 @@ "has-ansi": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "has-flag": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "has-value": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "get-value": "2.0.6", "has-values": "1.0.0", @@ -1739,13 +1969,15 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "has-values": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -1754,6 +1986,7 @@ "is-number": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1761,6 +1994,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1770,6 +2004,7 @@ "kind-of": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1778,15 +2013,18 @@ }, "hosted-git-info": { "version": "2.6.0", - "bundled": true + "bundled": true, + "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true + "bundled": true, + "dev": true }, "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -1794,43 +2032,51 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "invariant": { "version": "2.2.3", "bundled": true, + "dev": true, "requires": { "loose-envify": "1.3.1" } }, "invert-kv": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "is-arrayish": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "is-buffer": { "version": "1.1.6", - "bundled": true + "bundled": true, + "dev": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -1838,19 +2084,22 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "is-descriptor": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", "is-data-descriptor": "1.0.0", @@ -1859,43 +2108,51 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "is-dotfile": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "bundled": true, + "dev": true, "requires": { "is-primitive": "2.0.0" } }, "is-extendable": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "is-extglob": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-finite": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-glob": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -1903,6 +2160,7 @@ "is-number": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -1910,71 +2168,85 @@ "is-odd": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "is-number": "4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "is-plain-object": { "version": "2.0.4", "bundled": true, + "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "is-posix-bracket": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "is-primitive": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "is-utf8": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "is-windows": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isobject": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "isarray": "1.0.0" } }, "istanbul-lib-coverage": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "istanbul-lib-hook": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "append-transform": "0.4.0" } @@ -1982,6 +2254,7 @@ "istanbul-lib-instrument": { "version": "1.10.1", "bundled": true, + "dev": true, "requires": { "babel-generator": "6.26.1", "babel-template": "6.26.0", @@ -1995,6 +2268,7 @@ "istanbul-lib-report": { "version": "1.1.3", "bundled": true, + "dev": true, "requires": { "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", @@ -2005,6 +2279,7 @@ "supports-color": { "version": "3.2.3", "bundled": true, + "dev": true, "requires": { "has-flag": "1.0.0" } @@ -2014,6 +2289,7 @@ "istanbul-lib-source-maps": { "version": "1.2.3", "bundled": true, + "dev": true, "requires": { "debug": "3.1.0", "istanbul-lib-coverage": "1.2.0", @@ -2025,6 +2301,7 @@ "debug": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "ms": "2.0.0" } @@ -2034,21 +2311,25 @@ "istanbul-reports": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "handlebars": "4.0.11" } }, "js-tokens": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "jsesc": { "version": "1.3.0", - "bundled": true + "bundled": true, + "dev": true }, "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2056,11 +2337,13 @@ "lazy-cache": { "version": "1.0.4", "bundled": true, + "dev": true, "optional": true }, "lcid": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "invert-kv": "1.0.0" } @@ -2068,6 +2351,7 @@ "load-json-file": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", @@ -2079,6 +2363,7 @@ "locate-path": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -2086,21 +2371,25 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "lodash": { "version": "4.17.5", - "bundled": true + "bundled": true, + "dev": true }, "longest": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "loose-envify": { "version": "1.3.1", "bundled": true, + "dev": true, "requires": { "js-tokens": "3.0.2" } @@ -2108,6 +2397,7 @@ "lru-cache": { "version": "4.1.2", "bundled": true, + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -2115,11 +2405,13 @@ }, "map-cache": { "version": "0.2.2", - "bundled": true + "bundled": true, + "dev": true }, "map-visit": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "object-visit": "1.0.1" } @@ -2127,17 +2419,20 @@ "md5-hex": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "md5-o-matic": "0.1.1" } }, "md5-o-matic": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "mem": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -2145,19 +2440,22 @@ "merge-source-map": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "source-map": "0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true + "bundled": true, + "dev": true } } }, "micromatch": { "version": "2.3.11", "bundled": true, + "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2176,22 +2474,26 @@ }, "mimic-fn": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "minimatch": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true }, "mixin-deep": { "version": "1.3.1", "bundled": true, + "dev": true, "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -2200,6 +2502,7 @@ "is-extendable": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -2209,17 +2512,20 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "nanomatch": { "version": "1.2.9", "bundled": true, + "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -2237,21 +2543,25 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true + "bundled": true, + "dev": true }, "array-unique": { "version": "0.3.2", - "bundled": true + "bundled": true, + "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, + "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -2262,6 +2572,7 @@ "normalize-path": { "version": "2.1.1", "bundled": true, + "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -2269,21 +2580,25 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "path-key": "2.0.1" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true }, "object-copy": { "version": "0.1.0", "bundled": true, + "dev": true, "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", @@ -2293,6 +2608,7 @@ "define-property": { "version": "0.2.5", "bundled": true, + "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2300,6 +2616,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2307,6 +2624,7 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2314,6 +2632,7 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2322,7 +2641,8 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "bundled": true + "bundled": true, + "dev": true } } } @@ -2331,19 +2651,22 @@ "object-visit": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "object.omit": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" @@ -2352,19 +2675,22 @@ "object.pick": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -2372,6 +2698,7 @@ "optimist": { "version": "0.6.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8", "wordwrap": "0.0.3" @@ -2379,11 +2706,13 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "os-locale": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -2392,11 +2721,13 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "p-limit": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "p-try": "1.0.0" } @@ -2404,17 +2735,20 @@ "p-locate": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-limit": "1.2.0" } }, "p-try": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "parse-glob": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -2425,36 +2759,43 @@ "parse-json": { "version": "2.2.0", "bundled": true, + "dev": true, "requires": { "error-ex": "1.3.1" } }, "pascalcase": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "path-exists": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "pinkie-promise": "2.0.1" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "path-parse": { "version": "1.0.5", - "bundled": true + "bundled": true, + "dev": true }, "path-type": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "4.1.11", "pify": "2.3.0", @@ -2463,15 +2804,18 @@ }, "pify": { "version": "2.3.0", - "bundled": true + "bundled": true, + "dev": true }, "pinkie": { "version": "2.0.4", - "bundled": true + "bundled": true, + "dev": true }, "pinkie-promise": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "pinkie": "2.0.4" } @@ -2479,6 +2823,7 @@ "pkg-dir": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "find-up": "1.1.2" }, @@ -2486,6 +2831,7 @@ "find-up": { "version": "1.1.2", "bundled": true, + "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2495,19 +2841,23 @@ }, "posix-character-classes": { "version": "0.1.1", - "bundled": true + "bundled": true, + "dev": true }, "preserve": { "version": "0.2.0", - "bundled": true + "bundled": true, + "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "randomatic": { "version": "1.1.7", "bundled": true, + "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -2516,6 +2866,7 @@ "is-number": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2523,6 +2874,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2532,6 +2884,7 @@ "kind-of": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2541,6 +2894,7 @@ "read-pkg": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", @@ -2550,6 +2904,7 @@ "read-pkg-up": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "find-up": "1.1.2", "read-pkg": "1.1.0" @@ -2558,6 +2913,7 @@ "find-up": { "version": "1.1.2", "bundled": true, + "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2567,11 +2923,13 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true + "bundled": true, + "dev": true }, "regex-cache": { "version": "0.4.4", "bundled": true, + "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -2579,6 +2937,7 @@ "regex-not": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "extend-shallow": "3.0.2", "safe-regex": "1.1.0" @@ -2586,46 +2945,56 @@ }, "remove-trailing-separator": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "repeat-element": { "version": "1.1.2", - "bundled": true + "bundled": true, + "dev": true }, "repeat-string": { "version": "1.6.1", - "bundled": true + "bundled": true, + "dev": true }, "repeating": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-finite": "1.0.2" } }, "require-directory": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "resolve-from": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "resolve-url": { "version": "0.2.1", - "bundled": true + "bundled": true, + "dev": true }, "ret": { "version": "0.1.15", - "bundled": true + "bundled": true, + "dev": true }, "right-align": { "version": "0.1.3", "bundled": true, + "dev": true, "optional": true, "requires": { "align-text": "0.1.4" @@ -2634,6 +3003,7 @@ "rimraf": { "version": "2.6.2", "bundled": true, + "dev": true, "requires": { "glob": "7.1.2" } @@ -2641,21 +3011,25 @@ "safe-regex": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "ret": "0.1.15" } }, "semver": { "version": "5.5.0", - "bundled": true + "bundled": true, + "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "set-value": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -2666,6 +3040,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -2675,25 +3050,30 @@ "shebang-command": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "shebang-regex": "1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "slide": { "version": "1.1.6", - "bundled": true + "bundled": true, + "dev": true }, "snapdragon": { "version": "0.8.2", "bundled": true, + "dev": true, "requires": { "base": "0.11.2", "debug": "2.6.9", @@ -2708,6 +3088,7 @@ "define-property": { "version": "0.2.5", "bundled": true, + "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2715,6 +3096,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -2722,6 +3104,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2729,6 +3112,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2738,6 +3122,7 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2745,6 +3130,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2754,6 +3140,7 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2762,13 +3149,15 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true + "bundled": true, + "dev": true } } }, "snapdragon-node": { "version": "2.1.1", "bundled": true, + "dev": true, "requires": { "define-property": "1.0.0", "isobject": "3.0.1", @@ -2778,30 +3167,35 @@ "define-property": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "snapdragon-util": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } }, "source-map": { "version": "0.5.7", - "bundled": true + "bundled": true, + "dev": true }, "source-map-resolve": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "atob": "2.0.3", "decode-uri-component": "0.2.0", @@ -2812,11 +3206,13 @@ }, "source-map-url": { "version": "0.4.0", - "bundled": true + "bundled": true, + "dev": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, + "dev": true, "requires": { "foreground-child": "1.5.6", "mkdirp": "0.5.1", @@ -2829,6 +3225,7 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -2836,11 +3233,13 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -2848,11 +3247,13 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "split-string": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "extend-shallow": "3.0.2" } @@ -2860,6 +3261,7 @@ "static-extend": { "version": "0.1.2", "bundled": true, + "dev": true, "requires": { "define-property": "0.2.5", "object-copy": "0.1.0" @@ -2868,6 +3270,7 @@ "define-property": { "version": "0.2.5", "bundled": true, + "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2875,6 +3278,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2882,6 +3286,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2891,6 +3296,7 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2898,6 +3304,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2907,6 +3314,7 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2915,13 +3323,15 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true + "bundled": true, + "dev": true } } }, "string-width": { "version": "2.1.1", "bundled": true, + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -2929,11 +3339,13 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -2943,6 +3355,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -2950,21 +3363,25 @@ "strip-bom": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "is-utf8": "0.2.1" } }, "strip-eof": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "supports-color": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "test-exclude": { "version": "4.2.1", "bundled": true, + "dev": true, "requires": { "arrify": "1.0.1", "micromatch": "3.1.9", @@ -2975,15 +3392,18 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true + "bundled": true, + "dev": true }, "array-unique": { "version": "0.3.2", - "bundled": true + "bundled": true, + "dev": true }, "braces": { "version": "2.3.1", "bundled": true, + "dev": true, "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -3002,6 +3422,7 @@ "define-property": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3009,6 +3430,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3018,6 +3440,7 @@ "expand-brackets": { "version": "2.1.4", "bundled": true, + "dev": true, "requires": { "debug": "2.6.9", "define-property": "0.2.5", @@ -3031,6 +3454,7 @@ "define-property": { "version": "0.2.5", "bundled": true, + "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3038,6 +3462,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3045,6 +3470,7 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3053,13 +3479,15 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true + "bundled": true, + "dev": true } } }, "extglob": { "version": "2.0.4", "bundled": true, + "dev": true, "requires": { "array-unique": "0.3.2", "define-property": "1.0.0", @@ -3074,6 +3502,7 @@ "define-property": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3081,6 +3510,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3090,6 +3520,7 @@ "fill-range": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "extend-shallow": "2.0.1", "is-number": "3.0.0", @@ -3100,6 +3531,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3109,6 +3541,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3116,6 +3549,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3125,6 +3559,7 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3132,6 +3567,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3141,6 +3577,7 @@ "is-number": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3148,6 +3585,7 @@ "kind-of": { "version": "3.2.2", "bundled": true, + "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3156,15 +3594,18 @@ }, "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true }, "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true }, "micromatch": { "version": "3.1.9", "bundled": true, + "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -3185,11 +3626,13 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "to-object-path": { "version": "0.3.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3197,6 +3640,7 @@ "to-regex": { "version": "3.0.2", "bundled": true, + "dev": true, "requires": { "define-property": "2.0.2", "extend-shallow": "3.0.2", @@ -3207,6 +3651,7 @@ "to-regex-range": { "version": "2.1.1", "bundled": true, + "dev": true, "requires": { "is-number": "3.0.0", "repeat-string": "1.6.1" @@ -3215,6 +3660,7 @@ "is-number": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3223,11 +3669,13 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "uglify-js": { "version": "2.8.29", "bundled": true, + "dev": true, "optional": true, "requires": { "source-map": "0.5.7", @@ -3238,6 +3686,7 @@ "yargs": { "version": "3.10.0", "bundled": true, + "dev": true, "optional": true, "requires": { "camelcase": "1.2.1", @@ -3251,11 +3700,13 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, + "dev": true, "optional": true }, "union-value": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", @@ -3266,6 +3717,7 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3273,6 +3725,7 @@ "set-value": { "version": "0.4.3", "bundled": true, + "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -3285,6 +3738,7 @@ "unset-value": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "has-value": "0.3.1", "isobject": "3.0.1" @@ -3293,6 +3747,7 @@ "has-value": { "version": "0.3.1", "bundled": true, + "dev": true, "requires": { "get-value": "2.0.6", "has-values": "0.1.4", @@ -3302,6 +3757,7 @@ "isobject": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "isarray": "1.0.0" } @@ -3310,34 +3766,40 @@ }, "has-values": { "version": "0.1.4", - "bundled": true + "bundled": true, + "dev": true }, "isobject": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true } } }, "urix": { "version": "0.1.0", - "bundled": true + "bundled": true, + "dev": true }, "use": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "validate-npm-package-license": { "version": "3.0.3", "bundled": true, + "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -3346,26 +3808,31 @@ "which": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "isexe": "2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "window-size": { "version": "0.1.0", "bundled": true, + "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true + "bundled": true, + "dev": true }, "wrap-ansi": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" @@ -3374,6 +3841,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -3381,6 +3849,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -3391,11 +3860,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "write-file-atomic": { "version": "1.3.4", "bundled": true, + "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -3404,15 +3875,18 @@ }, "y18n": { "version": "3.2.1", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true }, "yargs": { "version": "11.1.0", "bundled": true, + "dev": true, "requires": { "cliui": "4.0.0", "decamelize": "1.2.0", @@ -3430,15 +3904,18 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "camelcase": { "version": "4.1.0", - "bundled": true + "bundled": true, + "dev": true }, "cliui": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "string-width": "2.1.1", "strip-ansi": "4.0.0", @@ -3448,6 +3925,7 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -3455,6 +3933,7 @@ "yargs-parser": { "version": "9.0.2", "bundled": true, + "dev": true, "requires": { "camelcase": "4.1.0" } @@ -3464,13 +3943,15 @@ "yargs-parser": { "version": "8.1.0", "bundled": true, + "dev": true, "requires": { "camelcase": "4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true + "bundled": true, + "dev": true } } } @@ -3480,6 +3961,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -3488,6 +3970,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -3495,17 +3978,20 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, "requires": { "p-try": "1.0.0" } @@ -3514,6 +4000,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "1.2.0" } @@ -3521,12 +4008,14 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -3538,6 +4027,7 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -3555,49 +4045,58 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true } } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { "pify": "3.0.0" } @@ -3605,27 +4104,32 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -3636,7 +4140,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -3644,6 +4149,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -3654,6 +4160,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -3663,6 +4170,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -3672,6 +4180,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -3681,6 +4190,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, "requires": { "rc": "1.2.6" } @@ -3689,6 +4199,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, "requires": { "path-parse": "1.0.5" } @@ -3697,6 +4208,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -3706,6 +4218,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" } @@ -3714,6 +4227,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { "is-promise": "2.1.0" } @@ -3721,12 +4235,14 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -3734,7 +4250,8 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -3745,6 +4262,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, "requires": { "semver": "5.5.0" } @@ -3753,6 +4271,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -3760,7 +4279,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shimmer": { "version": "1.2.0", @@ -3770,12 +4290,14 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "dev": true, "requires": { "source-map": "0.6.1" }, @@ -3783,7 +4305,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -3791,6 +4314,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -3799,12 +4323,14 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -3813,17 +4339,20 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -3831,27 +4360,32 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -3860,6 +4394,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, "requires": { "execa": "0.7.0" } @@ -3867,12 +4402,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -3880,12 +4417,14 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -3902,7 +4441,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -3910,6 +4450,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -3920,12 +4461,14 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -3944,7 +4487,8 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true } } }, @@ -3952,6 +4496,7 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "dev": true, "requires": { "tslib": "1.9.0" } @@ -3959,12 +4504,14 @@ "typescript": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -3973,6 +4520,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -3989,6 +4537,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -4002,6 +4551,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -4010,6 +4560,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -4019,6 +4570,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -4027,6 +4579,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, "requires": { "string-width": "2.1.1" }, @@ -4034,17 +4587,20 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -4054,6 +4610,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -4063,12 +4620,14 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -4078,17 +4637,20 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index d93c4e7f6..d1d732f09 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -110,4 +110,4 @@ const logger = (options?: LoggerOptions|string) => { logger(); -export = logger; \ No newline at end of file +export{logger}; \ No newline at end of file diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 405b814c4..a632d8f45 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -50,7 +50,7 @@ export class Buffer { */ constructor(exporter: Exporter, config: BufferConfig) { this.exporter = exporter; - this.logger = config.logger || logger(); + this.logger = config.logger || logger.logger(); this.bufferSize = config.bufferSize; this.bufferTimeout = config.bufferTimeout; return this; diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index a3ec9fca3..6fdb02822 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -28,6 +28,7 @@ export * from './common/types'; export * from './trace/model/root-span'; export * from './trace/model/span'; export * from './trace/model/tracer'; +export * from './common/console-logger'; // sampler impl export * from './trace/sampler/sampler'; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 628f16b19..f74e2c7af 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -52,7 +52,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.parentSpanId = context.traceContext.spanId || ''; } this.spansLocal = []; - this.logger = tracer.logger || logger(); + this.logger = tracer.logger || logger.logger(); } /** Gets span list from rootspan instance. */ diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index f05f50506..6d966d2f7 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -33,7 +33,7 @@ export class SpanImpl extends SpanBaseModel implements Span { constructor(root: RootSpan) { super(); this.root = root; - this.logger = this.root.logger || logger(); + this.logger = this.root.logger || logger.logger(); } /** Gets trace id of span. */ diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 2148918fc..39792ce1d 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -48,7 +48,7 @@ export class TracerImpl implements Tracer { /** A sampler used to make sample decisions */ sampler: Sampler; /** A configuration for starting the tracer */ - logger: Logger = logger(); + logger: Logger = logger.logger(); /** Constructs a new TraceImpl instance. */ constructor() { @@ -74,7 +74,7 @@ export class TracerImpl implements Tracer { start(config: TracerConfig): Tracer { this.activeLocal = true; this.config = config; - this.logger = this.config.logger || logger(); + this.logger = this.config.logger || logger.logger(); this.sampler = new SamplerImpl().probability(config.samplingRate); return this; } diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 49a8c0a41..123fa81a3 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -17,7 +17,9 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; +// import * as logger from '../src/common/console-logger'; import * as logger from '../src/common/console-logger'; + import {Logger} from '../src/common/types'; import {Buffer} from '../src/exporters/buffer'; import {ConsoleExporter} from '../src/exporters/console-exporter'; @@ -39,19 +41,19 @@ describe('ConsoleLogger', () => { /** Should create a new ConsoleLogger */ describe('new ConsoleLogger()', () => { it('should consoleLogger with default levels', () => { - const consoleLogger = logger(); + const consoleLogger = logger.logger(); assert.equal(LEVELS.length, consoleLogger.logger.levels.length); }); it('should consoleLogger with error', () => { - const consoleLogger = logger(LEVELS[0]); + const consoleLogger = logger.logger(LEVELS[0]); assert.strictEqual(LEVELS[0], consoleLogger.logger.level); }); }); /** Should logger only error log */ describe('error logger', () => { - const consoleLogger = logger(LEVELS[0]); + const consoleLogger = logger.logger(LEVELS[0]); it('should logger error', () => { consoleTxt = ''; @@ -103,7 +105,7 @@ describe('ConsoleLogger', () => { /** Should logger error, warn and info log */ describe('info logger', () => { - const consoleLogger = logger(LEVELS[2]); + const consoleLogger = logger.logger(LEVELS[2]); it('should logger error', () => { const intercept = require('intercept-stdout'); @@ -188,7 +190,7 @@ describe('ConsoleLogger', () => { 'debug' in object && 'silly' in object; } - const consoleLogger = logger('debug'); + const consoleLogger = logger.logger('debug'); const tracer = new TracerImpl(); tracer.start({logger: consoleLogger}); From d01e0f4890dbecf39e5cccb7532ab56c3fe429f2 Mon Sep 17 00:00:00 2001 From: Luana Date: Tue, 24 Apr 2018 14:40:43 -0300 Subject: [PATCH 102/110] refactor: remove Impl classes suffixes and use module namespace for types --- packages/opencensus-core/src/index-types.ts | 1 - packages/opencensus-core/src/index.ts | 14 ++-- .../src/trace/instrumentation/base-plugin.ts | 5 +- .../src/trace/model/root-span.ts | 16 ++--- .../src/trace/model/span-base-model.ts | 30 ++++----- .../opencensus-core/src/trace/model/span.ts | 8 +-- .../opencensus-core/src/trace/model/tracer.ts | 17 +++-- .../src/trace/sampler/sampler.ts | 4 +- packages/opencensus-core/test/test-buffer.ts | 12 ++-- .../test/test-console-exporter.ts | 15 ++--- .../test/test-console-logger.ts | 6 +- .../opencensus-core/test/test-root-span.ts | 52 +++++++-------- packages/opencensus-core/test/test-sampler.ts | 38 +++++------ packages/opencensus-core/test/test-span.ts | 64 +++++++++---------- packages/opencensus-core/test/test-tracer.ts | 58 ++++++++--------- 15 files changed, 165 insertions(+), 175 deletions(-) diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts index 2ad26e162..d3bdeb698 100644 --- a/packages/opencensus-core/src/index-types.ts +++ b/packages/opencensus-core/src/index-types.ts @@ -21,4 +21,3 @@ export * from './trace/sampler/types'; export * from './trace/instrumentation/types'; export * from './exporters/types'; export * from './common/types'; - diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 6fdb02822..8f74b4981 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -24,15 +24,6 @@ export * from './trace/instrumentation/types'; export * from './exporters/types'; export * from './common/types'; -// domain models impls -export * from './trace/model/root-span'; -export * from './trace/model/span'; -export * from './trace/model/tracer'; -export * from './common/console-logger'; - -// sampler impl -export * from './trace/sampler/sampler'; - // base instrumetation class export * from './trace/instrumentation/base-plugin'; @@ -41,4 +32,7 @@ export * from './exporters/buffer'; export * from './exporters/console-exporter'; // util -export * from './internal/util'; \ No newline at end of file +export * from './internal/util'; + +import * as types from './index-types'; +export {types}; \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 6e752fcb6..acb0c1d42 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -14,11 +14,12 @@ * limitations under the License. */ import * as shimmer from 'shimmer'; -import {Plugin} from './types'; +import * as types from './types'; import {Tracer} from '../model/types'; /** This class represent the base to patch plugin. */ -export abstract class BasePlugin implements Plugin { +export abstract class BasePlugin implements types.Plugin { + /** The service to send the collected traces */ // tslint:disable:no-any protected exporter: any; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index f74e2c7af..2c4560cd5 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -19,15 +19,15 @@ import * as uuid from 'uuid'; import {Clock} from '../../internal/clock'; import {debug} from '../../internal/util'; -import {SpanImpl} from './span'; +import {Span} from './span'; import {SpanBaseModel} from './span-base-model'; -import {TracerImpl} from './tracer'; -import {OnEndSpanEventListener, RootSpan, Span, TraceContext, TraceOptions, Tracer} from './types'; +import {Tracer} from './tracer'; import * as logger from '../../common/console-logger'; +import * as types from './types'; /** Defines a root span */ -export class RootSpanImpl extends SpanBaseModel implements RootSpan { +export class RootSpan extends SpanBaseModel implements types.RootSpan { /** A tracer object */ private tracer: Tracer; /** A list of child spans. */ @@ -40,7 +40,7 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { * @param tracer A tracer object. * @param context A trace options object to build the root span. */ - constructor(tracer: Tracer, context?: TraceOptions) { + constructor(tracer: Tracer, context?: types.TraceOptions) { super(); this.tracer = tracer; this.traceIdLocal = @@ -113,15 +113,15 @@ export class RootSpanImpl extends SpanBaseModel implements RootSpan { this.logger.debug( 'calling %s.startSpan() on ended %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); - return; + return null; } if (!this.started) { this.logger.debug( 'calling %s.startSpan() on un-started %s %o', this.className, this.className, {id: this.id, name: this.name, type: this.type}); - return; + return null; } - const newSpan = new SpanImpl(this); + const newSpan = new Span(this); if (name) { newSpan.name = name; } diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index fe3edb2fb..dbc38884d 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -14,15 +14,13 @@ * limitations under the License. */ +import {Logger} from '../../common/types'; import {Clock} from '../../internal/clock'; import {debug, randomSpanId} from '../../internal/util'; -import {Sampler} from '../sampler/types'; - -import {Annotation, Attributes, Link, MessageEvent, Span, TraceContext} from './types'; -import {Logger} from '../../common/types'; +import * as types from './types'; /** Defines a base model for spans. */ -export abstract class SpanBaseModel implements Span { +export abstract class SpanBaseModel implements types.Span { protected className: string; /** The clock used to mesure the beginning and ending of a span */ private clock: Clock = null; @@ -37,13 +35,13 @@ export abstract class SpanBaseModel implements Span { /** An object to log information to */ logger: Logger; /** A set of attributes, each in the format [KEY]:[VALUE] */ - attributes: Attributes = {}; + attributes: types.Attributes = {}; /** A text annotation with a set of attributes. */ - annotations: Annotation[] = []; + annotations: types.Annotation[] = []; /** An event describing a message sent/received between Spans */ - messageEvents: MessageEvent[] = []; + messageEvents: types.MessageEvent[] = []; /** Pointers from the current span to another span */ - links: Link[] = []; + links: types.Link[] = []; /** If the parent span is in another process. */ remoteParent: boolean; /** The span ID of this span's parent. If it's a root span, must be empty */ @@ -115,12 +113,12 @@ export abstract class SpanBaseModel implements Span { } /** Gives the TraceContext of the span. */ - get traceContext(): TraceContext { + get traceContext(): types.TraceContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), parentSpanId: this.parentSpanId - } as TraceContext; + } as types.TraceContext; } /** @@ -139,12 +137,12 @@ export abstract class SpanBaseModel implements Span { * @param attributes A set of attributes on the annotation. */ addAnnotation( - description: string, timestamp: number, attributes?: Attributes) { + description: string, timestamp: number, attributes?: types.Attributes) { this.annotations.push({ 'description': description, 'timestamp': timestamp, 'attributes': attributes, - } as Annotation); + } as types.Annotation); } /** @@ -155,13 +153,13 @@ export abstract class SpanBaseModel implements Span { * @param attributes A set of attributes on the link. */ addLink( - traceId: string, spanId: string, type: string, attributes?: Attributes) { + traceId: string, spanId: string, type: string, attributes?: types.Attributes) { this.links.push({ 'traceId': traceId, 'spanId': spanId, 'type': type, 'attributes': attributes - } as Link); + } as types.Link); } /** @@ -173,7 +171,7 @@ export abstract class SpanBaseModel implements Span { this.messageEvents.push({ 'type': type, 'id': id, - } as MessageEvent); + } as types.MessageEvent); } /** Starts the span. */ diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 6d966d2f7..60d35d583 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -16,14 +16,14 @@ import {debug, randomSpanId} from '../../internal/util'; -import {RootSpanImpl} from './root-span'; +import {RootSpan} from './root-span'; import {SpanBaseModel} from './span-base-model'; -import {RootSpan, Span, TraceContext} from './types'; import * as logger from '../../common/console-logger'; +import * as types from './types'; /** Defines a Span. */ -export class SpanImpl extends SpanBaseModel implements Span { +export class Span extends SpanBaseModel implements types.Span { private root: RootSpan; /** @@ -42,7 +42,7 @@ export class SpanImpl extends SpanBaseModel implements Span { } /** Gets trace context of span. */ - get traceContext(): TraceContext { + get traceContext(): types.TraceContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 39792ce1d..b1a374048 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -16,25 +16,24 @@ import * as cls from '../../internal/cls'; import {debug} from '../../internal/util'; -import {SamplerImpl} from '../sampler/sampler'; +import {Sampler} from '../sampler/sampler'; import {TracerConfig} from '../config/types'; -import {Sampler} from '../sampler/types'; import {Config} from '../config/types'; -import {RootSpanImpl} from './root-span'; -import {SpanImpl} from './span'; -import {RootSpan, Span} from './types'; -import {TraceOptions, Tracer} from './types'; +import {RootSpan} from './root-span'; +import {Span} from './span'; +import {TraceOptions} from './types'; import {Func, OnEndSpanEventListener} from './types'; import {Logger} from '../../common/types'; +import * as types from './types'; import * as logger from '../../common/console-logger'; /** * This class represent a tracer. */ -export class TracerImpl implements Tracer { +export class Tracer implements types.Tracer { /** Indicates if the tracer is active */ private activeLocal: boolean; /** TODO */ @@ -75,7 +74,7 @@ export class TracerImpl implements Tracer { this.activeLocal = true; this.config = config; this.logger = this.config.logger || logger.logger(); - this.sampler = new SamplerImpl().probability(config.samplingRate); + this.sampler = new Sampler().probability(config.samplingRate); return this; } @@ -103,7 +102,7 @@ export class TracerImpl implements Tracer { return this.contextManager.runAndReturn((root) => { let newRoot = null; if (this.active) { - newRoot = new RootSpanImpl(this, options); + newRoot = new RootSpan(this, options); if (this.sampler.shouldSample(newRoot.traceId)) { newRoot.start(); this.currentRootSpan = newRoot; diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 8226cfb8d..c3ede4fc6 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -15,13 +15,13 @@ */ import {debug, randomSpanId} from '../../internal/util'; -import {Sampler} from './types'; +import * as types from './types'; const MIN_NUMBER = 1e-4; const MAX_NUMBER = 0xffffffffffffffff; /** This class represent the probability of a tracer. */ -export class SamplerImpl implements Sampler { +export class Sampler implements types.Sampler { private idUpperBound: number; /** diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts index 50c1414f2..a28ee33d1 100644 --- a/packages/opencensus-core/test/test-buffer.ts +++ b/packages/opencensus-core/test/test-buffer.ts @@ -19,13 +19,13 @@ import * as mocha from 'mocha'; import {Buffer} from '../src/exporters/buffer'; import {NoopExporter} from '../src/exporters/console-exporter'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {TracerImpl} from '../src/trace/model/tracer'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; const exporter = new NoopExporter(); const DEFAULT_BUFFER_SIZE = 3; const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds -const tracer = new TracerImpl(); +const tracer = new Tracer(); const defaultBufferConfig = { bufferSize: DEFAULT_BUFFER_SIZE, @@ -61,7 +61,7 @@ describe('Buffer', () => { describe('addToBuffer', () => { it('should return the Buffer instance', () => { const buffer = new Buffer(exporter, defaultBufferConfig); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); const bufferAdd = buffer.addToBuffer(rootSpan); assert.ok(bufferAdd instanceof Buffer); }); @@ -74,7 +74,7 @@ describe('Buffer', () => { it('should return the Buffer instance', () => { const buffer = new Buffer(exporter, defaultBufferConfig); const bufferResize = buffer.setBufferSize(0); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); const bufferAdd = bufferResize.addToBuffer(rootSpan); assert.ok(bufferAdd instanceof Buffer); }); @@ -87,7 +87,7 @@ describe('Buffer', () => { it('should return the Buffer instance', () => { const buffer = new Buffer( exporter, {bufferSize: DEFAULT_BUFFER_SIZE, bufferTimeout: 0}); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); let bufferAdd = buffer.addToBuffer(rootSpan); bufferAdd = buffer.addToBuffer(rootSpan); assert.ok(bufferAdd instanceof Buffer); diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts index 5c32c5f62..fff8ca862 100644 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -19,11 +19,10 @@ import * as mocha from 'mocha'; import {Buffer} from '../src/exporters/buffer'; import {ConsoleExporter, NoopExporter} from '../src/exporters/console-exporter'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {TracerImpl} from '../src/trace/model/tracer'; -import {RootSpan} from '../src/trace/model/types'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; -const tracer = new TracerImpl(); +const tracer = new Tracer(); const DEFAULT_BUFFER_SIZE = 3; const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds const defaultBufferConfig = { @@ -36,7 +35,7 @@ describe('NoopExporter', () => { describe('onEndSpan()', () => { it('should do anything', () => { const exporter = new NoopExporter(); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); exporter.onEndSpan(rootSpan); assert.ok(true); }); @@ -46,7 +45,7 @@ describe('NoopExporter', () => { describe('publish()', () => { it('should do anything', () => { const exporter = new NoopExporter(); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); const queue: RootSpan[] = []; queue.push(rootSpan); @@ -61,7 +60,7 @@ describe('ConsoleLogExporter', () => { describe('onEndSpan()', () => { it('should end a span', () => { const exporter = new ConsoleExporter(defaultBufferConfig); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); exporter.onEndSpan(rootSpan); assert.ok(true); }); @@ -71,7 +70,7 @@ describe('ConsoleLogExporter', () => { describe('publish()', () => { it('should publish the rootspans in queue', () => { const exporter = new ConsoleExporter(defaultBufferConfig); - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.startSpan('name', 'type', rootSpan.traceId); const queue: RootSpan[] = []; queue.push(rootSpan); diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 123fa81a3..5704ad89f 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -24,8 +24,8 @@ import {Logger} from '../src/common/types'; import {Buffer} from '../src/exporters/buffer'; import {ConsoleExporter} from '../src/exporters/console-exporter'; import {BufferConfig, TracerConfig} from '../src/trace/config/types'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {TracerImpl} from '../src/trace/model/tracer'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; import {TraceOptions} from '../src/trace/model/types'; const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; @@ -192,7 +192,7 @@ describe('ConsoleLogger', () => { const consoleLogger = logger.logger('debug'); - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start({logger: consoleLogger}); it('checks if Tracer has a logger', () => { diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index b076fe8e0..fa8dc2a86 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -17,12 +17,12 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {SpanImpl} from '../src/trace/model/span'; -import {TracerImpl} from '../src/trace/model/tracer'; -import {Annotation, Attributes, Link, MessageEvent, RootSpan, Span, TraceOptions, Tracer} from '../src/trace/model/types'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Annotation, Attributes, Link, MessageEvent, TraceOptions} from '../src/trace/model/types'; -const tracer = new TracerImpl(); +const tracer = new Tracer(); describe('RootSpan', () => { /** @@ -30,8 +30,8 @@ describe('RootSpan', () => { */ describe('new RootSpan()', () => { it('should create a RootSpan instance', () => { - const root = new RootSpanImpl(tracer); - assert.ok(root instanceof RootSpanImpl); + const root = new RootSpan(tracer); + assert.ok(root instanceof RootSpan); }); }); @@ -40,11 +40,11 @@ describe('RootSpan', () => { */ describe('new RootSpan() with options', () => { it('should create a RootSpan instance with options', () => { - const trace = new RootSpanImpl(tracer); + const trace = new RootSpan(tracer); const options = {name: 'test', traceContext: trace.traceContext} as TraceOptions; - const root = new RootSpanImpl(tracer, options); - assert.ok(root instanceof RootSpanImpl); + const root = new RootSpan(tracer, options); + assert.ok(root instanceof RootSpan); }); }); @@ -53,12 +53,12 @@ describe('RootSpan', () => { */ describe('get spans()', () => { it('should get span list from rootspan instance', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.start(); const span = root.startSpan('spanName', 'spanType'); for (const span of root.spans) { - assert.ok(span instanceof SpanImpl); + assert.ok(span instanceof Span); } }); }); @@ -68,7 +68,7 @@ describe('RootSpan', () => { */ describe('new traceId()', () => { it('should get trace id from rootspan instance', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); assert.equal(root.traceId, root.traceContext.traceId); }); }); @@ -78,7 +78,7 @@ describe('RootSpan', () => { */ describe('start()', () => { it('should start a RootSpan instance', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.start(); assert.ok(root.started); }); @@ -91,13 +91,13 @@ describe('RootSpan', () => { let root, span; before(() => { - root = new RootSpanImpl(tracer); + root = new RootSpan(tracer); root.start(); span = root.startSpan('spanName', 'spanType'); }); it('should create span instance', () => { - assert.ok(span instanceof SpanImpl); + assert.ok(span instanceof Span); }); it('should start a span instance', () => { @@ -110,7 +110,7 @@ describe('RootSpan', () => { */ describe('startSpan() before start rootspan', () => { it('should not create span', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); const span = root.startSpan('spanName', 'spanType'); assert.ok(span == null); }); @@ -121,7 +121,7 @@ describe('RootSpan', () => { */ describe('startSpan() after rootspan ended', () => { it('should not create span', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.start(); root.end(); const span = root.startSpan('spanName', 'spanType'); @@ -134,7 +134,7 @@ describe('RootSpan', () => { */ describe('end()', () => { it('should end the rootspan instance', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.start(); root.end(); assert.ok(root.ended); @@ -146,7 +146,7 @@ describe('RootSpan', () => { */ describe('end() before start rootspan', () => { it('should not end rootspan', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.end(); assert.ok(!root.ended); }); @@ -157,7 +157,7 @@ describe('RootSpan', () => { */ describe('end() before end all spans', () => { it('should end all spans inside rootspan', () => { - const root = new RootSpanImpl(tracer); + const root = new RootSpan(tracer); root.start(); const span = root.startSpan('spanName', 'spanType'); root.end(); @@ -174,7 +174,7 @@ describe('RootSpan', () => { */ describe('addAtribute()', () => { it('should add an attribute', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); ['String', 'Number', 'Boolean'].map(attType => { @@ -196,7 +196,7 @@ describe('RootSpan', () => { 'attributes' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); rootSpan.addAnnotation('description test', Date.now(), {} as Attributes); @@ -216,10 +216,10 @@ describe('RootSpan', () => { return 'traceId' in object && 'spanId' in object && 'type' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); const LINK_TYPE = 'CHILD_LINKED_SPAN'; @@ -240,7 +240,7 @@ describe('RootSpan', () => { return 'type' in object && 'id' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts index 9b71b26d4..cc2497eea 100644 --- a/packages/opencensus-core/test/test-sampler.ts +++ b/packages/opencensus-core/test/test-sampler.ts @@ -17,11 +17,11 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {TracerImpl} from '../src/trace/model/tracer'; -import {SamplerImpl} from '../src/trace/sampler/sampler'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Sampler} from '../src/trace/sampler/sampler'; -const tracer = new TracerImpl(); +const tracer = new Tracer(); describe('Sampler', () => { /** @@ -29,8 +29,8 @@ describe('Sampler', () => { */ describe('new Sampler()', () => { it('should create a Sampler instance', () => { - const sampler = new SamplerImpl(); - assert.ok(sampler instanceof SamplerImpl); + const sampler = new Sampler(); + assert.ok(sampler instanceof Sampler); }); }); @@ -39,9 +39,9 @@ describe('Sampler', () => { */ describe('new Sampler(traceId)', () => { it('should create a Sampler instance', () => { - const root = new RootSpanImpl(tracer); - const sampler = new SamplerImpl(); - assert.ok(sampler instanceof SamplerImpl); + const root = new RootSpan(tracer); + const sampler = new Sampler(); + assert.ok(sampler instanceof Sampler); }); }); @@ -50,9 +50,9 @@ describe('Sampler', () => { */ describe('always()', () => { it('should return a sampler instance', () => { - const sampler = new SamplerImpl(); + const sampler = new Sampler(); const samplerAlways = sampler.always(); - assert.ok(samplerAlways instanceof SamplerImpl); + assert.ok(samplerAlways instanceof Sampler); }); }); @@ -61,9 +61,9 @@ describe('Sampler', () => { */ describe('never()', () => { it('should return a sampler instance', () => { - const sampler = new SamplerImpl(); + const sampler = new Sampler(); const samplerNever = sampler.never(); - assert.ok(samplerNever instanceof SamplerImpl); + assert.ok(samplerNever instanceof Sampler); }); }); @@ -73,9 +73,9 @@ describe('Sampler', () => { describe('probability()', () => { it('should return a sampler instance', () => { const PROBABILITY = 0.5; - const sampler = new SamplerImpl(); + const sampler = new Sampler(); const samplerProbability = sampler.probability(PROBABILITY); - assert.ok(samplerProbability instanceof SamplerImpl); + assert.ok(samplerProbability instanceof Sampler); }); }); @@ -84,8 +84,8 @@ describe('Sampler', () => { */ describe('shouldSample() always', () => { it('should return true', () => { - const root = new RootSpanImpl(tracer); - const sampler = new SamplerImpl(); + const root = new RootSpan(tracer); + const sampler = new Sampler(); sampler.always(); const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(samplerShouldSampler); @@ -96,8 +96,8 @@ describe('Sampler', () => { */ describe('shouldSample() never', () => { it('should return false', () => { - const root = new RootSpanImpl(tracer); - const sampler = new SamplerImpl(); + const root = new RootSpan(tracer); + const sampler = new Sampler(); sampler.never(); const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(!samplerShouldSampler); diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 4ae8d73f1..09baa8df9 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -17,12 +17,12 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {SpanImpl} from '../src/trace/model/span'; -import {TracerImpl} from '../src/trace/model/tracer'; -import {Annotation, Attributes, Link, MessageEvent, Span} from '../src/trace/model/types'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Annotation, Attributes, Link, MessageEvent} from '../src/trace/model/types'; -const tracer = new TracerImpl(); +const tracer = new Tracer(); describe('Span', () => { /** @@ -30,9 +30,9 @@ describe('Span', () => { */ describe('new Span()', () => { it('should create a Span instance', () => { - const rootSpan = new RootSpanImpl(tracer); - const span = new SpanImpl(rootSpan); - assert.ok(span instanceof SpanImpl); + const rootSpan = new RootSpan(tracer); + const span = new Span(rootSpan); + assert.ok(span instanceof Span); }); }); @@ -41,9 +41,9 @@ describe('Span', () => { */ describe('get traceId()', () => { it('should return the trace id', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); assert.equal(span.traceId, rootSpan.traceId); }); }); @@ -53,10 +53,10 @@ describe('Span', () => { */ describe('get traceContext()', () => { it('should the trace context of span', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); const context = span.traceContext; assert.equal(context.traceId, rootSpan.traceId); @@ -72,9 +72,9 @@ describe('Span', () => { describe('get time properties before start()', () => { let span; before(() => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - span = new SpanImpl(rootSpan); + span = new Span(rootSpan); }); it('should get startTime() return null', () => { assert.equal(span.startTime, null); @@ -92,10 +92,10 @@ describe('Span', () => { */ describe('start()', () => { it('should start a span instance', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); assert.ok(span.started); @@ -107,9 +107,9 @@ describe('Span', () => { */ describe('start() an already started span', () => { it('should not change the initial startTime', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); const initialStartTime = span.startTime; span.start(); @@ -123,10 +123,10 @@ describe('Span', () => { */ describe('end()', () => { it('should end a span instance', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); span.end(); @@ -139,10 +139,10 @@ describe('Span', () => { */ describe('end() before start()', () => { it('should not end a span instance', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.end(); assert.ok(!span.ended); @@ -154,9 +154,9 @@ describe('Span', () => { */ describe('end() an already ended span', () => { it('should not change the endTime', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); span.end(); const initialEndTime = span.endTime; @@ -171,10 +171,10 @@ describe('Span', () => { */ describe('addAtribute()', () => { it('should add an attribute', () => { - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); ['String', 'Number', 'Boolean'].map(attType => { @@ -196,10 +196,10 @@ describe('Span', () => { 'attributes' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); span.addAnnotation('description test', Date.now(), {} as Attributes); @@ -219,10 +219,10 @@ describe('Span', () => { return 'traceId' in object && 'spanId' in object && 'type' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); const LINK_TYPE = 'PARENT_LINKED_SPAN'; @@ -243,10 +243,10 @@ describe('Span', () => { return 'type' in object && 'id' in object; } - const rootSpan = new RootSpanImpl(tracer); + const rootSpan = new RootSpan(tracer); rootSpan.start(); - const span = new SpanImpl(rootSpan); + const span = new Span(rootSpan); span.start(); span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 1d2744727..7500b8c70 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -18,10 +18,10 @@ import * as assert from 'assert'; import {EventEmitter} from 'events'; import {TracerConfig} from '../src/trace/config/types'; -import {RootSpanImpl} from '../src/trace/model/root-span'; -import {SpanImpl} from '../src/trace/model/span'; -import {TracerImpl} from '../src/trace/model/tracer'; -import {OnEndSpanEventListener, RootSpan, Span, Tracer} from '../src/trace/model/types'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {OnEndSpanEventListener} from '../src/trace/model/types'; class OnEndSpanClass implements OnEndSpanEventListener { /** Counter for test use */ @@ -42,8 +42,8 @@ describe('Tracer', () => { /** Should create a Tracer instance */ describe('new Tracer()', () => { it('should create a Tracer instance', () => { - const tracer = new TracerImpl(); - assert.ok(tracer instanceof TracerImpl); + const tracer = new Tracer(); + assert.ok(tracer instanceof Tracer); }); }); @@ -51,12 +51,12 @@ describe('Tracer', () => { describe('get/set currentRootSpan()', () => { let tracer, rootSpan; before(() => { - tracer = new TracerImpl(); - rootSpan = new RootSpanImpl(tracer); + tracer = new Tracer(); + rootSpan = new RootSpan(tracer); tracer.currentRootSpan = rootSpan; }); it('should get the current RootSpan from tracer instance', () => { - assert.ok(tracer.currentRootSpan instanceof RootSpanImpl); + assert.ok(tracer.currentRootSpan instanceof RootSpan); }); it('should set the current RootSpan from tracer instance', () => { assert.equal(tracer.currentRootSpan, rootSpan); @@ -67,11 +67,11 @@ describe('Tracer', () => { describe('start()', () => { let tracerStarted; before(() => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracerStarted = tracer.start(defaultConfig); }); it('should return a tracer instance', () => { - assert.ok(tracerStarted instanceof TracerImpl); + assert.ok(tracerStarted instanceof Tracer); }); it('the trace was started', () => { @@ -83,7 +83,7 @@ describe('Tracer', () => { describe('registerEndSpanListener() / get eventListeners()', () => { let tracer, onEndSpan; before(() => { - tracer = new TracerImpl(); + tracer = new Tracer(); onEndSpan = new OnEndSpanClass(); tracer.registerEndSpanListener(onEndSpan); }); @@ -103,7 +103,7 @@ describe('Tracer', () => { /** Should stop the trace instance */ describe('stop()', () => { it('should stop the trace instance', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); tracer.stop(); assert.ok(!tracer.active); @@ -114,7 +114,7 @@ describe('Tracer', () => { describe('get active()', () => { let tracer: Tracer; before(() => { - tracer = new TracerImpl(); + tracer = new Tracer(); }); it('should check if the trace instance is started', () => { tracer.start(defaultConfig); @@ -130,14 +130,14 @@ describe('Tracer', () => { describe('startRootSpan()', () => { let rootSpanLocal; before(() => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); tracer.startRootSpan(null, (rootSpan) => { rootSpanLocal = rootSpan; }); }); it('should create a new RootSpan instance', () => { - assert.ok(rootSpanLocal instanceof RootSpanImpl); + assert.ok(rootSpanLocal instanceof RootSpan); }); it('should start the rootSpan', () => { assert.ok(rootSpanLocal.started); @@ -148,14 +148,14 @@ describe('Tracer', () => { describe('startRootSpan() with options', () => { let rootSpanLocal; before(() => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); tracer.startRootSpan(options, (rootSpan) => { rootSpanLocal = rootSpan; }); }); it('should create a new RootSpan instance', () => { - assert.ok(rootSpanLocal instanceof RootSpanImpl); + assert.ok(rootSpanLocal instanceof RootSpan); }); it('should start the rootSpan', () => { assert.ok(rootSpanLocal.started); @@ -165,7 +165,7 @@ describe('Tracer', () => { /** Should not start the new RootSpan instance */ describe('startRootSpan() with sampler never', () => { it('should not start the new RootSpan instance', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); const config = {samplingRate: 0} as TracerConfig; tracer.start(config); tracer.startRootSpan(options, (rootSpan) => { @@ -177,7 +177,7 @@ describe('Tracer', () => { /** Should not create the new RootSpan instance */ describe('startRootSpan() before start()', () => { it('should not create the new RootSpan instance', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.startRootSpan(options, (rootSpan) => { assert.equal(rootSpan, null); }); @@ -187,7 +187,7 @@ describe('Tracer', () => { /** Should set the current root span to null */ describe('clearCurrentRootSpan()', () => { it('should set the current root span to null', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); tracer.startRootSpan(options, (rootSpan) => { tracer.clearCurrentTrace(); @@ -200,14 +200,14 @@ describe('Tracer', () => { describe('startSpan()', () => { let span; before(() => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); tracer.startRootSpan(options, (rootSpan) => { span = tracer.startSpan('spanName', 'spanType'); }); }); it('should create a Span instance', () => { - assert.ok(span instanceof SpanImpl); + assert.ok(span instanceof Span); }); it('should start a span', () => { assert.ok(span.started); @@ -217,7 +217,7 @@ describe('Tracer', () => { /** Should not create a Span instance */ describe('startSpan() before startRootSpan()', () => { it('should not create a Span instance', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); const span = tracer.startSpan('spanName', 'spanType'); assert.equal(span, null); @@ -227,7 +227,7 @@ describe('Tracer', () => { /** Should run eventListeners when the rootSpan ends */ describe('onEndSpan()', () => { it('should run eventListeners when the rootSpan ends', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); const eventListener = new OnEndSpanClass(); tracer.registerEndSpanListener(eventListener); tracer.start(defaultConfig); @@ -243,25 +243,25 @@ describe('Tracer', () => { /** Testing void functions */ describe('void functions', () => { it('wrap()', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); assert.ok(tracer.wrap(() => {}) instanceof Function); }); it('wrap() before start()', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); assert.ok(tracer.wrap(() => {}) instanceof Function); }); it('wrapEmitter()', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); tracer.start(defaultConfig); assert.strictEqual( typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); }); it('wrapEmitter() before start()', () => { - const tracer = new TracerImpl(); + const tracer = new Tracer(); assert.strictEqual( typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); }); From 7dca176d52e5997a77eefddff2951991217f1049 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 24 Apr 2018 21:08:41 -0300 Subject: [PATCH 103/110] refactor: update and standardize use of types module namespace --- .../src/common/console-logger.ts | 10 ++-- .../opencensus-core/src/exporters/buffer.ts | 22 ++++----- .../src/exporters/console-exporter.ts | 26 +++++----- .../opencensus-core/src/exporters/types.ts | 14 +++--- packages/opencensus-core/src/index-classes.ts | 32 +++++++++++++ packages/opencensus-core/src/index-types.ts | 1 + packages/opencensus-core/src/index.ts | 24 ++-------- packages/opencensus-core/src/internal/cls.ts | 3 +- packages/opencensus-core/src/internal/util.ts | 3 -- .../src/trace/instrumentation/base-plugin.ts | 8 ++-- .../src/trace/model/root-span.ts | 31 +++--------- .../src/trace/model/span-base-model.ts | 5 +- .../opencensus-core/src/trace/model/span.ts | 17 +++---- .../opencensus-core/src/trace/model/tracer.ts | 48 +++++++++---------- .../opencensus-core/src/trace/model/types.ts | 26 ++++------ .../src/trace/sampler/sampler.ts | 2 +- packages/opencensus-core/src/trace/types.ts | 16 +++---- .../test/test-console-logger.ts | 1 - packages/opencensus-core/test/test-tracer.ts | 2 +- 19 files changed, 135 insertions(+), 156 deletions(-) create mode 100644 packages/opencensus-core/src/index-classes.ts diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index d1d732f09..147d1b119 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Logger, LoggerOptions} from './types'; +import * as types from './types'; const logDriver = require('log-driver'); @@ -22,7 +22,7 @@ const logDriver = require('log-driver'); /** * This class represente a console-logger */ -class ConsoleLogger implements Logger { +class ConsoleLogger implements types.Logger { // tslint:disable:no-any private logger: any; static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; @@ -31,8 +31,8 @@ class ConsoleLogger implements Logger { * Constructs a new ConsoleLogger instance * @param options A logger configuration object. */ - constructor(options?: LoggerOptions|string) { - let opt: LoggerOptions = {}; + constructor(options?: types.LoggerOptions|string) { + let opt: types.LoggerOptions = {}; if (typeof options === 'string') { opt = {level: options}; } else { @@ -102,7 +102,7 @@ let defaultLogger = null; * Function logger exported to others classes. * @param options A logger options or strig to logger in console */ -const logger = (options?: LoggerOptions|string) => { +const logger = (options?: types.LoggerOptions|string) => { defaultLogger = new ConsoleLogger(options); logger['logger'] = defaultLogger; return defaultLogger; diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index a632d8f45..2c2a82435 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -15,21 +15,17 @@ */ import * as uuidv4 from 'uuid/v4'; - -import {debug} from '../internal/util'; -import {RootSpan} from '../trace/model/types'; -import {OnEndSpanEventListener} from '../trace/model/types'; -import {Logger} from '../common/types'; -import {Exporter} from './types'; -import {Config, BufferConfig} from '../trace/config/types'; - +import * as types from './types'; +import * as modelTypes from '../trace/model/types'; +import * as configTypes from '../trace/config/types'; +import * as loggerTypes from '../common/types'; import * as logger from '../common/console-logger'; /** Controls the sending of traces to exporters. */ export class Buffer { /** The service to send the collected spans. */ - private exporter: Exporter; + private exporter: types.Exporter; /** Maximum size of a buffer. */ private bufferSize: number; /** Max time for a buffer can wait before being sent */ @@ -39,16 +35,16 @@ export class Buffer { /** Indicates when the buffer timeout is running */ private bufferTimeoutInProgress = false; /** An object to log information to */ - logger: Logger; + logger: loggerTypes.Logger; /** Trace queue of a buffer */ - queue: RootSpan[] = []; + queue: modelTypes.RootSpan[] = []; /** * Constructs a new Buffer instance. * @param exporter The service to send the collected spans. * @param config A buffer configuration object to create a buffer. */ - constructor(exporter: Exporter, config: BufferConfig) { + constructor(exporter: types.Exporter, config: configTypes.BufferConfig) { this.exporter = exporter; this.logger = config.logger || logger.logger(); this.bufferSize = config.bufferSize; @@ -69,7 +65,7 @@ export class Buffer { * Add a trace (rootSpan) in the buffer. * @param trace RootSpan to be added in the buffer. */ - addToBuffer(trace: RootSpan) { + addToBuffer(trace: modelTypes.RootSpan) { this.queue.push(trace); this.logger.debug('BUFFER: added new trace'); diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index 0be92e67c..bd4d8bc58 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -14,31 +14,31 @@ * limitations under the License. */ -import {Exporter, ExporterConfig} from '../exporters/types'; -import {RootSpan} from '../trace/model/types'; -import {Buffer} from './buffer'; -import {Logger} from '../common/types'; +import * as types from './types'; +import * as modelTypes from '../trace/model/types'; +import * as loggerTypes from '../common/types'; +import {Buffer} from './buffer'; /** Do not send span data */ -export class NoopExporter implements Exporter { - logger: Logger; - onEndSpan(root: RootSpan) {} - publish(rootSpans: RootSpan[]) {} +export class NoopExporter implements types.Exporter { + logger: loggerTypes.Logger; + onEndSpan(root: modelTypes.RootSpan) {} + publish(rootSpans: modelTypes.RootSpan[]) {} } /** Format and sends span data to the console. */ -export class ConsoleExporter implements Exporter { +export class ConsoleExporter implements types.Exporter { /** Buffer object to store the spans. */ private buffer: Buffer; - logger: Logger; + logger: loggerTypes.Logger; /** * Constructs a new ConsoleLogExporter instance. * @param config Exporter configuration object to create a console log * exporter. */ - constructor(config: ExporterConfig) { + constructor(config: types.ExporterConfig) { this.buffer = new Buffer(this, config); this.logger = config.logger; } @@ -47,7 +47,7 @@ export class ConsoleExporter implements Exporter { * Event called when a span is ended. * @param root Ended span. */ - onEndSpan(root: RootSpan) { + onEndSpan(root: modelTypes.RootSpan) { this.buffer.addToBuffer(root); } @@ -55,7 +55,7 @@ export class ConsoleExporter implements Exporter { * Sends the spans information to the console. * @param rootSpans */ - publish(rootSpans: RootSpan[]) { + publish(rootSpans: modelTypes.RootSpan[]) { rootSpans.map((root) => { const ROOT_STR: string = (` RootSpan: {traceId: ${root.traceId}, diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index ad2986d4b..f81b951d3 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -15,20 +15,20 @@ */ -import {OnEndSpanEventListener, RootSpan} from '../trace/model/types'; -import {BufferConfig} from '../trace/config/types'; -import {Logger} from '../common/types'; +import * as modelTypes from '../trace/model/types'; +import * as configTypes from '../trace/config/types'; +import * as loggerTypes from '../common/types'; /** Defines an exporter interface. */ -export interface Exporter extends OnEndSpanEventListener { +export interface Exporter extends modelTypes.OnEndSpanEventListener { /** An object to log information to */ - logger: Logger; + logger: loggerTypes.Logger; /** * Sends a list of root spans to the service. * @param rootSpans A list of root spans to publish. */ - publish(rootSpans: RootSpan[]); + publish(rootSpans: modelTypes.RootSpan[]); } -export type ExporterConfig = BufferConfig; +export type ExporterConfig = configTypes.BufferConfig; diff --git a/packages/opencensus-core/src/index-classes.ts b/packages/opencensus-core/src/index-classes.ts new file mode 100644 index 000000000..6af279fc3 --- /dev/null +++ b/packages/opencensus-core/src/index-classes.ts @@ -0,0 +1,32 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// all classes + +// domain models impls +export * from './trace/model/root-span'; +export * from './trace/model/span'; +export * from './trace/model/tracer'; + +// sampler impl +export * from './trace/sampler/sampler'; + +// base instrumetation class +export * from './trace/instrumentation/base-plugin'; + +// console exporter and buffer impls +export * from './exporters/buffer'; +export * from './exporters/console-exporter'; diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts index d3bdeb698..14143e902 100644 --- a/packages/opencensus-core/src/index-types.ts +++ b/packages/opencensus-core/src/index-types.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +// all types export * from './trace/types'; export * from './trace/model/types'; export * from './trace/config/types'; diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 8f74b4981..82718c3e1 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -15,24 +15,8 @@ */ -// opencensus core api interfaces -export * from './trace/types'; -export * from './trace/model/types'; -export * from './trace/config/types'; -export * from './trace/sampler/types'; -export * from './trace/instrumentation/types'; -export * from './exporters/types'; -export * from './common/types'; - -// base instrumetation class -export * from './trace/instrumentation/base-plugin'; - -// console exporter and buffer impls -export * from './exporters/buffer'; -export * from './exporters/console-exporter'; - -// util -export * from './internal/util'; - +import * as logger from './common/console-logger'; +import * as classes from './index-classes'; import * as types from './index-types'; -export {types}; \ No newline at end of file + +export {classes, logger, types}; diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index 779f4822a..35fcecfd4 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -18,7 +18,6 @@ import * as CLS from 'continuation-local-storage'; import * as semver from 'semver'; import * as cls_ah from './cls-ah'; -import {debug} from './util'; export type Namespace = CLS.Namespace; export type Func = CLS.Func; @@ -27,6 +26,8 @@ const useAsyncHooks: boolean = semver.satisfies( process.version, '>=8'); //&& // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; +import * as Debug from 'debug'; +const debug = Debug('opencensus'); debug('useAsyncHooks = %s', useAsyncHooks); const cls: typeof CLS = diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts index 5a8cbf0b9..b98e92cbc 100644 --- a/packages/opencensus-core/src/internal/util.ts +++ b/packages/opencensus-core/src/internal/util.ts @@ -15,9 +15,6 @@ */ import * as crypto from 'crypto'; -import * as Debug from 'debug'; - -export const debug = Debug('opencensus'); // TODO: rethink this snippet aproach diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index acb0c1d42..63a6f10df 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -15,7 +15,7 @@ */ import * as shimmer from 'shimmer'; import * as types from './types'; -import {Tracer} from '../model/types'; +import * as modelTypes from '../model/types'; /** This class represent the base to patch plugin. */ export abstract class BasePlugin implements types.Plugin { @@ -26,7 +26,7 @@ export abstract class BasePlugin implements types.Plugin { /** The module name */ protected moduleName: string; /** A tracer object. */ - protected tracer: Tracer; + protected tracer: modelTypes.Tracer; /** The module version. */ protected version: string; @@ -45,7 +45,7 @@ export abstract class BasePlugin implements types.Plugin { * @param version module version description */ // tslint:disable:no-any - protected setPluginContext(exporter: any, tracer: Tracer, version: string) { + protected setPluginContext(exporter: any, tracer: modelTypes.Tracer, version: string) { this.exporter = exporter; this.tracer = tracer; this.version = version; @@ -90,7 +90,7 @@ export abstract class BasePlugin implements types.Plugin { } // tslint:disable:no-any - applyPatch(exporter: any, tracer: Tracer, version: string): any{ + applyPatch(exporter: any, tracer: modelTypes.Tracer, version: string): any{ this.setPluginContext(exporter, tracer, version); } diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 2c4560cd5..05e8b2b6e 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -15,23 +15,20 @@ */ import * as uuid from 'uuid'; +import * as types from './types'; +import * as logger from '../../common/console-logger'; +import {SpanBaseModel} from './span-base-model'; import {Clock} from '../../internal/clock'; -import {debug} from '../../internal/util'; - import {Span} from './span'; -import {SpanBaseModel} from './span-base-model'; -import {Tracer} from './tracer'; -import * as logger from '../../common/console-logger'; -import * as types from './types'; /** Defines a root span */ export class RootSpan extends SpanBaseModel implements types.RootSpan { /** A tracer object */ - private tracer: Tracer; + private tracer: types.Tracer; /** A list of child spans. */ - private spansLocal: Span[]; + private spansLocal: types.Span[]; /** It's trace ID. */ private traceIdLocal: string; @@ -40,7 +37,7 @@ export class RootSpan extends SpanBaseModel implements types.RootSpan { * @param tracer A tracer object. * @param context A trace options object to build the root span. */ - constructor(tracer: Tracer, context?: types.TraceOptions) { + constructor(tracer: types.Tracer, context?: types.TraceOptions) { super(); this.tracer = tracer; this.traceIdLocal = @@ -56,7 +53,7 @@ export class RootSpan extends SpanBaseModel implements types.RootSpan { } /** Gets span list from rootspan instance. */ - get spans(): Span[] { + get spans(): types.Span[] { return this.spansLocal; } @@ -87,20 +84,6 @@ export class RootSpan extends SpanBaseModel implements types.RootSpan { this.tracer.onEndSpan(this); } - /** - * Event called when a span is ended. - * @param span Span ended. - */ - onEndSpan(span: Span) { - this.logger.debug('ending span %o', { - id: span.id, - traceId: span.traceId, - name: span.name, - startTime: span.startTime, - endTime: span.endTime, - duration: span.duration - }); - } /** * Starts a new child span in the root span. diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index dbc38884d..92c6a7c6f 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -13,11 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import * as types from './types'; import {Logger} from '../../common/types'; import {Clock} from '../../internal/clock'; -import {debug, randomSpanId} from '../../internal/util'; -import * as types from './types'; +import {randomSpanId} from '../../internal/util'; + /** Defines a base model for spans. */ export abstract class SpanBaseModel implements types.Span { diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 60d35d583..3d8c36f3f 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,23 +14,22 @@ * limitations under the License. */ -import {debug, randomSpanId} from '../../internal/util'; +import * as types from './types'; +import * as logger from '../../common/console-logger'; -import {RootSpan} from './root-span'; import {SpanBaseModel} from './span-base-model'; -import * as logger from '../../common/console-logger'; -import * as types from './types'; /** Defines a Span. */ export class Span extends SpanBaseModel implements types.Span { - private root: RootSpan; + + private root: types.RootSpan; /** * Constructs a new SpanImpl instance. * @param root */ - constructor(root: RootSpan) { + constructor(root: types.RootSpan) { super(); this.root = root; this.logger = this.root.logger || logger.logger(); @@ -58,15 +57,11 @@ export class Span extends SpanBaseModel implements types.Span { {traceId: this.traceId, spanId: this.id, name: this.name}); } - /** Notifies an end operation on span instance. */ - private notifyEnd() { - this.root.onEndSpan(this); - } + /** Ends the span. */ end(): void { super.end(); - this.notifyEnd(); this.logger.debug('ending span %o', { spanId: this.id, traceId: this.traceId, diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index b1a374048..8ef746e23 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -15,20 +15,16 @@ */ import * as cls from '../../internal/cls'; -import {debug} from '../../internal/util'; -import {Sampler} from '../sampler/sampler'; -import {TracerConfig} from '../config/types'; - -import {Config} from '../config/types'; +import * as types from './types'; +import * as samplerTypes from '../sampler/types'; +import * as configTypes from '../config/types'; +import * as loggerTypes from '../../common/types'; +import * as logger from '../../common/console-logger'; import {RootSpan} from './root-span'; import {Span} from './span'; -import {TraceOptions} from './types'; -import {Func, OnEndSpanEventListener} from './types'; -import {Logger} from '../../common/types'; -import * as types from './types'; +import {Sampler} from '../sampler/sampler'; -import * as logger from '../../common/console-logger'; /** * This class represent a tracer. @@ -39,15 +35,15 @@ export class Tracer implements types.Tracer { /** TODO */ private contextManager: cls.Namespace; /** A configuration for starting the tracer */ - private config: TracerConfig; + private config: configTypes.TracerConfig; /** A list of end span event listeners */ - private eventListenersLocal: OnEndSpanEventListener[] = []; + private eventListenersLocal: types.OnEndSpanEventListener[] = []; /** A list of ended root spans */ - private endedTraces: RootSpan[] = []; + private endedTraces: types.RootSpan[] = []; /** A sampler used to make sample decisions */ - sampler: Sampler; + sampler: samplerTypes.Sampler; /** A configuration for starting the tracer */ - logger: Logger = logger.logger(); + logger: loggerTypes.Logger = logger.logger(); /** Constructs a new TraceImpl instance. */ constructor() { @@ -57,12 +53,12 @@ export class Tracer implements types.Tracer { } /** Gets the current root span. */ - get currentRootSpan(): RootSpan { + get currentRootSpan(): types.RootSpan { return this.contextManager.get('rootspan'); } /** Sets the current root span. */ - set currentRootSpan(root: RootSpan) { + set currentRootSpan(root: types.RootSpan) { this.contextManager.set('rootspan', root); } @@ -70,7 +66,7 @@ export class Tracer implements types.Tracer { * Starts a tracer. * @param config A tracer configuration object to start a tracer. */ - start(config: TracerConfig): Tracer { + start(config: configTypes.TracerConfig): types.Tracer { this.activeLocal = true; this.config = config; this.logger = this.config.logger || logger.logger(); @@ -79,7 +75,7 @@ export class Tracer implements types.Tracer { } /** Gets the list of event listners. */ - get eventListeners(): OnEndSpanEventListener[] { + get eventListeners(): types.OnEndSpanEventListener[] { return this.eventListenersLocal; } @@ -98,7 +94,7 @@ export class Tracer implements types.Tracer { * @param options A TraceOptions object to start a root span. * @param fn A callback function to run after starting a root span. */ - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T { + startRootSpan(options: types.TraceOptions, fn: (root: types.RootSpan) => T): T { return this.contextManager.runAndReturn((root) => { let newRoot = null; if (this.active) { @@ -119,7 +115,7 @@ export class Tracer implements types.Tracer { * Is called when a span is ended. * @param root The ended span. */ - onEndSpan(root: RootSpan): void { + onEndSpan(root: types.RootSpan): void { if (!root) { return this.logger.debug('cannot end trace - no active trace found'); } @@ -134,11 +130,11 @@ export class Tracer implements types.Tracer { * Registers an end span event listener. * @param listener The listener to register. */ - registerEndSpanListener(listner: OnEndSpanEventListener) { + registerEndSpanListener(listner: types.OnEndSpanEventListener) { this.eventListenersLocal.push(listner); } - private notifyEndSpan(root: RootSpan) { + private notifyEndSpan(root: types.RootSpan) { if (this.active) { this.logger.debug('starting to notify listeners the end of rootspans'); if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { @@ -162,8 +158,8 @@ export class Tracer implements types.Tracer { * @param type The span type. * @param parentSpanId The parent span ID. */ - startSpan(name?: string, type?: string, parentSpanId?: string): Span { - let newSpan: Span = null; + startSpan(name?: string, type?: string, parentSpanId?: string): types.Span { + let newSpan: types.Span = null; if (!this.currentRootSpan) { this.logger.debug('no current trace found - must start a new root span first'); } else { @@ -176,7 +172,7 @@ export class Tracer implements types.Tracer { * Wraps a function. * @param fn Function to wrap. */ - wrap(fn: Func): Func { + wrap(fn: types.Func): types.Func { if (!this.active) { return fn; } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index d6292333a..8ab216cbe 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import {Config, TracerConfig} from '../config/types'; -import {Sampler} from '../sampler/types'; -import {Logger} from '../../common/types'; +import * as configTypes from '../config/types'; +import * as samplerTypes from '../sampler/types'; +import * as loggerTypes from '../../common/types'; /** Default type for functions */ @@ -84,7 +84,7 @@ export interface TraceContext { /** Defines an end span event listener */ export interface OnEndSpanEventListener { /** Happens when a span is ended */ - onEndSpan(span: Span): void; + onEndSpan(span: RootSpan): void; } /** Interface for Span */ @@ -105,7 +105,7 @@ export interface Span { type: string; /** An object to log information to */ - logger: Logger; + logger: loggerTypes.Logger; /** A final status for this span */ status: number; @@ -197,7 +197,7 @@ export interface Span { } /** Interface for RootSpan */ -export interface RootSpan extends Span, OnEndSpanEventListener { +export interface RootSpan extends Span { /** Get the span list from RootSpan instance */ readonly spans: Span[]; @@ -213,15 +213,15 @@ export interface RootSpan extends Span, OnEndSpanEventListener { /** Interface for Tracer */ -export interface Tracer { +export interface Tracer extends OnEndSpanEventListener { /** Get and set the currentRootSpan to tracer instance */ currentRootSpan: RootSpan; /** A sampler that will decide if the span will be sampled or not */ - sampler: Sampler; + sampler: samplerTypes.Sampler; /** A configuration for starting the tracer */ - logger: Logger; + logger: loggerTypes.Logger; /** Get the eventListeners from tracer instance */ readonly eventListeners: OnEndSpanEventListener[]; @@ -234,7 +234,7 @@ export interface Tracer { * @param config Configuration for tracer instace * @returns A tracer instance started */ - start(config: TracerConfig): Tracer; + start(config: configTypes.TracerConfig): Tracer; /** Stop the tracer instance */ stop(): void; @@ -247,12 +247,6 @@ export interface Tracer { */ startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; - /** - * Event called on the span end - * @param root The RootSpan that was ended - */ - onEndSpan(root: RootSpan): void; - /** * Register a OnEndSpanEventListener on the tracer instance * @param listener An OnEndSpanEventListener instance diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index c3ede4fc6..405e02cdd 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {debug, randomSpanId} from '../../internal/util'; +import {randomSpanId} from '../../internal/util'; import * as types from './types'; const MIN_NUMBER = 1e-4; diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 4991120f2..de27ce8fe 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -14,26 +14,26 @@ * limitations under the License. */ -import {Tracer} from './model/types'; -import {Sampler} from './sampler/types'; -import {Exporter} from '../exporters/types'; -import {Config} from './config/types'; +import * as modelTypes from './model/types'; +import * as samplerTypes from './sampler/types'; +import * as configTypes from './config/types'; +import * as exportersTypes from '../exporters/types'; /** Main interface for tracing. */ export interface Tracing { /** Object responsible for managing a trace. */ - readonly tracer: Tracer; + readonly tracer: modelTypes.Tracer; /** Service to send collected traces to. */ - readonly exporter: Exporter; + readonly exporter: exportersTypes.Exporter; /** * Enables the tracing process. * @param userConfig A configuration object. * @returns The tracing object. */ - start(userConfig?: Config): Tracing; + start(userConfig?: configTypes.Config): Tracing; /** Stops tracing. */ stop(): void; @@ -43,6 +43,6 @@ export interface Tracing { * @param exporter The exporter to send the traces to. * @returns The tracing object. */ - registerExporter(exporter: Exporter): Tracing; + registerExporter(exporter: exportersTypes.Exporter): Tracing; } diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 5704ad89f..accd397a4 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -17,7 +17,6 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -// import * as logger from '../src/common/console-logger'; import * as logger from '../src/common/console-logger'; import {Logger} from '../src/common/types'; diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 7500b8c70..5082ed7d1 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -27,7 +27,7 @@ class OnEndSpanClass implements OnEndSpanEventListener { /** Counter for test use */ testCount = 0; /** Happens when a span is ended */ - onEndSpan(span: Span): void { + onEndSpan(span: RootSpan): void { this.testCount++; } } From e7036c8246bfec16850a66a4833bfb2bb278665c Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 24 Apr 2018 21:19:45 -0300 Subject: [PATCH 104/110] style: update Copyright notice --- packages/opencensus-core/src/common/console-logger.ts | 2 +- packages/opencensus-core/src/common/types.ts | 2 +- packages/opencensus-core/src/exporters/buffer.ts | 2 +- packages/opencensus-core/src/exporters/console-exporter.ts | 2 +- packages/opencensus-core/src/exporters/types.ts | 2 +- packages/opencensus-core/src/index-classes.ts | 2 +- packages/opencensus-core/src/index-types.ts | 2 +- packages/opencensus-core/src/index.ts | 2 +- packages/opencensus-core/src/internal/clock.ts | 2 +- packages/opencensus-core/src/internal/cls-ah.ts | 2 +- packages/opencensus-core/src/internal/cls.ts | 2 +- packages/opencensus-core/src/internal/util.ts | 2 +- packages/opencensus-core/src/trace/config/types.ts | 2 +- .../opencensus-core/src/trace/instrumentation/base-plugin.ts | 2 +- packages/opencensus-core/src/trace/instrumentation/types.ts | 2 +- packages/opencensus-core/src/trace/model/root-span.ts | 2 +- packages/opencensus-core/src/trace/model/span-base-model.ts | 2 +- packages/opencensus-core/src/trace/model/span.ts | 2 +- packages/opencensus-core/src/trace/model/tracer.ts | 2 +- packages/opencensus-core/src/trace/model/types.ts | 2 +- packages/opencensus-core/src/trace/sampler/sampler.ts | 2 +- packages/opencensus-core/src/trace/sampler/types.ts | 2 +- packages/opencensus-core/src/trace/types.ts | 2 +- packages/opencensus-core/test/test-buffer.ts | 2 +- packages/opencensus-core/test/test-console-logger.ts | 2 +- packages/opencensus-core/test/test-root-span.ts | 2 +- packages/opencensus-core/test/test-sampler.ts | 2 +- packages/opencensus-core/test/test-span.ts | 2 +- packages/opencensus-core/test/test-tracer.ts | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 147d1b119..4865caa35 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts index 65b39385b..2ec9da97b 100644 --- a/packages/opencensus-core/src/common/types.ts +++ b/packages/opencensus-core/src/common/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/buffer.ts index 2c2a82435..14ad7d226 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/buffer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index bd4d8bc58..6ab94878e 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index f81b951d3..3c12d63c7 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/index-classes.ts b/packages/opencensus-core/src/index-classes.ts index 6af279fc3..3da128eb6 100644 --- a/packages/opencensus-core/src/index-classes.ts +++ b/packages/opencensus-core/src/index-classes.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts index 14143e902..d09fa413a 100644 --- a/packages/opencensus-core/src/index-types.ts +++ b/packages/opencensus-core/src/index-types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts index 82718c3e1..5d9e34ff0 100644 --- a/packages/opencensus-core/src/index.ts +++ b/packages/opencensus-core/src/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index a96feaa37..9f592ec4d 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts index e8f66fd89..adc08030c 100644 --- a/packages/opencensus-core/src/internal/cls-ah.ts +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index 35fcecfd4..e01ed0f57 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts index b98e92cbc..079e9be9b 100644 --- a/packages/opencensus-core/src/internal/util.ts +++ b/packages/opencensus-core/src/internal/util.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index 965cc26df..bfaa35413 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 63a6f10df..4682de43f 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index b26f8a09a..6854cafcf 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 05e8b2b6e..5cd037467 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base-model.ts index 92c6a7c6f..afe895f25 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base-model.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 3d8c36f3f..38c5923da 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 8ef746e23..f52321e25 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 8ab216cbe..de4209f99 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 405e02cdd..08c32f47e 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/sampler/types.ts b/packages/opencensus-core/src/trace/sampler/types.ts index 2924873cc..530fb0a1d 100644 --- a/packages/opencensus-core/src/trace/sampler/types.ts +++ b/packages/opencensus-core/src/trace/sampler/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index de27ce8fe..6d23a9bae 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts index a28ee33d1..4c97ac5bd 100644 --- a/packages/opencensus-core/test/test-buffer.ts +++ b/packages/opencensus-core/test/test-buffer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index accd397a4..470e0cfe5 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index fa8dc2a86..c98f0f79a 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts index cc2497eea..6993a20c0 100644 --- a/packages/opencensus-core/test/test-sampler.ts +++ b/packages/opencensus-core/test/test-sampler.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index 09baa8df9..e9a64207f 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 5082ed7d1..468182580 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google Inc. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 72a97c2228f347550ffa5fa6e25b90528d1cb199 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 24 Apr 2018 21:24:28 -0300 Subject: [PATCH 105/110] refactor: rename class SpanBaseModel to SpanBase and file span-base-model to span-base --- packages/opencensus-core/src/trace/model/root-span.ts | 4 ++-- .../src/trace/model/{span-base-model.ts => span-base.ts} | 2 +- packages/opencensus-core/src/trace/model/span.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename packages/opencensus-core/src/trace/model/{span-base-model.ts => span-base.ts} (99%) diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 5cd037467..86a9df03c 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -18,13 +18,13 @@ import * as uuid from 'uuid'; import * as types from './types'; import * as logger from '../../common/console-logger'; -import {SpanBaseModel} from './span-base-model'; +import {SpanBase} from './span-base'; import {Clock} from '../../internal/clock'; import {Span} from './span'; /** Defines a root span */ -export class RootSpan extends SpanBaseModel implements types.RootSpan { +export class RootSpan extends SpanBase implements types.RootSpan { /** A tracer object */ private tracer: types.Tracer; /** A list of child spans. */ diff --git a/packages/opencensus-core/src/trace/model/span-base-model.ts b/packages/opencensus-core/src/trace/model/span-base.ts similarity index 99% rename from packages/opencensus-core/src/trace/model/span-base-model.ts rename to packages/opencensus-core/src/trace/model/span-base.ts index afe895f25..c73185635 100644 --- a/packages/opencensus-core/src/trace/model/span-base-model.ts +++ b/packages/opencensus-core/src/trace/model/span-base.ts @@ -21,7 +21,7 @@ import {randomSpanId} from '../../internal/util'; /** Defines a base model for spans. */ -export abstract class SpanBaseModel implements types.Span { +export abstract class SpanBase implements types.Span { protected className: string; /** The clock used to mesure the beginning and ending of a span */ private clock: Clock = null; diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 38c5923da..845bb2046 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -17,11 +17,11 @@ import * as types from './types'; import * as logger from '../../common/console-logger'; -import {SpanBaseModel} from './span-base-model'; +import {SpanBase} from './span-base'; /** Defines a Span. */ -export class Span extends SpanBaseModel implements types.Span { +export class Span extends SpanBase implements types.Span { private root: types.RootSpan; From 20fef5c77f69ccd7f3a012b461314cc94f756232 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Wed, 25 Apr 2018 10:28:32 -0300 Subject: [PATCH 106/110] doc: remove doc files unrelated to core --- examples/automatic_instrumentation/README.md | 138 ------------------- examples/automatic_tracing/README.md | 91 ------------ examples/automatic_tracing/stackdriver.js | 25 ---- examples/automatic_tracing/zipkin.js | 26 ---- examples/custom_tracing/README.md | 90 ------------ examples/custom_tracing/stackdriver.js | 53 ------- examples/custom_tracing/zipkin.js | 54 -------- packages/opencensus-core/tsconfig.full.json | 17 --- 8 files changed, 494 deletions(-) delete mode 100644 examples/automatic_instrumentation/README.md delete mode 100644 examples/automatic_tracing/README.md delete mode 100644 examples/automatic_tracing/stackdriver.js delete mode 100644 examples/automatic_tracing/zipkin.js delete mode 100644 examples/custom_tracing/README.md delete mode 100644 examples/custom_tracing/stackdriver.js delete mode 100644 examples/custom_tracing/zipkin.js delete mode 100644 packages/opencensus-core/tsconfig.full.json diff --git a/examples/automatic_instrumentation/README.md b/examples/automatic_instrumentation/README.md deleted file mode 100644 index e8cf8944d..000000000 --- a/examples/automatic_instrumentation/README.md +++ /dev/null @@ -1,138 +0,0 @@ -# OpenCensus Node.js Example - - -Note: This code was tested on the following Node versions: -- v6.10.0 (for console exporter only) -- v9.8.0 (for Stackdriver and Zipkin exporters) - -At this momment the automatic instrumetation is only for apps using http and mongo-db. - -___ - -## Setup - -1. Clone the OpenCensus Node repository https://github.com/census-instrumentation/opencensus-node.git -```bash -git clone https://github.com/census-instrumentation/opencensus-node.git -cd opencensus-node -``` - -2. Switch to branch `dev` with: -```bash -git checkout dev -``` - -3. Install the dependencies with: -```bash -npm install -``` - -4. Compile the TypeScript code into JavaScript with: -``` -node_modules/.bin/tsc -``` - -5. In a different folder, clone the example application to be instrumented (EasyNotes Application) -```bash - git clone https://github.com/callicoder/node-easy-notes-app -``` - -6. Navigate to the application folder and install the dependencies with: -```bash -cd node-easy-notes-app -npm install -``` - -7. Check if the app is running. PS.: a mongodb installation is required -```bash -$ node server.js -Server is listening on port 3000 -Successfully connected to the database -``` - -## Add opencensus instrumentation - -To add opencensus instrumetation, follow the steps below: - -1. Navigate to the `node_modules` folder inside the EasyNotes application and create a link to OpenCensus Node project folder with: -```bash -cd node_modules -ln -s /opencensus-node/build/src opencensus-nodejs -cd .. -``` - -2. Edit server.js and add the following line, as the first line of the file: -```javascript - var tracing = require("opencensus-nodejs").start() - ... - var express = require('express'); -``` - -## Running the Instrumented Application - -Save the file server.js and run the app with debugging option. - -```bash -$ DEBUG=opencensus node server.js -opencensus useAsyncHooks = true +0ms -opencensus patching http@9.8.0 module +75ms -opencensus patching http.Server.prototype.emit function +7ms -.... -Server is listening on port 3000 -Successfully connected to the database -``` -This options uses a default exporter to console. - -To test de api you can use the commands: -```bash -#To insert a note: -curl -X POST http://localhost:3000/notes --data '{"title": "Note 1", "content": "this is the note content"}' -H "Content-Type: application/json" - -#To get notes: -curl http://localhost:3000/notes -``` - -## Exporting to Zipkins - -1. Download Zipkin choosing one of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: -```bash - wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' - java -jar zipkin.jar -``` - -2. Open the `server.js` file in the EasyNotes application and insert this code on top: -```javascript -var tracing = require("opencensus-nodejs") - .addZipkin("http://localhost:9411/api/v2/spans", "easy-notes") - .start() -``` - - -## Exporting to Stackdriver - -1. Make sure you enabled Stackdriver Tracing on Google Cloud Platform. More info at - -2. Enable Application Default Credentials for authentication with: -```bash -export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json -``` -More information at - -3. Open the `server.js` file in the EasyNotes application and insert this code on top: -```javascript -var traceMng = require("opencensus-nodejs") - .addStackdriver("your-project-id") - .start(); -``` - - -## Exporting to multiple Exporters - -It is possible to instrument with more than one code. To achieve this, simply add more than one Exporter in series. - -```javascript -var tracing = require("opencensus-nodejs") - .addZipkin(“http://localhost:9411/api/v2/spans“, "easy-notes") - .addStackdriver("your-project") - .start() -``` diff --git a/examples/automatic_tracing/README.md b/examples/automatic_tracing/README.md deleted file mode 100644 index 8473167eb..000000000 --- a/examples/automatic_tracing/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# OpenCensus Node.js Automatic Tracing - - -Note: This code was tested on the following Node versions: -- v6.10.0 (for console exporter only) -- v9.8.0 (for Stackdriver and Zipkin exporters) - -___ - -In this example we'll build a simple http server that can return `Hello World`. We're also going to instrument it using OpenCensus, to be able to collect traces and send them to different services. - -## OpenCensus Setup - -1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> -```bash -git clone https://github.com/census-instrumentation/opencensus-node.git -``` - -2. Switch to branch `dev` with: -```bash -git checkout dev -``` - -3. Navigate to the OpenCensus Node project folder and install the dependencies with: -```bash -cd opencensus-node -npm install -``` - -4. Compile the TypeScript code into JavaScript with: -``` -node_modules/.bin/tsc -``` - -___ - -## Instrumented Application Setup - -1. Navigate to the `automatic_tracing` folder with: -``` -cd examples/automatic_tracing -``` - -2. Create a folder named `node_modules` and make a symlink inside of it, running the following command: -``` -cd node_modules -ln -s /build/src opencensus-nodejs -``` - -### Using Stackdriver Exporter - -To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: -```bash -export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json -``` - -Open the `stackdriver.js` file and, in the `.addStackdriver()` method, pass your Project ID as follows: -```javascript -var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); -``` - -### Using Zipkin Exporter - -To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: -```bash - wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' - java -jar zipkin.jar -``` - -Open the `zipkin.js` file and , in the `.addZipkin()` method, pass your *URL* and *service name* as follows: -```javascript -var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); -``` - -___ - -## Running the Instrumented Application - -It is possible to run the application both with or without debugging information. To run with debugging information use: -```bash -DEBUG=opencensus node server.js -``` - -To run without debugging information, simply use: -```bash -node server.js -``` - -Go to `http://localhost:8080` to make a request or use a REST Application to do so. - -Now, just go to the service used to send the traces and see the requests you just made. diff --git a/examples/automatic_tracing/stackdriver.js b/examples/automatic_tracing/stackdriver.js deleted file mode 100644 index c77b8663f..000000000 --- a/examples/automatic_tracing/stackdriver.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var fs = require('fs'); -var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); - -var http = require('http'); -http.createServer(function (req, res) { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write('Hello World!'); - res.end(); -}).listen(8080); diff --git a/examples/automatic_tracing/zipkin.js b/examples/automatic_tracing/zipkin.js deleted file mode 100644 index 384d02335..000000000 --- a/examples/automatic_tracing/zipkin.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var fs = require('fs'); -var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); -tracing.start(); - -var http = require('http'); -http.createServer(function (req, res) { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write('Hello World!'); - res.end(); -}).listen(8080); diff --git a/examples/custom_tracing/README.md b/examples/custom_tracing/README.md deleted file mode 100644 index 5a96620ec..000000000 --- a/examples/custom_tracing/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# OpenCensus Node.js Custom Tracing - - -Note: This code was tested on the following Node versions: -- v6.10.0 (for console exporter only) -- v9.8.0 (for Stackdriver and Zipkin exporters) - -___ - -In these example we're going to build custom spans for `GET` requests and file writing operations and send them to different services. - -## OpenCensus Setup - -1. Clone the OpenCensus Node repository < https://github.com/census-instrumentation/opencensus-node.git> -```bash -git clone https://github.com/census-instrumentation/opencensus-node.git -``` - -2. Switch to branch `dev` with: -```bash -git checkout dev -``` - -3. Navigate to the OpenCensus Node project folder and install the dependencies with: -```bash -cd opencensus-node -npm install -``` - -4. Compile the TypeScript code into JavaScript with: -``` -node_modules/.bin/tsc -``` - -___ - -## Instrumented Application Setup - -1. Navigate to the `automatic_tracing` folder with: -``` -cd examples/automatic_tracing -``` - -2. Create a folder named `node_modules` and make a symlink inside of it, running the following command: -``` -cd node_modules -ln -s /build/src opencensus-nodejs -``` - - -### Using Stackdriver Exporter - -To use Stackdriver as your exporter, make sure you have enabled [Stackdriver Tracing](https://cloud.google.com/trace/docs/quickstart) on Google Cloud Platform. Enable your [Application Default Credentials](https://cloud.google.com/docs/authentication/getting-started) for authentication with: -```bash -export GOOGLE_APPLICATION_CREDENTIALS=path/to/your/credential.json -``` - -Open the `stackdriver.js` file and, in the `.addStackdriver()` method, pass your Project ID as follows: -```javascript -var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); -``` - -### Using Zipkin Exporter - -To use Zipkin as your exporter, first, download from any of the three available options on [Quickstart](https://zipkin.io/pages/quickstart.html): through Docker, on Java or manually compiling the source code. Tests were executed running Zipkin with Java, through the following commands on terminal: -```bash - wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' - java -jar zipkin.jar -``` - -Open the `zipkin.js` file and , in the `.addZipkin()` method, pass your *URL* and *service name* as follows: -```javascript -var tracing = require('opencensus-nodejs').addZipkin('http://localhost:9411/api/v2/spans', 'service_name'); -``` - -___ - -## Running the Instrumented Application - -It is possible to run the application both with or without debugging information. To run with debugging information use: -```bash -DEBUG=opencensus node server.js -``` - -To run without debugging information, simply use: -```bash -node server.js -``` - -Go to the service used to send the traces and see the spans for the operations you just made. diff --git a/examples/custom_tracing/stackdriver.js b/examples/custom_tracing/stackdriver.js deleted file mode 100644 index 0d349dc94..000000000 --- a/examples/custom_tracing/stackdriver.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var opencensus = require('opencensus-nodejs'); -var http = require('http'); -var fs = require('fs'); - -// Register trace exporters to export the collected data. -var tracing = require('opencensus-nodejs').addStackdriver('your-project-id').start(); -var tracer = tracing.Tracer; - -var options = { - name: 'fs.writeFileSync' -}; - -// Create root span for GET request -tracer.startRootSpan(options, (span) => { - http.get('http://httpbin.org/image/jpeg', function (response) { - - var data = []; - - response.on('data', (chunk) => { - data.push(chunk); - }); - - response.on('end', () => { - var filename = 'file'; - // Create a child span for file writing operation - var childSpan = tracer.startSpan(filename); - var buffer = Buffer.concat(data); - fs.writeFileSync(filename + '.jpeg', buffer, 'utf-8'); - - // Finish both root span and child span, since the operations - // has ended. - childSpan.end(); - span.end(); - }); - console.log('No more data in response.'); - }); -}); diff --git a/examples/custom_tracing/zipkin.js b/examples/custom_tracing/zipkin.js deleted file mode 100644 index 3e1cccb56..000000000 --- a/examples/custom_tracing/zipkin.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright 2018 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var opencensus = require('opencensus-nodejs'); -var http = require('http'); -var fs = require('fs'); - -// Register trace exporters to export the collected data. -var tracing = opencensus.addZipkin('http://localhost:9411/api/v2/spans', 'service_name').start(); -var tracer = tracing.Tracer; - -var options = { - name: 'fs.writeFileSync' -}; - -// Create root span for GET request -tracer.startRootSpan(options, (span) => { - http.get('http://httpbin.org/image/jpeg', function (response) { - - var data = []; - - response.on('data', (chunk) => { - data.push(chunk); - }); - - response.on('end', () => { - var filename = 'file'; - // Create a child span for file writing operation - var childSpan = tracer.startSpan(filename); - var buffer = Buffer.concat(data); - fs.writeFileSync(filename + '.jpeg', buffer, 'utf-8'); - - // Finish both root span and child span, since the operations - // has ended. - childSpan.end(); - span.end(); - }); - console.log('No more data in response.'); - }); -}); - diff --git a/packages/opencensus-core/tsconfig.full.json b/packages/opencensus-core/tsconfig.full.json deleted file mode 100644 index 9743ebde5..000000000 --- a/packages/opencensus-core/tsconfig.full.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "./node_modules/gts/tsconfig-google.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "build", - "target": "es6", - "allowUnreachableCode": true, - "noUnusedParameters": false, - "noImplicitAny": false, - "noImplicitThis": false, - "noEmitOnError": false - }, -"include": [ - "src/**/*.ts", - "test/**/*.ts" - ] -} From 618b9d6f3fcd89bf95a2fa568f647b298037dd36 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Wed, 25 Apr 2018 10:57:06 -0300 Subject: [PATCH 107/110] doc: update tracer jsdoc for wrap and wraEmitter --- .../opencensus-core/src/trace/model/tracer.ts | 14 +++++++++---- .../opencensus-core/src/trace/model/types.ts | 21 ++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index f52321e25..d2241e2b5 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -169,8 +169,11 @@ export class Tracer implements types.Tracer { } /** - * Wraps a function. - * @param fn Function to wrap. + * Binds the trace context to the given function. + * This is necessary in order to create child spans correctly in functions + * that are called asynchronously (for example, in a network response + * handler). + * @param fn A function to which to bind the trace context. */ wrap(fn: types.Func): types.Func { if (!this.active) { @@ -183,8 +186,11 @@ export class Tracer implements types.Tracer { } /** - * The wrap emitter. - * @param emitter The emitter. + * Binds the trace context to the given event emitter. + * This is necessary in order to create child spans correctly in event + * handlers. + * @param emitter An event emitter whose handlers should have + * the trace context binded to them. */ wrapEmitter(emitter: NodeJS.EventEmitter): void { if (!this.active) { diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index de4209f99..58aa3a160 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -266,16 +266,23 @@ export interface Tracer extends OnEndSpanEventListener { startSpan(name?: string, type?: string, parentSpanId?: string): Span; /** - * Wraper to contextManager - * @param fn Function that will wrap in contextManager - * @returns The contextManager class wrapped + * Binds the trace context to the given function. + * This is necessary in order to create child spans correctly in functions + * that are called asynchronously (for example, in a network response + * handler). + * @param fn A function to which to bind the trace context. */ wrap(fn: Func): Func; /** - * Wrapper to contextManager emitter - * @param emitter Function that will wrap in contextManager emitter - * @returns The contextManager emitter wrapped + * Binds the trace context to the given event emitter. + * This is necessary in order to create child spans correctly in event + * handlers. + * @param emitter An event emitter whose handlers should have + * the trace context binded to them. */ wrapEmitter(emitter: NodeJS.EventEmitter): void; -} \ No newline at end of file +} + + + From b90d44cc1c089cc764dc3d886fa0b6f7b586c9ed Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Fri, 27 Apr 2018 11:27:09 -0300 Subject: [PATCH 108/110] refactor: changes after PR review --- AUTHORS | 7 +- README.md | 16 +- package.json | 5 +- packages/opencensus-core/AUTHORS | 7 +- packages/opencensus-core/README.md | 10 +- packages/opencensus-core/package-lock.json | 1070 ++++------------- packages/opencensus-core/package.json | 4 +- packages/opencensus-core/scripts/compile.ts | 2 +- .../src/common/console-logger.ts | 54 +- packages/opencensus-core/src/common/types.ts | 5 +- .../src/exporters/console-exporter.ts | 30 +- .../{buffer.ts => exporter-buffer.ts} | 37 +- .../opencensus-core/src/exporters/types.ts | 11 +- packages/opencensus-core/src/index-classes.ts | 2 +- .../opencensus-core/src/internal/clock.ts | 5 +- .../opencensus-core/src/internal/cls-ah.ts | 5 +- packages/opencensus-core/src/internal/cls.ts | 8 +- packages/opencensus-core/src/internal/util.ts | 7 +- .../opencensus-core/src/trace/config/types.ts | 33 +- .../src/trace/instrumentation/base-plugin.ts | 45 +- .../src/trace/instrumentation/types.ts | 21 +- .../src/trace/model/root-span.ts | 22 +- .../src/trace/model/span-base.ts | 16 +- .../opencensus-core/src/trace/model/span.ts | 5 +- .../opencensus-core/src/trace/model/tracer.ts | 85 +- .../opencensus-core/src/trace/model/types.ts | 22 +- .../src/trace/sampler/sampler.ts | 20 +- .../src/trace/sampler/types.ts | 6 +- packages/opencensus-core/src/trace/types.ts | 7 +- packages/opencensus-core/test/test-buffer.ts | 96 -- .../test/test-console-exporter.ts | 30 +- .../test/test-console-logger.ts | 125 +- .../test/test-exporter-buffer.ts | 116 ++ .../opencensus-core/test/test-root-span.ts | 22 +- packages/opencensus-core/test/test-sampler.ts | 91 +- packages/opencensus-core/test/test-span.ts | 18 +- packages/opencensus-core/test/test-tracer.ts | 136 ++- packages/opencensus-core/tsconfig.json | 4 +- 38 files changed, 860 insertions(+), 1345 deletions(-) rename packages/opencensus-core/src/exporters/{buffer.ts => exporter-buffer.ts} (84%) delete mode 100644 packages/opencensus-core/test/test-buffer.ts create mode 100644 packages/opencensus-core/test/test-exporter-buffer.ts diff --git a/AUTHORS b/AUTHORS index e068e731e..3aa6d434a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1 +1,6 @@ -Google Inc. \ No newline at end of file +#CESAR's team (www.cesar.org.br): +Fabio Silva +Djonathas Cardoso +Luana Martins dos Santos +Eduardo Emery +Eldrey Seolin Galindo diff --git a/README.md b/README.md index 9bf553947..1983dec59 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,17 @@ -# OpenCensus Libraries for Node.js +# OpenCensus Core Node.js [![Gitter chat][gitter-image]][gitter-url] -OpenCensus Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. Right now OpenCensus for Node.js supports custom tracing and automatic tracing for http and mongodb. +OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. The library is in alpha stage and the API is subject to change. Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. -Note: This code was tested on the following Node versions: -- v6.10.0 (for console exporter only) -- v9.8.0 (for Stackdriver and Zipkin exporters) - -___ - - +## Useful links +- For more information on OpenCensus, visit: +- To checkout the OpenCensus for Node.js, visit: +- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + diff --git a/package.json b/package.json index dbd3c8834..1a80d1e21 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,12 @@ "version": "0.0.1", "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", "main": "build/src/index.js", - "types": "build/src/index.d.js", + "types": "build/src/index.d.ts", "repository": "census-instrumentation/opencensus-node", "scripts": { "postinstall": "npm run bootstrap;npm run build;", "build": "node_modules/.bin/lerna run build", + "test": "node_modules/.bin/lerna run test", "bootstrap": "node_modules/.bin/lerna bootstrap", "bump": "node_modules/.bin/lerna publish" }, @@ -20,7 +21,7 @@ "author": "Google Inc.", "license": "Apache-2.0", "engines": { - "node": ">=6.00" + "node": ">=6.0" }, "files": [ "build/src/**/*.js", diff --git a/packages/opencensus-core/AUTHORS b/packages/opencensus-core/AUTHORS index e068e731e..3aa6d434a 100644 --- a/packages/opencensus-core/AUTHORS +++ b/packages/opencensus-core/AUTHORS @@ -1 +1,6 @@ -Google Inc. \ No newline at end of file +#CESAR's team (www.cesar.org.br): +Fabio Silva +Djonathas Cardoso +Luana Martins dos Santos +Eduardo Emery +Eldrey Seolin Galindo diff --git a/packages/opencensus-core/README.md b/packages/opencensus-core/README.md index 1775e9e22..675f7e1bf 100644 --- a/packages/opencensus-core/README.md +++ b/packages/opencensus-core/README.md @@ -1,20 +1,12 @@ # OpenCensus Core Node.js [![Gitter chat][gitter-image]][gitter-url] -OpenCensus Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. Right now OpenCensus for Node.js supports custom tracing and automatic tracing for http and mongodb. +OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. The library is in alpha stage and the API is subject to change. -OpenCensus Core allow exporters and plugins to be built on it. To instrument an application, please visit [OpenCensus Node.js](https://github.com/census-instrumentation/opencensus-node) - Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. -Note: This code was tested on the following Node versions: -- v6.10.0 (for console exporter only) -- v9.8.0 (for Stackdriver and Zipkin exporters) - - - ## Useful links - For more information on OpenCensus, visit: - To checkout the OpenCensus for Node.js, visit: diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 976878d9c..91a86ae4c 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,14 +1,11 @@ { - "name": "@opencensus/opencensus-core", - "version": "0.0.1", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@types/continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -16,50 +13,42 @@ "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==", - "dev": true + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" }, "@types/node": { "version": "9.4.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==", - "dev": true + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" }, "@types/shimmer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==", - "dev": true + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", - "dev": true + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" }, "@types/strip-json-comments": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", - "dev": true, "requires": { "@types/node": "9.4.7" } @@ -68,7 +57,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -76,20 +64,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -99,7 +84,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -109,20 +93,17 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "1.9.1" } @@ -131,7 +112,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "1.0.3" } @@ -139,14 +119,12 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "async-listener": { "version": "0.6.9", @@ -166,7 +144,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -176,14 +153,12 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -195,22 +170,19 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -224,26 +196,22 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -253,7 +221,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -264,7 +231,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -273,20 +239,17 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, "requires": { "camelcase": "4.1.0", "map-obj": "2.0.0", @@ -296,22 +259,19 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" } } }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -321,14 +281,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, "requires": { "has-flag": "3.0.0" } @@ -338,14 +296,12 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, "clang-format": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", - "dev": true, "requires": { "async": "1.5.2", "glob": "7.1.2", @@ -355,22 +311,19 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -378,14 +331,12 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -393,26 +344,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "dev": true, "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -426,7 +373,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, "requires": { "is-obj": "1.0.1" } @@ -446,7 +392,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, "requires": { "capture-stack-trace": "1.0.0" } @@ -455,7 +400,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -465,14 +409,12 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -488,14 +430,12 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, "requires": { "decamelize": "1.2.0", "map-obj": "1.0.1" @@ -504,28 +444,24 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" } } }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "emitter-listener": { "version": "1.1.1", @@ -539,7 +475,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -547,26 +482,22 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -581,7 +512,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", @@ -592,7 +522,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "1.0.5" } @@ -601,7 +530,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "2.0.0" } @@ -609,20 +537,17 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -636,7 +561,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, "requires": { "ini": "1.3.5" } @@ -644,20 +568,17 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, "gts": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", - "dev": true, "requires": { "chalk": "2.3.2", "clang-format": "1.2.2", @@ -674,7 +595,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -682,20 +602,17 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, "requires": { "parse-passwd": "1.0.0" } @@ -703,38 +620,32 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -743,20 +654,17 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.2", @@ -777,20 +685,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -800,7 +705,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -818,14 +722,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -834,7 +736,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, "requires": { "global-dirs": "0.1.1", "is-path-inside": "1.0.1" @@ -843,20 +744,17 @@ "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -864,50 +762,42 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, "requires": { "argparse": "1.0.10", "esprima": "4.0.0" @@ -916,14 +806,12 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", - "dev": true + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, "requires": { "package-json": "4.0.1" } @@ -932,7 +820,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "4.0.0", @@ -944,7 +831,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "1.3.1", "json-parse-better-errors": "1.0.1" @@ -956,7 +842,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -965,8 +850,7 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._arraycopy": { "version": "3.0.0", @@ -1022,7 +906,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -1031,14 +914,12 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -1048,7 +929,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -1056,20 +936,17 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", @@ -1085,22 +962,19 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.11" } @@ -1108,14 +982,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" @@ -1125,7 +997,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1134,7 +1005,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", - "dev": true, "requires": { "browser-stdout": "1.3.1", "commander": "2.11.0", @@ -1156,20 +1026,17 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -1181,7 +1048,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -1190,7 +1056,6 @@ "version": "11.6.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", - "dev": true, "requires": { "archy": "1.0.0", "arrify": "1.0.1", @@ -1224,7 +1089,6 @@ "align-text": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2", "longest": "1.0.1", @@ -1233,79 +1097,65 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-styles": { "version": "2.2.1", - "bundled": true, - "dev": true + "bundled": true }, "append-transform": { "version": "0.4.0", "bundled": true, - "dev": true, "requires": { "default-require-extensions": "1.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-diff": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "arr-flatten": "1.1.0" } }, "arr-flatten": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "arr-union": { "version": "3.1.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "arrify": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "assign-symbols": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "async": { "version": "1.5.2", - "bundled": true, - "dev": true + "bundled": true }, "atob": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "babel-code-frame": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -1315,7 +1165,6 @@ "babel-generator": { "version": "6.26.1", "bundled": true, - "dev": true, "requires": { "babel-messages": "6.23.0", "babel-runtime": "6.26.0", @@ -1330,7 +1179,6 @@ "babel-messages": { "version": "6.23.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0" } @@ -1338,7 +1186,6 @@ "babel-runtime": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "core-js": "2.5.3", "regenerator-runtime": "0.11.1" @@ -1347,7 +1194,6 @@ "babel-template": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0", "babel-traverse": "6.26.0", @@ -1359,7 +1205,6 @@ "babel-traverse": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", @@ -1375,7 +1220,6 @@ "babel-types": { "version": "6.26.0", "bundled": true, - "dev": true, "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", @@ -1385,18 +1229,15 @@ }, "babylon": { "version": "6.18.0", - "bundled": true, - "dev": true + "bundled": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "base": { "version": "0.11.2", "bundled": true, - "dev": true, "requires": { "cache-base": "1.0.1", "class-utils": "0.3.6", @@ -1410,22 +1251,19 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1434,7 +1272,6 @@ "braces": { "version": "1.8.5", "bundled": true, - "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -1443,13 +1280,11 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, - "dev": true + "bundled": true }, "cache-base": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "collection-visit": "1.0.0", "component-emitter": "1.2.1", @@ -1464,15 +1299,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "caching-transform": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "md5-hex": "1.3.0", "mkdirp": "0.5.1", @@ -1482,13 +1315,11 @@ "camelcase": { "version": "1.2.1", "bundled": true, - "dev": true, "optional": true }, "center-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "0.1.4", @@ -1498,7 +1329,6 @@ "chalk": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -1510,7 +1340,6 @@ "class-utils": { "version": "0.3.6", "bundled": true, - "dev": true, "requires": { "arr-union": "3.1.0", "define-property": "0.2.5", @@ -1521,7 +1350,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -1529,7 +1357,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1537,7 +1364,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1547,7 +1373,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1555,7 +1380,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -1565,7 +1389,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -1574,20 +1397,17 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "cliui": { "version": "2.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "center-align": "0.1.3", @@ -1598,20 +1418,17 @@ "wordwrap": { "version": "0.0.2", "bundled": true, - "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "collection-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "map-visit": "1.0.0", "object-visit": "1.0.1" @@ -1619,38 +1436,31 @@ }, "commondir": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "component-emitter": { "version": "1.2.1", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "convert-source-map": { "version": "1.5.1", - "bundled": true, - "dev": true + "bundled": true }, "copy-descriptor": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "core-js": { "version": "2.5.3", - "bundled": true, - "dev": true + "bundled": true }, "cross-spawn": { "version": "4.0.2", "bundled": true, - "dev": true, "requires": { "lru-cache": "4.1.2", "which": "1.3.0" @@ -1659,30 +1469,25 @@ "debug": { "version": "2.6.9", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } }, "debug-log": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "decamelize": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true, - "dev": true + "bundled": true }, "default-require-extensions": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "strip-bom": "2.0.0" } @@ -1690,7 +1495,6 @@ "define-property": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2", "isobject": "3.0.1" @@ -1698,15 +1502,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "detect-indent": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "repeating": "2.0.1" } @@ -1714,25 +1516,21 @@ "error-ex": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "is-arrayish": "0.2.1" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "esutils": { "version": "2.0.2", - "bundled": true, - "dev": true + "bundled": true }, "execa": { "version": "0.7.0", "bundled": true, - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -1746,7 +1544,6 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, - "dev": true, "requires": { "lru-cache": "4.1.2", "shebang-command": "1.2.0", @@ -1758,7 +1555,6 @@ "expand-brackets": { "version": "0.1.5", "bundled": true, - "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -1766,7 +1562,6 @@ "expand-range": { "version": "1.8.2", "bundled": true, - "dev": true, "requires": { "fill-range": "2.2.3" } @@ -1774,7 +1569,6 @@ "extend-shallow": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "assign-symbols": "1.0.0", "is-extendable": "1.0.1" @@ -1783,7 +1577,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -1793,20 +1586,17 @@ "extglob": { "version": "0.3.2", "bundled": true, - "dev": true, "requires": { "is-extglob": "1.0.0" } }, "filename-regex": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "fill-range": { "version": "2.2.3", "bundled": true, - "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -1818,7 +1608,6 @@ "find-cache-dir": { "version": "0.1.1", "bundled": true, - "dev": true, "requires": { "commondir": "1.0.1", "mkdirp": "0.5.1", @@ -1828,20 +1617,17 @@ "find-up": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "locate-path": "2.0.0" } }, "for-in": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "for-own": { "version": "0.1.5", "bundled": true, - "dev": true, "requires": { "for-in": "1.0.2" } @@ -1849,7 +1635,6 @@ "foreground-child": { "version": "1.5.6", "bundled": true, - "dev": true, "requires": { "cross-spawn": "4.0.2", "signal-exit": "3.0.2" @@ -1858,35 +1643,29 @@ "fragment-cache": { "version": "0.2.1", "bundled": true, - "dev": true, "requires": { "map-cache": "0.2.2" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-caller-file": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "get-stream": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-value": { "version": "2.0.6", - "bundled": true, - "dev": true + "bundled": true }, "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1899,7 +1678,6 @@ "glob-base": { "version": "0.3.0", "bundled": true, - "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -1908,25 +1686,21 @@ "glob-parent": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-glob": "2.0.1" } }, "globals": { "version": "9.18.0", - "bundled": true, - "dev": true + "bundled": true }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "dev": true + "bundled": true }, "handlebars": { "version": "4.0.11", "bundled": true, - "dev": true, "requires": { "async": "1.5.2", "optimist": "0.6.1", @@ -1937,7 +1711,6 @@ "source-map": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "amdefine": "1.0.1" } @@ -1947,20 +1720,17 @@ "has-ansi": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "has-flag": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "has-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "1.0.0", @@ -1969,15 +1739,13 @@ "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "has-values": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -1986,7 +1754,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -1994,7 +1761,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2004,7 +1770,6 @@ "kind-of": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2013,18 +1778,15 @@ }, "hosted-git-info": { "version": "2.6.0", - "bundled": true, - "dev": true + "bundled": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -2032,51 +1794,43 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "invariant": { "version": "2.2.3", "bundled": true, - "dev": true, "requires": { "loose-envify": "1.3.1" } }, "invert-kv": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-accessor-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-arrayish": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-buffer": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -2084,22 +1838,19 @@ "is-data-descriptor": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-descriptor": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "1.0.0", "is-data-descriptor": "1.0.0", @@ -2108,51 +1859,43 @@ "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "is-dotfile": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "is-equal-shallow": { "version": "0.1.3", "bundled": true, - "dev": true, "requires": { "is-primitive": "2.0.0" } }, "is-extendable": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-extglob": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-finite": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-glob": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -2160,7 +1903,6 @@ "is-number": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2168,85 +1910,71 @@ "is-odd": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-number": "4.0.0" }, "dependencies": { "is-number": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "is-plain-object": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "is-posix-bracket": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-primitive": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-stream": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "is-utf8": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "is-windows": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isexe": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "isarray": "1.0.0" } }, "istanbul-lib-coverage": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-hook": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "append-transform": "0.4.0" } @@ -2254,7 +1982,6 @@ "istanbul-lib-instrument": { "version": "1.10.1", "bundled": true, - "dev": true, "requires": { "babel-generator": "6.26.1", "babel-template": "6.26.0", @@ -2268,7 +1995,6 @@ "istanbul-lib-report": { "version": "1.1.3", "bundled": true, - "dev": true, "requires": { "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", @@ -2279,7 +2005,6 @@ "supports-color": { "version": "3.2.3", "bundled": true, - "dev": true, "requires": { "has-flag": "1.0.0" } @@ -2289,7 +2014,6 @@ "istanbul-lib-source-maps": { "version": "1.2.3", "bundled": true, - "dev": true, "requires": { "debug": "3.1.0", "istanbul-lib-coverage": "1.2.0", @@ -2301,7 +2025,6 @@ "debug": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "ms": "2.0.0" } @@ -2311,25 +2034,21 @@ "istanbul-reports": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "handlebars": "4.0.11" } }, "js-tokens": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "jsesc": { "version": "1.3.0", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2337,13 +2056,11 @@ "lazy-cache": { "version": "1.0.4", "bundled": true, - "dev": true, "optional": true }, "lcid": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "invert-kv": "1.0.0" } @@ -2351,7 +2068,6 @@ "load-json-file": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", @@ -2363,7 +2079,6 @@ "locate-path": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -2371,25 +2086,21 @@ "dependencies": { "path-exists": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "lodash": { "version": "4.17.5", - "bundled": true, - "dev": true + "bundled": true }, "longest": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "loose-envify": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "js-tokens": "3.0.2" } @@ -2397,7 +2108,6 @@ "lru-cache": { "version": "4.1.2", "bundled": true, - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -2405,13 +2115,11 @@ }, "map-cache": { "version": "0.2.2", - "bundled": true, - "dev": true + "bundled": true }, "map-visit": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "object-visit": "1.0.1" } @@ -2419,20 +2127,17 @@ "md5-hex": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "md5-o-matic": "0.1.1" } }, "md5-o-matic": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "mem": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -2440,22 +2145,19 @@ "merge-source-map": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "source-map": "0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, - "dev": true + "bundled": true } } }, "micromatch": { "version": "2.3.11", "bundled": true, - "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2474,26 +2176,22 @@ }, "mimic-fn": { "version": "1.2.0", - "bundled": true, - "dev": true + "bundled": true }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "mixin-deep": { "version": "1.3.1", "bundled": true, - "dev": true, "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -2502,7 +2200,6 @@ "is-extendable": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "is-plain-object": "2.0.4" } @@ -2512,20 +2209,17 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "nanomatch": { "version": "1.2.9", "bundled": true, - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -2543,25 +2237,21 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "normalize-package-data": { "version": "2.4.0", "bundled": true, - "dev": true, "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", @@ -2572,7 +2262,6 @@ "normalize-path": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -2580,25 +2269,21 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "path-key": "2.0.1" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "object-assign": { "version": "4.1.1", - "bundled": true, - "dev": true + "bundled": true }, "object-copy": { "version": "0.1.0", "bundled": true, - "dev": true, "requires": { "copy-descriptor": "0.1.1", "define-property": "0.2.5", @@ -2608,7 +2293,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -2616,7 +2300,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2624,7 +2307,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2632,7 +2314,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -2641,8 +2322,7 @@ "dependencies": { "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -2651,22 +2331,19 @@ "object-visit": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "object.omit": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" @@ -2675,22 +2352,19 @@ "object.pick": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isobject": "3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -2698,7 +2372,6 @@ "optimist": { "version": "0.6.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8", "wordwrap": "0.0.3" @@ -2706,13 +2379,11 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "os-locale": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "execa": "0.7.0", "lcid": "1.0.0", @@ -2721,13 +2392,11 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "p-limit": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "p-try": "1.0.0" } @@ -2735,20 +2404,17 @@ "p-locate": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-limit": "1.2.0" } }, "p-try": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "parse-glob": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -2759,43 +2425,36 @@ "parse-json": { "version": "2.2.0", "bundled": true, - "dev": true, "requires": { "error-ex": "1.3.1" } }, "pascalcase": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "path-exists": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "pinkie-promise": "2.0.1" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-key": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "path-parse": { "version": "1.0.5", - "bundled": true, - "dev": true + "bundled": true }, "path-type": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "pify": "2.3.0", @@ -2804,18 +2463,15 @@ }, "pify": { "version": "2.3.0", - "bundled": true, - "dev": true + "bundled": true }, "pinkie": { "version": "2.0.4", - "bundled": true, - "dev": true + "bundled": true }, "pinkie-promise": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "pinkie": "2.0.4" } @@ -2823,7 +2479,6 @@ "pkg-dir": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "find-up": "1.1.2" }, @@ -2831,7 +2486,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2841,23 +2495,19 @@ }, "posix-character-classes": { "version": "0.1.1", - "bundled": true, - "dev": true + "bundled": true }, "preserve": { "version": "0.2.0", - "bundled": true, - "dev": true + "bundled": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "randomatic": { "version": "1.1.7", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -2866,7 +2516,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -2874,7 +2523,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2884,7 +2532,6 @@ "kind-of": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -2894,7 +2541,6 @@ "read-pkg": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", @@ -2904,7 +2550,6 @@ "read-pkg-up": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "find-up": "1.1.2", "read-pkg": "1.1.0" @@ -2913,7 +2558,6 @@ "find-up": { "version": "1.1.2", "bundled": true, - "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -2923,13 +2567,11 @@ }, "regenerator-runtime": { "version": "0.11.1", - "bundled": true, - "dev": true + "bundled": true }, "regex-cache": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -2937,7 +2579,6 @@ "regex-not": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "extend-shallow": "3.0.2", "safe-regex": "1.1.0" @@ -2945,56 +2586,46 @@ }, "remove-trailing-separator": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "repeat-element": { "version": "1.1.2", - "bundled": true, - "dev": true + "bundled": true }, "repeat-string": { "version": "1.6.1", - "bundled": true, - "dev": true + "bundled": true }, "repeating": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-finite": "1.0.2" } }, "require-directory": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "resolve-from": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "resolve-url": { "version": "0.2.1", - "bundled": true, - "dev": true + "bundled": true }, "ret": { "version": "0.1.15", - "bundled": true, - "dev": true + "bundled": true }, "right-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "0.1.4" @@ -3003,7 +2634,6 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "requires": { "glob": "7.1.2" } @@ -3011,25 +2641,21 @@ "safe-regex": { "version": "1.1.0", "bundled": true, - "dev": true, "requires": { "ret": "0.1.15" } }, "semver": { "version": "5.5.0", - "bundled": true, - "dev": true + "bundled": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "set-value": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -3040,7 +2666,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3050,30 +2675,25 @@ "shebang-command": { "version": "1.2.0", "bundled": true, - "dev": true, "requires": { "shebang-regex": "1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true }, "slide": { "version": "1.1.6", - "bundled": true, - "dev": true + "bundled": true }, "snapdragon": { "version": "0.8.2", "bundled": true, - "dev": true, "requires": { "base": "0.11.2", "debug": "2.6.9", @@ -3088,7 +2708,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3096,7 +2715,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3104,7 +2722,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3112,7 +2729,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3122,7 +2738,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3130,7 +2745,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3140,7 +2754,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3149,15 +2762,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "snapdragon-node": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "define-property": "1.0.0", "isobject": "3.0.1", @@ -3167,35 +2778,30 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "snapdragon-util": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } }, "source-map": { "version": "0.5.7", - "bundled": true, - "dev": true + "bundled": true }, "source-map-resolve": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "atob": "2.0.3", "decode-uri-component": "0.2.0", @@ -3206,13 +2812,11 @@ }, "source-map-url": { "version": "0.4.0", - "bundled": true, - "dev": true + "bundled": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, - "dev": true, "requires": { "foreground-child": "1.5.6", "mkdirp": "0.5.1", @@ -3225,7 +2829,6 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -3233,13 +2836,11 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, - "dev": true + "bundled": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -3247,13 +2848,11 @@ }, "spdx-license-ids": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "split-string": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "3.0.2" } @@ -3261,7 +2860,6 @@ "static-extend": { "version": "0.1.2", "bundled": true, - "dev": true, "requires": { "define-property": "0.2.5", "object-copy": "0.1.0" @@ -3270,7 +2868,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3278,7 +2875,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3286,7 +2882,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3296,7 +2891,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3304,7 +2898,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3314,7 +2907,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3323,15 +2915,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "string-width": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -3339,13 +2929,11 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -3355,7 +2943,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -3363,25 +2950,21 @@ "strip-bom": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "is-utf8": "0.2.1" } }, "strip-eof": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "supports-color": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "test-exclude": { "version": "4.2.1", "bundled": true, - "dev": true, "requires": { "arrify": "1.0.1", "micromatch": "3.1.9", @@ -3392,18 +2975,15 @@ "dependencies": { "arr-diff": { "version": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "array-unique": { "version": "0.3.2", - "bundled": true, - "dev": true + "bundled": true }, "braces": { "version": "2.3.1", "bundled": true, - "dev": true, "requires": { "arr-flatten": "1.1.0", "array-unique": "0.3.2", @@ -3422,7 +3002,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3430,7 +3009,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3440,7 +3018,6 @@ "expand-brackets": { "version": "2.1.4", "bundled": true, - "dev": true, "requires": { "debug": "2.6.9", "define-property": "0.2.5", @@ -3454,7 +3031,6 @@ "define-property": { "version": "0.2.5", "bundled": true, - "dev": true, "requires": { "is-descriptor": "0.1.6" } @@ -3462,7 +3038,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3470,7 +3045,6 @@ "is-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", "is-data-descriptor": "0.1.4", @@ -3479,15 +3053,13 @@ }, "kind-of": { "version": "5.1.0", - "bundled": true, - "dev": true + "bundled": true } } }, "extglob": { "version": "2.0.4", "bundled": true, - "dev": true, "requires": { "array-unique": "0.3.2", "define-property": "1.0.0", @@ -3502,7 +3074,6 @@ "define-property": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "is-descriptor": "1.0.2" } @@ -3510,7 +3081,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3520,7 +3090,6 @@ "fill-range": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-number": "3.0.0", @@ -3531,7 +3100,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3541,7 +3109,6 @@ "is-accessor-descriptor": { "version": "0.1.6", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3549,7 +3116,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3559,7 +3125,6 @@ "is-data-descriptor": { "version": "0.1.4", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3567,7 +3132,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3577,7 +3141,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3585,7 +3148,6 @@ "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3594,18 +3156,15 @@ }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true }, "micromatch": { "version": "3.1.9", "bundled": true, - "dev": true, "requires": { "arr-diff": "4.0.0", "array-unique": "0.3.2", @@ -3626,13 +3185,11 @@ }, "to-fast-properties": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "to-object-path": { "version": "0.3.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3640,7 +3197,6 @@ "to-regex": { "version": "3.0.2", "bundled": true, - "dev": true, "requires": { "define-property": "2.0.2", "extend-shallow": "3.0.2", @@ -3651,7 +3207,6 @@ "to-regex-range": { "version": "2.1.1", "bundled": true, - "dev": true, "requires": { "is-number": "3.0.0", "repeat-string": "1.6.1" @@ -3660,7 +3215,6 @@ "is-number": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -3669,13 +3223,11 @@ }, "trim-right": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "uglify-js": { "version": "2.8.29", "bundled": true, - "dev": true, "optional": true, "requires": { "source-map": "0.5.7", @@ -3686,7 +3238,6 @@ "yargs": { "version": "3.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "camelcase": "1.2.1", @@ -3700,13 +3251,11 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "union-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "arr-union": "3.1.0", "get-value": "2.0.6", @@ -3717,7 +3266,6 @@ "extend-shallow": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "is-extendable": "0.1.1" } @@ -3725,7 +3273,6 @@ "set-value": { "version": "0.4.3", "bundled": true, - "dev": true, "requires": { "extend-shallow": "2.0.1", "is-extendable": "0.1.1", @@ -3738,7 +3285,6 @@ "unset-value": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "has-value": "0.3.1", "isobject": "3.0.1" @@ -3747,7 +3293,6 @@ "has-value": { "version": "0.3.1", "bundled": true, - "dev": true, "requires": { "get-value": "2.0.6", "has-values": "0.1.4", @@ -3757,7 +3302,6 @@ "isobject": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "isarray": "1.0.0" } @@ -3766,40 +3310,34 @@ }, "has-values": { "version": "0.1.4", - "bundled": true, - "dev": true + "bundled": true }, "isobject": { "version": "3.0.1", - "bundled": true, - "dev": true + "bundled": true } } }, "urix": { "version": "0.1.0", - "bundled": true, - "dev": true + "bundled": true }, "use": { "version": "3.1.0", "bundled": true, - "dev": true, "requires": { "kind-of": "6.0.2" }, "dependencies": { "kind-of": { "version": "6.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, "validate-npm-package-license": { "version": "3.0.3", "bundled": true, - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -3808,31 +3346,26 @@ "which": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "isexe": "2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "window-size": { "version": "0.1.0", "bundled": true, - "dev": true, "optional": true }, "wordwrap": { "version": "0.0.3", - "bundled": true, - "dev": true + "bundled": true }, "wrap-ansi": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" @@ -3841,7 +3374,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -3849,7 +3381,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -3860,13 +3391,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "write-file-atomic": { "version": "1.3.4", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -3875,18 +3404,15 @@ }, "y18n": { "version": "3.2.1", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "2.1.2", - "bundled": true, - "dev": true + "bundled": true }, "yargs": { "version": "11.1.0", "bundled": true, - "dev": true, "requires": { "cliui": "4.0.0", "decamelize": "1.2.0", @@ -3904,18 +3430,15 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true }, "cliui": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "string-width": "2.1.1", "strip-ansi": "4.0.0", @@ -3925,7 +3448,6 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -3933,7 +3455,6 @@ "yargs-parser": { "version": "9.0.2", "bundled": true, - "dev": true, "requires": { "camelcase": "4.1.0" } @@ -3943,15 +3464,13 @@ "yargs-parser": { "version": "8.1.0", "bundled": true, - "dev": true, "requires": { "camelcase": "4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -3961,7 +3480,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -3970,7 +3488,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "1.2.0" } @@ -3978,20 +3495,17 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -4000,7 +3514,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.2.0" } @@ -4008,14 +3521,12 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, "requires": { "got": "6.7.1", "registry-auth-token": "3.3.2", @@ -4027,7 +3538,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, "requires": { "create-error-class": "3.0.2", "duplexer3": "0.1.4", @@ -4045,58 +3555,49 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" } } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -4104,32 +3605,27 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "quick-lru": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, "rc": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -4140,8 +3636,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4149,7 +3644,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, "requires": { "load-json-file": "4.0.0", "normalize-package-data": "2.4.0", @@ -4160,7 +3654,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, "requires": { "find-up": "2.1.0", "read-pkg": "3.0.0" @@ -4170,7 +3663,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, "requires": { "indent-string": "3.2.0", "strip-indent": "2.0.0" @@ -4180,7 +3672,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, "requires": { "rc": "1.2.6", "safe-buffer": "5.1.1" @@ -4190,7 +3681,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, "requires": { "rc": "1.2.6" } @@ -4199,7 +3689,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, "requires": { "path-parse": "1.0.5" } @@ -4208,7 +3697,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -4218,7 +3706,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "7.1.2" } @@ -4227,7 +3714,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "2.1.0" } @@ -4235,14 +3721,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "4.0.8" } @@ -4250,8 +3734,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.5.0", @@ -4262,7 +3745,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, "requires": { "semver": "5.5.0" } @@ -4271,7 +3753,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -4279,8 +3760,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shimmer": { "version": "1.2.0", @@ -4290,14 +3770,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "source-map-support": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", - "dev": true, "requires": { "source-map": "0.6.1" }, @@ -4305,8 +3783,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -4314,7 +3791,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.0" @@ -4323,14 +3799,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "2.1.0", "spdx-license-ids": "3.0.0" @@ -4339,20 +3813,17 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -4360,32 +3831,27 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -4394,7 +3860,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, "requires": { "execa": "0.7.0" } @@ -4402,14 +3867,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "1.0.2" } @@ -4417,14 +3880,12 @@ "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "ts-node": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", - "dev": true, "requires": { "arrify": "1.0.1", "chalk": "2.3.2", @@ -4441,8 +3902,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4450,7 +3910,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, "requires": { "@types/strip-bom": "3.0.0", "@types/strip-json-comments": "0.0.30", @@ -4461,14 +3920,12 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, "tslint": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", - "dev": true, "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", @@ -4487,8 +3944,7 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" } } }, @@ -4496,7 +3952,6 @@ "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", - "dev": true, "requires": { "tslib": "1.9.0" } @@ -4504,14 +3959,12 @@ "typescript": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, "requires": { "crypto-random-string": "1.0.0" } @@ -4520,7 +3973,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "dev": true, "requires": { "boxen": "1.3.0", "chalk": "2.3.2", @@ -4537,7 +3989,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, "requires": { "prepend-http": "1.0.4" } @@ -4551,7 +4002,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", - "dev": true, "requires": { "homedir-polyfill": "1.0.1" } @@ -4560,7 +4010,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "3.0.0", "spdx-expression-parse": "3.0.0" @@ -4570,7 +4019,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -4579,7 +4027,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "dev": true, "requires": { "string-width": "2.1.1" }, @@ -4587,20 +4034,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -4610,7 +4054,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" } @@ -4620,14 +4063,12 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -4637,20 +4078,17 @@ "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index e8df2b911..f0266ed1d 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", "main": "build/src/index.js", - "types": "build/src/index.d.js", + "types": "build/src/index.d.ts", "repository": "census-instrumentation/opencensus-node", "scripts": { "build": "node_modules/.bin/tsc --declaration", @@ -25,7 +25,7 @@ "author": "Google Inc.", "license": "Apache-2.0", "engines": { - "node": ">=6.00" + "node": ">=6.0" }, "files": [ "build/src/**/*.js", diff --git a/packages/opencensus-core/scripts/compile.ts b/packages/opencensus-core/scripts/compile.ts index b41246343..da139552f 100644 --- a/packages/opencensus-core/scripts/compile.ts +++ b/packages/opencensus-core/scripts/compile.ts @@ -11,7 +11,7 @@ export interface CompileOptions { export async function compile(options: CompileOptions) { let { strict, languageLevel } = options; if (languageLevel === 'auto') { - languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es6' : 'es5'; + languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es2017' : 'es2015'; } await forkP(`node_modules/.bin/tsc`, [ '-p', diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 4865caa35..5bce87103 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -14,18 +14,21 @@ * limitations under the License. */ +import * as util from 'util'; + import * as types from './types'; const logDriver = require('log-driver'); /** - * This class represente a console-logger + * This class implements a console logger. */ -class ConsoleLogger implements types.Logger { +export class ConsoleLogger implements types.Logger { // tslint:disable:no-any - private logger: any; - static LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; + private logger: any; + static LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; + level: string; /** * Constructs a new ConsoleLogger instance @@ -38,11 +41,9 @@ class ConsoleLogger implements types.Logger { } else { opt = options || {}; } - - this.logger = logDriver({ - levels: ConsoleLogger.LEVELS, - level: opt.level || 'silly' - }); + this.level = opt.level; + this.logger = + logDriver({levels: ConsoleLogger.LEVELS, level: opt.level || 'silent'}); } /** @@ -52,7 +53,7 @@ class ConsoleLogger implements types.Logger { */ // tslint:disable:no-any error(message: any, ...args: any[]): void { - this.logger.error(arguments); + this.logger.error(util.format(message, ...args)); } /** @@ -62,7 +63,7 @@ class ConsoleLogger implements types.Logger { */ // tslint:disable:no-any warn(message: any, ...args: any[]): void { - this.logger.warn(arguments); + this.logger.warn(util.format(message, ...args)); } /** @@ -72,7 +73,7 @@ class ConsoleLogger implements types.Logger { */ // tslint:disable:no-any info(message: any, ...args: any[]): void { - this.logger.info(arguments); + this.logger.info(util.format(message, ...args)); } /** @@ -82,7 +83,7 @@ class ConsoleLogger implements types.Logger { */ // tslint:disable:no-any debug(message: any, ...args: any[]): void { - this.logger.debug(arguments); + this.logger.debug(util.format(message, ...args)); } /** @@ -92,22 +93,31 @@ class ConsoleLogger implements types.Logger { */ // tslint:disable:no-any silly(message: any, ...args: any[]): void { - this.logger.silly(arguments); + this.logger.silly(util.format(message, ...args)); } } -let defaultLogger = null; /** * Function logger exported to others classes. * @param options A logger options or strig to logger in console */ -const logger = (options?: types.LoggerOptions|string) => { - defaultLogger = new ConsoleLogger(options); - logger['logger'] = defaultLogger; - return defaultLogger; -}; +const logger = (options?: types.LoggerOptions|string|number) => { + let opt: types.LoggerOptions|string; + if (typeof options === 'number') { + if (options < 0) { + options = 0; + } else if (options > ConsoleLogger.LEVELS.length) { + options = ConsoleLogger.LEVELS.length - 1; + } + opt = {level: ConsoleLogger.LEVELS[options]}; + } else { + opt = options; + } -logger(); + const aLogger = new ConsoleLogger(opt); + logger['logger'] = aLogger; + return aLogger; +}; -export{logger}; \ No newline at end of file +export {logger}; diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts index 2ec9da97b..5eb987e04 100644 --- a/packages/opencensus-core/src/common/types.ts +++ b/packages/opencensus-core/src/common/types.ts @@ -27,7 +27,4 @@ export interface Logger { } /** Defines an logger options interface. */ -export interface LoggerOptions { - level?: string; - tag?: string; -} +export interface LoggerOptions { level?: string; } diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts index 6ab94878e..9c1f17f5c 100644 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import * as types from './types'; -import * as modelTypes from '../trace/model/types'; import * as loggerTypes from '../common/types'; +import * as modelTypes from '../trace/model/types'; -import {Buffer} from './buffer'; +import {ExporterBuffer} from './exporter-buffer'; +import * as types from './types'; /** Do not send span data */ export class NoopExporter implements types.Exporter { @@ -30,8 +30,8 @@ export class NoopExporter implements types.Exporter { /** Format and sends span data to the console. */ export class ConsoleExporter implements types.Exporter { /** Buffer object to store the spans. */ - private buffer: Buffer; - logger: loggerTypes.Logger; + private buffer: ExporterBuffer; + private logger: loggerTypes.Logger; /** * Constructs a new ConsoleLogExporter instance. @@ -39,7 +39,7 @@ export class ConsoleExporter implements types.Exporter { * exporter. */ constructor(config: types.ExporterConfig) { - this.buffer = new Buffer(this, config); + this.buffer = new ExporterBuffer(this, config); this.logger = config.logger; } @@ -57,18 +57,16 @@ export class ConsoleExporter implements types.Exporter { */ publish(rootSpans: modelTypes.RootSpan[]) { rootSpans.map((root) => { - const ROOT_STR: string = (` - RootSpan: {traceId: ${root.traceId}, - spanId: ${root.id}, - name: ${root.name} }`); - const SPANS_STR: string[] = root.spans.map((span) => ` ChildSpan: - {traceId: ${span.traceId}, - spanId: ${span.id}, - name: ${span.name} }`); + const ROOT_STR = `RootSpan: {traceId: ${root.traceId}, spanId: ${ + root.id}, name: ${root.name} }`; + const SPANS_STR: string[] = root.spans.map( + (span) => [`\t\t{spanId: ${span.id}, name: ${span.name}}`].join( + '\n')); const result: string[] = []; - result.push(ROOT_STR); - result.push(`${SPANS_STR.join('')}`); + result.push( + ROOT_STR + '\n\tChildSpans:\n' + + `${SPANS_STR.join('\n')}`); console.log(`${result}`); }); } diff --git a/packages/opencensus-core/src/exporters/buffer.ts b/packages/opencensus-core/src/exporters/exporter-buffer.ts similarity index 84% rename from packages/opencensus-core/src/exporters/buffer.ts rename to packages/opencensus-core/src/exporters/exporter-buffer.ts index 14ad7d226..42e081ba8 100644 --- a/packages/opencensus-core/src/exporters/buffer.ts +++ b/packages/opencensus-core/src/exporters/exporter-buffer.ts @@ -15,15 +15,15 @@ */ import * as uuidv4 from 'uuid/v4'; -import * as types from './types'; -import * as modelTypes from '../trace/model/types'; -import * as configTypes from '../trace/config/types'; -import * as loggerTypes from '../common/types'; import * as logger from '../common/console-logger'; +import * as loggerTypes from '../common/types'; +import * as configTypes from '../trace/config/types'; +import * as modelTypes from '../trace/model/types'; +import * as types from './types'; /** Controls the sending of traces to exporters. */ -export class Buffer { +export class ExporterBuffer { /** The service to send the collected spans. */ private exporter: types.Exporter; /** Maximum size of a buffer. */ @@ -35,9 +35,9 @@ export class Buffer { /** Indicates when the buffer timeout is running */ private bufferTimeoutInProgress = false; /** An object to log information to */ - logger: loggerTypes.Logger; + private logger: loggerTypes.Logger; /** Trace queue of a buffer */ - queue: modelTypes.RootSpan[] = []; + private queue: modelTypes.RootSpan[] = []; /** * Constructs a new Buffer instance. @@ -61,13 +61,20 @@ export class Buffer { return this; } + getBufferSize(): number { + return this.bufferSize; + } + + getQueue(): modelTypes.RootSpan[] { + return this.queue; + } /** - * Add a trace (rootSpan) in the buffer. - * @param trace RootSpan to be added in the buffer. + * Add a rootSpan in the buffer. + * @param root RootSpan to be added in the buffer. */ - addToBuffer(trace: modelTypes.RootSpan) { - this.queue.push(trace); - this.logger.debug('BUFFER: added new trace'); + addToBuffer(root: modelTypes.RootSpan) { + this.queue.push(root); + this.logger.debug('ExporterBuffer: added new rootspan'); if (this.queue.length > this.bufferSize) { this.flush(); @@ -84,13 +91,13 @@ export class Buffer { /** Reset the buffer timeout */ private resetBufferTimeout() { - this.logger.debug('BUFFER: reset timeout'); + this.logger.debug('ExporterBuffer: reset timeout'); this.resetTimeout = true; } /** Start the buffer timeout, when finished calls flush method */ private setBufferTimeout() { - this.logger.debug('BUFFER: set timerout'); + this.logger.debug('ExporterBuffer: set timeout'); this.bufferTimeoutInProgress = true; setTimeout(() => { @@ -114,4 +121,4 @@ export class Buffer { this.queue = []; return this; } -} \ No newline at end of file +} diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts index 3c12d63c7..7974402ce 100644 --- a/packages/opencensus-core/src/exporters/types.ts +++ b/packages/opencensus-core/src/exporters/types.ts @@ -15,20 +15,17 @@ */ -import * as modelTypes from '../trace/model/types'; -import * as configTypes from '../trace/config/types'; import * as loggerTypes from '../common/types'; +import * as configTypes from '../trace/config/types'; +import * as modelTypes from '../trace/model/types'; /** Defines an exporter interface. */ export interface Exporter extends modelTypes.OnEndSpanEventListener { - /** An object to log information to */ - logger: loggerTypes.Logger; - /** * Sends a list of root spans to the service. * @param rootSpans A list of root spans to publish. */ - publish(rootSpans: modelTypes.RootSpan[]); + publish(rootSpans: modelTypes.RootSpan[]): void; } -export type ExporterConfig = configTypes.BufferConfig; +export type ExporterConfig = configTypes.BufferConfig; diff --git a/packages/opencensus-core/src/index-classes.ts b/packages/opencensus-core/src/index-classes.ts index 3da128eb6..c072bc87f 100644 --- a/packages/opencensus-core/src/index-classes.ts +++ b/packages/opencensus-core/src/index-classes.ts @@ -28,5 +28,5 @@ export * from './trace/sampler/sampler'; export * from './trace/instrumentation/base-plugin'; // console exporter and buffer impls -export * from './exporters/buffer'; +export * from './exporters/exporter-buffer'; export * from './exporters/console-exporter'; diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts index 9f592ec4d..3e80f7270 100644 --- a/packages/opencensus-core/src/internal/clock.ts +++ b/packages/opencensus-core/src/internal/clock.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -/** Defines a Clock. */ + +/** + * The Clock class is used to record the duration and endTime for spans. + */ export class Clock { /** Indicates if the clock is endend. */ private endedLocal = false; diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts index adc08030c..8e273454c 100644 --- a/packages/opencensus-core/src/internal/cls-ah.ts +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,9 @@ * limitations under the License. */ +// Original file from Stackdriver Trace Agent for Node.js +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + import * as asyncHook from 'async_hooks'; import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; import {EventEmitter} from 'events'; diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts index e01ed0f57..15384f2bc 100644 --- a/packages/opencensus-core/src/internal/cls.ts +++ b/packages/opencensus-core/src/internal/cls.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,9 @@ * limitations under the License. */ +// Original file from Stackdriver Trace Agent for Node.js +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + import * as CLS from 'continuation-local-storage'; import * as semver from 'semver'; @@ -30,8 +33,7 @@ import * as Debug from 'debug'; const debug = Debug('opencensus'); debug('useAsyncHooks = %s', useAsyncHooks); -const cls: typeof CLS = - useAsyncHooks ? cls_ah : CLS; +const cls: typeof CLS = useAsyncHooks ? cls_ah : CLS; const TRACE_NAMESPACE = 'opencensus.io'; diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts index 079e9be9b..358727af1 100644 --- a/packages/opencensus-core/src/internal/util.ts +++ b/packages/opencensus-core/src/internal/util.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018, OpenCensus Authors + * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,14 @@ * limitations under the License. */ +// Code snippets from Stackdriver Trace Agent +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + import * as crypto from 'crypto'; // TODO: rethink this snippet aproach -//--- Code snippet from Stackdriver Trace Agent + // Use 6 bytes of randomness only as JS numbers are doubles not 64-bit ints. const SPAN_ID_RANDOM_BYTES = 6; diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts index bfaa35413..12947ebdd 100644 --- a/packages/opencensus-core/src/trace/config/types.ts +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -14,14 +14,17 @@ * limitations under the License. */ - import {Exporter} from '../../exporters/types'; -import {PluginNames} from '../instrumentation/types'; import {Logger} from '../../common/types'; +import {Exporter} from '../../exporters/types'; +import {PluginNames} from '../instrumentation/types'; /** Interface configuration for a buffer. */ export interface BufferConfig { + /** Maximum size of a buffer. */ bufferSize?: number; + /** Max time for a buffer can wait before being sent */ bufferTimeout?: number; + /** A logger object */ logger?: Logger; } @@ -31,19 +34,39 @@ export interface TracerConfig { samplingRate?: number; /** Determines the ignored (or blacklisted) URLs */ ignoreUrls?: Array; - /** A logger object to show infos */ + /** A logger object */ logger?: Logger; } /** Available configuration options. */ export interface TracingConfig { + /** level of logger - 0:disable, 1: error, 2: warn, 3: info, 4: debug */ logLevel?: number; + + /** + * The maximum number of characters reported on a label value. + */ maximumLabelValueSize?: number; + + /** + * A list of trace instrumentations plugins to load. + * Each key is the name of the module to trace, and its + * value is the name of the package which has the plugin + * implementation. + * Ex.: + * plugins: { + * 'http': '@opencensus/opencensus-instrumentation-http', + * 'mongodb-core': '@opencensus/opencensus-instrumentation-mongodb-core', + * ... + * } + * Any user-provided value will be added to the default list. + * It will override any default plugin for the same key. + */ plugins?: PluginNames; + /** An exporter object */ exporter?: Exporter; + /** An instance of a logger */ logger?: Logger; } export type Config = TracingConfig&TracerConfig&BufferConfig; - - diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 4682de43f..7e1412da1 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -14,15 +14,16 @@ * limitations under the License. */ import * as shimmer from 'shimmer'; -import * as types from './types'; import * as modelTypes from '../model/types'; +import * as types from './types'; + +// TODO: improve Jsdoc comments /** This class represent the base to patch plugin. */ export abstract class BasePlugin implements types.Plugin { - - /** The service to send the collected traces */ + /** Exporters from the nodejs module to be instrumented */ // tslint:disable:no-any - protected exporter: any; + protected moduleExporters: any; /** The module name */ protected moduleName: string; /** A tracer object. */ @@ -40,13 +41,14 @@ export abstract class BasePlugin implements types.Plugin { /** * Sets modified plugin to the context. - * @param exporter object module to set on context + * @param moduleExporters object moduleExporters to set as context * @param tracer tracer relating to context * @param version module version description */ // tslint:disable:no-any - protected setPluginContext(exporter: any, tracer: modelTypes.Tracer, version: string) { - this.exporter = exporter; + protected setPluginContext( + moduleExporters: any, tracer: modelTypes.Tracer, version: string) { + this.moduleExporters = moduleExporters; this.tracer = tracer; this.version = version; } @@ -58,7 +60,7 @@ export abstract class BasePlugin implements types.Plugin { * @param wrapper The wrapper. */ protected wrap(nodule, name, wrapper) { - shimmer.wrap(nodule, name, wrapper); + shimmer.wrap(nodule, name, wrapper); } /** @@ -67,7 +69,7 @@ export abstract class BasePlugin implements types.Plugin { * @param name The function name. */ protected unwrap(nodule, name) { - shimmer.unwrap(nodule, name); + shimmer.unwrap(nodule, name); } /** @@ -76,24 +78,29 @@ export abstract class BasePlugin implements types.Plugin { * @param names A list of function names. * @param wrapper The wrapper. */ - protected massWrap(nodule,names, wrapper) { - shimmer.massWrap(nodule, names, wrapper); - } + protected massWrap(nodule, names, wrapper) { + shimmer.massWrap(nodule, names, wrapper); + } /** * Unwraps one or more functions. * @param nodule The module. * @param names The list of function names. */ - protected massUnwrap(nodule,names) { + protected massUnwrap(nodule, names) { shimmer.massUnwrap(nodule, names); - } - + } + + // TODO: review this implementation + // From the perspective of an instrumentation module author, + // that applyUnpatch is abstract makes it seem like patching is optional, + // while unpatching is not. It should be the other way around + // tslint:disable:no-any - applyPatch(exporter: any, tracer: modelTypes.Tracer, version: string): any{ - this.setPluginContext(exporter, tracer, version); + applyPatch(moduleExporters: any, tracer: modelTypes.Tracer, version: string): + any { + this.setPluginContext(moduleExporters, tracer, version); } abstract applyUnpatch(): void; - -} \ No newline at end of file +} diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts index 6854cafcf..b81fe70be 100644 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -14,13 +14,28 @@ * limitations under the License. */ -import {Tracer} from "../model/types"; +import {Tracer} from '../model/types'; /** Interface Plugin to apply patch. */ export interface Plugin { + /** + * Method to apply the instrumentation patch + * @param moduleExporters exporters from the module to patch + * @param tracer a tracer instance + * @param version version of the current instaled module to patch + */ // tslint:disable:no-any - applyPatch(exporter: any, tracer: Tracer, version: string): any; + applyPatch(moduleExporters: any, tracer: Tracer, version: string): any; + /** Method to unpatch the instrumentation */ applyUnpatch(): void; } -export type PluginNames = {[pluginName: string]: string;}; + +/** + * Type PluginNames: each key should be the name of the module to trace, + * and its value should be the name of the package which has the + * plugin implementation. + */ +export type PluginNames = { + [pluginName: string]: string; +}; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts index 86a9df03c..4c73e7e06 100644 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -15,12 +15,13 @@ */ import * as uuid from 'uuid'; -import * as types from './types'; -import * as logger from '../../common/console-logger'; -import {SpanBase} from './span-base'; +import * as logger from '../../common/console-logger'; import {Clock} from '../../internal/clock'; + import {Span} from './span'; +import {SpanBase} from './span-base'; +import * as types from './types'; /** Defines a root span */ @@ -41,14 +42,15 @@ export class RootSpan extends SpanBase implements types.RootSpan { super(); this.tracer = tracer; this.traceIdLocal = - context && context.traceContext && context.traceContext.traceId ? - context.traceContext.traceId : + context && context.spanContext && context.spanContext.traceId ? + context.spanContext.traceId : (uuid.v4().split('-').join('')); this.name = context && context.name ? context.name : 'undefined'; - if (context && context.traceContext) { - this.parentSpanId = context.traceContext.spanId || ''; + if (context && context.spanContext) { + this.parentSpanId = context.spanContext.spanId || ''; } this.spansLocal = []; + this.type = context && context.type ? context.type : null; this.logger = tracer.logger || logger.logger(); } @@ -70,11 +72,12 @@ export class RootSpan extends SpanBase implements types.RootSpan { {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); } + // TODO: review end() behavior if it should throw an error when it is called + // before start() /** Ends a rootspan instance. */ end() { super.end(); - // TODO - Define logic for list of spans for (const span of this.spansLocal) { if (!span.ended && span.started) { span.truncate(); @@ -91,7 +94,8 @@ export class RootSpan extends SpanBase implements types.RootSpan { * @param type Span type. * @param parentSpanId Span parent ID. */ - startSpan(name: string, type: string, parentSpanId?: string) { + startChildSpan(name: string, type: string, parentSpanId?: string): + types.Span { if (this.ended) { this.logger.debug( 'calling %s.startSpan() on ended %s %o', this.className, diff --git a/packages/opencensus-core/src/trace/model/span-base.ts b/packages/opencensus-core/src/trace/model/span-base.ts index c73185635..2e0fcb83e 100644 --- a/packages/opencensus-core/src/trace/model/span-base.ts +++ b/packages/opencensus-core/src/trace/model/span-base.ts @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as types from './types'; - import {Logger} from '../../common/types'; import {Clock} from '../../internal/clock'; import {randomSpanId} from '../../internal/util'; +import * as types from './types'; + /** Defines a base model for spans. */ export abstract class SpanBase implements types.Span { @@ -75,7 +75,7 @@ export abstract class SpanBase implements types.Span { } /** - * Gives a timestap that indicates the span's start time in RFC3339 UTC + * Gives a timestamp that indicates the span's start time in RFC3339 UTC * "Zulu" format. */ get startTime(): Date { @@ -114,12 +114,12 @@ export abstract class SpanBase implements types.Span { } /** Gives the TraceContext of the span. */ - get traceContext(): types.TraceContext { + get spanContext(): types.SpanContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), parentSpanId: this.parentSpanId - } as types.TraceContext; + } as types.SpanContext; } /** @@ -154,7 +154,8 @@ export abstract class SpanBase implements types.Span { * @param attributes A set of attributes on the link. */ addLink( - traceId: string, spanId: string, type: string, attributes?: types.Attributes) { + traceId: string, spanId: string, type: string, + attributes?: types.Attributes) { this.links.push({ 'traceId': traceId, 'spanId': spanId, @@ -209,10 +210,9 @@ export abstract class SpanBase implements types.Span { /** Forces the span to end. */ truncate() { - // TODO: review this.truncated = true; this.end(); this.logger.debug( - 'truncating %s %o', this.className, {id: this.id, name: this.name}); + 'truncating %s %o', this.className, {id: this.id, name: this.name}); } } \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts index 845bb2046..9842b199a 100644 --- a/packages/opencensus-core/src/trace/model/span.ts +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -14,15 +14,14 @@ * limitations under the License. */ -import * as types from './types'; import * as logger from '../../common/console-logger'; import {SpanBase} from './span-base'; +import * as types from './types'; /** Defines a Span. */ export class Span extends SpanBase implements types.Span { - private root: types.RootSpan; /** @@ -41,7 +40,7 @@ export class Span extends SpanBase implements types.Span { } /** Gets trace context of span. */ - get traceContext(): types.TraceContext { + get spanContext(): types.SpanContext { return { traceId: this.traceId.toString(), spanId: this.id.toString(), diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index d2241e2b5..dc2c98d43 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -14,16 +14,16 @@ * limitations under the License. */ +import * as logger from '../../common/console-logger'; +import * as loggerTypes from '../../common/types'; import * as cls from '../../internal/cls'; -import * as types from './types'; -import * as samplerTypes from '../sampler/types'; import * as configTypes from '../config/types'; -import * as loggerTypes from '../../common/types'; -import * as logger from '../../common/console-logger'; +import {Sampler} from '../sampler/sampler'; +import * as samplerTypes from '../sampler/types'; import {RootSpan} from './root-span'; import {Span} from './span'; -import {Sampler} from '../sampler/sampler'; +import * as types from './types'; /** @@ -32,7 +32,7 @@ import {Sampler} from '../sampler/sampler'; export class Tracer implements types.Tracer { /** Indicates if the tracer is active */ private activeLocal: boolean; - /** TODO */ + /** Manage context automatic propagation */ private contextManager: cls.Namespace; /** A configuration for starting the tracer */ private config: configTypes.TracerConfig; @@ -40,11 +40,14 @@ export class Tracer implements types.Tracer { private eventListenersLocal: types.OnEndSpanEventListener[] = []; /** A list of ended root spans */ private endedTraces: types.RootSpan[] = []; + /** Bit to represent whether trace is sampled or not. */ + private readonly IS_SAMPLED = 0x1; /** A sampler used to make sample decisions */ - sampler: samplerTypes.Sampler; + sampler: samplerTypes.Sampler; /** A configuration for starting the tracer */ logger: loggerTypes.Logger = logger.logger(); + /** Constructs a new TraceImpl instance. */ constructor() { this.activeLocal = false; @@ -74,16 +77,17 @@ export class Tracer implements types.Tracer { return this; } + /** Stops the tracer. */ + stop(): types.Tracer { + this.activeLocal = false; + return this; + } + /** Gets the list of event listners. */ get eventListeners(): types.OnEndSpanEventListener[] { return this.eventListenersLocal; } - /** Stops the tracer. */ - stop() { - this.activeLocal = false; - } - /** Indicates if the tracer is active or not. */ get active(): boolean { return this.activeLocal; @@ -94,15 +98,32 @@ export class Tracer implements types.Tracer { * @param options A TraceOptions object to start a root span. * @param fn A callback function to run after starting a root span. */ - startRootSpan(options: types.TraceOptions, fn: (root: types.RootSpan) => T): T { + startRootSpan( + options: types.TraceOptions, fn: (root: types.RootSpan) => T): T { return this.contextManager.runAndReturn((root) => { let newRoot = null; if (this.active) { - newRoot = new RootSpan(this, options); - if (this.sampler.shouldSample(newRoot.traceId)) { - newRoot.start(); - this.currentRootSpan = newRoot; - return fn(newRoot); + let propagatedSample = null; + + // if there is a context propagation, keep the decistion + if (options && options.spanContext) { + if (options.spanContext.options) { + propagatedSample = + ((options.spanContext.options & this.IS_SAMPLED) !== 0); + } + if (!propagatedSample) { + options.spanContext = null; + } + } + const aRoot = new RootSpan(this, options); + const sampleDecisition: boolean = propagatedSample ? + propagatedSample : + this.sampler.shouldSample(aRoot.traceId); + + if (sampleDecisition) { + aRoot.start(); + this.currentRootSpan = aRoot; + newRoot = aRoot; } } else { this.logger.debug('Tracer is inactive, can\'t start new RootSpan'); @@ -116,14 +137,16 @@ export class Tracer implements types.Tracer { * @param root The ended span. */ onEndSpan(root: types.RootSpan): void { - if (!root) { - return this.logger.debug('cannot end trace - no active trace found'); - } - if (this.currentRootSpan !== root) { - this.logger.debug('currentRootSpan != root on notifyEnd. Need more investigation.'); + if (this.active) { + if (!root) { + return this.logger.debug('cannot end trace - no active trace found'); + } + if (this.currentRootSpan !== root) { + this.logger.debug( + 'currentRootSpan != root on notifyEnd. Need more investigation.'); + } + this.notifyEndSpan(root); } - this.notifyEndSpan(root); - // this.clearCurrentTrace(); } /** @@ -158,12 +181,14 @@ export class Tracer implements types.Tracer { * @param type The span type. * @param parentSpanId The parent span ID. */ - startSpan(name?: string, type?: string, parentSpanId?: string): types.Span { + startChildSpan(name?: string, type?: string, parentSpanId?: string): + types.Span { let newSpan: types.Span = null; if (!this.currentRootSpan) { - this.logger.debug('no current trace found - must start a new root span first'); + this.logger.debug( + 'no current trace found - must start a new root span first'); } else { - newSpan = this.currentRootSpan.startSpan(name, type, parentSpanId); + newSpan = this.currentRootSpan.startChildSpan(name, type, parentSpanId); } return newSpan; } @@ -179,8 +204,6 @@ export class Tracer implements types.Tracer { if (!this.active) { return fn; } - - // This is safe because isActive checks the value of this.namespace. const namespace = this.contextManager; return namespace.bind(fn); } @@ -196,8 +219,6 @@ export class Tracer implements types.Tracer { if (!this.active) { return; } - - // This is safe because isActive checks the value of this.namespace. const namespace = this.contextManager; namespace.bindEmitter(emitter); } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index 58aa3a160..d14865153 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -14,9 +14,10 @@ * limitations under the License. */ +import * as loggerTypes from '../../common/types'; import * as configTypes from '../config/types'; import * as samplerTypes from '../sampler/types'; -import * as loggerTypes from '../../common/types'; + /** Default type for functions */ @@ -64,21 +65,19 @@ export interface TraceOptions { /** Root span name */ name: string; /** Trace context */ - traceContext?: TraceContext; + spanContext?: SpanContext; /** Span type */ type?: string; } -/** Defines the trace context */ -export interface TraceContext { +/** Defines the span context */ +export interface SpanContext { /** Trace ID */ traceId: string; /** Span ID */ spanId: string; /** Options */ options?: number; - /** Sample decision */ - sampleDecision?: boolean; } /** Defines an end span event listener */ @@ -150,7 +149,7 @@ export interface Span { readonly duration: number; /** Gives the TraceContext of the span. */ - readonly traceContext: TraceContext; + readonly spanContext: SpanContext; /** * Adds an atribute to the span. @@ -208,7 +207,7 @@ export interface RootSpan extends Span { end(): void; /** Starts a new Span instance in the RootSpan instance */ - startSpan(name: string, type: string, parentSpanId?: string): Span; + startChildSpan(name: string, type: string, parentSpanId?: string): Span; } @@ -237,7 +236,7 @@ export interface Tracer extends OnEndSpanEventListener { start(config: configTypes.TracerConfig): Tracer; /** Stop the tracer instance */ - stop(): void; + stop(): Tracer; /** * Start a new RootSpan to currentRootSpan @@ -263,7 +262,7 @@ export interface Tracer extends OnEndSpanEventListener { * @param parentSpanId Parent SpanId * @returns The new Span instance started */ - startSpan(name?: string, type?: string, parentSpanId?: string): Span; + startChildSpan(name?: string, type?: string, parentSpanId?: string): Span; /** * Binds the trace context to the given function. @@ -283,6 +282,3 @@ export interface Tracer extends OnEndSpanEventListener { */ wrapEmitter(emitter: NodeJS.EventEmitter): void; } - - - diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts index 08c32f47e..91ed245c4 100644 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -17,15 +17,18 @@ import {randomSpanId} from '../../internal/util'; import * as types from './types'; -const MIN_NUMBER = 1e-4; -const MAX_NUMBER = 0xffffffffffffffff; + +const MIN_NUMBER = Number.MIN_VALUE; +const MAX_NUMBER = Number.MAX_VALUE; + /** This class represent the probability of a tracer. */ export class Sampler implements types.Sampler { private idUpperBound: number; + description: string; /** - * Constructs a new SamplerImpl instance. + * Constructs a new Sampler instance. */ constructor() {} @@ -34,6 +37,7 @@ export class Sampler implements types.Sampler { * @returns a Sampler object */ always(): Sampler { + this.description = 'always'; this.idUpperBound = MAX_NUMBER; return this; } @@ -43,6 +47,7 @@ export class Sampler implements types.Sampler { * @returns a Sampler object */ never(): Sampler { + this.description = 'never'; this.idUpperBound = MIN_NUMBER; return this; } @@ -54,12 +59,13 @@ export class Sampler implements types.Sampler { * @param probability probability between 0 and 1 * @returns a Sampler object */ - probability(probability?: number): Sampler { - if (probability == null || probability > MAX_NUMBER) { + probability(probability: number): Sampler { + if (probability >= 1.0) { return this.always(); - } else if (probability < MIN_NUMBER) { + } else if (probability <= 0) { return this.never(); } + this.description = `probability.(${probability})`; this.idUpperBound = probability * MAX_NUMBER; return this; } @@ -71,7 +77,7 @@ export class Sampler implements types.Sampler { * False if the traceId is not in probability. */ shouldSample(traceId: string): boolean { - const LOWER_BYTES = traceId?traceId.substring(16):'0'; + const LOWER_BYTES = traceId ? traceId.substring(16) : '0'; // tslint:disable-next-line:ban Needed to parse hexadecimal. const LOWER_LONG = parseInt(LOWER_BYTES, 16); diff --git a/packages/opencensus-core/src/trace/sampler/types.ts b/packages/opencensus-core/src/trace/sampler/types.ts index 530fb0a1d..4942aa4dc 100644 --- a/packages/opencensus-core/src/trace/sampler/types.ts +++ b/packages/opencensus-core/src/trace/sampler/types.ts @@ -14,12 +14,16 @@ * limitations under the License. */ +import {Logger} from '../../common/types'; import {Exporter} from '../../exporters/types'; import {PluginNames} from '../instrumentation/types'; -import {Logger} from '../../common/types'; /** This interface represent the probability of a tracer. */ export interface Sampler { + /** + * A Sampler description name + */ + description: string; /** * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. * @returns a Sampler object. diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts index 6d23a9bae..77f1bb864 100644 --- a/packages/opencensus-core/src/trace/types.ts +++ b/packages/opencensus-core/src/trace/types.ts @@ -14,14 +14,14 @@ * limitations under the License. */ +import * as exportersTypes from '../exporters/types'; + +import * as configTypes from './config/types'; import * as modelTypes from './model/types'; import * as samplerTypes from './sampler/types'; -import * as configTypes from './config/types'; -import * as exportersTypes from '../exporters/types'; /** Main interface for tracing. */ export interface Tracing { - /** Object responsible for managing a trace. */ readonly tracer: modelTypes.Tracer; @@ -45,4 +45,3 @@ export interface Tracing { */ registerExporter(exporter: exportersTypes.Exporter): Tracing; } - diff --git a/packages/opencensus-core/test/test-buffer.ts b/packages/opencensus-core/test/test-buffer.ts deleted file mode 100644 index 4c97ac5bd..000000000 --- a/packages/opencensus-core/test/test-buffer.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import {Buffer} from '../src/exporters/buffer'; -import {NoopExporter} from '../src/exporters/console-exporter'; -import {RootSpan} from '../src/trace/model/root-span'; -import {Tracer} from '../src/trace/model/tracer'; - -const exporter = new NoopExporter(); -const DEFAULT_BUFFER_SIZE = 3; -const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds -const tracer = new Tracer(); - -const defaultBufferConfig = { - bufferSize: DEFAULT_BUFFER_SIZE, - bufferTimeout: DEFAULT_BUFFER_TIMEOUT -}; - -describe('Buffer', () => { - /** - * Should create a Buffer with exporter, DEFAULT_BUFFER_SIZE and - * DEFAULT_BUFFER_TIMEOUT - */ - describe('new Buffer()', () => { - it('should create a Buffer instance', () => { - const buffer = new Buffer(exporter, defaultBufferConfig); - assert.ok(buffer instanceof Buffer); - }); - }); - - /** - * Should return the Buffer - */ - describe('setBufferSize', () => { - it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter, defaultBufferConfig); - const bufferResize = buffer.setBufferSize(DEFAULT_BUFFER_SIZE); - assert.ok(bufferResize instanceof Buffer); - }); - }); - - /** - * Should return the Buffer with rootspan - */ - describe('addToBuffer', () => { - it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter, defaultBufferConfig); - const rootSpan = new RootSpan(tracer); - const bufferAdd = buffer.addToBuffer(rootSpan); - assert.ok(bufferAdd instanceof Buffer); - }); - }); - - /** - * Should return the Buffer without rootspan - */ - describe('addToBuffer force flush ', () => { - it('should return the Buffer instance', () => { - const buffer = new Buffer(exporter, defaultBufferConfig); - const bufferResize = buffer.setBufferSize(0); - const rootSpan = new RootSpan(tracer); - const bufferAdd = bufferResize.addToBuffer(rootSpan); - assert.ok(bufferAdd instanceof Buffer); - }); - }); - - /** - * Should return the Buffer without rootspan - */ - describe('addToBuffer force flush by timeout ', () => { - it('should return the Buffer instance', () => { - const buffer = new Buffer( - exporter, {bufferSize: DEFAULT_BUFFER_SIZE, bufferTimeout: 0}); - const rootSpan = new RootSpan(tracer); - let bufferAdd = buffer.addToBuffer(rootSpan); - bufferAdd = buffer.addToBuffer(rootSpan); - assert.ok(bufferAdd instanceof Buffer); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts index fff8ca862..22b81b9b6 100644 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -17,12 +17,12 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; -import {Buffer} from '../src/exporters/buffer'; import {ConsoleExporter, NoopExporter} from '../src/exporters/console-exporter'; +import {ExporterBuffer} from '../src/exporters/exporter-buffer'; import {RootSpan} from '../src/trace/model/root-span'; import {Tracer} from '../src/trace/model/tracer'; -const tracer = new Tracer(); +const tracer = new Tracer().start({}); const DEFAULT_BUFFER_SIZE = 3; const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds const defaultBufferConfig = { @@ -30,8 +30,22 @@ const defaultBufferConfig = { bufferTimeout: DEFAULT_BUFFER_TIMEOUT }; +const createRootSpans = (): RootSpan[] => { + const rootSpans = []; + for (let i = 0; i < DEFAULT_BUFFER_SIZE + 1; i++) { + const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); + rootSpan.start(); + for (let j = 0; j < 10; j++) { + rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); + } + rootSpans.push(rootSpan); + } + return rootSpans; +}; + + describe('NoopExporter', () => { - /** Should do anything when calling onEndSpan() */ + /** Should do nothing when calling onEndSpan() */ describe('onEndSpan()', () => { it('should do anything', () => { const exporter = new NoopExporter(); @@ -60,8 +74,12 @@ describe('ConsoleLogExporter', () => { describe('onEndSpan()', () => { it('should end a span', () => { const exporter = new ConsoleExporter(defaultBufferConfig); - const rootSpan = new RootSpan(tracer); - exporter.onEndSpan(rootSpan); + tracer.registerEndSpanListener(exporter); + // const rootSpan = new RootSpan(tracer); + const rootSpans = createRootSpans(); + for (const rootSpan of rootSpans) { + rootSpan.end(); + } assert.ok(true); }); }); @@ -71,7 +89,7 @@ describe('ConsoleLogExporter', () => { it('should publish the rootspans in queue', () => { const exporter = new ConsoleExporter(defaultBufferConfig); const rootSpan = new RootSpan(tracer); - rootSpan.startSpan('name', 'type', rootSpan.traceId); + rootSpan.startChildSpan('name', 'type', rootSpan.traceId); const queue: RootSpan[] = []; queue.push(rootSpan); diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 470e0cfe5..013a8a1c5 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -18,18 +18,21 @@ import * as assert from 'assert'; import * as mocha from 'mocha'; import * as logger from '../src/common/console-logger'; - +import {ConsoleLogger} from '../src/common/console-logger'; import {Logger} from '../src/common/types'; -import {Buffer} from '../src/exporters/buffer'; import {ConsoleExporter} from '../src/exporters/console-exporter'; +import {ExporterBuffer} from '../src/exporters/exporter-buffer'; import {BufferConfig, TracerConfig} from '../src/trace/config/types'; import {RootSpan} from '../src/trace/model/root-span'; import {Tracer} from '../src/trace/model/tracer'; import {TraceOptions} from '../src/trace/model/types'; -const LEVELS = ['error', 'warn', 'info', 'debug', 'silly']; +const LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; let consoleTxt = ''; +// TODO: Review test cases: Maybe testing the info log level is sufficient +// because it already shows that lower levels will log, and higher levels won't. + describe('ConsoleLogger', () => { const intercept = require('intercept-stdout'); const unhookIntercept = intercept((txt) => { @@ -39,22 +42,22 @@ describe('ConsoleLogger', () => { /** Should create a new ConsoleLogger */ describe('new ConsoleLogger()', () => { - it('should consoleLogger with default levels', () => { + it('should log with default levels', () => { const consoleLogger = logger.logger(); - assert.equal(LEVELS.length, consoleLogger.logger.levels.length); + assert.equal(LEVELS.length, ConsoleLogger.LEVELS.length); }); - it('should consoleLogger with error', () => { - const consoleLogger = logger.logger(LEVELS[0]); - assert.strictEqual(LEVELS[0], consoleLogger.logger.level); + it('should log with error', () => { + const consoleLogger = logger.logger(1); + assert.strictEqual(LEVELS[1], consoleLogger.level); }); }); /** Should logger only error log */ describe('error logger', () => { - const consoleLogger = logger.logger(LEVELS[0]); + const consoleLogger = logger.logger(LEVELS[1]); - it('should logger error', () => { + it('should log error', () => { consoleTxt = ''; consoleLogger.error('error test logger'); unhookIntercept(); @@ -63,7 +66,7 @@ describe('ConsoleLogger', () => { assert.ok(validateString >= 0); }); - it('should not logger warn', () => { + it('should not log warn', () => { consoleTxt = ''; consoleLogger.warn('warn test logger'); unhookIntercept(); @@ -73,7 +76,7 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger info', () => { + it('should not log info', () => { consoleTxt = ''; consoleLogger.info('info test logger'); unhookIntercept(); @@ -83,7 +86,7 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger debug', () => { + it('should not log debug', () => { consoleTxt = ''; consoleLogger.debug('debug test logger'); unhookIntercept(); @@ -92,7 +95,7 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger silly', () => { + it('should not log silly', () => { consoleTxt = ''; consoleLogger.silly('silly test logger'); unhookIntercept(); @@ -102,62 +105,40 @@ describe('ConsoleLogger', () => { }); }); - /** Should logger error, warn and info log */ - describe('info logger', () => { - const consoleLogger = logger.logger(LEVELS[2]); - - it('should logger error', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); + /** Should disable logger */ + describe('silent logger', () => { + const consoleLogger = logger.logger(0); + it('should not log error', () => { consoleTxt = ''; consoleLogger.error('error test logger'); unhookIntercept(); const validateString = consoleTxt.indexOf('error'); - assert.ok(validateString >= 0); + assert.equal(validateString, -1); }); - it('should not logger warn', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); - + it('should not log warn', () => { consoleTxt = ''; consoleLogger.warn('warn test logger'); unhookIntercept(); + const validateString = consoleTxt.indexOf('warn'); - assert.ok(validateString >= 0); + assert.equal(validateString, -1); }); - it('should logger info', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); - + it('should not log info', () => { consoleTxt = ''; consoleLogger.info('info test logger'); unhookIntercept(); + const validateString = consoleTxt.indexOf('info'); - assert.ok(validateString >= 0); + assert.equal(validateString, -1); }); - it('should not logger debug', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); - + it('should not log debug', () => { consoleTxt = ''; consoleLogger.debug('debug test logger'); unhookIntercept(); @@ -166,13 +147,7 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); - it('should not logger silly', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); - + it('should not log silly', () => { consoleTxt = ''; consoleLogger.silly('silly test logger'); unhookIntercept(); @@ -181,42 +156,4 @@ describe('ConsoleLogger', () => { assert.equal(validateString, -1); }); }); - - describe('Model classes has a logger', () => { - // tslint:disable:no-any - function instanceOfLogger(object: any): object is Logger { - return 'error' in object && 'warn' in object && 'info' in object && - 'debug' in object && 'silly' in object; - } - - const consoleLogger = logger.logger('debug'); - - const tracer = new Tracer(); - tracer.start({logger: consoleLogger}); - - it('checks if Tracer has a logger', () => { - assert.ok(instanceOfLogger(tracer.logger)); - }); - - it('checks if RootSpanImpl and SpanImpl has a logger', () => { - tracer.startRootSpan({name: 'rootSpanTest'} as TraceOptions, (root) => { - assert.ok(instanceOfLogger(root.logger)); - - const span = tracer.startSpan('spanTest'); - assert.ok(instanceOfLogger(span.logger)); - }); - }); - - const exporterConfig = {logger: consoleLogger}; - const exporter = new ConsoleExporter(exporterConfig); - - it('checks if exporter has a logger', () => { - assert.ok(instanceOfLogger(exporter.logger)); - }); - - it('checks if buffer has a logger', () => { - const buffer = new Buffer(exporter, exporterConfig); - assert.ok(instanceOfLogger(buffer.logger)); - }); - }); -}); \ No newline at end of file +}); diff --git a/packages/opencensus-core/test/test-exporter-buffer.ts b/packages/opencensus-core/test/test-exporter-buffer.ts new file mode 100644 index 000000000..43a33624e --- /dev/null +++ b/packages/opencensus-core/test/test-exporter-buffer.ts @@ -0,0 +1,116 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import * as logger from '../src/common/console-logger'; +import {NoopExporter} from '../src/exporters/console-exporter'; +import {ExporterBuffer} from '../src/exporters/exporter-buffer'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; + + +const exporter = new NoopExporter(); +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 2000; // time in milliseconds +const tracer = new Tracer().start({}); + +const defaultBufferConfig = { + bufferSize: DEFAULT_BUFFER_SIZE, + bufferTimeout: DEFAULT_BUFFER_TIMEOUT, + logger: logger.logger() +}; + + +const createRootSpans = (num: number): RootSpan[] => { + const rootSpans = []; + for (let i = 0; i < num; i++) { + const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); + rootSpan.start(); + for (let j = 0; j < 10; j++) { + rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); + } + rootSpans.push(rootSpan); + } + return rootSpans; +}; + +describe('ExporterBuffer', () => { + /** + * Should create a Buffer with exporter, DEFAULT_BUFFER_SIZE and + * DEFAULT_BUFFER_TIMEOUT + */ + describe('new ExporterBuffer()', () => { + it('should create a Buffer instance', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + assert.ok(buffer instanceof ExporterBuffer); + }); + }); + + /** + * Should return the Buffer + */ + describe('setBufferSize', () => { + it('should set BufferSize', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + const bufferResize = buffer.setBufferSize(DEFAULT_BUFFER_SIZE); + assert.ok(bufferResize instanceof ExporterBuffer); + assert.strictEqual(bufferResize.getBufferSize(), DEFAULT_BUFFER_SIZE); + }); + }); + + /** + * Should add one item to the Buffer + */ + describe('addToBuffer', () => { + it('should add one item to the Buffer', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 1); + }); + }); + + /** + * Should force flush + */ + describe('addToBuffer force flush ', () => { + it('should force flush', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + const rootSpans = createRootSpans(DEFAULT_BUFFER_SIZE); + for (const rootSpan of rootSpans) { + buffer.addToBuffer(rootSpan); + } + assert.strictEqual(buffer.getQueue().length, buffer.getBufferSize()); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 0); + }); + }); + + /** + * Should flush by timeout + */ + describe('addToBuffer force flush by timeout ', () => { + it('should flush by timeout', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 1); + setTimeout(() => { + assert.strictEqual(buffer.getQueue().length, 0); + }, DEFAULT_BUFFER_TIMEOUT + 100); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts index c98f0f79a..2a4112224 100644 --- a/packages/opencensus-core/test/test-root-span.ts +++ b/packages/opencensus-core/test/test-root-span.ts @@ -41,7 +41,7 @@ describe('RootSpan', () => { describe('new RootSpan() with options', () => { it('should create a RootSpan instance with options', () => { const trace = new RootSpan(tracer); - const options = {name: 'test', traceContext: trace.traceContext} as + const options = {name: 'test', spanContext: trace.spanContext} as TraceOptions; const root = new RootSpan(tracer, options); assert.ok(root instanceof RootSpan); @@ -54,8 +54,12 @@ describe('RootSpan', () => { describe('get spans()', () => { it('should get span list from rootspan instance', () => { const root = new RootSpan(tracer); + // TODO: Suggetion: make sure that root.spans.length is 1, + // and that it's the same as the earlier (shadowed) span object root.start(); - const span = root.startSpan('spanName', 'spanType'); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(root.spans.length, 1); + assert.strictEqual(span, root.spans[0]); for (const span of root.spans) { assert.ok(span instanceof Span); @@ -69,7 +73,7 @@ describe('RootSpan', () => { describe('new traceId()', () => { it('should get trace id from rootspan instance', () => { const root = new RootSpan(tracer); - assert.equal(root.traceId, root.traceContext.traceId); + assert.equal(root.traceId, root.spanContext.traceId); }); }); @@ -93,7 +97,7 @@ describe('RootSpan', () => { before(() => { root = new RootSpan(tracer); root.start(); - span = root.startSpan('spanName', 'spanType'); + span = root.startChildSpan('spanName', 'spanType'); }); it('should create span instance', () => { @@ -111,8 +115,8 @@ describe('RootSpan', () => { describe('startSpan() before start rootspan', () => { it('should not create span', () => { const root = new RootSpan(tracer); - const span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(span, null); }); }); @@ -124,8 +128,8 @@ describe('RootSpan', () => { const root = new RootSpan(tracer); root.start(); root.end(); - const span = root.startSpan('spanName', 'spanType'); - assert.ok(span == null); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(span, null); }); }); @@ -159,7 +163,7 @@ describe('RootSpan', () => { it('should end all spans inside rootspan', () => { const root = new RootSpan(tracer); root.start(); - const span = root.startSpan('spanName', 'spanType'); + const span = root.startChildSpan('spanName', 'spanType'); root.end(); for (const span of root.spans) { diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts index 6993a20c0..0427bbab3 100644 --- a/packages/opencensus-core/test/test-sampler.ts +++ b/packages/opencensus-core/test/test-sampler.ts @@ -24,61 +24,6 @@ import {Sampler} from '../src/trace/sampler/sampler'; const tracer = new Tracer(); describe('Sampler', () => { - /** - * Should create a sampler - */ - describe('new Sampler()', () => { - it('should create a Sampler instance', () => { - const sampler = new Sampler(); - assert.ok(sampler instanceof Sampler); - }); - }); - - /** - * Should create a sampler with traceId - */ - describe('new Sampler(traceId)', () => { - it('should create a Sampler instance', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler(); - assert.ok(sampler instanceof Sampler); - }); - }); - - /** - * Should return the SamplerImpl - */ - describe('always()', () => { - it('should return a sampler instance', () => { - const sampler = new Sampler(); - const samplerAlways = sampler.always(); - assert.ok(samplerAlways instanceof Sampler); - }); - }); - - /** - * Should return the SamplerImpl - */ - describe('never()', () => { - it('should return a sampler instance', () => { - const sampler = new Sampler(); - const samplerNever = sampler.never(); - assert.ok(samplerNever instanceof Sampler); - }); - }); - - /** - * Should return the SamplerImpl - */ - describe('probability()', () => { - it('should return a sampler instance', () => { - const PROBABILITY = 0.5; - const sampler = new Sampler(); - const samplerProbability = sampler.probability(PROBABILITY); - assert.ok(samplerProbability instanceof Sampler); - }); - }); - /** * Should return true */ @@ -90,6 +35,20 @@ describe('Sampler', () => { const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(samplerShouldSampler); }); + it('should return a always sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(1); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'always'); + assert.ok(samplerShouldSampler); + }); + it('should return a always sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(100); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'always'); + assert.ok(samplerShouldSampler); + }); }); /** * Should return false @@ -102,5 +61,27 @@ describe('Sampler', () => { const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(!samplerShouldSampler); }); + it('should return a never sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(0); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'never'); + assert.ok(!samplerShouldSampler); + }); + it('should return a never sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(-1); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'never'); + assert.ok(!samplerShouldSampler); + }); + }); + + describe('shouldSample() never', () => { + it('should return a probability sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(0.7); + assert.ok(sampler.description.indexOf('probability') >= 0); + }); }); }); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts index e9a64207f..0e987ca39 100644 --- a/packages/opencensus-core/test/test-span.ts +++ b/packages/opencensus-core/test/test-span.ts @@ -22,6 +22,10 @@ import {Span} from '../src/trace/model/span'; import {Tracer} from '../src/trace/model/tracer'; import {Annotation, Attributes, Link, MessageEvent} from '../src/trace/model/types'; + +// TODO: we should evaluate a way to merge similar test cases between span and +// rootspan + const tracer = new Tracer(); describe('Span', () => { @@ -49,15 +53,15 @@ describe('Span', () => { }); /** - * Should the trace context of span + * Should the span context of span */ - describe('get traceContext()', () => { - it('should the trace context of span', () => { + describe('get spanContext', () => { + it('should the span context of span', () => { const rootSpan = new RootSpan(tracer); rootSpan.start(); const span = new Span(rootSpan); - const context = span.traceContext; + const context = span.spanContext; assert.equal(context.traceId, rootSpan.traceId); assert.equal(context.spanId, span.id); @@ -77,13 +81,13 @@ describe('Span', () => { span = new Span(rootSpan); }); it('should get startTime() return null', () => { - assert.equal(span.startTime, null); + assert.strictEqual(span.startTime, null); }); it('should get endTime() return null', () => { - assert.equal(span.endTime, null); + assert.strictEqual(span.endTime, null); }); it('should get duration() return null', () => { - assert.equal(span.duration, null); + assert.strictEqual(span.duration, null); }); }); diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 468182580..1d3443a7e 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -16,11 +16,14 @@ import * as assert from 'assert'; import {EventEmitter} from 'events'; +import * as uuid from 'uuid'; +import {randomSpanId} from '../src/internal/util'; import {TracerConfig} from '../src/trace/config/types'; import {RootSpan} from '../src/trace/model/root-span'; import {Span} from '../src/trace/model/span'; import {Tracer} from '../src/trace/model/tracer'; +import * as types from '../src/trace/model/types'; import {OnEndSpanEventListener} from '../src/trace/model/types'; class OnEndSpanClass implements OnEndSpanEventListener { @@ -33,7 +36,7 @@ class OnEndSpanClass implements OnEndSpanEventListener { } const defaultConfig: TracerConfig = { - samplingRate: 1 + samplingRate: 1.0 // always sampler }; describe('Tracer', () => { @@ -59,7 +62,7 @@ describe('Tracer', () => { assert.ok(tracer.currentRootSpan instanceof RootSpan); }); it('should set the current RootSpan from tracer instance', () => { - assert.equal(tracer.currentRootSpan, rootSpan); + assert.strictEqual(tracer.currentRootSpan, rootSpan); }); }); @@ -68,6 +71,7 @@ describe('Tracer', () => { let tracerStarted; before(() => { const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); tracerStarted = tracer.start(defaultConfig); }); it('should return a tracer instance', () => { @@ -75,7 +79,7 @@ describe('Tracer', () => { }); it('the trace was started', () => { - assert.ok(tracerStarted.active); + assert.strictEqual(tracerStarted.active, true); }); }); @@ -90,7 +94,8 @@ describe('Tracer', () => { it('should register a new OnEndSpanEventListener on listners list', () => { const listner = tracer.eventListeners[0]; - assert.equal(listner, onEndSpan); + assert.strictEqual(tracer.eventListeners.length, 1); + assert.strictEqual(listner, onEndSpan); }); it('should return an OnEndSpanEventListener list', () => { @@ -104,27 +109,14 @@ describe('Tracer', () => { describe('stop()', () => { it('should stop the trace instance', () => { const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); tracer.start(defaultConfig); + assert.strictEqual(tracer.active, true); tracer.stop(); - assert.ok(!tracer.active); + assert.strictEqual(tracer.active, false); }); }); - /** Should check if the trace instance is started or stop */ - describe('get active()', () => { - let tracer: Tracer; - before(() => { - tracer = new Tracer(); - }); - it('should check if the trace instance is started', () => { - tracer.start(defaultConfig); - assert.ok(tracer.active); - }); - it('should check if the trace instance is stoped', () => { - tracer.stop(); - assert.ok(!tracer.active); - }); - }); /** Should create and start a new RootSpan instance */ describe('startRootSpan()', () => { @@ -169,21 +161,72 @@ describe('Tracer', () => { const config = {samplingRate: 0} as TracerConfig; tracer.start(config); tracer.startRootSpan(options, (rootSpan) => { - assert.ok(!rootSpan.started); + assert.strictEqual(rootSpan, null); }); }); }); /** Should not create the new RootSpan instance */ describe('startRootSpan() before start()', () => { - it('should not create the new RootSpan instance', () => { + it('should not create the new RootSpan instance, tracer not started', + () => { + const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); + tracer.startRootSpan(options, (rootSpan) => { + assert.equal(rootSpan, null); + }); + }); + }); + + describe('startRootSpan() with context propagation', () => { + const traceOptions = {name: 'rootName', type: 'spanType'} as + types.TraceOptions; + + it('should create new RootSpan instance, no propagation', () => { const tracer = new Tracer(); - tracer.startRootSpan(options, (rootSpan) => { - assert.equal(rootSpan, null); + tracer.start(defaultConfig); + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + }); + }); + + const spanContextPropagated = { + traceId: uuid.v4().split('-').join(''), + spanId: randomSpanId(), + options: 0x1 + } as types.SpanContext; + + + it('should reate the new RootSpan with propagation', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + traceOptions.spanContext = spanContextPropagated; + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + assert.strictEqual(rootSpan.traceId, spanContextPropagated.traceId); + assert.strictEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); + }); + }); + + it('should reate the new RootSpan with no propagation', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + traceOptions.spanContext.options = 0x0; + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + assert.notEqual(rootSpan.traceId, spanContextPropagated.traceId); + assert.notEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); }); }); }); + /** Should set the current root span to null */ describe('clearCurrentRootSpan()', () => { it('should set the current root span to null', () => { @@ -191,19 +234,20 @@ describe('Tracer', () => { tracer.start(defaultConfig); tracer.startRootSpan(options, (rootSpan) => { tracer.clearCurrentTrace(); - assert.ok(tracer.currentRootSpan == null); + assert.strictEqual(tracer.currentRootSpan, null); }); }); }); + /** Should create and start a Span instance into a rootSpan */ - describe('startSpan()', () => { - let span; + describe('startChildSpan()', () => { + let span: types.Span; before(() => { const tracer = new Tracer(); tracer.start(defaultConfig); tracer.startRootSpan(options, (rootSpan) => { - span = tracer.startSpan('spanName', 'spanType'); + span = tracer.startChildSpan('spanName', 'spanType'); }); }); it('should create a Span instance', () => { @@ -211,15 +255,17 @@ describe('Tracer', () => { }); it('should start a span', () => { assert.ok(span.started); + assert.strictEqual(span.name, 'spanName'); + assert.strictEqual(span.type, 'spanType'); }); }); /** Should not create a Span instance */ - describe('startSpan() before startRootSpan()', () => { - it('should not create a Span instance', () => { + describe('startChildSpan() before startRootSpan()', () => { + it('should not create a Span instance, without a rootspan', () => { const tracer = new Tracer(); tracer.start(defaultConfig); - const span = tracer.startSpan('spanName', 'spanType'); + const span = tracer.startChildSpan('spanName', 'spanType'); assert.equal(span, null); }); }); @@ -238,32 +284,4 @@ describe('Tracer', () => { }); }); }); - - - /** Testing void functions */ - describe('void functions', () => { - it('wrap()', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - assert.ok(tracer.wrap(() => {}) instanceof Function); - }); - - it('wrap() before start()', () => { - const tracer = new Tracer(); - assert.ok(tracer.wrap(() => {}) instanceof Function); - }); - - it('wrapEmitter()', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - assert.strictEqual( - typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); - }); - - it('wrapEmitter() before start()', () => { - const tracer = new Tracer(); - assert.strictEqual( - typeof tracer.wrapEmitter(new EventEmitter()), 'undefined'); - }); - }); }); \ No newline at end of file diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json index 4f7b0dc24..fc69b49c7 100644 --- a/packages/opencensus-core/tsconfig.json +++ b/packages/opencensus-core/tsconfig.json @@ -15,8 +15,8 @@ "sourceMap": false }, "include": [ - "src/*.ts", - "test/*.ts", + "src/**/*.ts", + "test/**/*.ts" ], "exclude": [ "node_modules" From c8b2ffbcd89215eafa12735539a799b0ac8b3222 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Mon, 30 Apr 2018 17:20:31 -0300 Subject: [PATCH 109/110] refactor: rework according to review follow up --- .../src/common/console-logger.ts | 31 ++++++++-------- .../src/trace/instrumentation/base-plugin.ts | 37 ------------------- .../opencensus-core/src/trace/model/tracer.ts | 6 +-- .../opencensus-core/src/trace/model/types.ts | 25 +++++-------- .../test/test-console-logger.ts | 7 +--- .../test/test-exporter-buffer.ts | 5 ++- packages/opencensus-core/test/test-sampler.ts | 8 ++-- packages/opencensus-core/test/test-tracer.ts | 4 +- 8 files changed, 37 insertions(+), 86 deletions(-) diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts index 5bce87103..decd19bfb 100644 --- a/packages/opencensus-core/src/common/console-logger.ts +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -30,13 +30,23 @@ export class ConsoleLogger implements types.Logger { static LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; level: string; + + // TODO: reevaluate options to accept numbers as a parameter + /** * Constructs a new ConsoleLogger instance * @param options A logger configuration object. */ - constructor(options?: types.LoggerOptions|string) { + constructor(options?: types.LoggerOptions|string|number) { let opt: types.LoggerOptions = {}; - if (typeof options === 'string') { + if (typeof options === 'number') { + if (options < 0) { + options = 0; + } else if (options > ConsoleLogger.LEVELS.length) { + options = ConsoleLogger.LEVELS.length - 1; + } + opt = {level: ConsoleLogger.LEVELS[options]}; + } else if (typeof options === 'string') { opt = {level: options}; } else { opt = options || {}; @@ -98,24 +108,15 @@ export class ConsoleLogger implements types.Logger { } +// TODO: reevaluate the need to create a new logger instance on every call to +// logger(); + /** * Function logger exported to others classes. * @param options A logger options or strig to logger in console */ const logger = (options?: types.LoggerOptions|string|number) => { - let opt: types.LoggerOptions|string; - if (typeof options === 'number') { - if (options < 0) { - options = 0; - } else if (options > ConsoleLogger.LEVELS.length) { - options = ConsoleLogger.LEVELS.length - 1; - } - opt = {level: ConsoleLogger.LEVELS[options]}; - } else { - opt = options; - } - - const aLogger = new ConsoleLogger(opt); + const aLogger = new ConsoleLogger(options); logger['logger'] = aLogger; return aLogger; }; diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts index 7e1412da1..9021aface 100644 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -53,43 +53,6 @@ export abstract class BasePlugin implements types.Plugin { this.version = version; } - /** - * Wraps a function. - * @param nodule The module. - * @param name The function name. - * @param wrapper The wrapper. - */ - protected wrap(nodule, name, wrapper) { - shimmer.wrap(nodule, name, wrapper); - } - - /** - * Unwraps a function. - * @param nodule The module. - * @param name The function name. - */ - protected unwrap(nodule, name) { - shimmer.unwrap(nodule, name); - } - - /** - * Wraps one or more funcitons. - * @param nodule The module. - * @param names A list of function names. - * @param wrapper The wrapper. - */ - protected massWrap(nodule, names, wrapper) { - shimmer.massWrap(nodule, names, wrapper); - } - - /** - * Unwraps one or more functions. - * @param nodule The module. - * @param names The list of function names. - */ - protected massUnwrap(nodule, names) { - shimmer.massUnwrap(nodule, names); - } // TODO: review this implementation // From the perspective of an instrumentation module author, diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index dc2c98d43..1d0d395d1 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -179,16 +179,14 @@ export class Tracer implements types.Tracer { * Starts a span. * @param name The span name. * @param type The span type. - * @param parentSpanId The parent span ID. */ - startChildSpan(name?: string, type?: string, parentSpanId?: string): - types.Span { + startChildSpan(name?: string, type?: string): types.Span { let newSpan: types.Span = null; if (!this.currentRootSpan) { this.logger.debug( 'no current trace found - must start a new root span first'); } else { - newSpan = this.currentRootSpan.startChildSpan(name, type, parentSpanId); + newSpan = this.currentRootSpan.startChildSpan(name, type); } return newSpan; } diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts index d14865153..5bf8e3509 100644 --- a/packages/opencensus-core/src/trace/model/types.ts +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -200,14 +200,8 @@ export interface RootSpan extends Span { /** Get the span list from RootSpan instance */ readonly spans: Span[]; - /** Starts the RootSpan instance */ - start(): void; - - /** Ends the RootSpan instance */ - end(): void; - /** Starts a new Span instance in the RootSpan instance */ - startChildSpan(name: string, type: string, parentSpanId?: string): Span; + startChildSpan(name: string, type: string): Span; } @@ -246,6 +240,14 @@ export interface Tracer extends OnEndSpanEventListener { */ startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; + /** + * Start a new Span instance to the currentRootSpan + * @param name Span name + * @param type Span type + * @returns The new Span instance started + */ + startChildSpan(name?: string, type?: string): Span; + /** * Register a OnEndSpanEventListener on the tracer instance * @param listener An OnEndSpanEventListener instance @@ -255,15 +257,6 @@ export interface Tracer extends OnEndSpanEventListener { /** Clear the currentRootSpan from tracer instance */ clearCurrentTrace(): void; - /** - * Start a new Span instance to the currentRootSpan - * @param name Span name - * @param type Span type - * @param parentSpanId Parent SpanId - * @returns The new Span instance started - */ - startChildSpan(name?: string, type?: string, parentSpanId?: string): Span; - /** * Binds the trace context to the given function. * This is necessary in order to create child spans correctly in functions diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts index 013a8a1c5..7f28435d3 100644 --- a/packages/opencensus-core/test/test-console-logger.ts +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -20,12 +20,7 @@ import * as mocha from 'mocha'; import * as logger from '../src/common/console-logger'; import {ConsoleLogger} from '../src/common/console-logger'; import {Logger} from '../src/common/types'; -import {ConsoleExporter} from '../src/exporters/console-exporter'; -import {ExporterBuffer} from '../src/exporters/exporter-buffer'; -import {BufferConfig, TracerConfig} from '../src/trace/config/types'; -import {RootSpan} from '../src/trace/model/root-span'; -import {Tracer} from '../src/trace/model/tracer'; -import {TraceOptions} from '../src/trace/model/types'; + const LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; let consoleTxt = ''; diff --git a/packages/opencensus-core/test/test-exporter-buffer.ts b/packages/opencensus-core/test/test-exporter-buffer.ts index 43a33624e..bf0fb68ed 100644 --- a/packages/opencensus-core/test/test-exporter-buffer.ts +++ b/packages/opencensus-core/test/test-exporter-buffer.ts @@ -67,9 +67,10 @@ describe('ExporterBuffer', () => { describe('setBufferSize', () => { it('should set BufferSize', () => { const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - const bufferResize = buffer.setBufferSize(DEFAULT_BUFFER_SIZE); + const newBufferSize = DEFAULT_BUFFER_SIZE + 10; + const bufferResize = buffer.setBufferSize(newBufferSize); assert.ok(bufferResize instanceof ExporterBuffer); - assert.strictEqual(bufferResize.getBufferSize(), DEFAULT_BUFFER_SIZE); + assert.strictEqual(bufferResize.getBufferSize(), newBufferSize); }); }); diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts index 0427bbab3..d7dc1195c 100644 --- a/packages/opencensus-core/test/test-sampler.ts +++ b/packages/opencensus-core/test/test-sampler.ts @@ -35,14 +35,14 @@ describe('Sampler', () => { const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(samplerShouldSampler); }); - it('should return a always sampler', () => { + it('should return a always sampler for 1', () => { const root = new RootSpan(tracer); const sampler = new Sampler().probability(1); const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.strictEqual(sampler.description, 'always'); assert.ok(samplerShouldSampler); }); - it('should return a always sampler', () => { + it('should return a always sampler for >1', () => { const root = new RootSpan(tracer); const sampler = new Sampler().probability(100); const samplerShouldSampler = sampler.shouldSample(root.traceId); @@ -61,14 +61,14 @@ describe('Sampler', () => { const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.ok(!samplerShouldSampler); }); - it('should return a never sampler', () => { + it('should return a never sampler for 0', () => { const root = new RootSpan(tracer); const sampler = new Sampler().probability(0); const samplerShouldSampler = sampler.shouldSample(root.traceId); assert.strictEqual(sampler.description, 'never'); assert.ok(!samplerShouldSampler); }); - it('should return a never sampler', () => { + it('should return a never sampler for negative value', () => { const root = new RootSpan(tracer); const sampler = new Sampler().probability(-1); const samplerShouldSampler = sampler.shouldSample(root.traceId); diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts index 1d3443a7e..a5d486ed2 100644 --- a/packages/opencensus-core/test/test-tracer.ts +++ b/packages/opencensus-core/test/test-tracer.ts @@ -199,7 +199,7 @@ describe('Tracer', () => { } as types.SpanContext; - it('should reate the new RootSpan with propagation', () => { + it('should create the new RootSpan with propagation', () => { const tracer = new Tracer(); tracer.start(defaultConfig); traceOptions.spanContext = spanContextPropagated; @@ -212,7 +212,7 @@ describe('Tracer', () => { }); }); - it('should reate the new RootSpan with no propagation', () => { + it('should create the new RootSpan with no propagation', () => { const tracer = new Tracer(); tracer.start(defaultConfig); traceOptions.spanContext.options = 0x0; From 8e832904f60a21ef2b0028b33d4458de0bab486a Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 May 2018 14:04:45 -0300 Subject: [PATCH 110/110] refactor: fix some dependencies, file copyright and typos --- packages/opencensus-core/package.json | 1 - packages/opencensus-core/src/trace/model/tracer.ts | 4 ++-- packages/opencensus-core/test/test-console-exporter.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json index f0266ed1d..70c610928 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -54,7 +54,6 @@ "nyc": "11.6.0" }, "dependencies": { - "async_hooks": "^1.0.0", "continuation-local-storage": "^3.2.1", "debug": "^3.1.0", "intercept-stdout": "^0.1.2", diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts index 1d0d395d1..4d5267e15 100644 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -116,11 +116,11 @@ export class Tracer implements types.Tracer { } } const aRoot = new RootSpan(this, options); - const sampleDecisition: boolean = propagatedSample ? + const sampleDecision: boolean = propagatedSample ? propagatedSample : this.sampler.shouldSample(aRoot.traceId); - if (sampleDecisition) { + if (sampleDecision) { aRoot.start(); this.currentRootSpan = aRoot; newRoot = aRoot; diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts index 22b81b9b6..82bc79a2e 100644 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -1,5 +1,5 @@ /** - * Copyright 2018 Google LLC. All Rights Reserved. + * Copyright 2018, OpenCensus Authors * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License.