diff options
author | Michaël Zasso <targos@protonmail.com> | 2017-12-22 16:53:42 +0100 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2018-01-11 09:48:05 +0100 |
commit | 3dc30632755713179f345f4af024bd904c6162d0 (patch) | |
tree | f28c4f6dd6dfc5992edf301449d1a371d229755b /tools/node_modules/eslint/lib/formatters | |
parent | a2c7085dd4a8e60d1a47572aca8bb6fcb7a32f88 (diff) | |
download | node-new-3dc30632755713179f345f4af024bd904c6162d0.tar.gz |
tools: move eslint from tools to tools/node_modules
This is required because we need to add the babel-eslint dependency
and it has to be able to resolve "eslint".
babel-eslint is required to support future ES features such as async
iterators and import.meta.
Refs: https://github.com/nodejs/node/pull/17755
PR-URL: https://github.com/nodejs/node/pull/17820
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Diffstat (limited to 'tools/node_modules/eslint/lib/formatters')
15 files changed, 1101 insertions, 0 deletions
diff --git a/tools/node_modules/eslint/lib/formatters/checkstyle.js b/tools/node_modules/eslint/lib/formatters/checkstyle.js new file mode 100644 index 0000000000..720e831a3e --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/checkstyle.js @@ -0,0 +1,60 @@ +/** + * @fileoverview CheckStyle XML reporter + * @author Ian Christian Myers + */ +"use strict"; + +const xmlEscape = require("../util/xml-escape"); + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns the severity of warning or error + * @param {Object} message message object to examine + * @returns {string} severity level + * @private + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "error"; + } + return "warning"; + +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = ""; + + output += "<?xml version=\"1.1\" encoding=\"utf-8\"?>"; + output += "<checkstyle version=\"4.3\">"; + + results.forEach(result => { + const messages = result.messages; + + output += `<file name="${xmlEscape(result.filePath)}">`; + + messages.forEach(message => { + output += [ + `<error line="${xmlEscape(message.line)}"`, + `column="${xmlEscape(message.column)}"`, + `severity="${xmlEscape(getMessageType(message))}"`, + `message="${xmlEscape(message.message)}${message.ruleId ? ` (${message.ruleId})` : ""}"`, + `source="${message.ruleId ? xmlEscape(`eslint.rules.${message.ruleId}`) : ""}" />` + ].join(" "); + }); + + output += "</file>"; + + }); + + output += "</checkstyle>"; + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/codeframe.js b/tools/node_modules/eslint/lib/formatters/codeframe.js new file mode 100644 index 0000000000..0b97a0d818 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/codeframe.js @@ -0,0 +1,138 @@ +/** + * @fileoverview Codeframe reporter + * @author Vitor Balocco + */ +"use strict"; + +const chalk = require("chalk"); +const codeFrame = require("babel-code-frame"); +const path = require("path"); + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * Given a word and a count, append an s if count is not one. + * @param {string} word A word in its singular form. + * @param {number} 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`); +} + +/** + * Gets a formatted relative file path from an absolute path and a line/column in the file. + * @param {string} filePath The absolute file path to format. + * @param {number} line The line from the file to use for formatting. + * @param {number} column The column from the file to use for formatting. + * @returns {string} The formatted file path. + */ +function formatFilePath(filePath, line, column) { + let relPath = path.relative(process.cwd(), filePath); + + if (line && column) { + relPath += `:${line}:${column}`; + } + + return chalk.green(relPath); +} + +/** + * Gets the formatted output for a given message. + * @param {Object} message The object that represents this message. + * @param {Object} parentResult The result object that this message belongs to. + * @returns {string} The formatted output. + */ +function formatMessage(message, parentResult) { + const type = (message.fatal || message.severity === 2) ? chalk.red("error") : chalk.yellow("warning"); + const msg = `${chalk.bold(message.message.replace(/([^ ])\.$/, "$1"))}`; + const ruleId = message.fatal ? "" : chalk.dim(`(${message.ruleId})`); + const filePath = formatFilePath(parentResult.filePath, message.line, message.column); + const sourceCode = parentResult.output ? parentResult.output : parentResult.source; + + const firstLine = [ + `${type}:`, + `${msg}`, + ruleId ? `${ruleId}` : "", + sourceCode ? `at ${filePath}:` : `at ${filePath}` + ].filter(String).join(" "); + + const result = [firstLine]; + + if (sourceCode) { + result.push( + codeFrame(sourceCode, message.line, message.column, { highlightCode: false }) + ); + } + + return result.join("\n"); +} + +/** + * Gets the formatted output summary for a given number of errors and warnings. + * @param {number} errors The number of errors. + * @param {number} warnings The number of warnings. + * @param {number} fixableErrors The number of fixable errors. + * @param {number} fixableWarnings The number of fixable warnings. + * @returns {string} The formatted output summary. + */ +function formatSummary(errors, warnings, fixableErrors, fixableWarnings) { + const summaryColor = errors > 0 ? "red" : "yellow"; + const summary = []; + const fixablesSummary = []; + + if (errors > 0) { + summary.push(`${errors} ${pluralize("error", errors)}`); + } + + if (warnings > 0) { + summary.push(`${warnings} ${pluralize("warning", warnings)}`); + } + + if (fixableErrors > 0) { + fixablesSummary.push(`${fixableErrors} ${pluralize("error", fixableErrors)}`); + } + + if (fixableWarnings > 0) { + fixablesSummary.push(`${fixableWarnings} ${pluralize("warning", fixableWarnings)}`); + } + + let output = chalk[summaryColor].bold(`${summary.join(" and ")} found.`); + + if (fixableErrors || fixableWarnings) { + output += chalk[summaryColor].bold(`\n${fixablesSummary.join(" and ")} potentially fixable with the \`--fix\` option.`); + } + + return output; +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + let errors = 0; + let warnings = 0; + let fixableErrors = 0; + let fixableWarnings = 0; + + const resultsWithMessages = results.filter(result => result.messages.length > 0); + + let output = resultsWithMessages.reduce((resultsOutput, result) => { + const messages = result.messages.map(message => `${formatMessage(message, result)}\n\n`); + + errors += result.errorCount; + warnings += result.warningCount; + fixableErrors += result.fixableErrorCount; + fixableWarnings += result.fixableWarningCount; + + return resultsOutput.concat(messages); + }, []).join("\n"); + + output += "\n"; + output += formatSummary(errors, warnings, fixableErrors, fixableWarnings); + + return (errors + warnings) > 0 ? output : ""; +}; diff --git a/tools/node_modules/eslint/lib/formatters/compact.js b/tools/node_modules/eslint/lib/formatters/compact.js new file mode 100644 index 0000000000..2b540bde23 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/compact.js @@ -0,0 +1,60 @@ +/** + * @fileoverview Compact reporter + * @author Nicholas C. Zakas + */ +"use strict"; + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns the severity of warning or error + * @param {Object} message message object to examine + * @returns {string} severity level + * @private + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "Error"; + } + return "Warning"; + +} + + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = "", + total = 0; + + results.forEach(result => { + + const messages = result.messages; + + total += messages.length; + + messages.forEach(message => { + + output += `${result.filePath}: `; + output += `line ${message.line || 0}`; + output += `, col ${message.column || 0}`; + output += `, ${getMessageType(message)}`; + output += ` - ${message.message}`; + output += message.ruleId ? ` (${message.ruleId})` : ""; + output += "\n"; + + }); + + }); + + if (total > 0) { + output += `\n${total} problem${total !== 1 ? "s" : ""}`; + } + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/html-template-message.html b/tools/node_modules/eslint/lib/formatters/html-template-message.html new file mode 100644 index 0000000000..66f49ff49d --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/html-template-message.html @@ -0,0 +1,8 @@ +<tr style="display:none" class="f-<%= parentIndex %>"> + <td><%= lineNumber %>:<%= columnNumber %></td> + <td class="clr-<%= severityNumber %>"><%= severityName %></td> + <td><%- message %></td> + <td> + <a href="https://eslint.org/docs/rules/<%= ruleId %>" target="_blank"><%= ruleId %></a> + </td> +</tr> diff --git a/tools/node_modules/eslint/lib/formatters/html-template-page.html b/tools/node_modules/eslint/lib/formatters/html-template-page.html new file mode 100644 index 0000000000..4016576fa0 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/html-template-page.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8"> + <title>ESLint Report</title> + <style> + body { + font-family:Arial, "Helvetica Neue", Helvetica, sans-serif; + font-size:16px; + font-weight:normal; + margin:0; + padding:0; + color:#333 + } + #overview { + padding:20px 30px + } + td, th { + padding:5px 10px + } + h1 { + margin:0 + } + table { + margin:30px; + width:calc(100% - 60px); + max-width:1000px; + border-radius:5px; + border:1px solid #ddd; + border-spacing:0px; + } + th { + font-weight:400; + font-size:medium; + text-align:left; + cursor:pointer + } + td.clr-1, td.clr-2, th span { + font-weight:700 + } + th span { + float:right; + margin-left:20px + } + th span:after { + content:""; + clear:both; + display:block + } + tr:last-child td { + border-bottom:none + } + tr td:first-child, tr td:last-child { + color:#9da0a4 + } + #overview.bg-0, tr.bg-0 th { + color:#468847; + background:#dff0d8; + border-bottom:1px solid #d6e9c6 + } + #overview.bg-1, tr.bg-1 th { + color:#f0ad4e; + background:#fcf8e3; + border-bottom:1px solid #fbeed5 + } + #overview.bg-2, tr.bg-2 th { + color:#b94a48; + background:#f2dede; + border-bottom:1px solid #eed3d7 + } + td { + border-bottom:1px solid #ddd + } + td.clr-1 { + color:#f0ad4e + } + td.clr-2 { + color:#b94a48 + } + td a { + color:#3a33d1; + text-decoration:none + } + td a:hover { + color:#272296; + text-decoration:underline + } + </style> + </head> + <body> + <div id="overview" class="bg-<%= reportColor %>"> + <h1>ESLint Report</h1> + <div> + <span><%= reportSummary %></span> - Generated on <%= date %> + </div> + </div> + <table> + <tbody> + <%= results %> + </tbody> + </table> + <script type="text/javascript"> + var groups = document.querySelectorAll("tr[data-group]"); + for (i = 0; i < groups.length; i++) { + groups[i].addEventListener("click", function() { + var inGroup = document.getElementsByClassName(this.getAttribute("data-group")); + this.innerHTML = (this.innerHTML.indexOf("+") > -1) ? this.innerHTML.replace("+", "-") : this.innerHTML.replace("-", "+"); + for (var j = 0; j < inGroup.length; j++) { + inGroup[j].style.display = (inGroup[j].style.display !== "none") ? "none" : "table-row"; + } + }); + } + </script> + </body> +</html> diff --git a/tools/node_modules/eslint/lib/formatters/html-template-result.html b/tools/node_modules/eslint/lib/formatters/html-template-result.html new file mode 100644 index 0000000000..f4a55933c2 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/html-template-result.html @@ -0,0 +1,6 @@ +<tr class="bg-<%- color %>" data-group="f-<%- index %>"> + <th colspan="4"> + [+] <%- filePath %> + <span><%- summary %></span> + </th> +</tr> diff --git a/tools/node_modules/eslint/lib/formatters/html.js b/tools/node_modules/eslint/lib/formatters/html.js new file mode 100644 index 0000000000..d450f9dee2 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/html.js @@ -0,0 +1,127 @@ +/** + * @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) + }); +}; diff --git a/tools/node_modules/eslint/lib/formatters/jslint-xml.js b/tools/node_modules/eslint/lib/formatters/jslint-xml.js new file mode 100644 index 0000000000..e152d8bdd7 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/jslint-xml.js @@ -0,0 +1,41 @@ +/** + * @fileoverview JSLint XML reporter + * @author Ian Christian Myers + */ +"use strict"; + +const xmlEscape = require("../util/xml-escape"); + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = ""; + + output += "<?xml version=\"1.1\" encoding=\"utf-8\"?>"; + output += "<jslint>"; + + results.forEach(result => { + const messages = result.messages; + + output += `<file name="${result.filePath}">`; + + messages.forEach(message => { + output += [ + `<issue line="${message.line}"`, + `char="${message.column}"`, + `evidence="${xmlEscape(message.source || "")}"`, + `reason="${xmlEscape(message.message || "")}${message.ruleId ? ` (${message.ruleId})` : ""}" />` + ].join(" "); + }); + + output += "</file>"; + + }); + + output += "</jslint>"; + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/json.js b/tools/node_modules/eslint/lib/formatters/json.js new file mode 100644 index 0000000000..82138af187 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/json.js @@ -0,0 +1,13 @@ +/** + * @fileoverview JSON reporter + * @author Burak Yigit Kaya aka BYK + */ +"use strict"; + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + return JSON.stringify(results); +}; diff --git a/tools/node_modules/eslint/lib/formatters/junit.js b/tools/node_modules/eslint/lib/formatters/junit.js new file mode 100644 index 0000000000..ca666bb14c --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/junit.js @@ -0,0 +1,70 @@ +/** + * @fileoverview jUnit Reporter + * @author Jamund Ferguson + */ +"use strict"; + +const xmlEscape = require("../util/xml-escape"); + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns the severity of warning or error + * @param {Object} message message object to examine + * @returns {string} severity level + * @private + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "Error"; + } + return "Warning"; + +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = ""; + + output += "<?xml version=\"1.1\" encoding=\"utf-8\"?>\n"; + output += "<testsuites>\n"; + + results.forEach(result => { + + const messages = result.messages; + + if (messages.length > 0) { + output += `<testsuite package="org.eslint" time="0" tests="${messages.length}" errors="${messages.length}" name="${result.filePath}">\n`; + messages.forEach(message => { + const type = message.fatal ? "error" : "failure"; + + output += `<testcase time="0" name="org.eslint.${message.ruleId || "unknown"}">`; + output += `<${type} message="${xmlEscape(message.message || "")}">`; + output += "<![CDATA["; + output += `line ${message.line || 0}, col `; + output += `${message.column || 0}, ${getMessageType(message)}`; + output += ` - ${xmlEscape(message.message || "")}`; + output += (message.ruleId ? ` (${message.ruleId})` : ""); + output += "]]>"; + output += `</${type}>`; + output += "</testcase>\n"; + }); + output += "</testsuite>\n"; + } else { + output += `<testsuite package="org.eslint" time="0" tests="1" errors="0" name="${result.filePath}">\n`; + output += `<testcase time="0" name="${result.filePath}" />\n`; + output += "</testsuite>\n"; + } + + }); + + output += "</testsuites>\n"; + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/stylish.js b/tools/node_modules/eslint/lib/formatters/stylish.js new file mode 100644 index 0000000000..e586fe857c --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/stylish.js @@ -0,0 +1,100 @@ +/** + * @fileoverview Stylish reporter + * @author Sindre Sorhus + */ +"use strict"; + +const chalk = require("chalk"), + stripAnsi = require("strip-ansi"), + table = require("text-table"); + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +/** + * 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`); +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = "\n", + errorCount = 0, + warningCount = 0, + fixableErrorCount = 0, + fixableWarningCount = 0, + summaryColor = "yellow"; + + results.forEach(result => { + const messages = result.messages; + + if (messages.length === 0) { + return; + } + + errorCount += result.errorCount; + warningCount += result.warningCount; + fixableErrorCount += result.fixableErrorCount; + fixableWarningCount += result.fixableWarningCount; + + output += `${chalk.underline(result.filePath)}\n`; + + output += `${table( + messages.map(message => { + let messageType; + + if (message.fatal || message.severity === 2) { + messageType = chalk.red("error"); + summaryColor = "red"; + } else { + messageType = chalk.yellow("warning"); + } + + return [ + "", + message.line || 0, + message.column || 0, + messageType, + message.message.replace(/([^ ])\.$/, "$1"), + chalk.dim(message.ruleId || "") + ]; + }), + { + align: ["", "r", "l"], + stringLength(str) { + return stripAnsi(str).length; + } + } + ).split("\n").map(el => el.replace(/(\d+)\s+(\d+)/, (m, p1, p2) => chalk.dim(`${p1}:${p2}`))).join("\n")}\n\n`; + }); + + const total = errorCount + warningCount; + + if (total > 0) { + output += chalk[summaryColor].bold([ + "\u2716 ", total, pluralize(" problem", total), + " (", errorCount, pluralize(" error", errorCount), ", ", + warningCount, pluralize(" warning", warningCount), ")\n" + ].join("")); + + if (fixableErrorCount > 0 || fixableWarningCount > 0) { + output += chalk[summaryColor].bold([ + " ", fixableErrorCount, pluralize(" error", fixableErrorCount), ", ", + fixableWarningCount, pluralize(" warning", fixableWarningCount), + " potentially fixable with the `--fix` option.\n" + ].join("")); + } + } + + return total > 0 ? output : ""; +}; diff --git a/tools/node_modules/eslint/lib/formatters/table.js b/tools/node_modules/eslint/lib/formatters/table.js new file mode 100644 index 0000000000..ebc3314e7a --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/table.js @@ -0,0 +1,150 @@ +/** + * @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; +}; diff --git a/tools/node_modules/eslint/lib/formatters/tap.js b/tools/node_modules/eslint/lib/formatters/tap.js new file mode 100644 index 0000000000..9651a2bcf1 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/tap.js @@ -0,0 +1,92 @@ +/** + * @fileoverview TAP reporter + * @author Jonathan Kingston + */ +"use strict"; + +const yaml = require("js-yaml"); + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns a canonical error level string based upon the error message passed in. + * @param {Object} message Individual error message provided by eslint + * @returns {string} Error level string + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "error"; + } + return "warning"; + +} + +/** + * Takes in a JavaScript object and outputs a TAP diagnostics string + * @param {Object} diagnostic JavaScript object to be embedded as YAML into output. + * @returns {string} diagnostics string with YAML embedded - TAP version 13 compliant + */ +function outputDiagnostics(diagnostic) { + const prefix = " "; + let output = `${prefix}---\n`; + + output += prefix + yaml.safeDump(diagnostic).split("\n").join(`\n${prefix}`); + output += "...\n"; + return output; +} + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + let output = `TAP version 13\n1..${results.length}\n`; + + results.forEach((result, id) => { + const messages = result.messages; + let testResult = "ok"; + let diagnostics = {}; + + if (messages.length > 0) { + testResult = "not ok"; + + messages.forEach(message => { + const diagnostic = { + message: message.message, + severity: getMessageType(message), + data: { + line: message.line || 0, + column: message.column || 0, + ruleId: message.ruleId || "" + } + }; + + /* + * If we have multiple messages place them under a messages key + * The first error will be logged as message key + * This is to adhere to TAP 13 loosely defined specification of having a message key + */ + if ("message" in diagnostics) { + if (typeof diagnostics.messages === "undefined") { + diagnostics.messages = []; + } + diagnostics.messages.push(diagnostic); + } else { + diagnostics = diagnostic; + } + }); + } + + output += `${testResult} ${id + 1} - ${result.filePath}\n`; + + // If we have an error include diagnostics + if (messages.length > 0) { + output += outputDiagnostics(diagnostics); + } + + }); + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/unix.js b/tools/node_modules/eslint/lib/formatters/unix.js new file mode 100644 index 0000000000..c6c4ebbdb9 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/unix.js @@ -0,0 +1,58 @@ +/** + * @fileoverview unix-style formatter. + * @author oshi-shinobu + */ +"use strict"; + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns a canonical error level string based upon the error message passed in. + * @param {Object} message Individual error message provided by eslint + * @returns {string} Error level string + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "Error"; + } + return "Warning"; + +} + + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = "", + total = 0; + + results.forEach(result => { + + const messages = result.messages; + + total += messages.length; + + messages.forEach(message => { + + output += `${result.filePath}:`; + output += `${message.line || 0}:`; + output += `${message.column || 0}:`; + output += ` ${message.message} `; + output += `[${getMessageType(message)}${message.ruleId ? `/${message.ruleId}` : ""}]`; + output += "\n"; + + }); + + }); + + if (total > 0) { + output += `\n${total} problem${total !== 1 ? "s" : ""}`; + } + + return output; +}; diff --git a/tools/node_modules/eslint/lib/formatters/visualstudio.js b/tools/node_modules/eslint/lib/formatters/visualstudio.js new file mode 100644 index 0000000000..0d49431db8 --- /dev/null +++ b/tools/node_modules/eslint/lib/formatters/visualstudio.js @@ -0,0 +1,63 @@ +/** + * @fileoverview Visual Studio compatible formatter + * @author Ronald Pijnacker + */ + +"use strict"; + +//------------------------------------------------------------------------------ +// Helper Functions +//------------------------------------------------------------------------------ + +/** + * Returns the severity of warning or error + * @param {Object} message message object to examine + * @returns {string} severity level + * @private + */ +function getMessageType(message) { + if (message.fatal || message.severity === 2) { + return "error"; + } + return "warning"; + +} + + +//------------------------------------------------------------------------------ +// Public Interface +//------------------------------------------------------------------------------ + +module.exports = function(results) { + + let output = "", + total = 0; + + results.forEach(result => { + + const messages = result.messages; + + total += messages.length; + + messages.forEach(message => { + + output += result.filePath; + output += `(${message.line || 0}`; + output += message.column ? `,${message.column}` : ""; + output += `): ${getMessageType(message)}`; + output += message.ruleId ? ` ${message.ruleId}` : ""; + output += ` : ${message.message}`; + output += "\n"; + + }); + + }); + + if (total === 0) { + output += "no problems"; + } else { + output += `\n${total} problem${total !== 1 ? "s" : ""}`; + } + + return output; +}; |