From 716e13e2afb97edd458d92b684914e452af55db8 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Thu, 3 Jan 2019 11:04:39 -0800 Subject: [PATCH 1/3] Replace process.hrtime with Date.now Although process.hrtime() provides a high-resolution timer, it is from an unknown relative time, not epoch i.e. The time is relative to an arbitrary time in the past (not related to the time of day) and therefore not subject to clock drifts. The whole purpose of hrtime is to gather information on intervals or durations. That's why it doesn't really matter what the point in time was. Also, it is impossible to construct the ISO timestamp from hrtime, which is required when we export metrics data using stackdriver exporter. I am proposing to use Date.now function, as it returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC. I have written timestampFromMillis function to construct Timestamp object from the given milliseconds. --- packages/opencensus-core/package-lock.json | 899 +++++++++++++----- packages/opencensus-core/package.json | 3 +- .../opencensus-core/src/common/time-util.ts | 40 + .../src/metrics/gauges/derived-gauge.ts | 9 +- .../src/metrics/gauges/gauge.ts | 6 +- packages/opencensus-core/src/stats/view.ts | 7 +- .../test/test-derived-gauge.ts | 51 +- packages/opencensus-core/test/test-gauge.ts | 189 ++-- .../test/test-metric-producer.ts | 15 +- .../test/test-metric-registry.ts | 62 +- packages/opencensus-core/test/test-view.ts | 58 +- 11 files changed, 984 insertions(+), 355 deletions(-) create mode 100644 packages/opencensus-core/src/common/time-util.ts diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index d702e0ea2..39bb2197a 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,11 +1,14 @@ { - "requires": true, + "name": "@opencensus/core", + "version": "0.0.8", "lockfileVersion": 1, + "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, "requires": { "@babel/highlight": "^7.0.0" } @@ -14,6 +17,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", + "dev": true, "requires": { "@babel/types": "^7.2.2", "jsesc": "^2.5.1", @@ -25,7 +29,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -33,6 +38,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", @@ -43,6 +49,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -51,6 +58,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -59,6 +67,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -68,19 +77,22 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true } } }, "@babel/parser": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.2.tgz", - "integrity": "sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA==" + "integrity": "sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA==", + "dev": true }, "@babel/template": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.2.2", @@ -91,6 +103,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.2.tgz", "integrity": "sha512-E5Bn9FSwHpSkUhthw/XEuvFZxIgrqb9M8cX8j5EUQtrUG5DQUy6bFyl7G7iQ1D1Czudor+xkmp81JbLVVM0Sjg==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.2.2", @@ -107,6 +120,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -114,7 +128,8 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -122,6 +137,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", + "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.10", @@ -132,6 +148,7 @@ "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": "*" } @@ -139,32 +156,38 @@ "@types/mocha": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==" + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true }, "@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", - "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==" + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==", + "dev": true }, "@types/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@types/once/-/once-1.4.0.tgz", - "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==" + "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==", + "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/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": "*" } @@ -173,6 +196,7 @@ "version": "6.6.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", + "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -184,6 +208,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.0.0" } @@ -191,17 +216,20 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true }, "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 }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -210,6 +238,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.2" } @@ -217,22 +246,26 @@ "argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=" + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "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=" + "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 }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -240,12 +273,14 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "async": { "version": "1.5.2", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, "async-listener": { "version": "0.6.9", @@ -259,22 +294,26 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "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", @@ -284,17 +323,20 @@ "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": "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.2", @@ -307,6 +349,7 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -314,27 +357,36 @@ "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 }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, + "big-integer": { + "version": "1.6.40", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.40.tgz", + "integrity": "sha512-CjhtJp0BViLzP1ZkEnoywjgtFQXS2pomKjAJtIISTCnuHILkLcAXLdFLG/nxsHc4s9kJfc+82Xpg8WNyhfACzQ==" + }, "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.0.0", @@ -349,6 +401,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" @@ -357,27 +410,32 @@ "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 }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "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": { "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 }, "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", @@ -387,17 +445,20 @@ "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "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", @@ -407,12 +468,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" } @@ -422,17 +485,20 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true }, "clang-format": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz", "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==", + "dev": true, "requires": { "async": "^1.5.2", "glob": "^7.0.0", @@ -442,12 +508,14 @@ "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" } @@ -455,12 +523,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 }, "codecov": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.1.0.tgz", "integrity": "sha512-aWQc/rtHbcWEQLka6WmBAOpV58J2TwyXqlpAQGhQaSiEUoigTTUk6lLd2vB3kXkhnDyzyH74RXfmV4dq2txmdA==", + "dev": true, "requires": { "argv": "^0.0.2", "ignore-walk": "^3.0.1", @@ -473,6 +543,7 @@ "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.1" } @@ -480,12 +551,14 @@ "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 }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -493,17 +566,20 @@ "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.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -525,12 +601,14 @@ "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=" + "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" } @@ -539,6 +617,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.0.1", "shebang-command": "^1.2.0", @@ -548,12 +627,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.1" } @@ -562,6 +643,7 @@ "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" } @@ -570,6 +652,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -577,12 +660,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.1.0", "map-obj": "^1.0.0" @@ -591,29 +676,34 @@ "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.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "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==" + "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.0" } @@ -621,12 +711,14 @@ "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 }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -643,12 +735,14 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -656,22 +750,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.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "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.0.1", "get-stream": "^3.0.0", @@ -685,12 +783,14 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "external-editor": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -700,22 +800,26 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "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=" + "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" } @@ -724,6 +828,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" } @@ -731,12 +836,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -746,17 +853,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 }, "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" } @@ -765,6 +875,7 @@ "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.4", @@ -778,6 +889,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.4" } @@ -785,12 +897,14 @@ "globals": { "version": "11.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true }, "got": { "version": "6.7.1", "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -808,17 +922,20 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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.9.0", "resolved": "https://registry.npmjs.org/gts/-/gts-0.9.0.tgz", "integrity": "sha512-Id2Vmg0xNU1FODc0AwmaFA1h0+h6V9/zBqu4NfT8FucVOVEP7pyJ16btyHfSH/UdzTCXjV1fq+fNBEgx/50EaA==", + "dev": true, "requires": { "chalk": "^2.4.1", "clang-format": "1.2.3", @@ -837,6 +954,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -846,12 +964,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.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -861,12 +981,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -876,6 +998,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.0.0" }, @@ -883,29 +1006,34 @@ "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 } } }, "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 }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "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.2.2", @@ -916,6 +1044,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -924,6 +1053,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -931,22 +1061,26 @@ "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.3.0", "wrappy": "1" @@ -955,17 +1089,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": "6.2.1", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -986,6 +1123,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", + "dev": true, "requires": { "lodash.toarray": "^3.0.0" } @@ -993,12 +1131,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.0.0" } @@ -1007,6 +1147,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, "requires": { "ci-info": "^1.5.0" } @@ -1014,12 +1155,14 @@ "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 }, "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.0", "is-path-inside": "^1.0.0" @@ -1028,17 +1171,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.1" } @@ -1046,52 +1192,62 @@ "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 }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "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 }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==" + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true }, "istanbul-lib-instrument": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "dev": true, "requires": { "@babel/generator": "^7.0.0", "@babel/parser": "^7.0.0", @@ -1105,12 +1261,14 @@ "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.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1119,37 +1277,44 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "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", @@ -1161,6 +1326,7 @@ "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.0" } @@ -1169,6 +1335,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.2", "parse-json": "^4.0.0", @@ -1179,7 +1346,8 @@ "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 } } }, @@ -1187,6 +1355,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" @@ -1195,37 +1364,44 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "lodash._arraycopy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true }, "lodash._basevalues": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, "requires": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", @@ -1236,6 +1412,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", + "dev": true, "requires": { "lodash._arraycopy": "^3.0.0", "lodash._basevalues": "^3.0.0", @@ -1251,6 +1428,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.0" @@ -1259,12 +1437,14 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1274,6 +1454,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, "requires": { "pify": "^3.0.0" }, @@ -1281,24 +1462,28 @@ "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 } } }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "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": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, "requires": { "camelcase-keys": "^4.0.0", "decamelize-keys": "^1.0.0", @@ -1314,12 +1499,14 @@ "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -1327,12 +1514,14 @@ "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.7" } @@ -1340,12 +1529,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" @@ -1355,6 +1546,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" } @@ -1363,6 +1555,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", @@ -1379,22 +1572,26 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "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.1.4", "is-builtin-module": "^1.0.0", @@ -1406,6 +1603,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.0" } @@ -1414,6 +1612,7 @@ "version": "13.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", + "dev": true, "requires": { "archy": "^1.0.0", "arrify": "^1.0.1", @@ -1445,7 +1644,7 @@ "align-text": { "version": "0.1.4", "bundled": true, - "optional": true, + "dev": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -1454,38 +1653,46 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "ansi-regex": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "append-transform": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "default-require-extensions": "^2.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "arrify": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "async": { "version": "1.5.2", - "bundled": true + "bundled": true, + "dev": true }, "balanced-match": { "version": "1.0.0", - "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" @@ -1493,11 +1700,13 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "caching-transform": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "make-dir": "^1.0.0", "md5-hex": "^2.0.0", @@ -1508,11 +1717,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.3", @@ -1522,6 +1733,7 @@ "cliui": { "version": "2.1.0", "bundled": true, + "dev": true, "optional": true, "requires": { "center-align": "^0.1.1", @@ -1532,25 +1744,30 @@ "wordwrap": { "version": "0.0.2", "bundled": true, + "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "commondir": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "convert-source-map": { "version": "1.6.0", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -1558,6 +1775,7 @@ "cross-spawn": { "version": "4.0.2", "bundled": true, + "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -1566,21 +1784,25 @@ "debug": { "version": "3.1.0", "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 }, "default-require-extensions": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "strip-bom": "^3.0.0" } @@ -1588,17 +1810,20 @@ "error-ex": { "version": "1.3.2", "bundled": true, + "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es6-error": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true }, "execa": { "version": "0.7.0", "bundled": true, + "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -1612,6 +1837,7 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, + "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -1623,6 +1849,7 @@ "find-cache-dir": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^1.0.0", @@ -1632,6 +1859,7 @@ "find-up": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -1639,6 +1867,7 @@ "foreground-child": { "version": "1.5.6", "bundled": true, + "dev": true, "requires": { "cross-spawn": "^4", "signal-exit": "^3.0.0" @@ -1646,19 +1875,23 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "get-caller-file": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "get-stream": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "glob": { "version": "7.1.3", "bundled": true, + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1670,11 +1903,13 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "bundled": true, + "dev": true }, "handlebars": { "version": "4.0.11", "bundled": true, + "dev": true, "requires": { "async": "^1.4.0", "optimist": "^0.6.1", @@ -1685,6 +1920,7 @@ "source-map": { "version": "0.4.4", "bundled": true, + "dev": true, "requires": { "amdefine": ">=0.0.4" } @@ -1693,19 +1929,23 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "hosted-git-info": { "version": "2.7.1", - "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.3.0", "wrappy": "1" @@ -1713,47 +1953,56 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "invert-kv": { "version": "1.0.0", - "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, - "optional": true + "dev": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "builtin-modules": "^1.0.0" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "istanbul-lib-coverage": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "istanbul-lib-hook": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "append-transform": "^1.0.0" } @@ -1761,6 +2010,7 @@ "istanbul-lib-report": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", "make-dir": "^1.3.0", @@ -1770,6 +2020,7 @@ "istanbul-lib-source-maps": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "debug": "^3.1.0", "istanbul-lib-coverage": "^2.0.1", @@ -1780,25 +2031,28 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true + "bundled": true, + "dev": true } } }, "istanbul-reports": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "handlebars": "^4.0.11" } }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "kind-of": { "version": "3.2.2", "bundled": true, - "optional": true, + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1806,11 +2060,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" } @@ -1818,6 +2074,7 @@ "load-json-file": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -1828,6 +2085,7 @@ "locate-path": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -1835,16 +2093,18 @@ }, "lodash.flattendeep": { "version": "4.4.0", - "bundled": true + "bundled": true, + "dev": true }, "longest": { "version": "1.0.1", "bundled": true, - "optional": true + "dev": true }, "lru-cache": { "version": "4.1.3", "bundled": true, + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1853,6 +2113,7 @@ "make-dir": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "pify": "^3.0.0" } @@ -1860,17 +2121,20 @@ "md5-hex": { "version": "2.0.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.0.0" } @@ -1878,51 +2142,60 @@ "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 } } }, "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.7" } }, "minimist": { "version": "0.0.10", - "bundled": true + "bundled": true, + "dev": true }, "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true } } }, "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "normalize-package-data": { "version": "2.4.0", "bundled": true, + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -1933,17 +2206,20 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1" } @@ -1951,6 +2227,7 @@ "optimist": { "version": "0.6.1", "bundled": true, + "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -1958,11 +2235,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", @@ -1971,11 +2250,13 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "p-limit": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -1983,17 +2264,20 @@ "p-locate": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "package-hash": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.11", "lodash.flattendeep": "^4.4.0", @@ -2004,6 +2288,7 @@ "parse-json": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -2011,41 +2296,49 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "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-type": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "pify": "^3.0.0" } }, "pify": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "pkg-dir": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "find-up": "^3.0.0" } }, "pseudomap": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "read-pkg": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -2055,6 +2348,7 @@ "read-pkg-up": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" @@ -2063,6 +2357,7 @@ "release-zalgo": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "es6-error": "^4.0.1" } @@ -2070,23 +2365,27 @@ "repeat-string": { "version": "1.6.1", "bundled": true, - "optional": true + "dev": true }, "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": "4.0.0", - "bundled": true + "bundled": true, + "dev": true }, "right-align": { "version": "0.1.3", "bundled": true, + "dev": true, "optional": true, "requires": { "align-text": "^0.1.1" @@ -2095,45 +2394,54 @@ "rimraf": { "version": "2.6.2", "bundled": true, + "dev": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "semver": { "version": "5.5.0", - "bundled": true + "bundled": true, + "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "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 }, "source-map": { "version": "0.5.7", "bundled": true, + "dev": true, "optional": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, + "dev": true, "requires": { "foreground-child": "^1.5.6", "mkdirp": "^0.5.0", @@ -2146,6 +2454,7 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -2153,11 +2462,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" @@ -2165,11 +2476,13 @@ }, "spdx-license-ids": { "version": "3.0.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" @@ -2178,21 +2491,25 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-eof": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "supports-color": { "version": "5.4.0", "bundled": true, + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -2200,6 +2517,7 @@ "test-exclude": { "version": "5.0.0", "bundled": true, + "dev": true, "requires": { "arrify": "^1.0.1", "minimatch": "^3.0.4", @@ -2210,6 +2528,7 @@ "uglify-js": { "version": "2.8.29", "bundled": true, + "dev": true, "optional": true, "requires": { "source-map": "~0.5.1", @@ -2220,6 +2539,7 @@ "yargs": { "version": "3.10.0", "bundled": true, + "dev": true, "optional": true, "requires": { "camelcase": "^1.0.2", @@ -2233,15 +2553,18 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, + "dev": true, "optional": true }, "uuid": { "version": "3.3.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" @@ -2250,26 +2573,31 @@ "which": { "version": "1.3.1", "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.1", "strip-ansi": "^3.0.1" @@ -2277,11 +2605,13 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2289,6 +2619,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2298,6 +2629,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2306,11 +2638,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "write-file-atomic": { "version": "2.3.0", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -2319,15 +2653,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.1.1", @@ -2346,6 +2683,7 @@ "cliui": { "version": "4.1.0", "bundled": true, + "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -2355,6 +2693,7 @@ "find-up": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -2362,6 +2701,7 @@ "locate-path": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -2370,6 +2710,7 @@ "p-limit": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -2377,26 +2718,30 @@ "p-locate": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "yargs-parser": { "version": "9.0.2", "bundled": true, + "dev": true, "requires": { "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true + "bundled": true, + "dev": true } } } @@ -2405,12 +2750,14 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "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" } @@ -2419,6 +2766,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.0.0" } @@ -2426,17 +2774,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.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -2445,6 +2796,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.1.0" } @@ -2452,12 +2804,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.0.1", @@ -2469,6 +2823,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" @@ -2477,32 +2832,38 @@ "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.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "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" }, @@ -2510,54 +2871,64 @@ "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 } } }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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 }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "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.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -2568,7 +2939,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 } } }, @@ -2576,6 +2948,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.3.2", @@ -2586,6 +2959,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.0.0", "read-pkg": "^3.0.0" @@ -2595,6 +2969,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.0.0", "strip-indent": "^2.0.0" @@ -2604,6 +2979,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.1.6", "safe-buffer": "^5.0.1" @@ -2613,6 +2989,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.0.1" } @@ -2621,6 +2998,7 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -2647,7 +3025,8 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true } } }, @@ -2655,6 +3034,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -2663,6 +3043,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.0", "signal-exit": "^3.0.2" @@ -2672,6 +3053,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.0.5" } @@ -2680,6 +3062,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" } @@ -2688,6 +3071,7 @@ "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, "requires": { "tslib": "^1.9.0" } @@ -2695,12 +3079,14 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -2711,6 +3097,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.0.3" } @@ -2719,6 +3106,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" } @@ -2726,7 +3114,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", @@ -2736,17 +3125,20 @@ "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": { "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 }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -2756,6 +3148,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -2764,12 +3157,14 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "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" @@ -2778,17 +3173,20 @@ "spdx-license-ids": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "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 }, "sshpk": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -2805,6 +3203,7 @@ "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" @@ -2814,6 +3213,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" } @@ -2824,6 +3224,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, "requires": { "ansi-regex": "^4.0.0" }, @@ -2831,34 +3232,40 @@ "ansi-regex": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true } } }, "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" } @@ -2867,6 +3274,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" } @@ -2874,17 +3282,20 @@ "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 }, "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 }, "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" } @@ -2892,12 +3303,14 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -2906,24 +3319,28 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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=" + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -2938,19 +3355,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 } } }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true }, "tslint": { "version": "5.11.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, "requires": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", @@ -2969,7 +3389,8 @@ "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true } } }, @@ -2977,6 +3398,7 @@ "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, "requires": { "tslib": "^1.8.1" } @@ -2985,6 +3407,7 @@ "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.0.1" } @@ -2992,17 +3415,20 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "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" } @@ -3010,12 +3436,14 @@ "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 }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -3033,6 +3461,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -3041,6 +3470,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.1" } @@ -3048,7 +3478,8 @@ "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=" + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true }, "uuid": { "version": "3.2.1", @@ -3059,6 +3490,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -3068,6 +3500,7 @@ "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", @@ -3078,6 +3511,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -3086,6 +3520,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, "requires": { "string-width": "^2.1.1" } @@ -3093,12 +3528,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", @@ -3108,17 +3545,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 }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -3126,7 +3566,8 @@ "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 6ae552c73..29e7aeeb3 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -61,6 +61,7 @@ "log-driver": "^1.2.7", "semver": "^5.5.0", "shimmer": "^1.2.0", - "uuid": "^3.2.1" + "uuid": "^3.2.1", + "big-integer": "^1.6.16" } } diff --git a/packages/opencensus-core/src/common/time-util.ts b/packages/opencensus-core/src/common/time-util.ts new file mode 100644 index 000000000..ea3178be0 --- /dev/null +++ b/packages/opencensus-core/src/common/time-util.ts @@ -0,0 +1,40 @@ +/** + * Copyright 2019, 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 BigInt from 'big-integer'; +import {Timestamp} from '../metrics/export/types'; + +const MILLIS_PER_SECOND = 1e3; +const NANOS_PER_MILLI = 1e6; + +/** + * Creates a new timestamp from the given milliseconds. + * + * @param {number} epochMilli the timestamp represented in milliseconds since + * epoch. + * @returns {Timestamp} new timestamp with specified fields. + */ +export function timestampFromMillis(epochMilli: number): Timestamp { + return {seconds: seconds(epochMilli), nanos: nanos(epochMilli)}; +} + +const seconds = (epochMilli: number): number => { + return Number(BigInt(epochMilli).divide(MILLIS_PER_SECOND).toString()); +}; + +const nanos = (epochMilli: number): number => { + const mos = epochMilli - seconds(epochMilli) * MILLIS_PER_SECOND; + return Number(BigInt(mos).times(NANOS_PER_MILLI).toString()); +}; diff --git a/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts b/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts index bd98b03e9..0a9ede237 100644 --- a/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts +++ b/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts @@ -14,8 +14,9 @@ * limitations under the License. */ +import {timestampFromMillis} from '../../common/time-util'; import {validateArrayElementsNotNull, validateNotNull} from '../../common/validations'; -import {LabelKey, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, TimeSeries} from '../export/types'; +import {LabelKey, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, TimeSeries, Timestamp} from '../export/types'; import * as types from '../gauges/types'; import {hashLabelValues} from '../utils'; @@ -204,16 +205,14 @@ export class DerivedGauge implements types.Meter { if (this.registeredPoints.size === 0) { return null; } - const [seconds, nanos] = process.hrtime(); + const timestamp: Timestamp = timestampFromMillis(Date.now()); return { descriptor: this.metricDescriptor, timeseries: Array.from( this.registeredPoints, ([_, gaugeEntry]) => ({ labelValues: gaugeEntry.labelValues, - points: [ - {value: gaugeEntry.extractor(), timestamp: {seconds, nanos}} - ] + points: [{value: gaugeEntry.extractor(), timestamp}] } as TimeSeries)) }; } diff --git a/packages/opencensus-core/src/metrics/gauges/gauge.ts b/packages/opencensus-core/src/metrics/gauges/gauge.ts index 0c8794ea1..1f45af514 100644 --- a/packages/opencensus-core/src/metrics/gauges/gauge.ts +++ b/packages/opencensus-core/src/metrics/gauges/gauge.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import {timestampFromMillis} from '../../common/time-util'; import {validateArrayElementsNotNull, validateNotNull} from '../../common/validations'; import {LabelKey, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, TimeSeries, Timestamp} from '../export/types'; import * as types from '../gauges/types'; @@ -129,12 +130,11 @@ export class Gauge implements types.Meter { if (this.registeredPoints.size === 0) { return null; } - const [seconds, nanos] = process.hrtime(); + const timestamp: Timestamp = timestampFromMillis(Date.now()); return { descriptor: this.metricDescriptor, timeseries: Array.from( - this.registeredPoints, - ([_, point]) => point.getTimeSeries({seconds, nanos})) + this.registeredPoints, ([_, point]) => point.getTimeSeries(timestamp)) }; } } diff --git a/packages/opencensus-core/src/stats/view.ts b/packages/opencensus-core/src/stats/view.ts index 4720221e5..e65c5571f 100644 --- a/packages/opencensus-core/src/stats/view.ts +++ b/packages/opencensus-core/src/stats/view.ts @@ -15,6 +15,7 @@ */ import * as defaultLogger from '../common/console-logger'; +import {timestampFromMillis} from '../common/time-util'; import * as loggerTypes from '../common/types'; import {DistributionValue, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, Point, TimeSeries, Timestamp} from '../metrics/export/types'; @@ -206,8 +207,7 @@ export class BaseView implements View { let startTimestamp: Timestamp; // The moment when this point was recorded. - const [currentSeconds, currentNanos] = process.hrtime(); - const now: Timestamp = {seconds: currentSeconds, nanos: currentNanos}; + const now: Timestamp = timestampFromMillis(Date.now()); switch (type) { case MetricDescriptorType.GAUGE_INT64: @@ -215,9 +215,8 @@ export class BaseView implements View { startTimestamp = null; break; default: - const [seconds, nanos] = process.hrtime(); // TODO (mayurkale): This should be set when create Cumulative view. - startTimestamp = {seconds, nanos}; + startTimestamp = timestampFromMillis(Date.now()); } const timeseries: TimeSeries[] = []; diff --git a/packages/opencensus-core/test/test-derived-gauge.ts b/packages/opencensus-core/test/test-derived-gauge.ts index bffcf65d2..d696a045e 100644 --- a/packages/opencensus-core/test/test-derived-gauge.ts +++ b/packages/opencensus-core/test/test-derived-gauge.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {DerivedGauge} from '../src/metrics/gauges/derived-gauge'; const METRIC_NAME = 'metric-name'; @@ -28,8 +28,14 @@ const LABEL_VALUES_200: LabelValue[] = [{value: '200'}]; const LABEL_VALUES_400: LabelValue[] = [{value: '400'}]; const LABEL_VALUES_EXRTA: LabelValue[] = [{value: '200'}, {value: '400'}]; +function mockDateNow() { + // mock now = Thu 3 January 2019 + return 1546540757282; +} + describe('DerivedGauge', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let instance: DerivedGauge; const expectedMetricDescriptor = { name: METRIC_NAME, @@ -42,11 +48,12 @@ describe('DerivedGauge', () => { beforeEach(() => { instance = new DerivedGauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); describe('createTimeSeries()', () => { @@ -80,7 +87,11 @@ describe('DerivedGauge', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 2, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 2, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); // add data in collection map.set('key2', 'value2'); @@ -98,11 +109,19 @@ describe('DerivedGauge', () => { assert.deepStrictEqual(metric.timeseries, [ { labelValues: LABEL_VALUES_200, - points: [{value: 4, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 4, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }, { labelValues: LABEL_VALUES_400, - points: [{value: 5, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 5, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] } ]); }); @@ -121,7 +140,11 @@ describe('DerivedGauge', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 45, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 45, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); it('should return a Metric (Double) - custom object', () => { @@ -147,7 +170,11 @@ describe('DerivedGauge', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 0.7, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 0.7, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); it('should throw an error when obj is null', () => { @@ -166,7 +193,11 @@ describe('DerivedGauge', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 1, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 1, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); // create timeseries with same labels. diff --git a/packages/opencensus-core/test/test-gauge.ts b/packages/opencensus-core/test/test-gauge.ts index 57faa5c2c..3e8e187c0 100644 --- a/packages/opencensus-core/test/test-gauge.ts +++ b/packages/opencensus-core/test/test-gauge.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {Gauge} from '../src/metrics/gauges/gauge'; const METRIC_NAME = 'metric-name'; @@ -31,8 +31,14 @@ const UNSET_LABEL_VALUE: LabelValue = { value: null }; +function mockDateNow() { + // mock now = Thu 3 January 2019 + return 1546540757282; +} + describe('GAUGE_INT64', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let instance: Gauge; const expectedMetricDescriptor = { name: METRIC_NAME, @@ -45,11 +51,12 @@ describe('GAUGE_INT64', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); describe('getOrCreateTimeSeries()', () => { @@ -81,7 +88,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 10, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); // add value and create new timeseries. point.add(5); @@ -93,11 +104,19 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual(metric.timeseries, [ { labelValues: LABEL_VALUES_200, - points: [{value: 15, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 15, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }, { labelValues: LABEL_VALUES_400, - points: [{value: -8, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: -8, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] } ]); }); @@ -111,7 +130,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 10, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); @@ -122,7 +145,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: LABEL_VALUES_200, - points: [{value: 40, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 40, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); }); @@ -137,7 +164,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: [UNSET_LABEL_VALUE], - points: [{value: 10, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); it('should return same timeseries for interchanged labels', () => { @@ -169,7 +200,11 @@ describe('GAUGE_INT64', () => { metric.timeseries, [{ labelValues: [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], - points: [{value: 200, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 200, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); it('should use previously created default timeseries', () => { @@ -182,7 +217,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: [UNSET_LABEL_VALUE], - points: [{value: 300, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 300, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); @@ -194,7 +233,11 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual( metric.timeseries, [{ labelValues: [UNSET_LABEL_VALUE], - points: [{value: 700, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 700, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }]); }); }); @@ -233,7 +276,8 @@ describe('GAUGE_INT64', () => { }); describe('GAUGE_DOUBLE', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let instance: Gauge; const expectedMetricDescriptor = { name: METRIC_NAME, @@ -246,11 +290,12 @@ describe('GAUGE_DOUBLE', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_DOUBLE, LABEL_KEYS); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); describe('getOrCreateTimeSeries()', () => { @@ -279,11 +324,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{value: 10.34, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 10.34, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // add value and create new timeseries. point.add(5.12); const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_400); @@ -293,11 +342,19 @@ describe('GAUGE_DOUBLE', () => { assert.deepStrictEqual(metric.timeseries, [ { labelValues: LABEL_VALUES_200, - points: [{value: 15.46, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: 15.46, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] }, { labelValues: LABEL_VALUES_400, - points: [{value: -8.3, timestamp: {nanos: 1e7, seconds: 1000}}] + points: [{ + value: -8.3, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] } ]); }); @@ -308,22 +365,30 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{value: 12.1, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 12.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point1.add(30.18); metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{value: 42.28, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 42.28, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); }); describe('getDefaultTimeSeries()', () => { @@ -334,11 +399,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{value: 10.1, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 10.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); it('should use previously created default timeseries', () => { const point = instance.getDefaultTimeSeries(); @@ -347,11 +416,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{value: 300.1, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 300.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); point1.add(400.1); @@ -359,11 +432,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{value: 700.2, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 700.2, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); it('should create same labelValues as labelKeys', () => { instance = @@ -378,12 +455,16 @@ describe('GAUGE_DOUBLE', () => { assert.deepStrictEqual(metric.descriptor.labelKeys.length, 3); assert.deepStrictEqual(metric.descriptor.type, 2); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: - [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], - points: [{value: 10.1, timestamp: {nanos: 1e7, seconds: 1000}}], - }]); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: + [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], + points: [{ + value: 10.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); }); describe('removeTimeSeries()', () => { diff --git a/packages/opencensus-core/test/test-metric-producer.ts b/packages/opencensus-core/test/test-metric-producer.ts index 0704e22ae..e5c293383 100644 --- a/packages/opencensus-core/test/test-metric-producer.ts +++ b/packages/opencensus-core/test/test-metric-producer.ts @@ -19,16 +19,23 @@ import {AggregationType, Measurement, MeasureUnit, Stats, Tags, View} from '../s import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {MetricProducerForStats} from '../src/stats/metric-producer'; + +function mockDateNow() { + // mock now = Thu 3 January 2019 + return 1546540757282; +} + describe('Metric producer for stats', () => { - const {hrtime} = process; - const mockedTime: Timestamp = {nanos: 1e7, seconds: 1000}; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; before(() => { - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); after(() => { - process.hrtime = hrtime; + Date.now = originalDateNow; }); const stats = new Stats(); diff --git a/packages/opencensus-core/test/test-metric-registry.ts b/packages/opencensus-core/test/test-metric-registry.ts index 8cf62757f..2c8106b39 100644 --- a/packages/opencensus-core/test/test-metric-registry.ts +++ b/packages/opencensus-core/test/test-metric-registry.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {MetricRegistry} from '../src/metrics/metric-registry'; import {MeasureUnit} from '../src/stats/types'; @@ -28,17 +28,24 @@ const LABEL_KEYS_WITH_NULL: LabelKey[] = const LABEL_VALUES_200: LabelValue[] = [{value: '200'}]; const LABEL_VALUES_400: LabelValue[] = [{value: '400'}]; +function mockDateNow() { + // mock now = Thu 3 January 2019 + return 1546540757282; +} + describe('addInt64Gauge', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let registry: MetricRegistry; beforeEach(() => { registry = new MetricRegistry(); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -109,21 +116,25 @@ describe('addInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 100); - assert.deepStrictEqual(point.timestamp, {seconds: 1000, nanos: 1e7}); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); }); describe('addDoubleGauge', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let registry: MetricRegistry; beforeEach(() => { registry = new MetricRegistry(); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -197,7 +208,9 @@ describe('addDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.deepStrictEqual(point.timestamp, {seconds: 1000, nanos: 1e7}); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -210,16 +223,18 @@ describe('addDoubleGauge', () => { }); describe('addDerivedInt64Gauge', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let registry: MetricRegistry; beforeEach(() => { registry = new MetricRegistry(); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -295,7 +310,9 @@ describe('addDerivedInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 2); - assert.deepStrictEqual(point.timestamp, {seconds: 1000, nanos: 1e7}); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -309,16 +326,18 @@ describe('addDerivedInt64Gauge', () => { }); describe('addDerivedDoubleGauge', () => { - const oldProcessHrtime = process.hrtime; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; let registry: MetricRegistry; beforeEach(() => { registry = new MetricRegistry(); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); afterEach(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -397,7 +416,9 @@ describe('addDerivedDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.deepStrictEqual(point.timestamp, {seconds: 1000, nanos: 1e7}); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -411,16 +432,17 @@ describe('addDerivedDoubleGauge', () => { }); describe('Add multiple gauges', () => { - const oldProcessHrtime = process.hrtime; + let originalDateNow = Date.now; let registry: MetricRegistry; before(() => { registry = new MetricRegistry(); - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); after(() => { - process.hrtime = oldProcessHrtime; + Date.now = originalDateNow; }); it('should return metrics', () => { diff --git a/packages/opencensus-core/test/test-view.ts b/packages/opencensus-core/test/test-view.ts index f557f25b0..c5e20ea8a 100644 --- a/packages/opencensus-core/test/test-view.ts +++ b/packages/opencensus-core/test/test-view.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import {BaseView} from '../src'; -import {DistributionValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {DistributionValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {AggregationType, DistributionData, Measure, Measurement, MeasureType, MeasureUnit, Tags, View} from '../src/stats/types'; /** The order of how close values must be to be considerated almost equal */ @@ -80,6 +80,11 @@ function assertView( } } +function mockDateNow() { + // mock now = Thu 3 January 2019 + return 1546540757282; +} + describe('BaseView', () => { const measure: Measure = { name: 'Test Measure', @@ -166,7 +171,7 @@ describe('BaseView', () => { 'test/view/name', measure, AggregationType.LAST_VALUE, ['testKey1', 'testKey2'], 'description test'); - it('should not record a measurement when it has wrong tag keys', () => { + it('should not record a measurement when it have wrong tag keys', () => { const measurement = {measure, tags: {testKey3: 'testValue'}, value: 10}; view.recordMeasurement(measurement); assert.ok(!view.getSnapshot(measurement.tags)); @@ -182,7 +187,7 @@ describe('BaseView', () => { assert.ok(!view.getSnapshot(measurement.tags)); }); - it('should not record a measurement when it has not enough tag keys', + it('should not record a measurement when it have not enough tag keys', () => { const measurement = { measure, @@ -195,15 +200,15 @@ describe('BaseView', () => { }); describe('getMetric()', () => { - const {hrtime} = process; - process.hrtime = () => [1000, 1e7]; + const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; + let originalDateNow = Date.now; const measurementValues = [1.1, 2.3, 3.2, 4.3, 5.2]; const buckets = [2, 4, 6]; const tags: Tags = {testKey1: 'testValue', testKey2: 'testValue'}; const tags1: Tags = {testKey1: 'testValue1', testKey2: 'testValue1'}; after(() => { - process.hrtime = hrtime; + Date.now = originalDateNow; }); for (const aggregationTestCase of aggregationTestCases) { @@ -217,12 +222,13 @@ describe('BaseView', () => { const {descriptor, timeseries} = view.getMetric(); before(() => { - process.hrtime = () => [1000, 1e7]; + originalDateNow = Date.now; + Date.now = mockDateNow; }); describe( `Aggregation type: ${aggregationTestCase.aggregationType}`, () => { - it('should has descriptor', () => { + it('should have descriptor', () => { assert.ok(descriptor); assert.deepStrictEqual(descriptor, { description: 'description test', @@ -240,26 +246,27 @@ describe('BaseView', () => { if (aggregationTestCase.metricDescriptorType === MetricDescriptorType.GAUGE_INT64) { - it('GAUGE_INT64 shouldnt has timeseries startTimestamp', () => { + it('GAUGE_INT64 shouldnt have timeseries startTimestamp', () => { assert.strictEqual(startTimestamp, undefined); }); } else if ( aggregationTestCase.metricDescriptorType === MetricDescriptorType.GAUGE_DOUBLE) { - it('GAUGE_DOUBLE shouldnt has timeseries startTimestamp', () => { + it('GAUGE_DOUBLE shouldnt have timeseries startTimestamp', () => { assert.strictEqual(startTimestamp, undefined); }); } else { - it('shouldnt has timeseries startTimestamp', () => { + it('shouldnt have timeseries startTimestamp', () => { assert.ok(startTimestamp); assert.equal(typeof startTimestamp.nanos, 'number'); - assert.strictEqual(startTimestamp.nanos, 1e7); + // assert.strictEqual(startTimestamp.nanos, mockedTime.nanos); assert.equal(typeof startTimestamp.seconds, 'number'); - assert.strictEqual(startTimestamp.seconds, 1000); + // assert.strictEqual(startTimestamp.seconds, + // mockedTime.seconds); }); } - it('should has labelValues', () => { + it('should have labelValues', () => { assert.ok(labelValues); assert.deepStrictEqual( labelValues, [{value: 'testValue'}, {value: 'testValue'}]); @@ -286,9 +293,9 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, 1e7); + assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, 1000); + assert.strictEqual(timestamp.seconds, mockedTime.seconds); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -328,9 +335,9 @@ describe('BaseView', () => { let {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, 1e7); + assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, 1000); + assert.strictEqual(timestamp.seconds, mockedTime.seconds); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -347,9 +354,9 @@ describe('BaseView', () => { ({timestamp, value} = point); assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, 1e7); + assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, 1000); + assert.strictEqual(timestamp.seconds, mockedTime.seconds); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -381,9 +388,9 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, 1e7); + assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, 1000); + assert.strictEqual(timestamp.seconds, mockedTime.seconds); assert.equal(typeof value, 'number'); assert.strictEqual(value, 5); }); @@ -408,9 +415,9 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, 1e7); + assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, 1000); + assert.strictEqual(timestamp.seconds, mockedTime.seconds); assert.equal(typeof value, 'number'); assert.strictEqual(value, total); }); @@ -431,7 +438,8 @@ describe('BaseView', () => { assert.ok(points); const [point] = points; const {timestamp, value} = point; - assert.deepStrictEqual(timestamp, {nanos: 1e7, seconds: 1000}); + assert.deepStrictEqual( + timestamp, {nanos: mockedTime.nanos, seconds: mockedTime.seconds}); assert.equal(typeof value, 'number'); assert.strictEqual( value, measurementValues[measurementValues.length - 1]); From 9a2fc3b7fbae60d0720b60996e6911532929c2c8 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Mon, 7 Jan 2019 15:54:22 -0800 Subject: [PATCH 2/3] Construct Timestamp from Date.now and Process.hrtime --- packages/opencensus-core/package-lock.json | 899 +++++------------- packages/opencensus-core/package.json | 3 +- .../opencensus-core/src/common/time-util.ts | 39 +- .../src/metrics/gauges/derived-gauge.ts | 4 +- .../src/metrics/gauges/gauge.ts | 4 +- packages/opencensus-core/src/stats/view.ts | 6 +- .../test/test-derived-gauge.ts | 100 +- packages/opencensus-core/test/test-gauge.ts | 298 +++--- .../test/test-metric-producer.ts | 77 +- .../test/test-metric-registry.ts | 71 +- .../opencensus-core/test/test-time-util.ts | 27 + packages/opencensus-core/test/test-view.ts | 48 +- 12 files changed, 485 insertions(+), 1091 deletions(-) create mode 100644 packages/opencensus-core/test/test-time-util.ts diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json index 39bb2197a..d702e0ea2 100644 --- a/packages/opencensus-core/package-lock.json +++ b/packages/opencensus-core/package-lock.json @@ -1,14 +1,11 @@ { - "name": "@opencensus/core", - "version": "0.0.8", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, "requires": { "@babel/highlight": "^7.0.0" } @@ -17,7 +14,6 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", - "dev": true, "requires": { "@babel/types": "^7.2.2", "jsesc": "^2.5.1", @@ -29,8 +25,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -38,7 +33,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.0.0", "@babel/template": "^7.1.0", @@ -49,7 +43,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -58,7 +51,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "dev": true, "requires": { "@babel/types": "^7.0.0" } @@ -67,7 +59,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -77,22 +68,19 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" } } }, "@babel/parser": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.2.tgz", - "integrity": "sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA==", - "dev": true + "integrity": "sha512-UNTmQ5cSLDeBGBl+s7JeowkqIHgmFAGBnLDdIzFmUNSuS5JF0XBcN59jsh/vJO/YjfsBqMxhMjoFGmNExmf0FA==" }, "@babel/template": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.2.2", @@ -103,7 +91,6 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.2.tgz", "integrity": "sha512-E5Bn9FSwHpSkUhthw/XEuvFZxIgrqb9M8cX8j5EUQtrUG5DQUy6bFyl7G7iQ1D1Czudor+xkmp81JbLVVM0Sjg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.2.2", @@ -120,7 +107,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -128,8 +114,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -137,7 +122,6 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", - "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.10", @@ -148,7 +132,6 @@ "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": "*" } @@ -156,38 +139,32 @@ "@types/mocha": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==" }, "@types/node": { "version": "10.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", - "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==", - "dev": true + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==" }, "@types/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@types/once/-/once-1.4.0.tgz", - "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==", - "dev": true + "integrity": "sha512-cnEvTAVVRqF6OQg/4SLnbxQ0slZJHqZQDve5BzGhcIQtuMpPv8T5QNS2cBPa/W0jTxciqwn7bmJAIGe/bOJ5Kw==" }, "@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/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": "*" } @@ -196,7 +173,6 @@ "version": "6.6.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -208,7 +184,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.0.0" } @@ -216,20 +191,17 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "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=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -238,7 +210,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.2" } @@ -246,26 +217,22 @@ "argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", - "dev": true + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=" }, "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=" }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -273,14 +240,12 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { "version": "1.5.2", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-listener": { "version": "0.6.9", @@ -294,26 +259,22 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "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", @@ -323,20 +284,17 @@ "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": "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.2", @@ -349,7 +307,6 @@ "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -357,36 +314,27 @@ "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=" }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, - "big-integer": { - "version": "1.6.40", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.40.tgz", - "integrity": "sha512-CjhtJp0BViLzP1ZkEnoywjgtFQXS2pomKjAJtIISTCnuHILkLcAXLdFLG/nxsHc4s9kJfc+82Xpg8WNyhfACzQ==" - }, "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.0.0", @@ -401,7 +349,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" @@ -410,32 +357,27 @@ "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==" }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "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": { "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=" }, "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", @@ -445,20 +387,17 @@ "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "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", @@ -468,14 +407,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" } @@ -485,20 +422,17 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, "clang-format": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.3.tgz", "integrity": "sha512-x90Hac4ERacGDcZSvHKK58Ga0STuMD+Doi5g0iG2zf7wlJef5Huvhs/3BvMRFxwRYyYSdl6mpQNrtfMxE8MQzw==", - "dev": true, "requires": { "async": "^1.5.2", "glob": "^7.0.0", @@ -508,14 +442,12 @@ "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" } @@ -523,14 +455,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=" }, "codecov": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.1.0.tgz", "integrity": "sha512-aWQc/rtHbcWEQLka6WmBAOpV58J2TwyXqlpAQGhQaSiEUoigTTUk6lLd2vB3kXkhnDyzyH74RXfmV4dq2txmdA==", - "dev": true, "requires": { "argv": "^0.0.2", "ignore-walk": "^3.0.1", @@ -543,7 +473,6 @@ "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.1" } @@ -551,14 +480,12 @@ "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=" }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -566,20 +493,17 @@ "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.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -601,14 +525,12 @@ "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 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "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" } @@ -617,7 +539,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.0.1", "shebang-command": "^1.2.0", @@ -627,14 +548,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.1" } @@ -643,7 +562,6 @@ "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" } @@ -652,7 +570,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -660,14 +577,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.1.0", "map-obj": "^1.0.0" @@ -676,34 +591,29 @@ "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.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "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 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "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==" }, "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.0" } @@ -711,14 +621,12 @@ "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=" }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -735,14 +643,12 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -750,26 +656,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.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "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.0.1", "get-stream": "^3.0.0", @@ -783,14 +685,12 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "external-editor": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -800,26 +700,22 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "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 + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "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" } @@ -828,7 +724,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" } @@ -836,14 +731,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -853,20 +746,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=" }, "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" } @@ -875,7 +765,6 @@ "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.4", @@ -889,7 +778,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.4" } @@ -897,14 +785,12 @@ "globals": { "version": "11.9.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" }, "got": { "version": "6.7.1", "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -922,20 +808,17 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "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.9.0", "resolved": "https://registry.npmjs.org/gts/-/gts-0.9.0.tgz", "integrity": "sha512-Id2Vmg0xNU1FODc0AwmaFA1h0+h6V9/zBqu4NfT8FucVOVEP7pyJ16btyHfSH/UdzTCXjV1fq+fNBEgx/50EaA==", - "dev": true, "requires": { "chalk": "^2.4.1", "clang-format": "1.2.3", @@ -954,7 +837,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -964,14 +846,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.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -981,14 +861,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -998,7 +876,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.0.0" }, @@ -1006,34 +883,29 @@ "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=" } } }, "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=" }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, "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.2.2", @@ -1044,7 +916,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1053,7 +924,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -1061,26 +931,22 @@ "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.3.0", "wrappy": "1" @@ -1089,20 +955,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": "6.2.1", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -1123,7 +986,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", - "dev": true, "requires": { "lodash.toarray": "^3.0.0" } @@ -1131,14 +993,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.0.0" } @@ -1147,7 +1007,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, "requires": { "ci-info": "^1.5.0" } @@ -1155,14 +1014,12 @@ "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=" }, "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.0", "is-path-inside": "^1.0.0" @@ -1171,20 +1028,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.1" } @@ -1192,62 +1046,52 @@ "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=" }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "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=" }, "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-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", - "dev": true + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==" }, "istanbul-lib-instrument": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", - "dev": true, "requires": { "@babel/generator": "^7.0.0", "@babel/parser": "^7.0.0", @@ -1261,14 +1105,12 @@ "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.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1277,44 +1119,37 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "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 + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "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 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "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", @@ -1326,7 +1161,6 @@ "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.0" } @@ -1335,7 +1169,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.2", "parse-json": "^4.0.0", @@ -1346,8 +1179,7 @@ "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=" } } }, @@ -1355,7 +1187,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" @@ -1364,44 +1195,37 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash._arraycopy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true + "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=", - "dev": true + "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=", - "dev": true + "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=", - "dev": true + "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=", - "dev": true + "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=", - "dev": true, "requires": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", @@ -1412,7 +1236,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", - "dev": true, "requires": { "lodash._arraycopy": "^3.0.0", "lodash._basevalues": "^3.0.0", @@ -1428,7 +1251,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.0" @@ -1437,14 +1259,12 @@ "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 + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -1454,7 +1274,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { "pify": "^3.0.0" }, @@ -1462,28 +1281,24 @@ "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=" } } }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" }, "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": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "dev": true, "requires": { "camelcase-keys": "^4.0.0", "decamelize-keys": "^1.0.0", @@ -1499,14 +1314,12 @@ "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" }, "mime-types": { "version": "2.1.21", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -1514,14 +1327,12 @@ "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.7" } @@ -1529,14 +1340,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" @@ -1546,7 +1355,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" } @@ -1555,7 +1363,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", @@ -1572,26 +1379,22 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "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 + "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.1.4", "is-builtin-module": "^1.0.0", @@ -1603,7 +1406,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.0" } @@ -1612,7 +1414,6 @@ "version": "13.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", - "dev": true, "requires": { "archy": "^1.0.0", "arrify": "^1.0.1", @@ -1644,7 +1445,7 @@ "align-text": { "version": "0.1.4", "bundled": true, - "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -1653,46 +1454,38 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "ansi-regex": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "append-transform": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "default-require-extensions": "^2.0.0" } }, "archy": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "arrify": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "async": { "version": "1.5.2", - "bundled": true, - "dev": true + "bundled": true }, "balanced-match": { "version": "1.0.0", - "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" @@ -1700,13 +1493,11 @@ }, "builtin-modules": { "version": "1.1.1", - "bundled": true, - "dev": true + "bundled": true }, "caching-transform": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "make-dir": "^1.0.0", "md5-hex": "^2.0.0", @@ -1717,13 +1508,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.3", @@ -1733,7 +1522,6 @@ "cliui": { "version": "2.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "center-align": "^0.1.1", @@ -1744,30 +1532,25 @@ "wordwrap": { "version": "0.0.2", "bundled": true, - "dev": true, "optional": true } } }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "commondir": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "convert-source-map": { "version": "1.6.0", "bundled": true, - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -1775,7 +1558,6 @@ "cross-spawn": { "version": "4.0.2", "bundled": true, - "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -1784,25 +1566,21 @@ "debug": { "version": "3.1.0", "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 }, "default-require-extensions": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "strip-bom": "^3.0.0" } @@ -1810,20 +1588,17 @@ "error-ex": { "version": "1.3.2", "bundled": true, - "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es6-error": { "version": "4.1.1", - "bundled": true, - "dev": true + "bundled": true }, "execa": { "version": "0.7.0", "bundled": true, - "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -1837,7 +1612,6 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -1849,7 +1623,6 @@ "find-cache-dir": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^1.0.0", @@ -1859,7 +1632,6 @@ "find-up": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -1867,7 +1639,6 @@ "foreground-child": { "version": "1.5.6", "bundled": true, - "dev": true, "requires": { "cross-spawn": "^4", "signal-exit": "^3.0.0" @@ -1875,23 +1646,19 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "get-caller-file": { "version": "1.0.3", - "bundled": true, - "dev": true + "bundled": true }, "get-stream": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "glob": { "version": "7.1.3", "bundled": true, - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1903,13 +1670,11 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "dev": true + "bundled": true }, "handlebars": { "version": "4.0.11", "bundled": true, - "dev": true, "requires": { "async": "^1.4.0", "optimist": "^0.6.1", @@ -1920,7 +1685,6 @@ "source-map": { "version": "0.4.4", "bundled": true, - "dev": true, "requires": { "amdefine": ">=0.0.4" } @@ -1929,23 +1693,19 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "hosted-git-info": { "version": "2.7.1", - "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.3.0", "wrappy": "1" @@ -1953,56 +1713,47 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "invert-kv": { "version": "1.0.0", - "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 + "optional": true }, "is-builtin-module": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "builtin-modules": "^1.0.0" } }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "is-stream": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "isexe": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-coverage": { "version": "2.0.1", - "bundled": true, - "dev": true + "bundled": true }, "istanbul-lib-hook": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "append-transform": "^1.0.0" } @@ -2010,7 +1761,6 @@ "istanbul-lib-report": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", "make-dir": "^1.3.0", @@ -2020,7 +1770,6 @@ "istanbul-lib-source-maps": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "debug": "^3.1.0", "istanbul-lib-coverage": "^2.0.1", @@ -2031,28 +1780,25 @@ "dependencies": { "source-map": { "version": "0.6.1", - "bundled": true, - "dev": true + "bundled": true } } }, "istanbul-reports": { "version": "2.0.1", "bundled": true, - "dev": true, "requires": { "handlebars": "^4.0.11" } }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "kind-of": { "version": "3.2.2", "bundled": true, - "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -2060,13 +1806,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" } @@ -2074,7 +1818,6 @@ "load-json-file": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -2085,7 +1828,6 @@ "locate-path": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -2093,18 +1835,16 @@ }, "lodash.flattendeep": { "version": "4.4.0", - "bundled": true, - "dev": true + "bundled": true }, "longest": { "version": "1.0.1", "bundled": true, - "dev": true + "optional": true }, "lru-cache": { "version": "4.1.3", "bundled": true, - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -2113,7 +1853,6 @@ "make-dir": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "pify": "^3.0.0" } @@ -2121,20 +1860,17 @@ "md5-hex": { "version": "2.0.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.0.0" } @@ -2142,60 +1878,51 @@ "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 } } }, "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.7" } }, "minimist": { "version": "0.0.10", - "bundled": true, - "dev": true + "bundled": true }, "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true } } }, "ms": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "normalize-package-data": { "version": "2.4.0", "bundled": true, - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -2206,20 +1933,17 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, - "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1" } @@ -2227,7 +1951,6 @@ "optimist": { "version": "0.6.1", "bundled": true, - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -2235,13 +1958,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", @@ -2250,13 +1971,11 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "p-limit": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -2264,20 +1983,17 @@ "p-locate": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "package-hash": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.11", "lodash.flattendeep": "^4.4.0", @@ -2288,7 +2004,6 @@ "parse-json": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -2296,49 +2011,41 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "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-type": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "pify": "^3.0.0" } }, "pify": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "pkg-dir": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "find-up": "^3.0.0" } }, "pseudomap": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "read-pkg": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -2348,7 +2055,6 @@ "read-pkg-up": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "find-up": "^3.0.0", "read-pkg": "^3.0.0" @@ -2357,7 +2063,6 @@ "release-zalgo": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "es6-error": "^4.0.1" } @@ -2365,27 +2070,23 @@ "repeat-string": { "version": "1.6.1", "bundled": true, - "dev": true + "optional": true }, "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": "4.0.0", - "bundled": true, - "dev": true + "bundled": true }, "right-align": { "version": "0.1.3", "bundled": true, - "dev": true, "optional": true, "requires": { "align-text": "^0.1.1" @@ -2394,54 +2095,45 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.1.2", - "bundled": true, - "dev": true + "bundled": true }, "semver": { "version": "5.5.0", - "bundled": true, - "dev": true + "bundled": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, - "dev": true + "bundled": true }, "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 }, "source-map": { "version": "0.5.7", "bundled": true, - "dev": true, "optional": true }, "spawn-wrap": { "version": "1.4.2", "bundled": true, - "dev": true, "requires": { "foreground-child": "^1.5.6", "mkdirp": "^0.5.0", @@ -2454,7 +2146,6 @@ "spdx-correct": { "version": "3.0.0", "bundled": true, - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -2462,13 +2153,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" @@ -2476,13 +2165,11 @@ }, "spdx-license-ids": { "version": "3.0.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" @@ -2491,25 +2178,21 @@ "strip-ansi": { "version": "4.0.0", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "3.0.0", - "bundled": true, - "dev": true + "bundled": true }, "strip-eof": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "supports-color": { "version": "5.4.0", "bundled": true, - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -2517,7 +2200,6 @@ "test-exclude": { "version": "5.0.0", "bundled": true, - "dev": true, "requires": { "arrify": "^1.0.1", "minimatch": "^3.0.4", @@ -2528,7 +2210,6 @@ "uglify-js": { "version": "2.8.29", "bundled": true, - "dev": true, "optional": true, "requires": { "source-map": "~0.5.1", @@ -2539,7 +2220,6 @@ "yargs": { "version": "3.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "camelcase": "^1.0.2", @@ -2553,18 +2233,15 @@ "uglify-to-browserify": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "uuid": { "version": "3.3.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" @@ -2573,31 +2250,26 @@ "which": { "version": "1.3.1", "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.1", "strip-ansi": "^3.0.1" @@ -2605,13 +2277,11 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2619,7 +2289,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2629,7 +2298,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2638,13 +2306,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "write-file-atomic": { "version": "2.3.0", "bundled": true, - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -2653,18 +2319,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.1.1", @@ -2683,7 +2346,6 @@ "cliui": { "version": "4.1.0", "bundled": true, - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -2693,7 +2355,6 @@ "find-up": { "version": "2.1.0", "bundled": true, - "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -2701,7 +2362,6 @@ "locate-path": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -2710,7 +2370,6 @@ "p-limit": { "version": "1.3.0", "bundled": true, - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -2718,30 +2377,26 @@ "p-locate": { "version": "2.0.0", "bundled": true, - "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true } } }, "yargs-parser": { "version": "9.0.2", "bundled": true, - "dev": true, "requires": { "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { "version": "4.1.0", - "bundled": true, - "dev": true + "bundled": true } } } @@ -2750,14 +2405,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2766,7 +2419,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.0.0" } @@ -2774,20 +2426,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.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -2796,7 +2445,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.1.0" } @@ -2804,14 +2452,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.0.1", @@ -2823,7 +2469,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" @@ -2832,38 +2477,32 @@ "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.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "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" }, @@ -2871,64 +2510,54 @@ "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=" } } }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "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=" }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "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.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -2939,8 +2568,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=" } } }, @@ -2948,7 +2576,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.3.2", @@ -2959,7 +2586,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.0.0", "read-pkg": "^3.0.0" @@ -2969,7 +2595,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.0.0", "strip-indent": "^2.0.0" @@ -2979,7 +2604,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.1.6", "safe-buffer": "^5.0.1" @@ -2989,7 +2613,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.0.1" } @@ -2998,7 +2621,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -3025,8 +2647,7 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" } } }, @@ -3034,7 +2655,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -3043,7 +2663,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.0", "signal-exit": "^3.0.2" @@ -3053,7 +2672,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.0.5" } @@ -3062,7 +2680,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" } @@ -3071,7 +2688,6 @@ "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -3079,14 +2695,12 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { "version": "5.5.0", @@ -3097,7 +2711,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.0.3" } @@ -3106,7 +2719,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" } @@ -3114,8 +2726,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", @@ -3125,20 +2736,17 @@ "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": { "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-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3148,7 +2756,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -3157,14 +2764,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "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" @@ -3173,20 +2778,17 @@ "spdx-license-ids": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", - "dev": true + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" }, "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=" }, "sshpk": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -3203,7 +2805,6 @@ "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" @@ -3213,7 +2814,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" } @@ -3224,7 +2824,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, "requires": { "ansi-regex": "^4.0.0" }, @@ -3232,40 +2831,34 @@ "ansi-regex": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "dev": true + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" } } }, "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" } @@ -3274,7 +2867,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" } @@ -3282,20 +2874,17 @@ "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=" }, "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=" }, "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" } @@ -3303,14 +2892,12 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -3319,28 +2906,24 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, "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=" }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -3355,22 +2938,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=" } } }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { "version": "5.11.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", - "dev": true, "requires": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", @@ -3389,8 +2969,7 @@ "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" } } }, @@ -3398,7 +2977,6 @@ "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, "requires": { "tslib": "^1.8.1" } @@ -3407,7 +2985,6 @@ "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.0.1" } @@ -3415,20 +2992,17 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" }, "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" } @@ -3436,14 +3010,12 @@ "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=" }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -3461,7 +3033,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -3470,7 +3041,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.1" } @@ -3478,8 +3048,7 @@ "urlgrey": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", - "dev": true + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=" }, "uuid": { "version": "3.2.1", @@ -3490,7 +3059,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -3500,7 +3068,6 @@ "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", @@ -3511,7 +3078,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -3520,7 +3086,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, "requires": { "string-width": "^2.1.1" } @@ -3528,14 +3093,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", @@ -3545,20 +3108,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=" }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -3566,8 +3126,7 @@ "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 29e7aeeb3..6ae552c73 100644 --- a/packages/opencensus-core/package.json +++ b/packages/opencensus-core/package.json @@ -61,7 +61,6 @@ "log-driver": "^1.2.7", "semver": "^5.5.0", "shimmer": "^1.2.0", - "uuid": "^3.2.1", - "big-integer": "^1.6.16" + "uuid": "^3.2.1" } } diff --git a/packages/opencensus-core/src/common/time-util.ts b/packages/opencensus-core/src/common/time-util.ts index ea3178be0..65b89e02f 100644 --- a/packages/opencensus-core/src/common/time-util.ts +++ b/packages/opencensus-core/src/common/time-util.ts @@ -13,28 +13,35 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as BigInt from 'big-integer'; + import {Timestamp} from '../metrics/export/types'; const MILLIS_PER_SECOND = 1e3; -const NANOS_PER_MILLI = 1e6; +const NANOS_PER_MILLI = 1e3 * 1e3; +const NANOS_PER_SECOND = 1e3 * 1e3 * 1e3; + +const hrtime = process.hrtime; +const origin = hrtime(); + +const refTime = Date.now(); +const startSecs = Math.floor(refTime / MILLIS_PER_SECOND); +const startNanos = (refTime % MILLIS_PER_SECOND) * NANOS_PER_MILLI; /** - * Creates a new timestamp from the given milliseconds. + * Gets the current timestamp with seconds and nanoseconds. * - * @param {number} epochMilli the timestamp represented in milliseconds since - * epoch. - * @returns {Timestamp} new timestamp with specified fields. + * @returns {Timestamp} The Timestamp. */ -export function timestampFromMillis(epochMilli: number): Timestamp { - return {seconds: seconds(epochMilli), nanos: nanos(epochMilli)}; -} +export function getTimestampWithProcessHRTime(): Timestamp { + const [offsetSecs, offsetNanos] = hrtime(origin); // [seconds, nanoseconds] -const seconds = (epochMilli: number): number => { - return Number(BigInt(epochMilli).divide(MILLIS_PER_SECOND).toString()); -}; + // determine drfit in seconds and nanoseconds + const seconds = startSecs + offsetSecs; + const nanos = startNanos + offsetNanos; -const nanos = (epochMilli: number): number => { - const mos = epochMilli - seconds(epochMilli) * MILLIS_PER_SECOND; - return Number(BigInt(mos).times(NANOS_PER_MILLI).toString()); -}; + // if nanos excess NANOS_PER_SECOND value. + if (nanos >= NANOS_PER_SECOND) { + return {seconds: seconds + 1, nanos: nanos % NANOS_PER_SECOND}; + } + return {seconds, nanos}; +} diff --git a/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts b/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts index 0a9ede237..ed270f9e0 100644 --- a/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts +++ b/packages/opencensus-core/src/metrics/gauges/derived-gauge.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {timestampFromMillis} from '../../common/time-util'; +import {getTimestampWithProcessHRTime} from '../../common/time-util'; import {validateArrayElementsNotNull, validateNotNull} from '../../common/validations'; import {LabelKey, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, TimeSeries, Timestamp} from '../export/types'; import * as types from '../gauges/types'; @@ -205,7 +205,7 @@ export class DerivedGauge implements types.Meter { if (this.registeredPoints.size === 0) { return null; } - const timestamp: Timestamp = timestampFromMillis(Date.now()); + const timestamp: Timestamp = getTimestampWithProcessHRTime(); return { descriptor: this.metricDescriptor, timeseries: Array.from( diff --git a/packages/opencensus-core/src/metrics/gauges/gauge.ts b/packages/opencensus-core/src/metrics/gauges/gauge.ts index 1f45af514..7a0131f9e 100644 --- a/packages/opencensus-core/src/metrics/gauges/gauge.ts +++ b/packages/opencensus-core/src/metrics/gauges/gauge.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {timestampFromMillis} from '../../common/time-util'; +import {getTimestampWithProcessHRTime} from '../../common/time-util'; import {validateArrayElementsNotNull, validateNotNull} from '../../common/validations'; import {LabelKey, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, TimeSeries, Timestamp} from '../export/types'; import * as types from '../gauges/types'; @@ -130,7 +130,7 @@ export class Gauge implements types.Meter { if (this.registeredPoints.size === 0) { return null; } - const timestamp: Timestamp = timestampFromMillis(Date.now()); + const timestamp: Timestamp = getTimestampWithProcessHRTime(); return { descriptor: this.metricDescriptor, timeseries: Array.from( diff --git a/packages/opencensus-core/src/stats/view.ts b/packages/opencensus-core/src/stats/view.ts index e65c5571f..e1031561a 100644 --- a/packages/opencensus-core/src/stats/view.ts +++ b/packages/opencensus-core/src/stats/view.ts @@ -15,7 +15,7 @@ */ import * as defaultLogger from '../common/console-logger'; -import {timestampFromMillis} from '../common/time-util'; +import {getTimestampWithProcessHRTime} from '../common/time-util'; import * as loggerTypes from '../common/types'; import {DistributionValue, LabelValue, Metric, MetricDescriptor, MetricDescriptorType, Point, TimeSeries, Timestamp} from '../metrics/export/types'; @@ -207,7 +207,7 @@ export class BaseView implements View { let startTimestamp: Timestamp; // The moment when this point was recorded. - const now: Timestamp = timestampFromMillis(Date.now()); + const now: Timestamp = getTimestampWithProcessHRTime(); switch (type) { case MetricDescriptorType.GAUGE_INT64: @@ -216,7 +216,7 @@ export class BaseView implements View { break; default: // TODO (mayurkale): This should be set when create Cumulative view. - startTimestamp = timestampFromMillis(Date.now()); + startTimestamp = getTimestampWithProcessHRTime(); } const timeseries: TimeSeries[] = []; diff --git a/packages/opencensus-core/test/test-derived-gauge.ts b/packages/opencensus-core/test/test-derived-gauge.ts index d696a045e..45972365d 100644 --- a/packages/opencensus-core/test/test-derived-gauge.ts +++ b/packages/opencensus-core/test/test-derived-gauge.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; import {DerivedGauge} from '../src/metrics/gauges/derived-gauge'; const METRIC_NAME = 'metric-name'; @@ -28,15 +28,9 @@ const LABEL_VALUES_200: LabelValue[] = [{value: '200'}]; const LABEL_VALUES_400: LabelValue[] = [{value: '400'}]; const LABEL_VALUES_EXRTA: LabelValue[] = [{value: '200'}, {value: '400'}]; -function mockDateNow() { - // mock now = Thu 3 January 2019 - return 1546540757282; -} - describe('DerivedGauge', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let instance: DerivedGauge; + let now: number; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -48,12 +42,6 @@ describe('DerivedGauge', () => { beforeEach(() => { instance = new DerivedGauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); describe('createTimeSeries()', () => { @@ -80,19 +68,19 @@ describe('DerivedGauge', () => { map.set('key', 'value'); instance.createTimeSeries(LABEL_VALUES_200, map); map.set('key1', 'value1'); + + now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 2, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + + const [timeseries] = metric.timeseries; + const [points] = timeseries.points; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.equal(points.value, 2); + assert.equal(Math.floor(now / 1e3), points.timestamp.seconds); + assert.ok(points.timestamp.nanos > 0); // add data in collection map.set('key2', 'value2'); map.set('key3', 'value3'); @@ -106,24 +94,14 @@ describe('DerivedGauge', () => { metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 2); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 4, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }, - { - labelValues: LABEL_VALUES_400, - points: [{ - value: 5, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - } - ]); + + const [timeseries1, timeseries2] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries1.points[0].value, 4); + assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); + assert.deepStrictEqual(timeseries2.points[0].value, 5); + assert.deepStrictEqual( + timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); }); it('should return a Metric (INT64) - custom object', () => { class QueueManager { @@ -137,15 +115,13 @@ describe('DerivedGauge', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 45, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 45); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); it('should return a Metric (Double) - custom object', () => { class QueueManager { @@ -167,15 +143,9 @@ describe('DerivedGauge', () => { labelKeys: LABEL_KEYS }); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 0.7, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 0.7); }); it('should throw an error when obj is null', () => { assert.throws(() => { @@ -190,15 +160,9 @@ describe('DerivedGauge', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 1, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 1); // create timeseries with same labels. assert.throws(() => { diff --git a/packages/opencensus-core/test/test-gauge.ts b/packages/opencensus-core/test/test-gauge.ts index 3e8e187c0..f2206ea02 100644 --- a/packages/opencensus-core/test/test-gauge.ts +++ b/packages/opencensus-core/test/test-gauge.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; import {Gauge} from '../src/metrics/gauges/gauge'; const METRIC_NAME = 'metric-name'; @@ -31,15 +31,9 @@ const UNSET_LABEL_VALUE: LabelValue = { value: null }; -function mockDateNow() { - // mock now = Thu 3 January 2019 - return 1546540757282; -} - describe('GAUGE_INT64', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let instance: Gauge; + let now: number; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -51,12 +45,6 @@ describe('GAUGE_INT64', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); describe('getOrCreateTimeSeries()', () => { @@ -81,19 +69,17 @@ describe('GAUGE_INT64', () => { it('should return a Metric', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point.add(10); + + now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 10, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 10); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // add value and create new timeseries. point.add(5); const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_400); @@ -101,24 +87,14 @@ describe('GAUGE_INT64', () => { metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 2); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 15, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }, - { - labelValues: LABEL_VALUES_400, - points: [{ - value: -8, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - } - ]); + + const [timeseries1, timeseries2] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries1.points[0].value, 15); + assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); + assert.deepStrictEqual(timeseries2.points[0].value, -8); + assert.deepStrictEqual( + timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); }); it('should not create same timeseries again', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); @@ -127,30 +103,25 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 10, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 10); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point1.add(30); metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: LABEL_VALUES_200, - points: [{ - value: 40, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + + const [timeseries1] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries1.points[0].value, 40); + assert.ok(timeseries1.points[0].timestamp.seconds > 0); + assert.equal( + timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); }); describe('getDefaultTimeSeries()', () => { @@ -161,15 +132,13 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 10, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 10); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); it('should return same timeseries for interchanged labels', () => { instance = new Gauge( @@ -196,16 +165,15 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual(metric.descriptor.labelKeys.length, 3); assert.deepStrictEqual(metric.descriptor.type, 1); assert.equal(metric.timeseries.length, 1); + + const [timeseries] = metric.timeseries; assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: - [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], - points: [{ - value: 200, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + timeseries.labelValues, + [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 200); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); it('should use previously created default timeseries', () => { const point = instance.getDefaultTimeSeries(); @@ -214,15 +182,12 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 300, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 300); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); point1.add(400); @@ -230,15 +195,12 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual( - metric.timeseries, [{ - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 700, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }]); + const [timeseries1] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries1.points[0].value, 700); + assert.ok(timeseries1.points[0].timestamp.seconds > 0); + assert.equal( + timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); }); describe('removeTimeSeries()', () => { @@ -276,9 +238,8 @@ describe('GAUGE_INT64', () => { }); describe('GAUGE_DOUBLE', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let instance: Gauge; + let now: number; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -290,12 +251,6 @@ describe('GAUGE_DOUBLE', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_DOUBLE, LABEL_KEYS); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); describe('getOrCreateTimeSeries()', () => { @@ -320,43 +275,31 @@ describe('GAUGE_DOUBLE', () => { it('should return a Metric', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point.add(10.34); + + now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 10.34, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 10.34); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // add value and create new timeseries. point.add(5.12); const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_400); point1.set(-8.3); metric = instance.getMetric(); assert.equal(metric.timeseries.length, 2); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 15.46, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - }, - { - labelValues: LABEL_VALUES_400, - points: [{ - value: -8.3, - timestamp: - {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }] - } - ]); + const [timeseries1, timeseries2] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries1.points[0].value, 15.46); + assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); + assert.deepStrictEqual(timeseries2.points[0].value, -8.3); + assert.deepStrictEqual( + timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); }); it('should not create same timeseries again', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); @@ -365,30 +308,25 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 12.1, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries.points[0].value, 12.1); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point1.add(30.18); metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: LABEL_VALUES_200, - points: [{ - value: 42.28, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + const [timeseries1] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); + assert.deepStrictEqual(timeseries1.points[0].value, 42.28); + assert.ok(timeseries1.points[0].timestamp.seconds > 0); + assert.equal( + timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); }); describe('getDefaultTimeSeries()', () => { @@ -399,15 +337,13 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 10.1, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 10.1); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); it('should use previously created default timeseries', () => { const point = instance.getDefaultTimeSeries(); @@ -416,15 +352,12 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 300.1, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 300.1); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); point1.add(400.1); @@ -432,15 +365,12 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: [UNSET_LABEL_VALUE], - points: [{ - value: 700.2, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + const [timeseries1] = metric.timeseries; + assert.deepStrictEqual(timeseries1.labelValues, [UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries1.points[0].value, 700.2); + assert.ok(timeseries1.points[0].timestamp.seconds > 0); + assert.equal( + timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); it('should create same labelValues as labelKeys', () => { instance = @@ -455,16 +385,14 @@ describe('GAUGE_DOUBLE', () => { assert.deepStrictEqual(metric.descriptor.labelKeys.length, 3); assert.deepStrictEqual(metric.descriptor.type, 2); assert.equal(metric.timeseries.length, 1); - assert.deepStrictEqual(metric.timeseries, [ - { - labelValues: - [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], - points: [{ - value: 10.1, - timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} - }], - } - ]); + const [timeseries] = metric.timeseries; + assert.deepStrictEqual( + timeseries.labelValues, + [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE]); + assert.deepStrictEqual(timeseries.points[0].value, 10.1); + assert.ok(timeseries.points[0].timestamp.seconds > 0); + assert.equal( + timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); }); }); describe('removeTimeSeries()', () => { diff --git a/packages/opencensus-core/test/test-metric-producer.ts b/packages/opencensus-core/test/test-metric-producer.ts index e5c293383..d5a354e35 100644 --- a/packages/opencensus-core/test/test-metric-producer.ts +++ b/packages/opencensus-core/test/test-metric-producer.ts @@ -16,28 +16,10 @@ import * as assert from 'assert'; import {AggregationType, Measurement, MeasureUnit, Stats, Tags, View} from '../src'; -import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; import {MetricProducerForStats} from '../src/stats/metric-producer'; - -function mockDateNow() { - // mock now = Thu 3 January 2019 - return 1546540757282; -} - describe('Metric producer for stats', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; - - before(() => { - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - after(() => { - Date.now = originalDateNow; - }); - const stats = new Stats(); const metricProducerForStats = new MetricProducerForStats(stats); @@ -67,11 +49,6 @@ describe('Metric producer for stats', () => { unit: MeasureUnit.UNIT, type: MetricDescriptorType.CUMULATIVE_DOUBLE, }; - const expectedTimeSeries1 = [{ - labelValues, - points: [{value: 25, timestamp: mockedTime}], - startTimestamp: mockedTime - }]; const expectedMetricDescriptor2 = { name: viewName2, description, @@ -79,11 +56,6 @@ describe('Metric producer for stats', () => { unit: MeasureUnit.UNIT, type: MetricDescriptorType.CUMULATIVE_INT64, }; - const expectedTimeSeries2 = [{ - labelValues, - points: [{value: 1, timestamp: mockedTime}], - startTimestamp: mockedTime - }]; const expectedMetricDescriptor3 = { name: viewName3, description, @@ -91,8 +63,6 @@ describe('Metric producer for stats', () => { unit: MeasureUnit.UNIT, type: MetricDescriptorType.GAUGE_DOUBLE, }; - const expectedTimeSeries3 = - [{labelValues, points: [{value: 300, timestamp: mockedTime}]}]; const expectedMetricDescriptor4 = { name: viewName3, description, @@ -100,20 +70,6 @@ describe('Metric producer for stats', () => { unit: MeasureUnit.UNIT, type: MetricDescriptorType.CUMULATIVE_DISTRIBUTION, }; - const expectedTimeSeries4 = [{ - labelValues, - points: [{ - value: { - 'bucketOptions': {'explicit': {'bounds': [2, 4, 6]}}, - 'buckets': [{count: 1}, {count: 2}, {count: 2}, {count: 0}], - 'count': 5, - 'sum': 16.099999999999998, - 'sumOfSquaredDeviation': 10.427999999999997 - }, - timestamp: mockedTime - }], - startTimestamp: mockedTime - }]; it('should add sum stats', () => { const view: View = stats.createView( @@ -130,7 +86,8 @@ describe('Metric producer for stats', () => { }] = metrics; assert.deepStrictEqual(actualMetricDescriptor1, expectedMetricDescriptor1); assert.strictEqual(actualTimeSeries1.length, 1); - assert.deepStrictEqual(actualTimeSeries1, expectedTimeSeries1); + assert.deepStrictEqual(actualTimeSeries1[0].labelValues, labelValues); + assert.equal(actualTimeSeries1[0].points[0].value, 25); }); it('should add count stats', @@ -150,11 +107,13 @@ describe('Metric producer for stats', () => { assert.deepStrictEqual( actualMetricDescriptor1, expectedMetricDescriptor1); assert.strictEqual(actualTimeSeries1.length, 1); - assert.deepStrictEqual(actualTimeSeries1, expectedTimeSeries1); + assert.deepStrictEqual(actualTimeSeries1[0].labelValues, labelValues); + assert.equal(actualTimeSeries1[0].points[0].value, 25); assert.deepStrictEqual( actualMetricDescriptor2, expectedMetricDescriptor2); assert.strictEqual(actualTimeSeries2.length, 1); - assert.deepStrictEqual(actualTimeSeries2, expectedTimeSeries2); + assert.deepStrictEqual(actualTimeSeries2[0].labelValues, labelValues); + assert.equal(actualTimeSeries2[0].points[0].value, 1); // update count view view.recordMeasurement(measurement2); @@ -179,12 +138,15 @@ describe('Metric producer for stats', () => { metrics; assert.deepStrictEqual(actualMetricDescriptor1, expectedMetricDescriptor1); assert.strictEqual(actualTimeSeries1.length, 1); - assert.deepStrictEqual(actualTimeSeries1, expectedTimeSeries1); + assert.strictEqual(actualTimeSeries1.length, 1); + assert.deepStrictEqual(actualTimeSeries1[0].labelValues, labelValues); + assert.equal(actualTimeSeries1[0].points[0].value, 25); assert.deepStrictEqual(actualMetricDescriptor2, expectedMetricDescriptor2); assert.strictEqual(actualTimeSeries2.length, 1); assert.deepStrictEqual(actualMetricDescriptor3, expectedMetricDescriptor3); assert.strictEqual(actualTimeSeries3.length, 1); - assert.deepStrictEqual(actualTimeSeries3, expectedTimeSeries3); + assert.deepStrictEqual(actualTimeSeries3[0].labelValues, labelValues); + assert.equal(actualTimeSeries3[0].points[0].value, 300); }); it('should add distribution stats', () => { @@ -210,14 +172,23 @@ describe('Metric producer for stats', () => { metrics; assert.deepStrictEqual(actualMetricDescriptor1, expectedMetricDescriptor1); assert.strictEqual(actualTimeSeries1.length, 1); - assert.deepStrictEqual(actualTimeSeries1, expectedTimeSeries1); + assert.deepStrictEqual(actualTimeSeries1[0].labelValues, labelValues); + assert.equal(actualTimeSeries1[0].points[0].value, 25); assert.deepStrictEqual(actualMetricDescriptor2, expectedMetricDescriptor2); assert.strictEqual(actualTimeSeries2.length, 1); assert.deepStrictEqual(actualMetricDescriptor3, expectedMetricDescriptor3); assert.strictEqual(actualTimeSeries3.length, 1); - assert.deepStrictEqual(actualTimeSeries3, expectedTimeSeries3); + assert.deepStrictEqual(actualTimeSeries3[0].labelValues, labelValues); + assert.equal(actualTimeSeries3[0].points[0].value, 300); assert.deepStrictEqual(actualMetricDescriptor4, expectedMetricDescriptor4); assert.strictEqual(actualTimeSeries4.length, 1); - assert.deepStrictEqual(actualTimeSeries4, expectedTimeSeries4); + assert.deepStrictEqual(actualTimeSeries4[0].labelValues, labelValues); + assert.deepStrictEqual(actualTimeSeries4[0].points[0].value, { + 'bucketOptions': {'explicit': {'bounds': [2, 4, 6]}}, + 'buckets': [{count: 1}, {count: 2}, {count: 2}, {count: 0}], + 'count': 5, + 'sum': 16.099999999999998, + 'sumOfSquaredDeviation': 10.427999999999997 + }); }); }); diff --git a/packages/opencensus-core/test/test-metric-registry.ts b/packages/opencensus-core/test/test-metric-registry.ts index 2c8106b39..f5d332119 100644 --- a/packages/opencensus-core/test/test-metric-registry.ts +++ b/packages/opencensus-core/test/test-metric-registry.ts @@ -15,7 +15,7 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; +import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; import {MetricRegistry} from '../src/metrics/metric-registry'; import {MeasureUnit} from '../src/stats/types'; @@ -27,25 +27,12 @@ const LABEL_KEYS_WITH_NULL: LabelKey[] = [{key: 'code', description: 'desc'}, null]; const LABEL_VALUES_200: LabelValue[] = [{value: '200'}]; const LABEL_VALUES_400: LabelValue[] = [{value: '400'}]; - -function mockDateNow() { - // mock now = Thu 3 January 2019 - return 1546540757282; -} - describe('addInt64Gauge', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let registry: MetricRegistry; + let now: number; beforeEach(() => { registry = new MetricRegistry(); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -102,6 +89,7 @@ describe('addInt64Gauge', () => { const pointEntry = int64Gauge.getOrCreateTimeSeries(LABEL_VALUES_200); pointEntry.add(100); + now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -116,25 +104,16 @@ describe('addInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 100); - assert.deepStrictEqual( - point.timestamp, - {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); + assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); }); }); describe('addDoubleGauge', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let registry: MetricRegistry; + let now: number; beforeEach(() => { registry = new MetricRegistry(); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -194,6 +173,7 @@ describe('addDoubleGauge', () => { const pointEntry1 = doubleGauge.getOrCreateTimeSeries(LABEL_VALUES_200); pointEntry1.set(0.7); + now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -208,9 +188,7 @@ describe('addDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.deepStrictEqual( - point.timestamp, - {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); + assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); }); it('should throw an error when the register same metric', () => { @@ -223,18 +201,11 @@ describe('addDoubleGauge', () => { }); describe('addDerivedInt64Gauge', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let registry: MetricRegistry; + let now: number; beforeEach(() => { registry = new MetricRegistry(); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -296,6 +267,7 @@ describe('addDerivedInt64Gauge', () => { derivedInt64Gauge.createTimeSeries(LABEL_VALUES_200, map); map.set('key1', 'value1'); + now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -310,9 +282,7 @@ describe('addDerivedInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 2); - assert.deepStrictEqual( - point.timestamp, - {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); + assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); }); it('should throw an error when the register same metric', () => { @@ -326,18 +296,11 @@ describe('addDerivedInt64Gauge', () => { }); describe('addDerivedDoubleGauge', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; let registry: MetricRegistry; + let now: number; beforeEach(() => { registry = new MetricRegistry(); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - afterEach(() => { - Date.now = originalDateNow; }); it('should throw an error when the name is null', () => { @@ -402,6 +365,7 @@ describe('addDerivedDoubleGauge', () => { METRIC_NAME, METRIC_DESCRIPTION, UNIT, LABEL_KEYS); derivedDoubleGauge.createTimeSeries(LABEL_VALUES_200, new QueueManager()); + now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -416,9 +380,7 @@ describe('addDerivedDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.deepStrictEqual( - point.timestamp, - {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); + assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); }); it('should throw an error when the register same metric', () => { @@ -432,17 +394,10 @@ describe('addDerivedDoubleGauge', () => { }); describe('Add multiple gauges', () => { - let originalDateNow = Date.now; let registry: MetricRegistry; before(() => { registry = new MetricRegistry(); - originalDateNow = Date.now; - Date.now = mockDateNow; - }); - - after(() => { - Date.now = originalDateNow; }); it('should return metrics', () => { diff --git a/packages/opencensus-core/test/test-time-util.ts b/packages/opencensus-core/test/test-time-util.ts new file mode 100644 index 000000000..7f3ad2bbe --- /dev/null +++ b/packages/opencensus-core/test/test-time-util.ts @@ -0,0 +1,27 @@ +/** + * Copyright 2019, 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 {getTimestampWithProcessHRTime} from '../src/common/time-util'; + +describe('getTimestampWithProcessHRTime()', () => { + it('compare now with getTimestampWithProcessHRTime', () => { + const arr = getTimestampWithProcessHRTime(); + const now = Date.now(); + + assert.equal(Math.floor(now / 1000), arr.seconds); + }); +}); diff --git a/packages/opencensus-core/test/test-view.ts b/packages/opencensus-core/test/test-view.ts index c5e20ea8a..c8ae50b45 100644 --- a/packages/opencensus-core/test/test-view.ts +++ b/packages/opencensus-core/test/test-view.ts @@ -17,7 +17,7 @@ import * as assert from 'assert'; import {BaseView} from '../src'; -import {DistributionValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; +import {DistributionValue, MetricDescriptorType} from '../src/metrics/export/types'; import {AggregationType, DistributionData, Measure, Measurement, MeasureType, MeasureUnit, Tags, View} from '../src/stats/types'; /** The order of how close values must be to be considerated almost equal */ @@ -80,11 +80,6 @@ function assertView( } } -function mockDateNow() { - // mock now = Thu 3 January 2019 - return 1546540757282; -} - describe('BaseView', () => { const measure: Measure = { name: 'Test Measure', @@ -200,17 +195,12 @@ describe('BaseView', () => { }); describe('getMetric()', () => { - const mockedTime: Timestamp = {nanos: 282000000, seconds: 1546540757}; - let originalDateNow = Date.now; + let now: number; const measurementValues = [1.1, 2.3, 3.2, 4.3, 5.2]; const buckets = [2, 4, 6]; const tags: Tags = {testKey1: 'testValue', testKey2: 'testValue'}; const tags1: Tags = {testKey1: 'testValue1', testKey2: 'testValue1'}; - after(() => { - Date.now = originalDateNow; - }); - for (const aggregationTestCase of aggregationTestCases) { const view: View = new BaseView( 'test/view/name', measure, aggregationTestCase.aggregationType, @@ -219,12 +209,9 @@ describe('BaseView', () => { const measurement = {measure, tags, value}; view.recordMeasurement(measurement); } - const {descriptor, timeseries} = view.getMetric(); - before(() => { - originalDateNow = Date.now; - Date.now = mockDateNow; - }); + now = Date.now(); + const {descriptor, timeseries} = view.getMetric(); describe( `Aggregation type: ${aggregationTestCase.aggregationType}`, () => { @@ -259,10 +246,8 @@ describe('BaseView', () => { it('shouldnt have timeseries startTimestamp', () => { assert.ok(startTimestamp); assert.equal(typeof startTimestamp.nanos, 'number'); - // assert.strictEqual(startTimestamp.nanos, mockedTime.nanos); assert.equal(typeof startTimestamp.seconds, 'number'); - // assert.strictEqual(startTimestamp.seconds, - // mockedTime.seconds); + assert.equal(startTimestamp.seconds, Math.floor(now / 1e3)); }); } @@ -286,6 +271,7 @@ describe('BaseView', () => { } it('should have point', () => { + now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -293,9 +279,8 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, mockedTime.seconds); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -323,6 +308,7 @@ describe('BaseView', () => { } it('should have points', () => { + now = Date.now(); const {timeseries} = view.getMetric(); assert.equal(timeseries.length, 2); const [{labelValues: labelValues1, points: points1}, { @@ -335,9 +321,8 @@ describe('BaseView', () => { let {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, mockedTime.seconds); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -354,9 +339,8 @@ describe('BaseView', () => { ({timestamp, value} = point); assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, mockedTime.seconds); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -381,6 +365,7 @@ describe('BaseView', () => { } it('should have point', () => { + now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -388,9 +373,8 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, mockedTime.seconds); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.equal(typeof value, 'number'); assert.strictEqual(value, 5); }); @@ -408,6 +392,7 @@ describe('BaseView', () => { } it('should have point', () => { + now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -415,9 +400,8 @@ describe('BaseView', () => { const {timestamp, value} = point; assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); - assert.strictEqual(timestamp.nanos, mockedTime.nanos); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, mockedTime.seconds); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.equal(typeof value, 'number'); assert.strictEqual(value, total); }); @@ -433,13 +417,13 @@ describe('BaseView', () => { } it('should have point', () => { + now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); const [point] = points; const {timestamp, value} = point; - assert.deepStrictEqual( - timestamp, {nanos: mockedTime.nanos, seconds: mockedTime.seconds}); + assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); assert.equal(typeof value, 'number'); assert.strictEqual( value, measurementValues[measurementValues.length - 1]); From da80ba92e33050b553d18783c7e91317cbfe25e1 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Tue, 8 Jan 2019 12:30:20 -0800 Subject: [PATCH 3/3] mock time for tests --- .../opencensus-core/src/common/time-util.ts | 40 ++- .../test/test-derived-gauge.ts | 103 ++++-- packages/opencensus-core/test/test-gauge.ts | 308 +++++++++++------- .../test/test-metric-registry.ts | 111 ++++++- .../opencensus-core/test/test-time-util.ts | 35 +- packages/opencensus-core/test/test-view.ts | 50 ++- 6 files changed, 460 insertions(+), 187 deletions(-) diff --git a/packages/opencensus-core/src/common/time-util.ts b/packages/opencensus-core/src/common/time-util.ts index 65b89e02f..21cb9594c 100644 --- a/packages/opencensus-core/src/common/time-util.ts +++ b/packages/opencensus-core/src/common/time-util.ts @@ -20,12 +20,26 @@ const MILLIS_PER_SECOND = 1e3; const NANOS_PER_MILLI = 1e3 * 1e3; const NANOS_PER_SECOND = 1e3 * 1e3 * 1e3; -const hrtime = process.hrtime; -const origin = hrtime(); +let hrtime = process.hrtime; +let hrtimeOrigin: [number, number] = [0, 0]; +let hrtimeRefSeconds = 0; +let hrtimeRefNanos = 0; -const refTime = Date.now(); -const startSecs = Math.floor(refTime / MILLIS_PER_SECOND); -const startNanos = (refTime % MILLIS_PER_SECOND) * NANOS_PER_MILLI; +function setHrtimeReference() { + resetHrtimeFunctionCache(); + hrtimeOrigin = hrtime(); + const refTime = Date.now(); + hrtimeRefSeconds = Math.floor(refTime / MILLIS_PER_SECOND); + hrtimeRefNanos = (refTime % MILLIS_PER_SECOND) * NANOS_PER_MILLI; +} + +/** + * This is used to enable tests to mock process.hrtime while still allow us to + * cache it. + */ +function resetHrtimeFunctionCache() { + hrtime = process.hrtime; +} /** * Gets the current timestamp with seconds and nanoseconds. @@ -33,15 +47,21 @@ const startNanos = (refTime % MILLIS_PER_SECOND) * NANOS_PER_MILLI; * @returns {Timestamp} The Timestamp. */ export function getTimestampWithProcessHRTime(): Timestamp { - const [offsetSecs, offsetNanos] = hrtime(origin); // [seconds, nanoseconds] + const [offsetSecs, offsetNanos] = hrtime(hrtimeOrigin); - // determine drfit in seconds and nanoseconds - const seconds = startSecs + offsetSecs; - const nanos = startNanos + offsetNanos; + // determine drift in seconds and nanoseconds + const seconds = hrtimeRefSeconds + offsetSecs; + const nanos = hrtimeRefNanos + offsetNanos; - // if nanos excess NANOS_PER_SECOND value. if (nanos >= NANOS_PER_SECOND) { return {seconds: seconds + 1, nanos: nanos % NANOS_PER_SECOND}; } return {seconds, nanos}; } + +setHrtimeReference(); + +export const TEST_ONLY = { + setHrtimeReference, + resetHrtimeFunctionCache +}; diff --git a/packages/opencensus-core/test/test-derived-gauge.ts b/packages/opencensus-core/test/test-derived-gauge.ts index 45972365d..0f3e45cb4 100644 --- a/packages/opencensus-core/test/test-derived-gauge.ts +++ b/packages/opencensus-core/test/test-derived-gauge.ts @@ -15,7 +15,9 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; + +import {TEST_ONLY} from '../src/common/time-util'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {DerivedGauge} from '../src/metrics/gauges/derived-gauge'; const METRIC_NAME = 'metric-name'; @@ -30,7 +32,9 @@ const LABEL_VALUES_EXRTA: LabelValue[] = [{value: '200'}, {value: '400'}]; describe('DerivedGauge', () => { let instance: DerivedGauge; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -42,6 +46,18 @@ describe('DerivedGauge', () => { beforeEach(() => { instance = new DerivedGauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); describe('createTimeSeries()', () => { @@ -69,18 +85,19 @@ describe('DerivedGauge', () => { instance.createTimeSeries(LABEL_VALUES_200, map); map.set('key1', 'value1'); - now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; - const [points] = timeseries.points; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.equal(points.value, 2); - assert.equal(Math.floor(now / 1e3), points.timestamp.seconds); - assert.ok(points.timestamp.nanos > 0); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 2, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); // add data in collection map.set('key2', 'value2'); map.set('key3', 'value3'); @@ -94,14 +111,24 @@ describe('DerivedGauge', () => { metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 2); - - const [timeseries1, timeseries2] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries1.points[0].value, 4); - assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); - assert.deepStrictEqual(timeseries2.points[0].value, 5); - assert.deepStrictEqual( - timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 4, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }, + { + labelValues: LABEL_VALUES_400, + points: [{ + value: 5, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + } + ]); }); it('should return a Metric (INT64) - custom object', () => { class QueueManager { @@ -115,13 +142,15 @@ describe('DerivedGauge', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 45); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 45, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); it('should return a Metric (Double) - custom object', () => { class QueueManager { @@ -143,9 +172,15 @@ describe('DerivedGauge', () => { labelKeys: LABEL_KEYS }); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 0.7); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 0.7, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); it('should throw an error when obj is null', () => { assert.throws(() => { @@ -160,9 +195,15 @@ describe('DerivedGauge', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 1); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 1, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); // create timeseries with same labels. assert.throws(() => { diff --git a/packages/opencensus-core/test/test-gauge.ts b/packages/opencensus-core/test/test-gauge.ts index f2206ea02..bfdecffb0 100644 --- a/packages/opencensus-core/test/test-gauge.ts +++ b/packages/opencensus-core/test/test-gauge.ts @@ -15,7 +15,9 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; + +import {TEST_ONLY} from '../src/common/time-util'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {Gauge} from '../src/metrics/gauges/gauge'; const METRIC_NAME = 'metric-name'; @@ -33,7 +35,9 @@ const UNSET_LABEL_VALUE: LabelValue = { describe('GAUGE_INT64', () => { let instance: Gauge; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -45,6 +49,18 @@ describe('GAUGE_INT64', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_INT64, LABEL_KEYS); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); describe('getOrCreateTimeSeries()', () => { @@ -70,16 +86,20 @@ describe('GAUGE_INT64', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point.add(10); - now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 10); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); + // add value and create new timeseries. point.add(5); const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_400); @@ -87,14 +107,24 @@ describe('GAUGE_INT64', () => { metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 2); - - const [timeseries1, timeseries2] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries1.points[0].value, 15); - assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); - assert.deepStrictEqual(timeseries2.points[0].value, -8); - assert.deepStrictEqual( - timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 15, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }, + { + labelValues: LABEL_VALUES_400, + points: [{ + value: -8, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + } + ]); }); it('should not create same timeseries again', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); @@ -103,25 +133,30 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 10); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point1.add(30); metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries1] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries1.points[0].value, 40); - assert.ok(timeseries1.points[0].timestamp.seconds > 0); - assert.equal( - timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: LABEL_VALUES_200, + points: [{ + value: 40, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); }); describe('getDefaultTimeSeries()', () => { @@ -132,13 +167,15 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 10); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 10, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); it('should return same timeseries for interchanged labels', () => { instance = new Gauge( @@ -165,15 +202,16 @@ describe('GAUGE_INT64', () => { assert.deepStrictEqual(metric.descriptor.labelKeys.length, 3); assert.deepStrictEqual(metric.descriptor.type, 1); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; assert.deepStrictEqual( - timeseries.labelValues, - [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 200); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + metric.timeseries, [{ + labelValues: + [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], + points: [{ + value: 200, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); it('should use previously created default timeseries', () => { const point = instance.getDefaultTimeSeries(); @@ -182,12 +220,15 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 300); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 300, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); point1.add(400); @@ -195,12 +236,15 @@ describe('GAUGE_INT64', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries1] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries1.points[0].value, 700); - assert.ok(timeseries1.points[0].timestamp.seconds > 0); - assert.equal( - timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + metric.timeseries, [{ + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 700, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }]); }); }); describe('removeTimeSeries()', () => { @@ -239,7 +283,9 @@ describe('GAUGE_INT64', () => { describe('GAUGE_DOUBLE', () => { let instance: Gauge; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; const expectedMetricDescriptor = { name: METRIC_NAME, description: METRIC_DESCRIPTION, @@ -251,6 +297,18 @@ describe('GAUGE_DOUBLE', () => { beforeEach(() => { instance = new Gauge( METRIC_NAME, METRIC_DESCRIPTION, UNIT, GAUGE_DOUBLE, LABEL_KEYS); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); describe('getOrCreateTimeSeries()', () => { @@ -276,30 +334,43 @@ describe('GAUGE_DOUBLE', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point.add(10.34); - now = Date.now(); let metric = instance.getMetric(); assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 10.34); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 10.34, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // add value and create new timeseries. point.add(5.12); const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_400); point1.set(-8.3); metric = instance.getMetric(); assert.equal(metric.timeseries.length, 2); - const [timeseries1, timeseries2] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries1.points[0].value, 15.46); - assert.deepStrictEqual(timeseries2.labelValues, LABEL_VALUES_400); - assert.deepStrictEqual(timeseries2.points[0].value, -8.3); - assert.deepStrictEqual( - timeseries1.points[0].timestamp, timeseries2.points[0].timestamp); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 15.46, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + }, + { + labelValues: LABEL_VALUES_400, + points: [{ + value: -8.3, + timestamp: + {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }] + } + ]); }); it('should not create same timeseries again', () => { const point = instance.getOrCreateTimeSeries(LABEL_VALUES_200); @@ -308,25 +379,30 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries.points[0].value, 12.1); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 12.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // create timeseries with same labels. const point1 = instance.getOrCreateTimeSeries(LABEL_VALUES_200); point1.add(30.18); metric = instance.getMetric(); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries1] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, LABEL_VALUES_200); - assert.deepStrictEqual(timeseries1.points[0].value, 42.28); - assert.ok(timeseries1.points[0].timestamp.seconds > 0); - assert.equal( - timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: LABEL_VALUES_200, + points: [{ + value: 42.28, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); }); describe('getDefaultTimeSeries()', () => { @@ -337,13 +413,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 10.1); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 10.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); it('should use previously created default timeseries', () => { const point = instance.getDefaultTimeSeries(); @@ -352,12 +430,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual(timeseries.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 300.1); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 300.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); // get default timeseries again. const point1 = instance.getDefaultTimeSeries(); point1.add(400.1); @@ -365,12 +446,15 @@ describe('GAUGE_DOUBLE', () => { assert.notEqual(metric, null); assert.deepStrictEqual(metric.descriptor, expectedMetricDescriptor); assert.equal(metric.timeseries.length, 1); - const [timeseries1] = metric.timeseries; - assert.deepStrictEqual(timeseries1.labelValues, [UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries1.points[0].value, 700.2); - assert.ok(timeseries1.points[0].timestamp.seconds > 0); - assert.equal( - timeseries1.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: [UNSET_LABEL_VALUE], + points: [{ + value: 700.2, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); it('should create same labelValues as labelKeys', () => { instance = @@ -385,14 +469,16 @@ describe('GAUGE_DOUBLE', () => { assert.deepStrictEqual(metric.descriptor.labelKeys.length, 3); assert.deepStrictEqual(metric.descriptor.type, 2); assert.equal(metric.timeseries.length, 1); - const [timeseries] = metric.timeseries; - assert.deepStrictEqual( - timeseries.labelValues, - [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE]); - assert.deepStrictEqual(timeseries.points[0].value, 10.1); - assert.ok(timeseries.points[0].timestamp.seconds > 0); - assert.equal( - timeseries.points[0].timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual(metric.timeseries, [ + { + labelValues: + [UNSET_LABEL_VALUE, UNSET_LABEL_VALUE, UNSET_LABEL_VALUE], + points: [{ + value: 10.1, + timestamp: {nanos: mockedTime.nanos, seconds: mockedTime.seconds} + }], + } + ]); }); }); describe('removeTimeSeries()', () => { diff --git a/packages/opencensus-core/test/test-metric-registry.ts b/packages/opencensus-core/test/test-metric-registry.ts index f5d332119..0e968bd9e 100644 --- a/packages/opencensus-core/test/test-metric-registry.ts +++ b/packages/opencensus-core/test/test-metric-registry.ts @@ -15,7 +15,8 @@ */ import * as assert from 'assert'; -import {LabelKey, LabelValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {TEST_ONLY} from '../src/common/time-util'; +import {LabelKey, LabelValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {MetricRegistry} from '../src/metrics/metric-registry'; import {MeasureUnit} from '../src/stats/types'; @@ -29,10 +30,24 @@ const LABEL_VALUES_200: LabelValue[] = [{value: '200'}]; const LABEL_VALUES_400: LabelValue[] = [{value: '400'}]; describe('addInt64Gauge', () => { let registry: MetricRegistry; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; beforeEach(() => { registry = new MetricRegistry(); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); it('should throw an error when the name is null', () => { @@ -89,7 +104,6 @@ describe('addInt64Gauge', () => { const pointEntry = int64Gauge.getOrCreateTimeSeries(LABEL_VALUES_200); pointEntry.add(100); - now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -104,16 +118,32 @@ describe('addInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 100); - assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); }); describe('addDoubleGauge', () => { let registry: MetricRegistry; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; beforeEach(() => { registry = new MetricRegistry(); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); it('should throw an error when the name is null', () => { @@ -173,7 +203,6 @@ describe('addDoubleGauge', () => { const pointEntry1 = doubleGauge.getOrCreateTimeSeries(LABEL_VALUES_200); pointEntry1.set(0.7); - now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -188,7 +217,9 @@ describe('addDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -202,10 +233,24 @@ describe('addDoubleGauge', () => { describe('addDerivedInt64Gauge', () => { let registry: MetricRegistry; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; beforeEach(() => { registry = new MetricRegistry(); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); it('should throw an error when the name is null', () => { @@ -267,7 +312,6 @@ describe('addDerivedInt64Gauge', () => { derivedInt64Gauge.createTimeSeries(LABEL_VALUES_200, map); map.set('key1', 'value1'); - now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -282,7 +326,9 @@ describe('addDerivedInt64Gauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 2); - assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -297,10 +343,24 @@ describe('addDerivedInt64Gauge', () => { describe('addDerivedDoubleGauge', () => { let registry: MetricRegistry; - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; beforeEach(() => { registry = new MetricRegistry(); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); it('should throw an error when the name is null', () => { @@ -365,7 +425,6 @@ describe('addDerivedDoubleGauge', () => { METRIC_NAME, METRIC_DESCRIPTION, UNIT, LABEL_KEYS); derivedDoubleGauge.createTimeSeries(LABEL_VALUES_200, new QueueManager()); - now = Date.now(); const metrics = registry.getMetricProducer().getMetrics(); assert.strictEqual(metrics.length, 1); const [{descriptor, timeseries}] = metrics; @@ -380,7 +439,9 @@ describe('addDerivedDoubleGauge', () => { const [{points}] = timeseries; const [point] = points; assert.equal(point.value, 0.7); - assert.equal(point.timestamp.seconds, Math.floor(now / 1e3)); + assert.deepStrictEqual( + point.timestamp, + {seconds: mockedTime.seconds, nanos: mockedTime.nanos}); }); it('should throw an error when the register same metric', () => { @@ -395,9 +456,24 @@ describe('addDerivedDoubleGauge', () => { describe('Add multiple gauges', () => { let registry: MetricRegistry; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; - before(() => { + beforeEach(() => { registry = new MetricRegistry(); + + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); }); it('should return metrics', () => { @@ -443,11 +519,18 @@ describe('Add multiple gauges', () => { assert.strictEqual(timeseries1.length, 1); assert.strictEqual(timeseries1[0].points.length, 1); assert.equal(timeseries1[0].points[0].value, 100); + assert.equal( + timeseries1[0].points[0].timestamp.seconds, mockedTime.seconds); + assert.equal(timeseries1[0].points[0].timestamp.nanos, mockedTime.nanos); assert.strictEqual(timeseries2.length, 1); assert.strictEqual(timeseries2[0].points.length, 1); assert.equal(timeseries2[0].points[0].value, 5.5); assert.strictEqual(timeseries3.length, 1); assert.strictEqual(timeseries3[0].points.length, 1); assert.equal(timeseries3[0].points[0].value, 5); + assert.deepStrictEqual( + timeseries1[0].points[0].timestamp, timeseries2[0].points[0].timestamp); + assert.deepStrictEqual( + timeseries2[0].points[0].timestamp, timeseries3[0].points[0].timestamp); }); }); diff --git a/packages/opencensus-core/test/test-time-util.ts b/packages/opencensus-core/test/test-time-util.ts index 7f3ad2bbe..94f67351a 100644 --- a/packages/opencensus-core/test/test-time-util.ts +++ b/packages/opencensus-core/test/test-time-util.ts @@ -15,13 +15,38 @@ */ import * as assert from 'assert'; -import {getTimestampWithProcessHRTime} from '../src/common/time-util'; +import {getTimestampWithProcessHRTime, TEST_ONLY} from '../src/common/time-util'; describe('getTimestampWithProcessHRTime()', () => { - it('compare now with getTimestampWithProcessHRTime', () => { - const arr = getTimestampWithProcessHRTime(); - const now = Date.now(); + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; - assert.equal(Math.floor(now / 1000), arr.seconds); + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); + }); + + it('should return timestamp with respect to now and process.hrtime', () => { + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + + const currentTime = getTimestampWithProcessHRTime(); + + assert.deepStrictEqual(currentTime, {seconds: 1450000100, nanos: 1e7}); + }); + + it('should handle excess of nanos', () => { + process.hrtime = () => [100, 10000000012]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + + const currentTime = getTimestampWithProcessHRTime(); + + assert.deepStrictEqual(currentTime, {seconds: 1450000101, nanos: 12}); }); }); diff --git a/packages/opencensus-core/test/test-view.ts b/packages/opencensus-core/test/test-view.ts index c8ae50b45..6638b5602 100644 --- a/packages/opencensus-core/test/test-view.ts +++ b/packages/opencensus-core/test/test-view.ts @@ -17,7 +17,8 @@ import * as assert from 'assert'; import {BaseView} from '../src'; -import {DistributionValue, MetricDescriptorType} from '../src/metrics/export/types'; +import {TEST_ONLY} from '../src/common/time-util'; +import {DistributionValue, MetricDescriptorType, Timestamp} from '../src/metrics/export/types'; import {AggregationType, DistributionData, Measure, Measurement, MeasureType, MeasureUnit, Tags, View} from '../src/stats/types'; /** The order of how close values must be to be considerated almost equal */ @@ -195,7 +196,9 @@ describe('BaseView', () => { }); describe('getMetric()', () => { - let now: number; + const realHrtimeFn = process.hrtime; + const realNowFn = Date.now; + const mockedTime: Timestamp = {seconds: 1450000100, nanos: 1e7}; const measurementValues = [1.1, 2.3, 3.2, 4.3, 5.2]; const buckets = [2, 4, 6]; const tags: Tags = {testKey1: 'testValue', testKey2: 'testValue'}; @@ -210,7 +213,20 @@ describe('BaseView', () => { view.recordMeasurement(measurement); } - now = Date.now(); + beforeEach(() => { + process.hrtime = () => [100, 1e7]; + Date.now = () => 1450000000000; + // Force the clock to recalibrate the time offset with the mocked time + TEST_ONLY.setHrtimeReference(); + }); + + afterEach(() => { + process.hrtime = realHrtimeFn; + Date.now = realNowFn; + // Reset the hrtime reference so that it uses a real clock again. + TEST_ONLY.resetHrtimeFunctionCache(); + }); + const {descriptor, timeseries} = view.getMetric(); describe( @@ -243,11 +259,12 @@ describe('BaseView', () => { assert.strictEqual(startTimestamp, undefined); }); } else { - it('shouldnt have timeseries startTimestamp', () => { + it('should have timeseries startTimestamp', () => { assert.ok(startTimestamp); assert.equal(typeof startTimestamp.nanos, 'number'); assert.equal(typeof startTimestamp.seconds, 'number'); - assert.equal(startTimestamp.seconds, Math.floor(now / 1e3)); + assert.ok(startTimestamp.seconds > 0); + assert.ok(startTimestamp.nanos > 0); }); } @@ -271,7 +288,6 @@ describe('BaseView', () => { } it('should have point', () => { - now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -280,7 +296,8 @@ describe('BaseView', () => { assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -308,7 +325,6 @@ describe('BaseView', () => { } it('should have points', () => { - now = Date.now(); const {timeseries} = view.getMetric(); assert.equal(timeseries.length, 2); const [{labelValues: labelValues1, points: points1}, { @@ -322,7 +338,8 @@ describe('BaseView', () => { assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -340,7 +357,8 @@ describe('BaseView', () => { assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.notEqual(typeof value, 'number'); assert.deepStrictEqual((value as DistributionValue), { bucketOptions: {explicit: {bounds: buckets}}, @@ -365,7 +383,6 @@ describe('BaseView', () => { } it('should have point', () => { - now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -374,7 +391,8 @@ describe('BaseView', () => { assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.equal(typeof value, 'number'); assert.strictEqual(value, 5); }); @@ -392,7 +410,6 @@ describe('BaseView', () => { } it('should have point', () => { - now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); @@ -401,7 +418,8 @@ describe('BaseView', () => { assert.ok(timestamp); assert.equal(typeof timestamp.nanos, 'number'); assert.equal(typeof timestamp.seconds, 'number'); - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.equal(typeof value, 'number'); assert.strictEqual(value, total); }); @@ -417,13 +435,13 @@ describe('BaseView', () => { } it('should have point', () => { - now = Date.now(); const {timeseries} = view.getMetric(); const [{points}] = timeseries; assert.ok(points); const [point] = points; const {timestamp, value} = point; - assert.strictEqual(timestamp.seconds, Math.floor(now / 1e3)); + assert.equal(timestamp.seconds, mockedTime.seconds); + assert.equal(timestamp.nanos, mockedTime.nanos); assert.equal(typeof value, 'number'); assert.strictEqual( value, measurementValues[measurementValues.length - 1]);