1 | const { EOL } = require('os');
|
2 | const got = require('got');
|
3 | const supportsColor = require('supports-color');
|
4 | const windowSize = require('window-size');
|
5 | const uuid = require('uuid');
|
6 | const osName = require('os-name');
|
7 | const isCi = require('is-ci');
|
8 | const _ = require('lodash');
|
9 | const debug = require('debug')('release-it:metrics');
|
10 | const pkg = require('../package.json');
|
11 |
|
12 | const noop = Promise.resolve();
|
13 |
|
14 | const cast = value => (value ? 1 : 0);
|
15 |
|
16 | const cid = uuid.v4();
|
17 | const dimensions = windowSize ? windowSize.get() : { width: 0, height: 0 };
|
18 | const vp = `${dimensions.width}x${dimensions.height}`;
|
19 | const depths = ['1-bit', '4-bit', '8-bit', '24-bits'];
|
20 | const sd = depths[supportsColor.level || 0];
|
21 |
|
22 | const payload = config => ({
|
23 | v: 1,
|
24 | tid: 'UA-108828841-1',
|
25 | cid,
|
26 | vp,
|
27 | sd,
|
28 | cd1: pkg.version,
|
29 | cd2: process.version,
|
30 | cd3: osName(),
|
31 | cd4: cast(!config.isCI),
|
32 | cd5: cast(config.isDryRun),
|
33 | cd6: cast(config.isVerbose),
|
34 | cd7: cast(config.isDebug),
|
35 | cd8: null,
|
36 | cd9: config.preReleaseId,
|
37 | cd11: cast(isCi),
|
38 | cd12: cast(config.git.tag),
|
39 | cd13: cast(config.npm.publish),
|
40 | cd14: cast(config.github.release),
|
41 | cd15: config.increment,
|
42 | cd16: cast(config.gitlab.release)
|
43 | });
|
44 |
|
45 | class Metrics {
|
46 | constructor({ isEnabled = true, request = got } = {}) {
|
47 | this.isEnabled = isEnabled;
|
48 | this.request = request;
|
49 | }
|
50 | debug(response) {
|
51 | debug(_.pick(response, ['statusCode', 'statusMessage', 'url']));
|
52 | }
|
53 | send(payload) {
|
54 | return !this.isEnabled
|
55 | ? noop
|
56 | : this.request('http://www.google-analytics.com/collect', {
|
57 | timeout: 300,
|
58 | retries: 0,
|
59 | form: true,
|
60 | body: payload
|
61 | }).then(this.debug, this.debug);
|
62 | }
|
63 | trackEvent(action, config) {
|
64 | return this.send(
|
65 | Object.assign(config ? payload(config) : {}, {
|
66 | t: 'event',
|
67 | ec: 'session',
|
68 | ea: action
|
69 | })
|
70 | );
|
71 | }
|
72 | trackException(err) {
|
73 | return this.send({
|
74 | t: 'exception',
|
75 | exd: err.toString().split(EOL)[0]
|
76 | });
|
77 | }
|
78 | }
|
79 |
|
80 | module.exports = Metrics;
|