UNPKG

tslint-formatter-beauty

Version:

Beautiful TSLint formatter.

131 lines (130 loc) 5.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslint = require("tslint"); const chalk_1 = require("chalk"); const style = require("ansi-styles"); const logSymbols = require("log-symbols"); const highlight_1 = require("@babel/highlight"); const codeExcerpt = require("code-excerpt"); function padStart(text, length) { return text.length >= length ? text : `${' '.repeat(length - text.length)}${text}`; } function sort(a, b) { if (a.getRuleSeverity() === 'error' && b.getRuleSeverity() === 'warning') { return -1; } if (a.getRuleSeverity() === 'warning' && b.getRuleSeverity() === 'error') { return 1; } if (a.getStartPosition().getPosition() > b.getStartPosition().getPosition()) { return 1; } return 0; } class Formatter extends tslint.Formatters.AbstractFormatter { format(failures, options) { let output = '\n'; const results = {}; failures.forEach(failure => { const filePath = failure.getFileName(); if (results[filePath]) { results[filePath].push(failure); } else { results[filePath] = [failure]; } }); Object.keys(results).forEach(result => { output += chalk_1.default.underline(result.replace(process.cwd(), '.')) + '\n'; results[result].sort(sort).forEach(failure => { output += failure.getRuleSeverity() === 'error' ? chalk_1.default.red(` Error: ${failure.getFailure()} `) : chalk_1.default.yellow(` Warning: ${failure.getFailure()} `); output += chalk_1.default.gray(`(${failure.getRuleName()})`) + '\n'; const startLine = failure .getStartPosition() .getLineAndCharacter().line + 1; const endLine = failure.getEndPosition().getLineAndCharacter().line + 1; const startColumn = failure .getStartPosition() .getLineAndCharacter() .character + 1; const endColumn = failure .getEndPosition() .getLineAndCharacter() .character + 1; const rawLines = codeExcerpt(failure.getRawLines(), startLine, { around: 2 }); const padding = rawLines[rawLines.length - 1].line.toString().length + 6; const lines = rawLines.map(line => { let painted = chalk_1.default.gray(padStart(`${line.line} | `, padding)); const painter = (text => (failure.getRuleSeverity() === 'error' ? chalk_1.default.bgRed(chalk_1.default.white(text)) : chalk_1.default.bgYellow(chalk_1.default.black(text)))); painter.open = `/*****${failure.getRuleSeverity() === 'error' ? style.bgRed.open + style.white.open : style.bgYellow.open + style.black.open}`; painter.close = `${failure.getRuleSeverity() === 'error' ? style.bgRed.close + style.white.close : style.bgYellow.close + style.black.close}*****/`; if (line.line === startLine) { const chars = line.value.split(''); chars.splice(startColumn - 1, 0, painter.open); if (startLine === endLine) { chars.splice(startColumn === endColumn ? endColumn + 1 : endColumn, 0, painter.close); } else { chars.push(painter.close); } painted += highlight_1.default(chars.join('')); } else if (line.line > startLine && line.line < endLine) { painted += highlight_1.default(`/*****${painter(line.value)}*****/`); } else if (line.line === endLine) { const chars = line.value.split(''); chars.unshift(painter.open); chars.splice(endColumn, 0, painter.close); painted += highlight_1.default(chars.join('')); } else { painted += highlight_1.default(line.value); } painted = painted.replace(/\/\*\*\*\*\*/g, '') .replace(/\*\*\*\*\*\//g, ''); return painted; }); output += lines.join('\n'); output += '\n\n'; }); }); const errorsCount = failures .filter(failure => failure.getRuleSeverity() === 'error') .length; const warningsCount = failures .filter(failure => failure.getRuleSeverity() === 'warning') .length; if (errorsCount === 0 && warningsCount === 0) { return ''; // Without errors and warnings, be silent } if (options && options.noSummary) { return output; } if (errorsCount > 0) { output += logSymbols.error + chalk_1.default.red(` ${errorsCount} error${errorsCount === 1 ? '' : 's'}`); } if (warningsCount > 0) { if (errorsCount > 0) { output += '\n'; } output += logSymbols.warning + chalk_1.default.yellow(` ${warningsCount} warning${warningsCount === 1 ? '' : 's'}`); } output += '\n'; return output; } } exports.Formatter = Formatter;