123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /**
- * @fileoverview "table reporter.
- * @author Gajus Kuizinas <gajus@gajus.com>
- */
- "use strict";
-
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
-
- const chalk = require("chalk"),
- table = require("table").table,
- pluralize = require("pluralize");
-
- //------------------------------------------------------------------------------
- // Helpers
- //------------------------------------------------------------------------------
-
- /**
- * 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("Error", errorCount, true))
- ],
- [
- chalk.yellow(pluralize("Warning", warningCount, true))
- ]
- ], {
- columns: {
- 0: {
- width: 110,
- wrapWord: true
- }
- },
- drawHorizontalLine() {
- return true;
- }
- })}`;
-
- return result;
- };
|