|
|
- /**
- * @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;
- };
|