UNPKG

tslint-config-airbnb

Version:
306 lines (304 loc) 32.6 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-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())); }; return Rule; }(Lint.Rules.AbstractRule)); Rule.metadata = { ruleName: RULE_NAME, description: 'enforce a maximum line length', rationale: (_a = ["\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 "], _a.raw = ["\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 "], Lint.Utils.dedent(_a)), optionsDescription: (_b = ["\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 "], _b.raw = ["\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 "], Lint.Utils.dedent(_b, 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: (_c = {}, _c[CODE] = { type: 'number', minumum: '1' }, _c[COMMENTS] = { type: 'number', minumum: '1' }, _c[TAB_WIDTH] = { type: 'number', minumum: '1' }, _c[IGNORE_PATTERN] = { type: 'string' }, _c[IGNORE_COMMENTS] = { type: 'boolean' }, _c[IGNORE_STRINGS] = { type: 'boolean' }, _c[IGNORE_URLS] = { type: 'boolean' }, _c[IGNORE_TEMPLATE_LITERALS] = { type: 'boolean' }, _c[IGNORE_REG_EXP_LITERALS] = { type: 'boolean' }, _c[IGNORE_TRAILING_COMMENTS] = { type: 'boolean' }, _c[IGNORE_IMPORTS] = { type: 'boolean' }, _c), additionalProperties: false }], minLength: 1, maxLength: 3 }, optionExamples: [ (_d = ["\n \"", "\": [true, 100]\n "], _d.raw = ["\n \"", "\": [true, 100]\n "], Lint.Utils.dedent(_d, RULE_NAME)), (_e = ["\n \"", "\": [\n true,\n 100,\n 2,\n {\n \"", "\": true,\n \"", "\": \"^\\\\s*(let|const)\\\\s.+=\\\\s*require\\\\s*\\\\(\"\n }\n ]\n "], _e.raw = ["\n \"", "\": [\n true,\n 100,\n 2,\n {\n \"", "\": true,\n \"", "\": \"^\\\\\\\\s*(let|const)\\\\\\\\s.+=\\\\\\\\s*require\\\\\\\\s*\\\\\\\\(\"\n }\n ]\n "], Lint.Utils.dedent(_e, RULE_NAME, IGNORE_URLS, IGNORE_PATTERN)), (_f = ["\n \"", "\": [\n true,\n {\n \"", "\": 100,\n \"", "\": 2,\n \"", "\": true,\n \"", "\": true,\n \"", "\": \"^\\\\s*(let|const)\\\\s.+=\\\\s*require\\\\s*\\\\(\"\n }\n ]\n "], _f.raw = ["\n \"", "\": [\n true,\n {\n \"", "\": 100,\n \"", "\": 2,\n \"", "\": true,\n \"", "\": true,\n \"", "\": \"^\\\\\\\\s*(let|const)\\\\\\\\s.+=\\\\\\\\s*require\\\\\\\\s*\\\\\\\\(\"\n }\n ]\n "], Lint.Utils.dedent(_f, RULE_NAME, CODE, TAB_WIDTH, IGNORE_IMPORTS, IGNORE_URLS, IGNORE_PATTERN)) ], typescriptOnly: false, type: 'style' }; Rule.URL_REGEXP = /[^:/?#]:\/\/[^?#]/; 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]; 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 _a, _b, _c, _d, _e, _f; //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDLENBQUM7Z0JBQ3BDLFFBQVEsQ0FBQztZQUNYLENBQUM7WUFFRCxJQUFJLFdBQVcsR0FBNEIsSUFBSSxDQUFDO1lBQ2hELEVBQUUsQ0FBQyxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQ2hDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFDeEIsV0FBUSxDQUFDLEdBQUcsQ0FBQyxxREFBK0MsZ0JBQWdCLE1BQUcsRUFDL0UsU0FBUyxDQUNWLENBQUM7WUFDSixDQUFDO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQ2hDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFDeEIsV0FBUSxDQUFDLEdBQUcsQ0FBQyw2Q0FBdUMsU0FBUyxNQUFHLEVBQ2hFLFNBQVMsQ0FDVixDQUFDO1lBQ0osQ0FBQztZQUVELEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDSCxtQkFBQztBQUFELENBbExBLEFBa0xDLENBbEwwQixJQUFJLENBQUMsVUFBVSxHQWtMekM7QUFFRCx5QkFBeUIsVUFBa0IsRUFBRSxTQUFpQixFQUFFLFlBQW9CO0lBTWxGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQzlGLENBQUMiLCJmaWxlIjoicnVsZXMvdGVyTWF4TGVuUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvam1sb3Blei9Xb3Jrc3BhY2UvdHNsaW50LWVzbGludC1ydWxlcy9zcmMifQ==