UNPKG

tslint-eslint-rules

Version:

Improve your TSLint with the missing ESLint Rules

307 lines (305 loc) 32.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var _a; var ts = require("typescript"); var Lint = require("tslint"); var tsutils_1 = require("tsutils"); var RULE_NAME = 'ter-max-len'; var CODE = 'code'; var COMMENTS = 'comments'; var TAB_WIDTH = 'tabWidth'; var IGNORE_PATTERN = 'ignorePattern'; var IGNORE_COMMENTS = 'ignoreComments'; var IGNORE_STRINGS = 'ignoreStrings'; var IGNORE_URLS = 'ignoreUrls'; var IGNORE_TEMPLATE_LITERALS = 'ignoreTemplateLiterals'; var IGNORE_REG_EXP_LITERALS = 'ignoreRegExpLiterals'; var IGNORE_TRAILING_COMMENTS = 'ignoreTrailingComments'; var IGNORE_IMPORTS = 'ignoreImports'; function computeLineLength(line, tabWidth) { var extraCharacterCount = 0; line.replace(/\t/g, function (_, offset) { var totalOffset = offset + extraCharacterCount; var previousTabStopOffset = tabWidth ? totalOffset % tabWidth : 0; var spaceCount = tabWidth - previousTabStopOffset; extraCharacterCount += spaceCount - 1; return '\t'; }); return line.length + extraCharacterCount; } function isFullLineComment(line, lineNumber, comment) { var start = comment.start; var end = comment.end; var isFirstTokenOnLine = !line.slice(0, start[1]).trim(); return comment && (start[0] < lineNumber || (start[0] === lineNumber && isFirstTokenOnLine)) && (end[0] > lineNumber || (end[0] === lineNumber && end[1] === line.length)); } function isTrailingComment(line, lineNumber, comment) { return comment && (comment.start[0] === lineNumber && lineNumber <= comment.end[0]) && (comment.end[0] > lineNumber || comment.end[1] === line.length); } function stripTrailingComment(line, comment) { return line.slice(0, comment.start[1]).replace(/\s+$/, ''); } function groupByLineNumber(acc, node) { var startLoc = node.start; var endLoc = node.end; for (var i = startLoc[0]; i <= endLoc[0]; ++i) { if (!Array.isArray(acc[i])) { acc[i] = []; } acc[i].push(node); } return acc; } var Rule = (function (_super) { tslib_1.__extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.mergeOptions = function (options) { var optionsObj = {}; var obj = options[0]; if (typeof obj === 'number') { optionsObj[CODE] = obj || 80; obj = options[1]; } if (typeof obj === 'number') { optionsObj[TAB_WIDTH] = obj || 4; obj = options[2]; } if (typeof obj === 'object' && !Array.isArray(obj)) { Object.keys(obj).forEach(function (key) { optionsObj[key] = obj[key]; }); } optionsObj[CODE] = optionsObj[CODE] || 80; optionsObj[TAB_WIDTH] = optionsObj[TAB_WIDTH] || 4; return optionsObj; }; Rule.prototype.isEnabled = function () { if (_super.prototype.isEnabled.call(this)) { var options = this.getOptions().ruleArguments; var option = options[0]; if (typeof option === 'number' && option > 0) { return true; } var optionsObj = Rule.mergeOptions(options); if (optionsObj[CODE]) { return true; } } return false; }; Rule.prototype.apply = function (sourceFile) { return this.applyWithWalker(new MaxLenWalker(sourceFile, this.getOptions())); }; Rule.metadata = { ruleName: RULE_NAME, description: 'enforce a maximum line length', rationale: Lint.Utils.dedent(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n Limiting the length of a line of code improves code readability.\n It also makes comparing code side-by-side easier and improves compatibility with\n various editors, IDEs, and diff viewers.\n "], ["\n Limiting the length of a line of code improves code readability.\n It also makes comparing code side-by-side easier and improves compatibility with\n various editors, IDEs, and diff viewers.\n "]))), optionsDescription: Lint.Utils.dedent(templateObject_2 || (templateObject_2 = tslib_1.__makeTemplateObject(["\n An integer indicating the maximum length of lines followed by an optional integer specifying\n the character width for tab characters.\n\n An optional object may be provided to fine tune the rule:\n\n * `\"", "\"`: (default 80) enforces a maximum line length\n * `\"", "\"`: (default 4) specifies the character width for tab characters\n * `\"", "\"`: enforces a maximum line length for comments; defaults to value of code\n * `\"", "\"`: ignores lines matching a regular expression; can only match a single\n line and need to be double escaped when written in JSON\n * `\"", "\"`: true ignores all trailing comments and comments on their own line\n * `\"", "\"`: true ignores only trailing comments\n * `\"", "\"`: true ignores lines that contain a URL\n * `\"", "\"`: true ignores lines that contain a double-quoted or single-quoted string\n * `\"", "\"`: true ignores lines that contain a template literal\n * `\"", "\"`: true ignores lines that contain a RegExp literal\n * `\"", "\"`: true ignores lines that contain an import module specifier\n "], ["\n An integer indicating the maximum length of lines followed by an optional integer specifying\n the character width for tab characters.\n\n An optional object may be provided to fine tune the rule:\n\n * \\`\"", "\"\\`: (default 80) enforces a maximum line length\n * \\`\"", "\"\\`: (default 4) specifies the character width for tab characters\n * \\`\"", "\"\\`: enforces a maximum line length for comments; defaults to value of code\n * \\`\"", "\"\\`: ignores lines matching a regular expression; can only match a single\n line and need to be double escaped when written in JSON\n * \\`\"", "\"\\`: true ignores all trailing comments and comments on their own line\n * \\`\"", "\"\\`: true ignores only trailing comments\n * \\`\"", "\"\\`: true ignores lines that contain a URL\n * \\`\"", "\"\\`: true ignores lines that contain a double-quoted or single-quoted string\n * \\`\"", "\"\\`: true ignores lines that contain a template literal\n * \\`\"", "\"\\`: true ignores lines that contain a RegExp literal\n * \\`\"", "\"\\`: true ignores lines that contain an import module specifier\n "])), CODE, TAB_WIDTH, COMMENTS, IGNORE_PATTERN, IGNORE_COMMENTS, IGNORE_TRAILING_COMMENTS, IGNORE_URLS, IGNORE_STRINGS, IGNORE_TEMPLATE_LITERALS, IGNORE_REG_EXP_LITERALS, IGNORE_IMPORTS), options: { type: 'array', items: [{ type: 'number', minimum: '0' }, { type: 'object', properties: (_a = {}, _a[CODE] = { type: 'number', minumum: '1' }, _a[COMMENTS] = { type: 'number', minumum: '1' }, _a[TAB_WIDTH] = { type: 'number', minumum: '1' }, _a[IGNORE_PATTERN] = { type: 'string' }, _a[IGNORE_COMMENTS] = { type: 'boolean' }, _a[IGNORE_STRINGS] = { type: 'boolean' }, _a[IGNORE_URLS] = { type: 'boolean' }, _a[IGNORE_TEMPLATE_LITERALS] = { type: 'boolean' }, _a[IGNORE_REG_EXP_LITERALS] = { type: 'boolean' }, _a[IGNORE_TRAILING_COMMENTS] = { type: 'boolean' }, _a[IGNORE_IMPORTS] = { type: 'boolean' }, _a), additionalProperties: false }], minLength: 1, maxLength: 3 }, optionExamples: [ Lint.Utils.dedent(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n \"", "\": [true, 100]\n "], ["\n \"", "\": [true, 100]\n "])), RULE_NAME), Lint.Utils.dedent(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n \"", "\": [\n true,\n 100,\n 2,\n {\n \"", "\": true,\n \"", "\": \"^\\\\s*(let|const)\\\\s.+=\\\\s*require\\\\s*\\\\(\"\n }\n ]\n "], ["\n \"", "\": [\n true,\n 100,\n 2,\n {\n \"", "\": true,\n \"", "\": \"^\\\\\\\\s*(let|const)\\\\\\\\s.+=\\\\\\\\s*require\\\\\\\\s*\\\\\\\\(\"\n }\n ]\n "])), RULE_NAME, IGNORE_URLS, IGNORE_PATTERN), Lint.Utils.dedent(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n \"", "\": [\n true,\n {\n \"", "\": 100,\n \"", "\": 2,\n \"", "\": true,\n \"", "\": true,\n \"", "\": \"^\\\\s*(let|const)\\\\s.+=\\\\s*require\\\\s*\\\\(\"\n }\n ]\n "], ["\n \"", "\": [\n true,\n {\n \"", "\": 100,\n \"", "\": 2,\n \"", "\": true,\n \"", "\": true,\n \"", "\": \"^\\\\\\\\s*(let|const)\\\\\\\\s.+=\\\\\\\\s*require\\\\\\\\s*\\\\\\\\(\"\n }\n ]\n "])), RULE_NAME, CODE, TAB_WIDTH, IGNORE_IMPORTS, IGNORE_URLS, IGNORE_PATTERN) ], typescriptOnly: false, type: 'style' }; Rule.URL_REGEXP = /[^:/?#]:\/\/[^?#]/; return Rule; }(Lint.Rules.AbstractRule)); exports.Rule = Rule; var MaxLenWalker = (function (_super) { tslib_1.__extends(MaxLenWalker, _super); function MaxLenWalker(sourceFile, options) { var _this = _super.call(this, sourceFile, options) || this; _this.ignoredIntervals = []; _this.optionsObj = {}; _this.comments = []; _this.strings = []; _this.templates = []; _this.regExp = []; _this.optionsObj = Rule.mergeOptions(_this.getOptions()); return _this; } MaxLenWalker.prototype.hasOption = function (option) { if (this.optionsObj[option] && this.optionsObj[option]) { return true; } return false; }; MaxLenWalker.prototype.getOption = function (option) { return this.optionsObj[option]; }; MaxLenWalker.prototype.visitStringLiteral = function (node) { this.strings.push(this.getINode(node.kind, node.getText(), node.getStart())); _super.prototype.visitStringLiteral.call(this, node); }; MaxLenWalker.prototype.visitRegularExpressionLiteral = function (node) { this.regExp.push(this.getINode(node.kind, node.getText(), node.getStart())); _super.prototype.visitRegularExpressionLiteral.call(this, node); }; MaxLenWalker.prototype.getINode = function (kind, text, startPos) { var width = text.length; var src = this.getSourceFile(); var startLoc = src.getLineAndCharacterOfPosition(startPos); var endLoc = src.getLineAndCharacterOfPosition(startPos + width); return { kind: kind, text: text, startPosition: startPos, endPosition: startPos + width, start: [startLoc.line, startLoc.character], end: [endLoc.line, endLoc.character] }; }; MaxLenWalker.prototype.visitSourceFile = function (node) { var _this = this; _super.prototype.visitSourceFile.call(this, node); tsutils_1.forEachTokenWithTrivia(node, function (text, token, range) { if (token === ts.SyntaxKind.SingleLineCommentTrivia || token === ts.SyntaxKind.MultiLineCommentTrivia) { _this.comments.push(_this.getINode(token, text.substring(range.pos, range.end), range.pos)); } else if (token === ts.SyntaxKind.FirstTemplateToken) { _this.templates.push(_this.getINode(token, text.substring(range.pos, range.end), range.pos)); } }); this.findFailures(node); }; MaxLenWalker.prototype.visitImportDeclaration = function (node) { _super.prototype.visitImportDeclaration.call(this, node); var startPos = node.moduleSpecifier.getStart(); var text = node.moduleSpecifier.getText(); var width = text.length; if (this.hasOption(IGNORE_IMPORTS)) { this.ignoredIntervals.push({ endPosition: startPos + width, startPosition: startPos }); } }; MaxLenWalker.prototype.findFailures = function (sourceFile) { var lineStarts = sourceFile.getLineStarts(); var source = sourceFile.getFullText(); var lineLimit = this.getOption(CODE) || 80; var ignoreTrailingComments = this.getOption(IGNORE_TRAILING_COMMENTS) || this.getOption(IGNORE_COMMENTS) || false; var ignoreComments = this.getOption(IGNORE_COMMENTS) || false; var ignoreStrings = this.getOption(IGNORE_STRINGS) || false; var ignoreTemplateLiterals = this.getOption(IGNORE_TEMPLATE_LITERALS) || false; var ignoreUrls = this.getOption(IGNORE_URLS) || false; var ignoreRexExpLiterals = this.getOption(IGNORE_REG_EXP_LITERALS) || false; var pattern = this.getOption(IGNORE_PATTERN) || null; var tabWidth = this.getOption(TAB_WIDTH) || 4; var maxCommentLength = this.getOption(COMMENTS); var comments = ignoreComments || maxCommentLength || ignoreTrailingComments ? this.comments : []; var commentsIndex = 0; var stringsByLine = this.strings.reduce(groupByLineNumber, {}); var templatesByLine = this.templates.reduce(groupByLineNumber, {}); var regExpByLine = this.regExp.reduce(groupByLineNumber, {}); var totalLines = lineStarts.length; for (var i = 0; i < totalLines; ++i) { var from = lineStarts[i]; var to = lineStarts[i + 1] || source.length; var line = source.substring(from, i === totalLines - 1 ? to : to - 1); var lineIsComment = false; if (commentsIndex < comments.length) { var comment = void 0; do { comment = comments[++commentsIndex]; } while (comment && comment.start[0] <= i); comment = comments[--commentsIndex]; if (isFullLineComment(line, i, comment)) { lineIsComment = true; } else if (ignoreTrailingComments && isTrailingComment(line, i, comment)) { line = stripTrailingComment(line, comment); } } if (ignoreUrls && Rule.URL_REGEXP.test(line) || pattern && new RegExp(pattern).test(line) || ignoreStrings && stringsByLine[i] || ignoreTemplateLiterals && templatesByLine[i] || ignoreRexExpLiterals && regExpByLine[i]) { continue; } var lineLength = computeLineLength(line, tabWidth); if (lineIsComment && ignoreComments) { continue; } var ruleFailure = null; if (lineIsComment && exceedLineLimit(lineLength, maxCommentLength, source[to - 2])) { ruleFailure = new Lint.RuleFailure(sourceFile, from, to - 1, "Line " + (i + 1) + " exceeds the maximum comment line length of " + maxCommentLength + ".", RULE_NAME); } else if (exceedLineLimit(lineLength, lineLimit, source[to - 2])) { ruleFailure = new Lint.RuleFailure(sourceFile, from, to - 1, "Line " + (i + 1) + " exceeds the maximum line length of " + lineLimit + ".", RULE_NAME); } if (ruleFailure && !Lint.doesIntersect(ruleFailure, this.ignoredIntervals)) { this.addFailure(ruleFailure); } } }; return MaxLenWalker; }(Lint.RuleWalker)); function exceedLineLimit(lineLength, lineLimit, secondToLast) { return lineLength > lineLimit && !((lineLength - 1) === lineLimit && secondToLast === '\r'); } var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5; //# sourceMappingURL=data:application/json;charset=utf8;base64,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LElBQUksQ0FBQyxXQUFXLENBQ2hDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFDeEIsV0FBUSxDQUFDLEdBQUcsQ0FBQyw2Q0FBdUMsU0FBUyxNQUFHLEVBQ2hFLFNBQVMsQ0FDVixDQUFDO2FBQ0g7WUFFRCxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUMxRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQWxMQSxBQWtMQyxDQWxMMEIsSUFBSSxDQUFDLFVBQVUsR0FrTHpDO0FBRUQsU0FBUyxlQUFlLENBQUMsVUFBa0IsRUFBRSxTQUFpQixFQUFFLFlBQW9CO0lBTWxGLE9BQU8sVUFBVSxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM5RixDQUFDIiwiZmlsZSI6InJ1bGVzL3Rlck1heExlblJ1bGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2ptbG9wZXovdHNsaW50LWVzbGludC1ydWxlcy9zcmMifQ==