160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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;
 | |
| };
 | 
