bit-bin
Version:
<a href="https://opensource.org/licenses/Apache-2.0"><img alt="apache" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="https://github.com/teambit/bit/blob/master/CONTRIBUTING.md"><img alt="prs" src="https://img.shields.io/b
370 lines (296 loc) • 10.2 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Analytics = exports.LEVEL = void 0;
function _defineProperty2() {
const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
_defineProperty2 = function () {
return data;
};
return data;
}
function _serializeError() {
const data = require("serialize-error");
_serializeError = function () {
return data;
};
return data;
}
function path() {
const data = _interopRequireWildcard(require("path"));
path = function () {
return data;
};
return data;
}
function _objectHash() {
const data = _interopRequireDefault(require("object-hash"));
_objectHash = function () {
return data;
};
return data;
}
function _uniqid() {
const data = _interopRequireDefault(require("uniqid"));
_uniqid = function () {
return data;
};
return data;
}
function _yn() {
const data = _interopRequireDefault(require("yn"));
_yn = function () {
return data;
};
return data;
}
function _ramda() {
const data = _interopRequireDefault(require("ramda"));
_ramda = function () {
return data;
};
return data;
}
function _os() {
const data = _interopRequireDefault(require("os"));
_os = function () {
return data;
};
return data;
}
function _child_process() {
const data = require("child_process");
_child_process = function () {
return data;
};
return data;
}
function _globalConfig() {
const data = require("../api/consumer/lib/global-config");
_globalConfig = function () {
return data;
};
return data;
}
function _prompts() {
const data = require("../prompts");
_prompts = function () {
return data;
};
return data;
}
function _constants() {
const data = require("../constants");
_constants = function () {
return data;
};
return data;
}
/* eslint max-classes-per-file: 0 */
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const LEVEL = {
DEBUG: 'debug',
INFO: 'info',
WARNING: 'warning',
ERROR: 'error',
FATAL: 'fatal'
};
exports.LEVEL = LEVEL;
class Breadcrumb {
constructor(category, message, data) {
(0, _defineProperty2().default)(this, "category", void 0);
(0, _defineProperty2().default)(this, "message", void 0);
(0, _defineProperty2().default)(this, "data", void 0);
this.category = category;
this.message = message;
this.data = data;
}
}
class Analytics {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
static getID() {
const id = (0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_USERID_KEY);
if (id) return id;
const newId = (0, _uniqid().default)();
(0, _globalConfig().setSync)(_constants().CFG_ANALYTICS_USERID_KEY, newId);
return newId;
}
static promptAnalyticsIfNeeded(cmd) {
function shouldPromptForAnalytics() {
// do not prompt analytics approval for bit config command (so you can configure it in CI envs)
if (cmd.length && cmd[0] !== 'config') {
const analyticsReporting = (0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_REPORTING_KEY);
const errorReporting = (0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_ERROR_REPORTS_KEY);
return _ramda().default.isNil(analyticsReporting) && _ramda().default.isNil(errorReporting);
}
return false;
}
if (shouldPromptForAnalytics()) {
const uniqId = (0, _uniqid().default)();
if (!(0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_USERID_KEY)) (0, _globalConfig().setSync)(_constants().CFG_ANALYTICS_USERID_KEY, uniqId); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return (0, _prompts().analyticsPrompt)().then(({
analyticsResponse
}) => {
(0, _globalConfig().setSync)(_constants().CFG_ANALYTICS_REPORTING_KEY, (0, _yn().default)(analyticsResponse));
if (!(0, _yn().default)(analyticsResponse)) {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
return (0, _prompts().errorReportingPrompt)().then(({
errResponse
}) => {
return (0, _globalConfig().setSync)(_constants().CFG_ANALYTICS_ERROR_REPORTS_KEY, (0, _yn().default)(errResponse));
});
}
return null;
});
}
return Promise.resolve();
}
static _maskString(str) {
return str.replace(/[A-Za-z]/g, 'x');
}
static _hashLightly(value) {
switch (typeof value) {
case 'undefined':
case 'number':
case 'boolean':
return value;
case 'string':
return this._maskString(value);
case 'object':
if (Array.isArray(value)) return value.map(item => this._hashLightly(item));
if (value === null) return value;
return (0, _objectHash().default)(value);
default:
return (0, _objectHash().default)(value);
}
}
static _hashFlags(flags) {
const hashedFlags = {};
const definedFlags = _ramda().default.filter(flag => typeof flag !== 'undefined', flags);
if (this.anonymous && !_ramda().default.isEmpty(definedFlags)) {
Object.keys(definedFlags).forEach(key => {
hashedFlags[key] = this._hashLightly(flags[key]);
});
return hashedFlags;
}
return definedFlags;
}
static _hashArgs(args) {
if (!this.anonymous) return args;
return args.map(arg => this._hashLightly(arg));
}
static init(command, flags, args) {
this.anonymous = (0, _yn().default)((0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_ANONYMOUS_KEY), {
default: true
});
this.command = command;
this.flags = this._hashFlags(flags);
this.release = _constants().BIT_VERSION;
this.args = this._hashArgs(args);
this.nodeVersion = process.version;
this.os = process.platform;
this.level = LEVEL.INFO;
this.username = !this.anonymous ? (0, _globalConfig().getSync)(_constants().CFG_USER_EMAIL_KEY) || (0, _globalConfig().getSync)(_constants().CFG_USER_NAME_KEY) || _os().default.hostname() || this.getID() : this.getID();
this.analytics_usage = (0, _yn().default)((0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_REPORTING_KEY), {
default: false
});
this.error_usage = this.analytics_usage ? true : (0, _yn().default)((0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_ERROR_REPORTS_KEY), {
default: false
});
this.environment = (0, _globalConfig().getSync)(_constants().CFG_ANALYTICS_ENVIRONMENT_KEY) || _constants().DEFAULT_BIT_ENV;
}
static sendData() {
return new Promise((resolve, reject) => {
if (this.analytics_usage || this.error_usage && !this.success) {
const file = path().join(__dirname, 'analytics-sender.js'); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
const forked = (0, _child_process().fork)(file, {
silent: true
}); // switch to `false` to debug the child
// console.log('sending', this.toObject()); // un-comment to see the data sent to Analytics
forked.send(this.toObject());
forked.on('message', () => {
// makes sure the data has been sent to the child.
// without it, when the message is large, it exits before the child got the complete message
resolve();
});
forked.on('error', err => {
reject(err);
});
} else {
resolve();
}
});
}
static setError(level = LEVEL.ERROR, err) {
this.level = level;
this.error = (0, _serializeError().serializeError)(err);
this.success = false;
}
/**
* eventually goes to the "ADDITIONAL DATA" section in Sentry
*/
static setExtraData(key, value) {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
this.extra[key] = value;
}
static incExtraDataKey(key, value) {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
if (this.extra[key]) {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
this.extra[key] += value || 1;
} else {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
this.extra[key] = value || 1;
}
}
static hashData(data) {
if (this.anonymous) {
return (0, _objectHash().default)(data);
}
return data;
}
static addBreadCrumb(category, message, data) {
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
this.breadcrumbs.push(new Breadcrumb(category, message, data));
}
static toObject() {
return {
username: this.username,
command: this.command,
flags: this.flags,
args: this.args,
release: this.release,
extra: this.extra,
nodeVersion: this.nodeVersion,
os: this.os,
level: this.level,
error: this.error,
success: this.success,
breadcrumbs: this.breadcrumbs,
analytics_usage: this.analytics_usage,
error_usage: this.analytics_usage,
environment: this.environment
};
}
}
exports.Analytics = Analytics;
(0, _defineProperty2().default)(Analytics, "username", void 0);
(0, _defineProperty2().default)(Analytics, "command", void 0);
(0, _defineProperty2().default)(Analytics, "release", void 0);
(0, _defineProperty2().default)(Analytics, "args", void 0);
(0, _defineProperty2().default)(Analytics, "flags", {});
(0, _defineProperty2().default)(Analytics, "success", true);
(0, _defineProperty2().default)(Analytics, "nodeVersion", void 0);
(0, _defineProperty2().default)(Analytics, "os", void 0);
(0, _defineProperty2().default)(Analytics, "extra", {});
(0, _defineProperty2().default)(Analytics, "level", void 0);
(0, _defineProperty2().default)(Analytics, "error", void 0);
(0, _defineProperty2().default)(Analytics, "breadcrumbs", []);
(0, _defineProperty2().default)(Analytics, "analytics_usage", void 0);
(0, _defineProperty2().default)(Analytics, "error_usage", void 0);
(0, _defineProperty2().default)(Analytics, "anonymous", void 0);
(0, _defineProperty2().default)(Analytics, "environment", void 0);