summaryrefslogtreecommitdiff
path: root/tools/node_modules/eslint/lib/formatters
diff options
context:
space:
mode:
authorMichaël Zasso <targos@protonmail.com>2017-12-22 16:53:42 +0100
committerMichaël Zasso <targos@protonmail.com>2018-01-11 09:48:05 +0100
commit3dc30632755713179f345f4af024bd904c6162d0 (patch)
treef28c4f6dd6dfc5992edf301449d1a371d229755b /tools/node_modules/eslint/lib/formatters
parenta2c7085dd4a8e60d1a47572aca8bb6fcb7a32f88 (diff)
downloadnode-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')
-rw-r--r--tools/node_modules/eslint/lib/formatters/checkstyle.js60
-rw-r--r--tools/node_modules/eslint/lib/formatters/codeframe.js138
-rw-r--r--tools/node_modules/eslint/lib/formatters/compact.js60
-rw-r--r--tools/node_modules/eslint/lib/formatters/html-template-message.html8
-rw-r--r--tools/node_modules/eslint/lib/formatters/html-template-page.html115
-rw-r--r--tools/node_modules/eslint/lib/formatters/html-template-result.html6
-rw-r--r--tools/node_modules/eslint/lib/formatters/html.js127
-rw-r--r--tools/node_modules/eslint/lib/formatters/jslint-xml.js41
-rw-r--r--tools/node_modules/eslint/lib/formatters/json.js13
-rw-r--r--tools/node_modules/eslint/lib/formatters/junit.js70
-rw-r--r--tools/node_modules/eslint/lib/formatters/stylish.js100
-rw-r--r--tools/node_modules/eslint/lib/formatters/table.js150
-rw-r--r--tools/node_modules/eslint/lib/formatters/tap.js92
-rw-r--r--tools/node_modules/eslint/lib/formatters/unix.js58
-rw-r--r--tools/node_modules/eslint/lib/formatters/visualstudio.js63
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;
+};