@dependabot/yarn-lib
Version:
📦🐈 Fast, reliable, and secure dependency management.
288 lines (225 loc) • 7.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _asyncToGenerator2;
function _load_asyncToGenerator() {
return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator'));
}
exports.stringifyLangArgs = stringifyLangArgs;
var _format;
function _load_format() {
return _format = require('./format.js');
}
var _index;
function _load_index() {
return _index = _interopRequireWildcard(require('./lang/index.js'));
}
var _isCi;
function _load_isCi() {
return _isCi = _interopRequireDefault(require('is-ci'));
}
var _os;
function _load_os() {
return _os = _interopRequireDefault(require('os'));
}
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const util = require('util');
/* eslint no-unused-vars: 0 */
const EventEmitter = require('events').EventEmitter;
function stringifyLangArgs(args) {
return args.map(function (val) {
if (val != null && val.inspect) {
return val.inspect();
} else {
try {
const str = JSON.stringify(val) || val + '';
// should match all literal line breaks and
// "u001b" that follow an odd number of backslashes and convert them to ESC
// we do this because the JSON.stringify process has escaped these characters
return str.replace(/((?:^|[^\\])(?:\\{2})*)\\u001[bB]/g, '$1\u001b').replace(/[\\]r[\\]n|[\\]n/g, (_os || _load_os()).default.EOL);
} catch (e) {
return util.inspect(val);
}
}
});
}
class BaseReporter {
constructor(opts = {}) {
const lang = 'en';
this.language = lang;
this.stdout = opts.stdout || process.stdout;
this.stderr = opts.stderr || process.stderr;
this.stdin = opts.stdin || this._getStandardInput();
this.emoji = !!opts.emoji;
this.noProgress = !!opts.noProgress || (_isCi || _load_isCi()).default;
this.isVerbose = !!opts.verbose;
// $FlowFixMe: this is valid!
this.isTTY = this.stdout.isTTY;
this.peakMemory = 0;
this.startTime = Date.now();
this.format = (_format || _load_format()).defaultFormatter;
}
lang(key, ...args) {
const msg = (_index || _load_index())[this.language][key] || (_index || _load_index()).en[key];
if (!msg) {
throw new ReferenceError(`Unknown language key ${key}`);
}
// stringify args
const stringifiedArgs = stringifyLangArgs(args);
// replace $0 placeholders with args
return msg.replace(/\$(\d+)/g, (str, i) => {
return stringifiedArgs[i];
});
}
/**
* `stringifyLangArgs` run `JSON.stringify` on strings too causing
* them to appear quoted. This marks them as "raw" and prevents
* the quiating and escaping
*/
rawText(str) {
return {
inspect() {
return str;
}
};
}
verbose(msg) {
if (this.isVerbose) {
this._verbose(msg);
}
}
verboseInspect(val) {
if (this.isVerbose) {
this._verboseInspect(val);
}
}
_verbose(msg) {}
_verboseInspect(val) {}
_getStandardInput() {
let standardInput;
// Accessing stdin in a win32 headless process (e.g., Visual Studio) may throw an exception.
try {
standardInput = process.stdin;
} catch (e) {
console.warn(e.message);
delete process.stdin;
// $FlowFixMe: this is valid!
process.stdin = new EventEmitter();
standardInput = process.stdin;
}
return standardInput;
}
initPeakMemoryCounter() {
this.checkPeakMemory();
this.peakMemoryInterval = setInterval(() => {
this.checkPeakMemory();
}, 1000);
// $FlowFixMe: Node's setInterval returns a Timeout, not a Number
this.peakMemoryInterval.unref();
}
checkPeakMemory() {
var _process$memoryUsage = process.memoryUsage();
const heapTotal = _process$memoryUsage.heapTotal;
if (heapTotal > this.peakMemory) {
this.peakMemory = heapTotal;
}
}
close() {
if (this.peakMemoryInterval) {
clearInterval(this.peakMemoryInterval);
this.peakMemoryInterval = null;
}
}
getTotalTime() {
return Date.now() - this.startTime;
}
// TODO
list(key, items, hints) {}
// Outputs basic tree structure to console
tree(key, obj) {}
// called whenever we begin a step in the CLI.
step(current, total, message, emoji) {}
// a error message has been triggered. this however does not always meant an abrupt
// program end.
error(message) {}
// an info message has been triggered. this provides things like stats and diagnostics.
info(message) {}
// a warning message has been triggered.
warn(message) {}
// a success message has been triggered.
success(message) {}
// a simple log message
// TODO: rethink the {force} parameter. In the meantime, please don't use it (cf comments in #4143).
log(message, { force = false } = {}) {}
// a shell command has been executed
command(command) {}
// inspect and pretty-print any value
inspect(value) {}
// the screen shown at the very start of the CLI
header(command, pkg) {}
// the screen shown at the very end of the CLI
footer(showPeakMemory) {}
//
table(head, body) {}
// render an activity spinner and return a function that will trigger an update
activity() {
return {
tick(name) {},
end() {}
};
}
//
activitySet(total, workers) {
return {
spinners: Array(workers).fill({
clear() {},
setPrefix() {},
tick() {},
end() {}
}),
end() {}
};
}
//
question(question, options = {}) {
return Promise.reject(new Error('Not implemented'));
}
//
questionAffirm(question) {
var _this = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
const condition = true; // trick eslint
while (condition) {
let answer = yield _this.question(question);
answer = answer.toLowerCase();
if (answer === 'y' || answer === 'yes') {
return true;
}
if (answer === 'n' || answer === 'no') {
return false;
}
_this.error('Invalid answer for question');
}
return false;
})();
}
// prompt the user to select an option from an array
select(header, question, options) {
return Promise.reject(new Error('Not implemented'));
}
// render a progress bar and return a function which when called will trigger an update
progress(total) {
return function () {};
}
// utility function to disable progress bar
disableProgress() {
this.noProgress = true;
}
//
prompt(message, choices, options = {}) {
return Promise.reject(new Error('Not implemented'));
}
}
exports.default = BaseReporter;