@dependabot/yarn-lib
Version:
📦🐈 Fast, reliable, and secure dependency management.
556 lines (446 loc) • 13.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _asyncToGenerator2;
function _load_asyncToGenerator() {
return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator'));
}
var _baseReporter;
function _load_baseReporter() {
return _baseReporter = _interopRequireDefault(require('../base-reporter.js'));
}
var _progressBar;
function _load_progressBar() {
return _progressBar = _interopRequireDefault(require('./progress-bar.js'));
}
var _spinnerProgress;
function _load_spinnerProgress() {
return _spinnerProgress = _interopRequireDefault(require('./spinner-progress.js'));
}
var _util;
function _load_util() {
return _util = require('./util.js');
}
var _misc;
function _load_misc() {
return _misc = require('../../util/misc.js');
}
var _treeHelper;
function _load_treeHelper() {
return _treeHelper = require('./helpers/tree-helper.js');
}
var _inquirer;
function _load_inquirer() {
return _inquirer = _interopRequireDefault(require('inquirer'));
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _require = require('util');
const inspect = _require.inspect;
const readline = require('readline');
const chalk = require('chalk');
const stripAnsi = require('strip-ansi');
const read = require('read');
const tty = require('tty');
// fixes bold on windows
if (process.platform === 'win32' && !(process.env.TERM && /^xterm/i.test(process.env.TERM))) {
chalk.bold._styles[0].close += '\u001b[m';
}
class ConsoleReporter extends (_baseReporter || _load_baseReporter()).default {
constructor(opts) {
super(opts);
this._lastCategorySize = 0;
this._spinners = new Set();
this.format = chalk;
this.format.stripColor = stripAnsi;
this.isSilent = !!opts.isSilent;
}
_prependEmoji(msg, emoji) {
if (this.emoji && emoji && this.isTTY) {
msg = `${emoji} ${msg}`;
}
return msg;
}
_logCategory(category, color, msg) {
this._lastCategorySize = category.length;
this._log(`${this.format[color](category)} ${msg}`);
}
_verbose(msg) {
this._logCategory('verbose', 'grey', `${process.uptime()} ${msg}`);
}
_verboseInspect(obj) {
this.inspect(obj);
}
close() {
for (var _iterator = this._spinners, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
const spinner = _ref;
spinner.stop();
}
this._spinners.clear();
this.stopProgress();
super.close();
}
table(head, body) {
//
head = head.map(field => this.format.underline(field));
//
const rows = [head].concat(body);
// get column widths
const cols = [];
for (let i = 0; i < head.length; i++) {
const widths = rows.map(row => this.format.stripColor(row[i]).length);
cols[i] = Math.max(...widths);
}
//
const builtRows = rows.map(row => {
for (let i = 0; i < row.length; i++) {
const field = row[i];
const padding = cols[i] - this.format.stripColor(field).length;
row[i] = field + ' '.repeat(padding);
}
return row.join(' ');
});
this.log(builtRows.join('\n'));
}
step(current, total, msg, emoji) {
msg = this._prependEmoji(msg, emoji);
if (msg.endsWith('?')) {
msg = `${(0, (_misc || _load_misc()).removeSuffix)(msg, '?')}...?`;
} else {
msg += '...';
}
this.log(`${this.format.dim(`[${current}/${total}]`)} ${msg}`);
}
inspect(value) {
if (typeof value !== 'number' && typeof value !== 'string') {
value = inspect(value, {
breakLength: 0,
colors: true,
depth: null,
maxArrayLength: null
});
}
this.log(String(value), { force: true });
}
list(key, items, hints) {
const gutterWidth = (this._lastCategorySize || 2) - 1;
if (hints) {
for (var _iterator2 = items, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref2 = _i2.value;
}
const item = _ref2;
this._log(`${' '.repeat(gutterWidth)}- ${this.format.bold(item)}`);
this._log(` ${' '.repeat(gutterWidth)} ${hints[item]}`);
}
} else {
for (var _iterator3 = items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
var _ref3;
if (_isArray3) {
if (_i3 >= _iterator3.length) break;
_ref3 = _iterator3[_i3++];
} else {
_i3 = _iterator3.next();
if (_i3.done) break;
_ref3 = _i3.value;
}
const item = _ref3;
this._log(`${' '.repeat(gutterWidth)}- ${item}`);
}
}
}
header(command, pkg) {
this.log(this.format.bold(`${pkg.name} ${command} v${pkg.version}`));
}
footer(showPeakMemory) {
this.stopProgress();
const totalTime = (this.getTotalTime() / 1000).toFixed(2);
let msg = `Done in ${totalTime}s.`;
if (showPeakMemory) {
const peakMemory = (this.peakMemory / 1024 / 1024).toFixed(2);
msg += ` Peak memory usage ${peakMemory}MB.`;
}
this.log(this._prependEmoji(msg, '✨'));
}
log(msg, { force = false } = {}) {
this._lastCategorySize = 0;
this._log(msg, { force });
}
_log(msg, { force = false } = {}) {
if (this.isSilent && !force) {
return;
}
(0, (_util || _load_util()).clearLine)(this.stdout);
this.stdout.write(`${msg}\n`);
}
success(msg) {
this._logCategory('success', 'green', msg);
}
error(msg) {
(0, (_util || _load_util()).clearLine)(this.stderr);
this.stderr.write(`${this.format.red('error')} ${msg}\n`);
}
info(msg) {
this._logCategory('info', 'blue', msg);
}
command(command) {
this.log(this.format.dim(`$ ${command}`));
}
warn(msg) {
(0, (_util || _load_util()).clearLine)(this.stderr);
this.stderr.write(`${this.format.yellow('warning')} ${msg}\n`);
}
question(question, options = {}) {
if (!process.stdout.isTTY) {
return Promise.reject(new Error("Can't answer a question unless a user TTY"));
}
return new Promise((resolve, reject) => {
read({
prompt: `${this.format.dim('question')} ${question}: `,
silent: !!options.password,
output: this.stdout,
input: this.stdin
}, (err, answer) => {
if (err) {
if (err.message === 'canceled') {
process.exitCode = 1;
}
reject(err);
} else {
if (!answer && options.required) {
this.error(this.lang('answerRequired'));
resolve(this.question(question, options));
} else {
resolve(answer);
}
}
});
});
}
// handles basic tree output to console
tree(key, trees) {
this.stopProgress();
//
const output = ({ name, children, hint, color }, titlePrefix, childrenPrefix) => {
const formatter = this.format;
const out = (0, (_treeHelper || _load_treeHelper()).getFormattedOutput)({
prefix: titlePrefix,
hint,
color,
name,
formatter
});
this.stdout.write(out);
if (children && children.length) {
(0, (_treeHelper || _load_treeHelper()).recurseTree)((0, (_treeHelper || _load_treeHelper()).sortTrees)(children), childrenPrefix, output);
}
};
(0, (_treeHelper || _load_treeHelper()).recurseTree)((0, (_treeHelper || _load_treeHelper()).sortTrees)(trees), '', output);
}
activitySet(total, workers) {
if (!this.isTTY || this.noProgress) {
return super.activitySet(total, workers);
}
const spinners = [];
const reporterSpinners = this._spinners;
for (let i = 1; i < workers; i++) {
this.log('');
}
for (let i = 0; i < workers; i++) {
const spinner = new (_spinnerProgress || _load_spinnerProgress()).default(this.stderr, i);
reporterSpinners.add(spinner);
spinner.start();
let prefix = null;
let current = 0;
const updatePrefix = () => {
spinner.setPrefix(`${this.format.dim(`[${current === 0 ? '-' : current}/${total}]`)} `);
};
const clear = () => {
prefix = null;
current = 0;
updatePrefix();
spinner.setText('waiting...');
};
clear();
spinners.unshift({
clear,
setPrefix(_current, _prefix) {
current = _current;
prefix = _prefix;
spinner.setText(prefix);
updatePrefix();
},
tick(msg) {
if (prefix) {
msg = `${prefix}: ${msg}`;
}
spinner.setText(msg);
},
end() {
spinner.stop();
reporterSpinners.delete(spinner);
}
});
}
return {
spinners,
end: () => {
for (var _iterator4 = spinners, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
var _ref4;
if (_isArray4) {
if (_i4 >= _iterator4.length) break;
_ref4 = _iterator4[_i4++];
} else {
_i4 = _iterator4.next();
if (_i4.done) break;
_ref4 = _i4.value;
}
const spinner = _ref4;
spinner.end();
}
readline.moveCursor(this.stdout, 0, -workers + 1);
}
};
}
activity() {
if (!this.isTTY) {
return {
tick() {},
end() {}
};
}
const reporterSpinners = this._spinners;
const spinner = new (_spinnerProgress || _load_spinnerProgress()).default(this.stderr);
spinner.start();
reporterSpinners.add(spinner);
return {
tick(name) {
spinner.setText(name);
},
end() {
spinner.stop();
reporterSpinners.delete(spinner);
}
};
}
select(header, question, options) {
if (!this.isTTY) {
return Promise.reject(new Error("Can't answer a question unless a user TTY"));
}
const rl = readline.createInterface({
input: this.stdin,
output: this.stdout,
terminal: true
});
const questions = options.map(opt => opt.name);
const answers = options.map(opt => opt.value);
function toIndex(input) {
const index = answers.indexOf(input);
if (index >= 0) {
return index;
} else {
return +input;
}
}
return new Promise(resolve => {
this.info(header);
for (let i = 0; i < questions.length; i++) {
this.log(` ${this.format.dim(`${i + 1})`)} ${questions[i]}`);
}
const ask = () => {
rl.question(`${question}: `, input => {
let index = toIndex(input);
if (isNaN(index)) {
this.log('Not a number');
ask();
return;
}
if (index <= 0 || index > options.length) {
this.log('Outside answer range');
ask();
return;
}
// get index
index--;
rl.close();
resolve(answers[index]);
});
};
ask();
});
}
progress(count) {
if (this.noProgress || count <= 0) {
return function () {
// noop
};
}
if (!this.isTTY) {
return function () {
// TODO what should the behaviour here be? we could buffer progress messages maybe
};
}
// Clear any potentiall old progress bars
this.stopProgress();
const bar = this._progressBar = new (_progressBar || _load_progressBar()).default(count, this.stderr, progress => {
if (progress === this._progressBar) {
this._progressBar = null;
}
});
bar.render();
return function () {
bar.tick();
};
}
stopProgress() {
if (this._progressBar) {
this._progressBar.stop();
}
}
prompt(message, choices, options = {}) {
var _this = this;
return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {
if (!process.stdout.isTTY) {
return Promise.reject(new Error("Can't answer a question unless a user TTY"));
}
let pageSize;
if (process.stdout instanceof tty.WriteStream) {
pageSize = process.stdout.rows - 2;
}
const rl = readline.createInterface({
input: _this.stdin,
output: _this.stdout,
terminal: true
});
// $FlowFixMe: Need to update the type of Inquirer
const prompt = (_inquirer || _load_inquirer()).default.createPromptModule({
input: _this.stdin,
output: _this.stdout
});
var _options$name = options.name;
const name = _options$name === undefined ? 'prompt' : _options$name;
var _options$type = options.type;
const type = _options$type === undefined ? 'input' : _options$type,
validate = options.validate;
const answers = yield prompt([{ name, type, message, choices, pageSize, validate }]);
rl.close();
return answers[name];
})();
}
}
exports.default = ConsoleReporter;