1 | /**
|
---|
2 | * @fileoverview Stylish reporter
|
---|
3 | * @author Sindre Sorhus
|
---|
4 | */
|
---|
5 | "use strict";
|
---|
6 |
|
---|
7 | const chalk = require("chalk"),
|
---|
8 | stripAnsi = require("strip-ansi"),
|
---|
9 | table = require("text-table");
|
---|
10 |
|
---|
11 | //------------------------------------------------------------------------------
|
---|
12 | // Helpers
|
---|
13 | //------------------------------------------------------------------------------
|
---|
14 |
|
---|
15 | /**
|
---|
16 | * Given a word and a count, append an s if count is not one.
|
---|
17 | * @param {string} word A word in its singular form.
|
---|
18 | * @param {int} count A number controlling whether word should be pluralized.
|
---|
19 | * @returns {string} The original word with an s on the end if count is not one.
|
---|
20 | */
|
---|
21 | function pluralize(word, count) {
|
---|
22 | return (count === 1 ? word : `${word}s`);
|
---|
23 | }
|
---|
24 |
|
---|
25 | //------------------------------------------------------------------------------
|
---|
26 | // Public Interface
|
---|
27 | //------------------------------------------------------------------------------
|
---|
28 |
|
---|
29 | module.exports = function(results) {
|
---|
30 |
|
---|
31 | let output = "\n",
|
---|
32 | errorCount = 0,
|
---|
33 | warningCount = 0,
|
---|
34 | fixableErrorCount = 0,
|
---|
35 | fixableWarningCount = 0,
|
---|
36 | summaryColor = "yellow";
|
---|
37 |
|
---|
38 | results.forEach(result => {
|
---|
39 | const messages = result.messages;
|
---|
40 |
|
---|
41 | if (messages.length === 0) {
|
---|
42 | return;
|
---|
43 | }
|
---|
44 |
|
---|
45 | errorCount += result.errorCount;
|
---|
46 | warningCount += result.warningCount;
|
---|
47 | fixableErrorCount += result.fixableErrorCount;
|
---|
48 | fixableWarningCount += result.fixableWarningCount;
|
---|
49 |
|
---|
50 | output += `${chalk.underline(result.filePath)}\n`;
|
---|
51 |
|
---|
52 | output += `${table(
|
---|
53 | messages.map(message => {
|
---|
54 | let messageType;
|
---|
55 |
|
---|
56 | if (message.fatal || message.severity === 2) {
|
---|
57 | messageType = chalk.red("error");
|
---|
58 | summaryColor = "red";
|
---|
59 | } else {
|
---|
60 | messageType = chalk.yellow("warning");
|
---|
61 | }
|
---|
62 |
|
---|
63 | return [
|
---|
64 | "",
|
---|
65 | message.line || 0,
|
---|
66 | message.column || 0,
|
---|
67 | messageType,
|
---|
68 | message.message.replace(/([^ ])\.$/u, "$1"),
|
---|
69 | chalk.dim(message.ruleId || "")
|
---|
70 | ];
|
---|
71 | }),
|
---|
72 | {
|
---|
73 | align: ["", "r", "l"],
|
---|
74 | stringLength(str) {
|
---|
75 | return stripAnsi(str).length;
|
---|
76 | }
|
---|
77 | }
|
---|
78 | ).split("\n").map(el => el.replace(/(\d+)\s+(\d+)/u, (m, p1, p2) => chalk.dim(`${p1}:${p2}`))).join("\n")}\n\n`;
|
---|
79 | });
|
---|
80 |
|
---|
81 | const total = errorCount + warningCount;
|
---|
82 |
|
---|
83 | if (total > 0) {
|
---|
84 | output += chalk[summaryColor].bold([
|
---|
85 | "\u2716 ", total, pluralize(" problem", total),
|
---|
86 | " (", errorCount, pluralize(" error", errorCount), ", ",
|
---|
87 | warningCount, pluralize(" warning", warningCount), ")\n"
|
---|
88 | ].join(""));
|
---|
89 |
|
---|
90 | if (fixableErrorCount > 0 || fixableWarningCount > 0) {
|
---|
91 | output += chalk[summaryColor].bold([
|
---|
92 | " ", fixableErrorCount, pluralize(" error", fixableErrorCount), " and ",
|
---|
93 | fixableWarningCount, pluralize(" warning", fixableWarningCount),
|
---|
94 | " potentially fixable with the `--fix` option.\n"
|
---|
95 | ].join(""));
|
---|
96 | }
|
---|
97 | }
|
---|
98 |
|
---|
99 | // Resets output color, for prevent change on top level
|
---|
100 | return total > 0 ? chalk.reset(output) : "";
|
---|
101 | };
|
---|