|
|
/** * @fileoverview "table reporter. * @author Gajus Kuizinas <gajus@gajus.com> */ "use strict";
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const chalk = require("chalk"), table = require("table").table;
//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------
/** * Given a word and a count, append an "s" if count is not one. * @param {string} word A word. * @param {number} count Quantity. * @returns {string} The original word with an s on the end if count is not one. */ function pluralize(word, count) { return (count === 1 ? word : `${word}s`); }
/** * Draws text table. * @param {Array<Object>} messages Error messages relating to a specific file. * @returns {string} A text table. */ function drawTable(messages) { const rows = [];
if (messages.length === 0) { return ""; }
rows.push([ chalk.bold("Line"), chalk.bold("Column"), chalk.bold("Type"), chalk.bold("Message"), chalk.bold("Rule ID") ]);
messages.forEach(message => { let messageType;
if (message.fatal || message.severity === 2) { messageType = chalk.red("error"); } else { messageType = chalk.yellow("warning"); }
rows.push([ message.line || 0, message.column || 0, messageType, message.message, message.ruleId || "" ]); });
return table(rows, { columns: { 0: { width: 8, wrapWord: true }, 1: { width: 8, wrapWord: true }, 2: { width: 8, wrapWord: true }, 3: { paddingRight: 5, width: 50, wrapWord: true }, 4: { width: 20, wrapWord: true } }, drawHorizontalLine(index) { return index === 1; } }); }
/** * Draws a report (multiple tables). * @param {Array} results Report results for every file. * @returns {string} A column of text tables. */ function drawReport(results) { let files;
files = results.map(result => { if (!result.messages.length) { return ""; }
return `\n${result.filePath}\n\n${drawTable(result.messages)}`; });
files = files.filter(content => content.trim());
return files.join(""); }
//------------------------------------------------------------------------------
// Public Interface
//------------------------------------------------------------------------------
module.exports = function(report) { let result, errorCount, warningCount;
result = ""; errorCount = 0; warningCount = 0;
report.forEach(fileReport => { errorCount += fileReport.errorCount; warningCount += fileReport.warningCount; });
if (errorCount || warningCount) { result = drawReport(report); }
result += `\n${table([ [ chalk.red(pluralize(`${errorCount} Error`, errorCount)) ], [ chalk.yellow(pluralize(`${warningCount} Warning`, warningCount)) ] ], { columns: { 0: { width: 110, wrapWord: true } }, drawHorizontalLine() { return true; } })}`;
return result; };
|