2015-10-11 05:23:05 -04:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
let execSync = require('child_process').execSync;
|
|
|
|
let fs = require('fs');
|
2015-11-13 18:51:51 -05:00
|
|
|
|
|
|
|
let minimist;
|
|
|
|
try {
|
|
|
|
minimist = require('minimist');
|
|
|
|
} catch (e) {
|
|
|
|
minimist = function(){ return {projects: ""}; };
|
|
|
|
}
|
|
|
|
|
2015-10-11 05:23:05 -04:00
|
|
|
let path = require('path');
|
|
|
|
let os = require('os');
|
2015-10-27 18:19:52 -04:00
|
|
|
let ua;
|
|
|
|
|
|
|
|
try {
|
|
|
|
ua = require('universal-analytics');
|
|
|
|
} catch(e) {
|
|
|
|
// ignore errors due to invoking analytics before the first npm install
|
|
|
|
}
|
2015-10-11 05:23:05 -04:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2015-10-27 18:19:52 -04:00
|
|
|
if (ua) {
|
|
|
|
if (cid) {
|
|
|
|
visitor = ua(analyticsId, cid, analyticsOptions);
|
|
|
|
} else {
|
|
|
|
visitor = ua(analyticsId, analyticsOptions);
|
|
|
|
cid = visitor.cid;
|
|
|
|
fs.writeFileSync(analyticsFile, cid, 'utf-8');
|
|
|
|
}
|
2015-10-11 05:23:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
|
|
|
|
let customParams = {
|
|
|
|
// OS Platform (darwin, win32, linux)
|
2015-11-13 05:10:33 -05:00
|
|
|
cd1: os.platform(),
|
2015-10-11 05:23:05 -04:00
|
|
|
// 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?
|
2016-03-03 23:07:23 -05:00
|
|
|
cd5: (process.env.TRAVIS_PULL_REQUEST == 'true') ? 'true' : 'false',
|
2015-10-11 05:23:05 -04:00
|
|
|
// Travis - Branch Name (master)
|
|
|
|
cd6: process.env.TRAVIS_BRANCH,
|
|
|
|
// Travis - Repo Slug (angular/angular)
|
|
|
|
cd7: process.env.TRAVIS_REPO_SLUG,
|
2016-03-03 23:58:07 -05:00
|
|
|
// Travis - Job ID (1, 2, 3, 4, ...)
|
|
|
|
cd12: process.env.TRAVIS_JOB_NUMBER ? process.env.TRAVIS_JOB_NUMBER.split('.')[1] : undefined,
|
2015-10-11 05:23:05 -04:00
|
|
|
// HW - CPU Info
|
|
|
|
cd8: `${os.cpus().length} x ${os.cpus()[0].model}`,
|
|
|
|
// HW - Memory Info
|
|
|
|
cd9: `${Math.round(os.totalmem()/1024/1024/1024)}GB`,
|
2015-11-13 05:10:11 -05:00
|
|
|
// gulp --projects (angular2,angular2_material)
|
|
|
|
cd13: minimist(process.argv.slice(2)).projects
|
2015-10-11 05:23:05 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-11-15 05:27:59 -05:00
|
|
|
function recordEvent(eventType, actionCategory, actionName, duration, label) {
|
2015-10-27 18:19:52 -04:00
|
|
|
// if universal-analytics is not yet installed, don't bother doing anything (e.g. when tracking initial npm install)
|
|
|
|
// build-analytics will however store the starting timestamp, so at least we can record the success/error event with duration
|
|
|
|
if (!ua) return;
|
|
|
|
|
|
|
|
if (duration) {
|
2015-10-11 05:23:05 -04:00
|
|
|
duration = Math.round(duration);
|
2015-10-27 18:19:52 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (eventType) {
|
|
|
|
case 'start':
|
|
|
|
visitor.
|
2015-11-15 05:27:59 -05:00
|
|
|
event(actionCategory, actionName + ' (start)', label, null, customParams).
|
2015-10-27 18:19:52 -04:00
|
|
|
send();
|
|
|
|
break;
|
|
|
|
case 'success':
|
|
|
|
visitor.
|
2015-11-15 05:27:59 -05:00
|
|
|
event(actionCategory, actionName, label, duration, customParams).
|
|
|
|
timing(actionCategory, actionName, duration, label, customParams).
|
2015-10-27 18:19:52 -04:00
|
|
|
send();
|
|
|
|
break;
|
|
|
|
case 'error':
|
|
|
|
visitor.
|
2015-11-15 05:27:59 -05:00
|
|
|
event(actionCategory, actionName + ' (errored)', label, duration, customParams).
|
|
|
|
timing(actionCategory, actionName, duration, label, customParams).
|
2015-10-27 18:19:52 -04:00
|
|
|
send();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new Error(`unknown event type "${eventType}"`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
|
|
installStart: (actionName) => {
|
|
|
|
recordEvent('start', 'install', actionName);
|
2015-10-11 05:23:05 -04:00
|
|
|
},
|
|
|
|
|
2015-10-27 18:19:52 -04:00
|
|
|
installSuccess: (actionName, duration) => {
|
|
|
|
recordEvent('success', 'install', actionName, duration);
|
2015-10-11 05:23:05 -04:00
|
|
|
},
|
|
|
|
|
2015-10-27 18:19:52 -04:00
|
|
|
installError: (actionName, duration) => {
|
|
|
|
recordEvent('error', 'install', actionName, duration);
|
|
|
|
},
|
|
|
|
|
|
|
|
buildStart: (actionName) => {
|
|
|
|
recordEvent('start', 'build', actionName);
|
|
|
|
},
|
|
|
|
|
|
|
|
buildSuccess: (actionName, duration) => {
|
|
|
|
recordEvent('success', 'build', actionName, duration);
|
|
|
|
},
|
|
|
|
|
|
|
|
buildError: (actionName, duration) => {
|
|
|
|
recordEvent('error', 'build', actionName, duration);
|
|
|
|
},
|
|
|
|
|
|
|
|
ciStart: (actionName) => {
|
|
|
|
recordEvent('start', 'ci', actionName);
|
|
|
|
},
|
|
|
|
|
|
|
|
ciSuccess: (actionName, duration) => {
|
|
|
|
recordEvent('success', 'ci', actionName, duration);
|
|
|
|
},
|
|
|
|
|
|
|
|
ciError: (actionName, duration) => {
|
|
|
|
recordEvent('success', 'ci', actionName, duration);
|
2015-11-15 05:27:59 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
bundleSize: (filePath, sizeInBytes, compressionLevel) => {
|
|
|
|
recordEvent('success', 'payload', compressionLevel, sizeInBytes, filePath);
|
2015-10-11 05:23:05 -04:00
|
|
|
}
|
|
|
|
};
|