| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | /** * @fileoverview HTML reporter * @author Julian Laval */"use strict";const lodash = require("lodash");const fs = require("fs");const path = require("path");//------------------------------------------------------------------------------// Helpers//------------------------------------------------------------------------------const pageTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-page.html"), "utf-8"));const messageTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-message.html"), "utf-8"));const resultTemplate = lodash.template(fs.readFileSync(path.join(__dirname, "html-template-result.html"), "utf-8"));/** * Given a word and a count, append an s if count is not one. * @param {string} word A word in its singular form. * @param {int} count A number controlling whether word should be pluralized. * @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`);}/** * Renders text along the template of x problems (x errors, x warnings) * @param {string} totalErrors Total errors * @param {string} totalWarnings Total warnings * @returns {string} The formatted string, pluralized where necessary */function renderSummary(totalErrors, totalWarnings) {    const totalProblems = totalErrors + totalWarnings;    let renderedText = `${totalProblems} ${pluralize("problem", totalProblems)}`;    if (totalProblems !== 0) {        renderedText += ` (${totalErrors} ${pluralize("error", totalErrors)}, ${totalWarnings} ${pluralize("warning", totalWarnings)})`;    }    return renderedText;}/** * Get the color based on whether there are errors/warnings... * @param {string} totalErrors Total errors * @param {string} totalWarnings Total warnings * @returns {int} The color code (0 = green, 1 = yellow, 2 = red) */function renderColor(totalErrors, totalWarnings) {    if (totalErrors !== 0) {        return 2;    }    if (totalWarnings !== 0) {        return 1;    }    return 0;}/** * Get HTML (table rows) describing the messages. * @param {Array} messages Messages. * @param {int} parentIndex Index of the parent HTML row. * @returns {string} HTML (table rows) describing the messages. */function renderMessages(messages, parentIndex) {    /**     * Get HTML (table row) describing a message.     * @param {Object} message Message.     * @returns {string} HTML (table row) describing a message.     */    return lodash.map(messages, message => {        const lineNumber = message.line || 0;        const columnNumber = message.column || 0;        return messageTemplate({            parentIndex,            lineNumber,            columnNumber,            severityNumber: message.severity,            severityName: message.severity === 1 ? "Warning" : "Error",            message: message.message,            ruleId: message.ruleId        });    }).join("\n");}/** * @param {Array} results Test results. * @returns {string} HTML string describing the results. */function renderResults(results) {    return lodash.map(results, (result, index) => resultTemplate({        index,        color: renderColor(result.errorCount, result.warningCount),        filePath: result.filePath,        summary: renderSummary(result.errorCount, result.warningCount)    }) + renderMessages(result.messages, index)).join("\n");}//------------------------------------------------------------------------------// Public Interface//------------------------------------------------------------------------------module.exports = function(results) {    let totalErrors,        totalWarnings;    totalErrors = 0;    totalWarnings = 0;    // Iterate over results to get totals    results.forEach(result => {        totalErrors += result.errorCount;        totalWarnings += result.warningCount;    });    return pageTemplate({        date: new Date(),        reportColor: renderColor(totalErrors, totalWarnings),        reportSummary: renderSummary(totalErrors, totalWarnings),        results: renderResults(results)    });};
 |