react-templates/src/formatters/stylish.js

90 lines
2.5 KiB
JavaScript

'use strict'
/**
* @type {Chalk.ChalkModule}
*/
const chalk = require('chalk')
const _ = require('lodash')
const table = require('text-table')
/**
* 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`
}
/**
* @param {number} line
* @return {string}
*/
function lineText(line) {
return line < 1 ? '' : line
}
module.exports = function (results) {
results = _.groupBy(results, 'file')
let output = '\n'
let total = 0
let errors = 0
let warnings = 0
let infos = 0
let summaryColor = 'cyan'
_.forEach(results, (result, k) => {
const messages = result
if (messages.length === 0) {
return
}
total += messages.length
output += chalk.underline(k) + '\n'
output += table(
messages.map(message => {
let messageType
if (message.level === 'ERROR') {
messageType = chalk.red('error')
summaryColor = 'red'
errors++
} else if (message.level === 'WARN') {
messageType = chalk.yellow('warning')
summaryColor = 'yellow'
warnings++
} else {
messageType = chalk.cyan('info')
infos++
}
return [
'',
lineText(message.line),
lineText(message.column),
messageType,
message.msg.replace(/\.$/, ''),
chalk.gray(message.ruleId || '')
]
}),
{
align: ['', 'r', 'l'],
stringLength: str => chalk.stripColor(str).length
}
).split('\n').map(el => el.replace(/(\d+)\s+(\d+)/, (m, p1, p2) => chalk.gray(p1 + ':' + p2))).join('\n') + '\n\n'
})
if (total > 0) {
output += chalk[summaryColor].bold([
'\u2716 ', total, pluralize(' message', total),
' (', errors, pluralize(' error', errors), ', ',
warnings, pluralize(' warning', warnings), ', ',
infos, pluralize(' info', infos), ')\n'
].join(''))
}
return total > 0 ? output : ''
}