JezK
Edit File: console-reporter.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _toConsumableArray2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); _toConsumableArray2 = function _toConsumableArray2() { return data; }; return data; } function _classCallCheck2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); _classCallCheck2 = function _classCallCheck2() { return data; }; return data; } function _createClass2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); _createClass2 = function _createClass2() { return data; }; return data; } function _assertThisInitialized2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); _assertThisInitialized2 = function _assertThisInitialized2() { return data; }; return data; } function _get2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/get")); _get2 = function _get2() { return data; }; return data; } function _inherits2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); _inherits2 = function _inherits2() { return data; }; return data; } function _possibleConstructorReturn2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); _possibleConstructorReturn2 = function _possibleConstructorReturn2() { return data; }; return data; } function _getPrototypeOf2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); _getPrototypeOf2 = function _getPrototypeOf2() { return data; }; return data; } function _defineProperty2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); _defineProperty2 = function _defineProperty2() { return data; }; return data; } function _baseReporter() { var data = _interopRequireDefault(require("../base-reporter.js")); _baseReporter = function _baseReporter() { return data; }; return data; } function _progressBar() { var data = _interopRequireDefault(require("./progress-bar.js")); _progressBar = function _progressBar() { return data; }; return data; } function _spinnerProgress() { var data = _interopRequireDefault(require("./spinner-progress.js")); _spinnerProgress = function _spinnerProgress() { return data; }; return data; } function _util() { var data = require("./util.js"); _util = function _util() { return data; }; return data; } function _misc() { var data = require("../../util/misc.js"); _misc = function _misc() { return data; }; return data; } function _treeHelper() { var data = require("./helpers/tree-helper.js"); _treeHelper = function _treeHelper() { return data; }; return data; } function _inquirer() { var data = _interopRequireDefault(require("inquirer")); _inquirer = function _inquirer() { return data; }; return data; } function _cliTable() { var data = _interopRequireDefault(require("cli-table")); _cliTable = function _cliTable() { return data; }; return data; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2()["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2()["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2()["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var _require = require('util'), _inspect = _require.inspect; var readline = require('readline'); var chalk = require('chalk'); var stripAnsi = require('strip-ansi'); var read = require('read'); var tty = require('tty'); var AUDIT_COL_WIDTHS = [15, 62]; var auditSeverityColors = { info: chalk.bold, low: chalk.bold, moderate: chalk.yellow, high: chalk.red, critical: chalk.bgRed }; // fixes bold on windows if (process.platform === 'win32' && !(process.env.TERM && /^xterm/i.test(process.env.TERM))) { chalk.bold._styles[0].close += "\x1B[m"; } var ConsoleReporter = /*#__PURE__*/function (_BaseReporter) { (0, _inherits2()["default"])(ConsoleReporter, _BaseReporter); var _super = _createSuper(ConsoleReporter); function ConsoleReporter(opts) { var _this; (0, _classCallCheck2()["default"])(this, ConsoleReporter); _this = _super.call(this, opts); (0, _defineProperty2()["default"])((0, _assertThisInitialized2()["default"])(_this), "_lastCategorySize", void 0); (0, _defineProperty2()["default"])((0, _assertThisInitialized2()["default"])(_this), "_progressBar", void 0); (0, _defineProperty2()["default"])((0, _assertThisInitialized2()["default"])(_this), "_spinners", void 0); _this._lastCategorySize = 0; _this._spinners = new Set(); _this.format = chalk; _this.format.stripColor = stripAnsi; _this.isSilent = !!opts.isSilent; return _this; } (0, _createClass2()["default"])(ConsoleReporter, [{ key: "_prependEmoji", value: function _prependEmoji(msg, emoji) { if (this.emoji && emoji && this.isTTY) { msg = "".concat(emoji, " ").concat(msg); } return msg; } }, { key: "_logCategory", value: function _logCategory(category, color, msg) { this._lastCategorySize = category.length; this._log("".concat(this.format[color](category), " ").concat(msg)); } }, { key: "_verbose", value: function _verbose(msg) { this._logCategory('verbose', 'grey', "".concat(process.uptime(), " ").concat(msg)); } }, { key: "_verboseInspect", value: function _verboseInspect(obj) { this.inspect(obj); } }, { key: "close", value: function close() { var _iterator = _createForOfIteratorHelper(this._spinners), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var spinner = _step.value; spinner.stop(); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } this._spinners.clear(); this.stopProgress(); (0, _get2()["default"])((0, _getPrototypeOf2()["default"])(ConsoleReporter.prototype), "close", this).call(this); } }, { key: "table", value: function table(head, body) { var _this2 = this; // head = head.map(function (field) { return _this2.format.underline(field); }); // var rows = [head].concat(body); // get column widths var cols = []; var _loop = function _loop(i) { var widths = rows.map(function (row) { return _this2.format.stripColor(row[i]).length; }); cols[i] = Math.max.apply(Math, (0, _toConsumableArray2()["default"])(widths)); }; for (var i = 0; i < head.length; i++) { _loop(i); } // var builtRows = rows.map(function (row) { for (var _i = 0; _i < row.length; _i++) { var field = row[_i]; var padding = cols[_i] - _this2.format.stripColor(field).length; row[_i] = field + ' '.repeat(padding); } return row.join(' '); }); this.log(builtRows.join('\n')); } }, { key: "step", value: function step(current, total, msg, emoji) { msg = this._prependEmoji(msg, emoji); if (msg.endsWith('?')) { msg = "".concat((0, _misc().removeSuffix)(msg, '?'), "...?"); } else { msg += '...'; } this.log("".concat(this.format.dim("[".concat(current, "/").concat(total, "]")), " ").concat(msg)); } }, { key: "inspect", value: function inspect(value) { if (typeof value !== 'number' && typeof value !== 'string') { value = _inspect(value, { breakLength: 0, colors: this.isTTY, depth: null, maxArrayLength: null }); } this.log(String(value), { force: true }); } }, { key: "list", value: function list(key, items, hints) { var gutterWidth = (this._lastCategorySize || 2) - 1; if (hints) { var _iterator2 = _createForOfIteratorHelper(items), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var item = _step2.value; this._log("".concat(' '.repeat(gutterWidth), "- ").concat(this.format.bold(item))); this._log(" ".concat(' '.repeat(gutterWidth), " ").concat(hints[item])); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } else { var _iterator3 = _createForOfIteratorHelper(items), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _item = _step3.value; this._log("".concat(' '.repeat(gutterWidth), "- ").concat(_item)); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } } } }, { key: "header", value: function header(command, pkg) { this.log(this.format.bold("".concat(pkg.name, " ").concat(command, " v").concat(pkg.version))); } }, { key: "footer", value: function footer(showPeakMemory) { this.stopProgress(); var totalTime = (this.getTotalTime() / 1000).toFixed(2); var msg = "Done in ".concat(totalTime, "s."); if (showPeakMemory) { var peakMemory = (this.peakMemory / 1024 / 1024).toFixed(2); msg += " Peak memory usage ".concat(peakMemory, "MB."); } this.log(this._prependEmoji(msg, '✨')); } }, { key: "log", value: function log(msg) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$force = _ref.force, force = _ref$force === void 0 ? false : _ref$force; this._lastCategorySize = 0; this._log(msg, { force: force }); } }, { key: "_log", value: function _log(msg) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$force = _ref2.force, force = _ref2$force === void 0 ? false : _ref2$force; if (this.isSilent && !force) { return; } (0, _util().clearLine)(this.stdout); this.stdout.write("".concat(msg, "\n")); } }, { key: "success", value: function success(msg) { this._logCategory('success', 'green', msg); } }, { key: "error", value: function error(msg) { (0, _util().clearLine)(this.stderr); this.stderr.write("".concat(this.format.red('error'), " ").concat(msg, "\n")); } }, { key: "info", value: function info(msg) { this._logCategory('info', 'blue', msg); } }, { key: "command", value: function command(_command) { this.log(this.format.dim("$ ".concat(_command))); } }, { key: "warn", value: function warn(msg) { (0, _util().clearLine)(this.stderr); this.stderr.write("".concat(this.format.yellow('warning'), " ").concat(msg, "\n")); } }, { key: "question", value: function question(_question) { var _this3 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!process.stdout.isTTY) { return Promise.reject(new Error("Can't answer a question unless a user TTY")); } return new Promise(function (resolve, reject) { read({ prompt: "".concat(_this3.format.dim('question'), " ").concat(_question, ": "), silent: !!options.password, output: _this3.stdout, input: _this3.stdin }, function (err, answer) { if (err) { if (err.message === 'canceled') { process.exitCode = 1; } reject(err); } else { if (!answer && options.required) { _this3.error(_this3.lang('answerRequired')); resolve(_this3.question(_question, options)); } else { resolve(answer); } } }); }); } // handles basic tree output to console }, { key: "tree", value: function tree(key, trees) { var _this4 = this; var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref3$force = _ref3.force, force = _ref3$force === void 0 ? false : _ref3$force; this.stopProgress(); // if (this.isSilent && !force) { return; } var output = function output(_ref4, titlePrefix, childrenPrefix) { var name = _ref4.name, children = _ref4.children, hint = _ref4.hint, color = _ref4.color; var formatter = _this4.format; var out = (0, _treeHelper().getFormattedOutput)({ prefix: titlePrefix, hint: hint, color: color, name: name, formatter: formatter }); _this4.stdout.write(out); if (children && children.length) { (0, _treeHelper().recurseTree)((0, _treeHelper().sortTrees)(children), childrenPrefix, output); } }; (0, _treeHelper().recurseTree)((0, _treeHelper().sortTrees)(trees), '', output); } }, { key: "activitySet", value: function activitySet(total, workers) { var _this5 = this; if (!this.isTTY || this.noProgress) { return (0, _get2()["default"])((0, _getPrototypeOf2()["default"])(ConsoleReporter.prototype), "activitySet", this).call(this, total, workers); } var spinners = []; var reporterSpinners = this._spinners; for (var i = 1; i < workers; i++) { this.log(''); } var _loop2 = function _loop2() { var spinner = new (_spinnerProgress()["default"])(_this5.stderr, _i2); reporterSpinners.add(spinner); spinner.start(); var prefix = null; var current = 0; var updatePrefix = function updatePrefix() { spinner.setPrefix("".concat(_this5.format.dim("[".concat(current === 0 ? '-' : current, "/").concat(total, "]")), " ")); }; var clear = function clear() { prefix = null; current = 0; updatePrefix(); spinner.setText('waiting...'); }; clear(); spinners.unshift({ clear: clear, setPrefix: function setPrefix(_current, _prefix) { current = _current; prefix = _prefix; spinner.setText(prefix); updatePrefix(); }, tick: function tick(msg) { if (prefix) { msg = "".concat(prefix, ": ").concat(msg); } spinner.setText(msg); }, end: function end() { spinner.stop(); reporterSpinners["delete"](spinner); } }); }; for (var _i2 = 0; _i2 < workers; _i2++) { _loop2(); } return { spinners: spinners, end: function end() { for (var _i3 = 0, _spinners = spinners; _i3 < _spinners.length; _i3++) { var spinner = _spinners[_i3]; spinner.end(); } readline.moveCursor(_this5.stdout, 0, -workers + 1); } }; } }, { key: "activity", value: function activity() { if (!this.isTTY) { return { tick: function tick() {}, end: function end() {} }; } var reporterSpinners = this._spinners; var spinner = new (_spinnerProgress()["default"])(this.stderr); spinner.start(); reporterSpinners.add(spinner); return { tick: function tick(name) { spinner.setText(name); }, end: function end() { spinner.stop(); reporterSpinners["delete"](spinner); } }; } }, { key: "select", value: function select(header, question, options) { var _this6 = this; if (!this.isTTY) { return Promise.reject(new Error("Can't answer a question unless a user TTY")); } var rl = readline.createInterface({ input: this.stdin, output: this.stdout, terminal: true }); var questions = options.map(function (opt) { return opt.name; }); var answers = options.map(function (opt) { return opt.value; }); function toIndex(input) { var index = answers.indexOf(input); if (index >= 0) { return index; } else { return +input; } } return new Promise(function (resolve) { _this6.info(header); for (var i = 0; i < questions.length; i++) { _this6.log(" ".concat(_this6.format.dim("".concat(i + 1, ")")), " ").concat(questions[i])); } var ask = function ask() { rl.question("".concat(question, ": "), function (input) { var index = toIndex(input); if (isNaN(index)) { _this6.log('Not a number'); ask(); return; } if (index <= 0 || index > options.length) { _this6.log('Outside answer range'); ask(); return; } // get index index--; rl.close(); resolve(answers[index]); }); }; ask(); }); } }, { key: "progress", value: function progress(count) { var _this7 = this; 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 potentially old progress bars this.stopProgress(); var bar = this._progressBar = new (_progressBar()["default"])(count, this.stderr, function (progress) { if (progress === _this7._progressBar) { _this7._progressBar = null; } }); bar.render(); return function () { bar.tick(); }; } }, { key: "stopProgress", value: function stopProgress() { if (this._progressBar) { this._progressBar.stop(); } } }, { key: "prompt", value: function () { var _prompt = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(message, choices) { var options, pageSize, rl, prompt, _options$name, name, _options$type, type, validate, answers, _args = arguments; return _regenerator()["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}; if (process.stdout.isTTY) { _context.next = 3; break; } return _context.abrupt("return", Promise.reject(new Error("Can't answer a question unless a user TTY"))); case 3: if (process.stdout instanceof tty.WriteStream) { pageSize = process.stdout.rows - 2; } rl = readline.createInterface({ input: this.stdin, output: this.stdout, terminal: true }); // $FlowFixMe: Need to update the type of Inquirer prompt = _inquirer()["default"].createPromptModule({ input: this.stdin, output: this.stdout }); _options$name = options.name, name = _options$name === void 0 ? 'prompt' : _options$name, _options$type = options.type, type = _options$type === void 0 ? 'input' : _options$type, validate = options.validate; _context.next = 9; return prompt([{ name: name, type: type, message: message, choices: choices, pageSize: pageSize, validate: validate }]); case 9: answers = _context.sent; rl.close(); return _context.abrupt("return", answers[name]); case 12: case "end": return _context.stop(); } }, _callee, this); })); function prompt(_x, _x2) { return _prompt.apply(this, arguments); } return prompt; }() }, { key: "auditSummary", value: function auditSummary(auditMetadata) { var totalDependencies = auditMetadata.totalDependencies, vulnerabilities = auditMetadata.vulnerabilities; var totalVulnerabilities = vulnerabilities.info + vulnerabilities.low + vulnerabilities.moderate + vulnerabilities.high + vulnerabilities.critical; var summary = this.lang('auditSummary', totalVulnerabilities > 0 ? this.rawText(chalk.red(totalVulnerabilities.toString())) : totalVulnerabilities, totalDependencies); this._log(summary); if (totalVulnerabilities) { var severities = []; if (vulnerabilities.info) { severities.push(this.lang('auditInfo', vulnerabilities.info)); } if (vulnerabilities.low) { severities.push(this.lang('auditLow', vulnerabilities.low)); } if (vulnerabilities.moderate) { severities.push(this.lang('auditModerate', vulnerabilities.moderate)); } if (vulnerabilities.high) { severities.push(this.lang('auditHigh', vulnerabilities.high)); } if (vulnerabilities.critical) { severities.push(this.lang('auditCritical', vulnerabilities.critical)); } this._log("".concat(this.lang('auditSummarySeverity'), " ").concat(severities.join(' | '))); } } }, { key: "auditAction", value: function auditAction(recommendation) { var label = recommendation.action.resolves.length === 1 ? 'vulnerability' : 'vulnerabilities'; this._log(this.lang('auditResolveCommand', this.rawText(chalk.inverse(recommendation.cmd)), recommendation.action.resolves.length, this.rawText(label))); if (recommendation.isBreaking) { this._log(this.lang('auditSemverMajorChange')); } } }, { key: "auditManualReview", value: function auditManualReview() { var tableOptions = { colWidths: [78] }; var table = new (_cliTable()["default"])(tableOptions); table.push([{ content: this.lang('auditManualReview'), vAlign: 'center', hAlign: 'center' }]); this._log(table.toString()); } }, { key: "auditAdvisory", value: function auditAdvisory(resolution, _auditAdvisory) { function colorSeverity(severity, message) { return auditSeverityColors[severity](message || severity); } function makeAdvisoryTableRow(patchedIn) { var patchRows = []; if (patchedIn) { patchRows.push({ 'Patched in': patchedIn }); } return [(0, _defineProperty2()["default"])({}, chalk.bold(colorSeverity(_auditAdvisory.severity)), chalk.bold(_auditAdvisory.title)), { Package: _auditAdvisory.module_name }].concat(patchRows, [{ 'Dependency of': "".concat(resolution.path.split('>')[0], " ").concat(resolution.dev ? '[dev]' : '') }, { Path: resolution.path.split('>').join(' > ') }, { 'More info': "https://www.npmjs.com/advisories/".concat(_auditAdvisory.id) }]); } var tableOptions = { colWidths: AUDIT_COL_WIDTHS, wordWrap: true }; var table = new (_cliTable()["default"])(tableOptions); var patchedIn = _auditAdvisory.patched_versions.replace(' ', '') === '<0.0.0' ? 'No patch available' : _auditAdvisory.patched_versions; table.push.apply(table, (0, _toConsumableArray2()["default"])(makeAdvisoryTableRow(patchedIn))); this._log(table.toString()); } }]); return ConsoleReporter; }(_baseReporter()["default"]); exports["default"] = ConsoleReporter; //# sourceMappingURL=console-reporter.js.map