UNPKG

tslint-eslint-rules

Version:

Improve your TSLint with the missing ESLint Rules

230 lines (228 loc) 21.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var ts = require("typescript"); var Lint = require("tslint"); var tsutils_1 = require("tsutils"); var RULE_NAME = 'ter-padded-blocks'; var OPTION_ALWAYS = 'always'; var Rule = (function (_super) { tslib_1.__extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.prototype.formatOptions = function (ruleArguments) { var config = ruleArguments[0] || OPTION_ALWAYS; if (typeof (config) === 'string') { var always = config === OPTION_ALWAYS; return { blocks: always, classes: always, switches: always }; } return { blocks: config['blocks'] && config['blocks'] === OPTION_ALWAYS, classes: config['classes'] && config['classes'] === OPTION_ALWAYS, switches: config['switches'] && config['switches'] === OPTION_ALWAYS }; }; Rule.prototype.apply = function (sourceFile) { var opt = this.formatOptions(this.ruleArguments); var walker = new RuleWalker(sourceFile, this.ruleName, opt); return this.applyWithWalker(walker); }; Rule.metadata = { ruleName: RULE_NAME, hasFix: false, description: 'enforces consistent empty line padding within blocks', rationale: Lint.Utils.dedent(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n Some style guides require block statements to start and end with blank\n lines. The goal is to improve readability by visually separating the\n block content and the surrounding code.\n "], ["\n Some style guides require block statements to start and end with blank\n lines. The goal is to improve readability by visually separating the\n block content and the surrounding code.\n "]))), optionsDescription: 'This rule has one option, which can be a string option or an object option', options: { type: 'array', items: [ { enum: ['always', 'never'] }, { type: 'object', properties: { blocks: { enum: ['always', 'never'] }, classes: { enum: ['always', 'never'] }, switches: { enum: ['always', 'never'] } }, additionalProperties: false } ], maxLength: 1 }, optionExamples: [ Lint.Utils.dedent(templateObject_2 || (templateObject_2 = tslib_1.__makeTemplateObject(["\n \"", "\": [true]\n "], ["\n \"", "\": [true]\n "])), RULE_NAME), Lint.Utils.dedent(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n \"", "\": [true, \"always\"]\n "], ["\n \"", "\": [true, \"always\"]\n "])), RULE_NAME), Lint.Utils.dedent(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n \"", "\": [true, \"never\"]\n "], ["\n \"", "\": [true, \"never\"]\n "])), RULE_NAME), Lint.Utils.dedent(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n \"", "\": [true, { \"blocks\": \"always\" }]\n "], ["\n \"", "\": [true, { \"blocks\": \"always\" }]\n "])), RULE_NAME), Lint.Utils.dedent(templateObject_6 || (templateObject_6 = tslib_1.__makeTemplateObject(["\n \"", "\": [true, { \"blocks\": \"never\" }]\n "], ["\n \"", "\": [true, { \"blocks\": \"never\" }]\n "])), RULE_NAME) ], typescriptOnly: false, type: 'style' }; Rule.FAILURE_STRING = { always: 'Block must be padded by blank lines.', never: 'Block must not be padded by blank lines.' }; return Rule; }(Lint.Rules.AbstractRule)); exports.Rule = Rule; var RuleWalker = (function (_super) { tslib_1.__extends(RuleWalker, _super); function RuleWalker() { return _super !== null && _super.apply(this, arguments) || this; } RuleWalker.prototype.walk = function (sourceFile) { var _this = this; sourceFile.forEachChild(function (node) { return _this.processNode(node); }); }; RuleWalker.prototype.processNode = function (node) { var _this = this; switch (node.kind) { case ts.SyntaxKind.Block: case ts.SyntaxKind.ClassDeclaration: case ts.SyntaxKind.CaseBlock: this.checkPadding(node); } node.forEachChild(function (child) { return _this.processNode(child); }); }; RuleWalker.prototype.getParts = function (node) { var openBrace, body, closeBrace; node.getChildren().forEach(function (child) { if (child.kind === ts.SyntaxKind.OpenBraceToken) { openBrace = child; } else if (child.kind === ts.SyntaxKind.SyntaxList) { body = child; } else if (child.kind === ts.SyntaxKind.CloseBraceToken) { closeBrace = child; } }); return { openBrace: openBrace, body: body, closeBrace: closeBrace }; }; RuleWalker.prototype.getPositions = function (node) { var _a = this.getParts(node), openBrace = _a.openBrace, body = _a.body, closeBrace = _a.closeBrace; var firstChild = body.getChildAt(0); var lastChild = body.getChildAt(body.getChildCount() - 1); var positions = { openPosition: openBrace.getStart(this.sourceFile), openLine: this.getLine(openBrace.getStart(this.sourceFile)), closePosition: closeBrace.getEnd(), closeLine: this.getLine(closeBrace.getEnd()) }; if (firstChild) { positions.firstChildPosition = firstChild.getStart(this.sourceFile); positions.firstChildLine = this.getLine(positions.firstChildPosition); } if (lastChild) { positions.lastChildPosition = lastChild.getEnd(); positions.lastChildLine = this.getLine(positions.lastChildPosition); } return positions; }; RuleWalker.prototype.checkPadding = function (node) { var _this = this; var paddingAllowed = this.options.blocks; if (node.kind === ts.SyntaxKind.ClassDeclaration) { paddingAllowed = this.options.classes; } else if (node.parent && node.parent.kind === ts.SyntaxKind.SwitchStatement) { paddingAllowed = this.options.switches; } if (paddingAllowed === undefined) { return; } var positions = this.getPositions(node); var openBraceReplacement = { from: positions.openPosition + 1, to: positions.firstChildPosition || positions.closePosition }; var closeBraceReplacement = { from: positions.lastChildPosition || positions.openPosition, to: positions.closePosition - 1 }; var comments = []; tsutils_1.forEachComment(node, function (_fullText, comment) { if (comment.pos > positions.openPosition && comment.pos < positions.closePosition) { var commentLineEnd = _this.getLine(comment.end); if (commentLineEnd > positions.openLine) { comments.push(comment); } else if (commentLineEnd === positions.openLine) { openBraceReplacement.from = comment.end; } } }); if (comments.length > 0) { var firstCommentLine = this.getLine(comments[0].pos); var lastCommentLine = this.getLine(comments[comments.length - 1].end); if (!positions.firstChildLine || firstCommentLine < positions.firstChildLine) { positions.firstChildLine = firstCommentLine; positions.firstChildPosition = comments[0].pos; openBraceReplacement.to = positions.firstChildPosition; } if (!positions.lastChildLine || lastCommentLine >= positions.lastChildLine) { positions.lastChildLine = lastCommentLine; positions.lastChildPosition = comments[comments.length - 1].end; closeBraceReplacement.from = positions.lastChildPosition; } } if (this.getLine(openBraceReplacement.from) !== this.getLine(openBraceReplacement.to)) { openBraceReplacement.to = this.getPosition(this.getLine(openBraceReplacement.to)); } if (this.getLine(closeBraceReplacement.from) !== this.getLine(closeBraceReplacement.to)) { closeBraceReplacement.to = this.getPosition(this.getLine(closeBraceReplacement.to)); } if (positions.firstChildLine === undefined && positions.lastChildLine === undefined) { return; } var openPadded = false; if (positions.firstChildLine !== undefined) { openPadded = positions.firstChildLine - positions.openLine > 1; } else { openPadded = positions.closeLine - positions.openLine > 1; } var closePadded = false; if (positions.lastChildLine !== undefined) { closePadded = positions.closeLine - positions.lastChildLine > 1; } else { closePadded = positions.closeLine - positions.openLine > 1; } if (paddingAllowed ? !openPadded : openPadded) { var openFix = Lint.Replacement.replaceFromTo(openBraceReplacement.from, openBraceReplacement.to, paddingAllowed ? '\n\n' : '\n'); this.addFailure(positions.openPosition, positions.openPosition + 1, paddingAllowed ? Rule.FAILURE_STRING.always : Rule.FAILURE_STRING.never, openFix); } if (paddingAllowed ? !closePadded : closePadded) { var closeFix = Lint.Replacement.replaceFromTo(closeBraceReplacement.from, closeBraceReplacement.to, paddingAllowed ? '\n\n' : '\n'); this.addFailure(positions.closePosition - 1, positions.closePosition, paddingAllowed ? Rule.FAILURE_STRING.always : Rule.FAILURE_STRING.never, closeFix); } }; RuleWalker.prototype.getLine = function (pos) { return this.sourceFile.getLineAndCharacterOfPosition(pos).line; }; RuleWalker.prototype.getPosition = function (line) { return this.sourceFile.getPositionOfLineAndCharacter(line, 0); }; return RuleWalker; }(Lint.AbstractWalker)); var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bGVzL3RlclBhZGRlZEJsb2Nrc1J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQUUvQixtQ0FBeUM7QUFFekMsSUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUM7QUFDdEMsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBTy9CO0lBQTBCLGdDQUF1QjtJQUFqRDs7SUFxRkEsQ0FBQztJQXpCUyw0QkFBYSxHQUFyQixVQUFzQixhQUFvQjtRQUN4QyxJQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDO1FBRWpELElBQUksT0FBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUMvQixJQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssYUFBYSxDQUFDO1lBRXhDLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQztTQUNIO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLGFBQWE7WUFDOUQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssYUFBYTtZQUNqRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxhQUFhO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRU0sb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ3BDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELElBQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUFDLFdBQVcsRUFBRTtZQUMvQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDN0MscUJBQXFCLENBQUMsSUFBSSxFQUMxQixxQkFBcUIsQ0FBQyxFQUFFLEVBQ3hCLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQy9CLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxDQUNiLFNBQVMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUMzQixTQUFTLENBQUMsYUFBYSxFQUN2QixjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFDdkUsUUFBUSxDQUNULENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyw0QkFBTyxHQUFmLFVBQWdCLEdBQVc7UUFDekIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRU8sZ0NBQVcsR0FBbkIsVUFBb0IsSUFBWTtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDSCxpQkFBQztBQUFELENBOUtBLEFBOEtDLENBOUt3QixJQUFJLENBQUMsY0FBYyxHQThLM0MiLCJmaWxlIjoicnVsZXMvdGVyUGFkZGVkQmxvY2tzUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvam1sb3Blei90c2xpbnQtZXNsaW50LXJ1bGVzL3NyYyJ9