From da1272f3687ff0db5f38e2fc644c3b04451a21db Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Sun, 11 Oct 2015 02:23:05 -0700 Subject: [PATCH] build(analytics): add basic build-analytics to the project This is pretty experimental, but the goal is to track the performance of our build over time so that we can more easily track perf regressions. Currently it's integrated only with gulp tasks, but I'd like to expand it to tracking travis jobs, protractor/benchpress test runs, npm installs, etc. No PII is being collected. And the data is collected via a Google Analytics property owned by the Angular team account. Closes #4672 --- .gitignore | 3 + gulpfile.js | 5 + npm-shrinkwrap.clean.json | 215 +++++++++++++- npm-shrinkwrap.json | 539 +++++++++++++++++++++++++++-------- package.json | 1 + tools/analytics/analytics.js | 107 +++++++ 6 files changed, 738 insertions(+), 132 deletions(-) create mode 100644 tools/analytics/analytics.js diff --git a/.gitignore b/.gitignore index 84d9bb913057d..01c9c49e5a208 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ modules/.vscode npm-debug.log /docs/bower_components/ + +# build-analytics +.build-analytics diff --git a/gulpfile.js b/gulpfile.js index 5be4b93a5ccbb..7f412743f6ec7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -17,6 +17,7 @@ var merge = require('merge'); var merge2 = require('merge2'); var path = require('path'); var licenseWrap = require('./tools/build/licensewrap'); +var analytics = require('./tools/analytics/analytics'); var watch = require('./tools/build/watch'); @@ -1297,3 +1298,7 @@ process.on('beforeExit', function() { gulp.start('cleanup.builder'); } }); + + +gulp.on('task_stop', (e) => { analytics.build('gulp ' + e.task, e.duration*1000)}); +gulp.on('task_err', (e) => { analytics.build('gulp ' + e.task + ' (errored)', e.duration*1000)}); diff --git a/npm-shrinkwrap.clean.json b/npm-shrinkwrap.clean.json index 043f4d9ebf775..22b36403f9169 100644 --- a/npm-shrinkwrap.clean.json +++ b/npm-shrinkwrap.clean.json @@ -11344,17 +11344,6 @@ "type-detect": { "version": "0.1.2" }, - "universal-analytics": { - "version": "0.3.9", - "dependencies": { - "underscore": { - "version": "1.8.3" - }, - "async": { - "version": "0.2.10" - } - } - }, "update-notifier": { "version": "0.2.2", "dependencies": { @@ -11647,6 +11636,208 @@ "typescript": { "version": "1.6.2" }, + "universal-analytics": { + "version": "0.3.9", + "dependencies": { + "request": { + "version": "2.65.0", + "dependencies": { + "bl": { + "version": "1.0.0", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "dependencies": { + "core-util-is": { + "version": "1.0.1" + }, + "inherits": { + "version": "2.0.1" + }, + "isarray": { + "version": "0.0.1" + }, + "process-nextick-args": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "0.10.31" + }, + "util-deprecate": { + "version": "1.0.2" + } + } + } + } + }, + "caseless": { + "version": "0.11.0" + }, + "extend": { + "version": "3.0.0" + }, + "forever-agent": { + "version": "0.6.1" + }, + "form-data": { + "version": "1.0.0-rc3", + "dependencies": { + "async": { + "version": "1.4.2" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1" + }, + "mime-types": { + "version": "2.1.7", + "dependencies": { + "mime-db": { + "version": "1.19.0" + } + } + }, + "qs": { + "version": "5.2.0" + }, + "tunnel-agent": { + "version": "0.4.1" + }, + "tough-cookie": { + "version": "2.2.0" + }, + "http-signature": { + "version": "0.11.0", + "dependencies": { + "assert-plus": { + "version": "0.1.5" + }, + "asn1": { + "version": "0.1.11" + }, + "ctype": { + "version": "0.5.3" + } + } + }, + "oauth-sign": { + "version": "0.8.0" + }, + "hawk": { + "version": "3.1.0", + "dependencies": { + "hoek": { + "version": "2.16.3" + }, + "boom": { + "version": "2.9.0" + }, + "cryptiles": { + "version": "2.0.5" + }, + "sntp": { + "version": "1.0.9" + } + } + }, + "aws-sign2": { + "version": "0.6.0" + }, + "stringstream": { + "version": "0.0.4" + }, + "combined-stream": { + "version": "1.0.5", + "dependencies": { + "delayed-stream": { + "version": "1.0.0" + } + } + }, + "isstream": { + "version": "0.1.2" + }, + "har-validator": { + "version": "2.0.2", + "dependencies": { + "chalk": { + "version": "1.1.1", + "dependencies": { + "ansi-styles": { + "version": "2.1.0" + }, + "escape-string-regexp": { + "version": "1.0.3" + }, + "has-ansi": { + "version": "2.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "dependencies": { + "ansi-regex": { + "version": "2.0.0" + } + } + }, + "supports-color": { + "version": "2.0.0" + } + } + }, + "commander": { + "version": "2.8.1", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1" + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "dependencies": { + "generate-function": { + "version": "2.0.0" + }, + "generate-object-property": { + "version": "1.2.0", + "dependencies": { + "is-property": { + "version": "1.0.2" + } + } + }, + "jsonpointer": { + "version": "2.0.0" + } + } + }, + "pinkie-promise": { + "version": "1.0.0", + "dependencies": { + "pinkie": { + "version": "1.0.0" + } + } + } + } + } + } + }, + "underscore": { + "version": "1.8.3" + }, + "async": { + "version": "0.2.10" + } + } + }, "vinyl": { "version": "0.4.6", "dependencies": { @@ -11685,5 +11876,5 @@ } }, "name": "angular", - "version": "2.0.0-alpha.39" + "version": "2.0.0-alpha.40" } diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8b761b8248c9a..184113b2c0009 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "angular", - "version": "2.0.0-alpha.39", + "version": "2.0.0-alpha.40", "dependencies": { "@reactivex/rxjs": { "version": "0.0.0-prealpha.3", @@ -15809,40 +15809,41 @@ "protractor": { "version": "2.5.0", "from": "protractor@2.5.0", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-2.5.0.tgz", "dependencies": { "request": { "version": "2.57.0", - "from": "request@>=2.57.0 <2.58.0", + "from": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.57.0.tgz", "dependencies": { "bl": { "version": "0.9.4", - "from": "bl@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz", "dependencies": { "readable-stream": { "version": "1.0.33", - "from": "readable-stream@>=1.0.26 <1.1.0", + "from": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { "version": "1.0.1", - "from": "core-util-is@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" }, "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", + "from": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "string_decoder": { "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" } } @@ -15851,32 +15852,32 @@ }, "caseless": { "version": "0.10.0", - "from": "caseless@>=0.10.0 <0.11.0", + "from": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.10.0.tgz" }, "forever-agent": { "version": "0.6.1", - "from": "forever-agent@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, "form-data": { "version": "0.2.0", - "from": "form-data@>=0.2.0 <0.3.0", + "from": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", "dependencies": { "async": { "version": "0.9.2", - "from": "async@>=0.9.0 <0.10.0", + "from": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" }, "combined-stream": { "version": "0.0.7", - "from": "combined-stream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "dependencies": { "delayed-stream": { "version": "0.0.5", - "from": "delayed-stream@0.0.5", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" } } @@ -15885,210 +15886,210 @@ }, "json-stringify-safe": { "version": "5.0.1", - "from": "json-stringify-safe@>=5.0.0 <5.1.0", + "from": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { "version": "2.0.14", - "from": "mime-types@>=2.0.1 <2.1.0", + "from": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", "dependencies": { "mime-db": { "version": "1.12.0", - "from": "mime-db@>=1.12.0 <1.13.0", + "from": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" } } }, "qs": { "version": "3.1.0", - "from": "qs@>=3.1.0 <3.2.0", + "from": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-3.1.0.tgz" }, "tunnel-agent": { "version": "0.4.1", - "from": "tunnel-agent@>=0.4.0 <0.5.0", + "from": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" }, "tough-cookie": { "version": "2.2.0", - "from": "tough-cookie@>=0.12.0", + "from": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz" }, "http-signature": { "version": "0.11.0", - "from": "http-signature@>=0.11.0 <0.12.0", + "from": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", "dependencies": { "assert-plus": { "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", + "from": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" }, "asn1": { "version": "0.1.11", - "from": "asn1@0.1.11", + "from": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" }, "ctype": { "version": "0.5.3", - "from": "ctype@0.5.3", + "from": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" } } }, "oauth-sign": { "version": "0.8.0", - "from": "oauth-sign@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" }, "hawk": { "version": "2.3.1", - "from": "hawk@>=2.3.0 <2.4.0", + "from": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", "dependencies": { "hoek": { "version": "2.16.3", - "from": "hoek@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "boom": { "version": "2.9.0", - "from": "boom@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz" }, "cryptiles": { "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "sntp": { "version": "1.0.9", - "from": "sntp@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" } } }, "aws-sign2": { "version": "0.5.0", - "from": "aws-sign2@>=0.5.0 <0.6.0", + "from": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" }, "stringstream": { "version": "0.0.4", - "from": "stringstream@>=0.0.4 <0.1.0", + "from": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" }, "combined-stream": { "version": "1.0.5", - "from": "combined-stream@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "dependencies": { "delayed-stream": { "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" } } }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.1 <0.2.0", + "from": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "har-validator": { "version": "1.8.0", - "from": "har-validator@>=1.6.1 <2.0.0", + "from": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", "dependencies": { "bluebird": { "version": "2.10.2", - "from": "bluebird@>=2.9.30 <3.0.0", + "from": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, "chalk": { "version": "1.1.1", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { "version": "2.1.0", - "from": "ansi-styles@>=2.1.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { "version": "1.0.3", - "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "from": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" }, "has-ansi": { "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "strip-ansi": { "version": "3.0.0", - "from": "strip-ansi@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", - "from": "ansi-regex@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" } } }, "supports-color": { "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" } } }, "commander": { "version": "2.8.1", - "from": "commander@>=2.8.1 <3.0.0", + "from": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "dependencies": { "graceful-readlink": { "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", + "from": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" } } }, "is-my-json-valid": { "version": "2.12.2", - "from": "is-my-json-valid@>=2.12.0 <3.0.0", + "from": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", "dependencies": { "generate-function": { "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" }, "generate-object-property": { "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", + "from": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "dependencies": { "is-property": { "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" } } }, "jsonpointer": { "version": "2.0.0", - "from": "jsonpointer@2.0.0", + "from": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" } } @@ -16099,67 +16100,68 @@ }, "minijasminenode": { "version": "1.1.1", - "from": "minijasminenode@1.1.1", + "from": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz", "resolved": "https://registry.npmjs.org/minijasminenode/-/minijasminenode-1.1.1.tgz" }, "jasminewd": { "version": "1.1.0", - "from": "jasminewd@1.1.0", + "from": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz", "resolved": "https://registry.npmjs.org/jasminewd/-/jasminewd-1.1.0.tgz" }, "jasminewd2": { "version": "0.0.6", - "from": "jasminewd2@0.0.6" + "from": "jasminewd2@0.0.6", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-0.0.6.tgz" }, "jasmine": { "version": "2.3.2", - "from": "jasmine@2.3.2", + "from": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.3.2.tgz", "dependencies": { "exit": { "version": "0.1.2", - "from": "exit@>=0.1.2 <0.2.0", + "from": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" } } }, "saucelabs": { "version": "1.0.1", - "from": "saucelabs@>=1.0.1 <1.1.0", + "from": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.0.1.tgz", "dependencies": { "https-proxy-agent": { "version": "1.0.0", - "from": "https-proxy-agent@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", "dependencies": { "agent-base": { "version": "2.0.1", - "from": "agent-base@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz", "dependencies": { "semver": { "version": "5.0.3", - "from": "semver@>=5.0.1 <5.1.0", + "from": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" } } }, "debug": { "version": "2.2.0", - "from": "debug@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "dependencies": { "ms": { "version": "0.7.1", - "from": "ms@0.7.1", + "from": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" } } }, "extend": { "version": "3.0.0", - "from": "extend@>=3.0.0 <4.0.0", + "from": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" } } @@ -16168,27 +16170,27 @@ }, "glob": { "version": "3.2.11", - "from": "glob@>=3.2.0 <3.3.0", + "from": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", "dependencies": { "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "minimatch": { "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", + "from": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "dependencies": { "lru-cache": { "version": "2.7.0", - "from": "lru-cache@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" }, "sigmund": { "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" } } @@ -16197,44 +16199,44 @@ }, "adm-zip": { "version": "0.4.4", - "from": "adm-zip@0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" }, "optimist": { "version": "0.6.1", - "from": "optimist@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "dependencies": { "wordwrap": { "version": "0.0.3", - "from": "wordwrap@>=0.0.2 <0.1.0", + "from": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" }, "minimist": { "version": "0.0.10", - "from": "minimist@>=0.0.1 <0.1.0", + "from": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" } } }, "q": { "version": "1.0.0", - "from": "q@1.0.0", + "from": "https://registry.npmjs.org/q/-/q-1.0.0.tgz", "resolved": "https://registry.npmjs.org/q/-/q-1.0.0.tgz" }, "source-map-support": { "version": "0.2.10", - "from": "source-map-support@>=0.2.6 <0.3.0", + "from": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", "dependencies": { "source-map": { "version": "0.1.32", - "from": "source-map@0.1.32", + "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "dependencies": { "amdefine": { "version": "1.0.0", - "from": "amdefine@>=0.0.4", + "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" } } @@ -16243,12 +16245,12 @@ }, "html-entities": { "version": "1.1.3", - "from": "html-entities@>=1.1.1 <1.2.0", + "from": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.1.3.tgz" }, "accessibility-developer-tools": { "version": "2.6.0", - "from": "accessibility-developer-tools@>=2.6.0 <2.7.0", + "from": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz", "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.6.0.tgz" } } @@ -16374,56 +16376,56 @@ }, "selenium-webdriver": { "version": "2.47.0", - "from": "selenium-webdriver@2.47.0", + "from": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.47.0.tgz", "dependencies": { "adm-zip": { "version": "0.4.4", - "from": "adm-zip@0.4.4", + "from": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" }, "rimraf": { "version": "2.4.3", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", "dependencies": { "glob": { "version": "5.0.15", - "from": "glob@>=5.0.14 <6.0.0", + "from": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "dependencies": { "inflight": { "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", + "from": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "once": { "version": "1.3.2", - "from": "once@>=1.3.0 <2.0.0", + "from": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", "dependencies": { "wrappy": { "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" } } }, "path-is-absolute": { "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", + "from": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" } } @@ -16432,54 +16434,54 @@ }, "tmp": { "version": "0.0.24", - "from": "tmp@0.0.24", + "from": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz" }, "ws": { "version": "0.8.0", - "from": "ws@>=0.8.0 <0.9.0", + "from": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", "dependencies": { "options": { "version": "0.0.6", - "from": "options@>=0.0.5", + "from": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "ultron": { "version": "1.0.2", - "from": "ultron@>=1.0.0 <1.1.0", + "from": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" }, "bufferutil": { "version": "1.2.1", - "from": "bufferutil@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "2.0.9", - "from": "nan@>=2.0.5 <3.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz" } } }, "utf-8-validate": { "version": "1.2.1", - "from": "utf-8-validate@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", "dependencies": { "bindings": { "version": "1.2.1", - "from": "bindings@>=1.2.0 <1.3.0", + "from": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" }, "nan": { "version": "2.0.9", - "from": "nan@>=2.0.5 <3.0.0", + "from": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.0.9.tgz" } } @@ -16488,22 +16490,22 @@ }, "xml2js": { "version": "0.4.4", - "from": "xml2js@0.4.4", + "from": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "dependencies": { "sax": { "version": "0.6.1", - "from": "sax@>=0.6.0 <0.7.0", + "from": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz" }, "xmlbuilder": { "version": "3.1.0", - "from": "xmlbuilder@>=1.0.0", + "from": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", "dependencies": { "lodash": { "version": "3.10.1", - "from": "lodash@>=3.5.0 <4.0.0", + "from": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" } } @@ -17518,23 +17520,6 @@ "from": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.2.tgz", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.2.tgz" }, - "universal-analytics": { - "version": "0.3.9", - "from": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.3.9.tgz", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.3.9.tgz", - "dependencies": { - "underscore": { - "version": "1.8.3", - "from": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" - }, - "async": { - "version": "0.2.10", - "from": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" - } - } - }, "update-notifier": { "version": "0.2.2", "from": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.2.tgz", @@ -17983,6 +17968,320 @@ "from": "https://registry.npmjs.org/typescript/-/typescript-1.6.2.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.6.2.tgz" }, + "universal-analytics": { + "version": "0.3.9", + "from": "universal-analytics@*", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.3.9.tgz", + "dependencies": { + "request": { + "version": "2.65.0", + "from": "request@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.65.0.tgz", + "dependencies": { + "bl": { + "version": "1.0.0", + "from": "bl@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "from": "readable-stream@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@>=2.0.1 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "process-nextick-args": { + "version": "1.0.3", + "from": "process-nextick-args@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz" + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" + }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc3", + "from": "form-data@>=1.0.0-rc3 <1.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "dependencies": { + "async": { + "version": "1.4.2", + "from": "async@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz" + } + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@>=5.0.1 <5.1.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "mime-types": { + "version": "2.1.7", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "dependencies": { + "mime-db": { + "version": "1.19.0", + "from": "mime-db@>=1.19.0 <1.20.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz" + } + } + }, + "qs": { + "version": "5.2.0", + "from": "qs@>=5.2.0 <5.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + }, + "tunnel-agent": { + "version": "0.4.1", + "from": "tunnel-agent@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + }, + "tough-cookie": { + "version": "2.2.0", + "from": "tough-cookie@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz" + }, + "http-signature": { + "version": "0.11.0", + "from": "http-signature@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "from": "assert-plus@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + }, + "ctype": { + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + } + } + }, + "oauth-sign": { + "version": "0.8.0", + "from": "oauth-sign@>=0.8.0 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + }, + "hawk": { + "version": "3.1.0", + "from": "hawk@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", + "dependencies": { + "hoek": { + "version": "2.16.3", + "from": "hoek@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + }, + "boom": { + "version": "2.9.0", + "from": "boom@>=2.8.0 <3.0.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.9.0.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" + }, + "sntp": { + "version": "1.0.9", + "from": "sntp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + } + }, + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + }, + "stringstream": { + "version": "0.0.4", + "from": "stringstream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + } + }, + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + }, + "har-validator": { + "version": "2.0.2", + "from": "har-validator@>=2.0.2 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.2.tgz", + "dependencies": { + "chalk": { + "version": "1.1.1", + "from": "chalk@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "from": "ansi-styles@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + }, + "escape-string-regexp": { + "version": "1.0.3", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + } + } + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + } + }, + "commander": { + "version": "2.8.1", + "from": "commander@>=2.8.1 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "from": "is-my-json-valid@>=2.12.2 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", + "dependencies": { + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "dependencies": { + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "from": "jsonpointer@2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + } + } + }, + "pinkie-promise": { + "version": "1.0.0", + "from": "pinkie-promise@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "dependencies": { + "pinkie": { + "version": "1.0.0", + "from": "pinkie@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + } + } + } + } + } + } + }, + "underscore": { + "version": "1.8.3", + "from": "underscore@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" + }, + "async": { + "version": "0.2.10", + "from": "async@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + } + } + }, "vinyl": { "version": "0.4.6", "from": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", diff --git a/package.json b/package.json index 73f3c75400e37..550db4ba5f637 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,7 @@ "tsd": "^0.6.5-beta", "tslint": "^2.5.0", "typescript": "^1.6.2", + "universal-analytics": "^0.3.9", "vinyl": "^0.4.6", "walk-sync": "^0.1.3", "which": "~1", diff --git a/tools/analytics/analytics.js b/tools/analytics/analytics.js new file mode 100644 index 0000000000000..8615758bd62a0 --- /dev/null +++ b/tools/analytics/analytics.js @@ -0,0 +1,107 @@ +'use strict'; + +let execSync = require('child_process').execSync; +let fs = require('fs'); +let path = require('path'); +let os = require('os'); +let ua = require('universal-analytics'); + +const analyticsFile = path.resolve(path.join(__dirname, '..', '..', '.build-analytics')); +const analyticsId = "UA-8594346-17"; // Owned by the Angular account +const analyticsOptions = { + https: true, + debug: false +}; + +let cid = fs.existsSync(analyticsFile) ? fs.readFileSync(analyticsFile, 'utf-8') : null; +let visitor; + +if (cid) { + visitor = ua(analyticsId, cid, analyticsOptions); +} else { + visitor = ua(analyticsId, analyticsOptions); + cid = visitor.cid; + fs.writeFileSync(analyticsFile, cid, 'utf-8'); +} + + +// https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters +let customParams = { + // OS Platform (darwin, win32, linux) + cd1: os.platform, + // Node.js Version (v4.1.2) + cd2: process.version, + // npm Version (2.14.7) + cd10: getNpmVersion(), + // TypeScript Version (1.6.2) + cd3: getTypeScriptVersion(), + // Dart Version + cd11: getDartVersion(), + // Dev Environment + cd4: process.env.TRAVIS ? 'Travis CI' : 'Local Dev', + // Travis - Pull Request? + cd5: process.env.TRAVIS && process.env.TRAVIS_PULL_REQUEST ? 'true' : 'false', + // Travis - Branch Name (master) + cd6: process.env.TRAVIS_BRANCH, + // Travis - Repo Slug (angular/angular) + cd7: process.env.TRAVIS_REPO_SLUG, + // HW - CPU Info + cd8: `${os.cpus().length} x ${os.cpus()[0].model}`, + // HW - Memory Info + cd9: `${Math.round(os.totalmem()/1024/1024/1024)}GB`, +}; + + + +function getTypeScriptVersion() { + try { + return require('typescript').version; + } catch (e) { + return 'unknown'; + } +} + + +function getNpmVersion() { + try { + return execSync('npm -v').toString().replace(/\s/, ''); + } catch (e) { + return 'unknown'; + } +} + + +function getDartVersion() { + try { + return execSync('dart --version 2>&1').toString().replace(/.+: (\S+) [\s\S]+/, '$1') + } catch (e) { + return 'unknown'; + } +} + + +module.exports = { + install: (actionName, duration) => { + duration = Math.round(duration); + visitor. + event('install', actionName, 'testLabel', duration, customParams). + timing('install', actionName, duration, customParams). + send(); + }, + + build: (actionName, duration) => { + duration = Math.round(duration); + visitor. + event('build', actionName, 'testLabel', duration, customParams). + timing('build', actionName, duration, customParams). + send(); + }, + + test: (actionName, duration) => { + duration = Math.round(duration); + visitor. + event('test', actionName, 'testLabel', duration, customParams). + timing('test', actionName, duration, customParams). + send(); + } +};