tslint-formatter-beauty
Version:
Beautiful TSLint formatter.
131 lines (130 loc) • 5.83 kB
JavaScript
;
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;