177 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
let execSync = require('child_process').execSync;
 | 
						|
let fs = require('fs');
 | 
						|
 | 
						|
let minimist;
 | 
						|
try {
 | 
						|
  minimist = require('minimist');
 | 
						|
} catch (e) {
 | 
						|
  minimist = function(){ return {projects: ""}; };
 | 
						|
}
 | 
						|
 | 
						|
let path = require('path');
 | 
						|
let os = require('os');
 | 
						|
let ua;
 | 
						|
 | 
						|
try {
 | 
						|
  ua = require('universal-analytics');
 | 
						|
} catch(e) {
 | 
						|
  // ignore errors due to invoking analytics before the first npm install
 | 
						|
}
 | 
						|
 | 
						|
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 (ua) {
 | 
						|
  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_PULL_REQUEST == 'true') ? 'true' : 'false',
 | 
						|
  // Travis - Branch Name (master)
 | 
						|
  cd6: process.env.TRAVIS_BRANCH,
 | 
						|
  // Travis - Repo Slug  (angular/angular)
 | 
						|
  cd7: process.env.TRAVIS_REPO_SLUG,
 | 
						|
  // Travis - Job ID (1, 2, 3, 4, ...)
 | 
						|
  cd12: process.env.TRAVIS_JOB_NUMBER ? process.env.TRAVIS_JOB_NUMBER.split('.')[1] : undefined,
 | 
						|
  // HW - CPU Info
 | 
						|
  cd8: `${os.cpus().length} x ${os.cpus()[0].model}`,
 | 
						|
  // HW - Memory Info
 | 
						|
  cd9: `${Math.round(os.totalmem()/1024/1024/1024)}GB`,
 | 
						|
  // gulp --projects (angular2)
 | 
						|
  cd13: minimist(process.argv.slice(2)).projects
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
 | 
						|
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';
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function recordEvent(eventType, actionCategory, actionName, duration, label) {
 | 
						|
  // 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) {
 | 
						|
    duration = Math.round(duration);
 | 
						|
  }
 | 
						|
 | 
						|
  switch (eventType) {
 | 
						|
    case 'start':
 | 
						|
      visitor.
 | 
						|
        event(actionCategory, actionName + ' (start)', label, null, customParams).
 | 
						|
        send();
 | 
						|
      break;
 | 
						|
    case 'success':
 | 
						|
      visitor.
 | 
						|
        event(actionCategory, actionName, label, duration, customParams).
 | 
						|
        timing(actionCategory, actionName, duration, label, customParams).
 | 
						|
        send();
 | 
						|
      break;
 | 
						|
    case 'error':
 | 
						|
      visitor.
 | 
						|
        event(actionCategory, actionName + ' (errored)', label, duration, customParams).
 | 
						|
        timing(actionCategory, actionName, duration, label, customParams).
 | 
						|
        send();
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      throw new Error(`unknown event type "${eventType}"`);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
module.exports = {
 | 
						|
 | 
						|
  installStart: (actionName) => {
 | 
						|
    recordEvent('start', 'install', actionName);
 | 
						|
  },
 | 
						|
 | 
						|
  installSuccess: (actionName, duration) => {
 | 
						|
    recordEvent('success', 'install', actionName, duration);
 | 
						|
  },
 | 
						|
 | 
						|
  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('error', 'ci', actionName, duration);
 | 
						|
  },
 | 
						|
 | 
						|
  bundleSize: (filePath, sizeInBytes, compressionLevel) => {
 | 
						|
    recordEvent('success', 'payload', compressionLevel, sizeInBytes, filePath);
 | 
						|
  }
 | 
						|
};
 |