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