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;
|
||
|
};
|