You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
3.7 KiB
159 lines
3.7 KiB
/** |
|
* @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; |
|
};
|
|
|