UNPKG

vrsource-tslint-rules

Version:
315 lines 30.4 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var ts = require("typescript"); var Lint = require("tslint"); var CLASS_TAG = "class"; var INTERFACE_TAG = "interface"; var PARAMETER_TAG = "parameter"; var PROPERTY_TAG = "property"; var METHOD_TAG = "method"; var FUNCTION_TAG = "function"; var VARIABLE_TAG = "variable"; var LOCAL_TAG = "local"; var STATIC_TAG = "static"; var CONST_TAG = "const"; var PUBLIC_TAG = "public"; var PROTECTED_TAG = "protected"; var PRIVATE_TAG = "private"; var VALID_VAR_TAGS = [CLASS_TAG, INTERFACE_TAG, PARAMETER_TAG, PROPERTY_TAG, METHOD_TAG, FUNCTION_TAG, VARIABLE_TAG, LOCAL_TAG, STATIC_TAG, CONST_TAG, PUBLIC_TAG, PROTECTED_TAG, PRIVATE_TAG]; var PASCAL_OPTION = "pascal"; var CAMEL_OPTION = "camel"; var SNAKE_OPTION = "snake"; var UPPER_OPTION = "upper"; var ALLOW_LEADING_UNDERSCORE_OPTION = "allow-leading-underscore"; var ALLOW_TRAILING_UNDERSCORE_OPTION = "allow-trailing-underscore"; var REQUIRE_LEADING_UNDERSCORE_OPTION = "require-leading-underscore"; var REQUIRE_TRAILING_UNDERSCORE_OPTION = "require-trailing-underscore"; var BAN_KEYWORDS_OPTION = "ban-keywords"; var CAMEL_FAIL = "must be in camel case"; var PASCAL_FAIL = "must be in pascal case"; var SNAKE_FAIL = "must be in snake case"; var UPPER_FAIL = "must be in uppercase"; var KEYWORD_FAIL = "name clashes with keyword/type"; var LEADING_FAIL = "name must not have leading underscore"; var TRAILING_FAIL = "name must not have trailing underscore"; var NO_LEADING_FAIL = "name must have leading underscore"; var NO_TRAILING_FAIL = "name must have trailing underscore"; var REGEX_FAIL = "name did not match required regex"; var BANNED_KEYWORDS = ["any", "Number", "number", "String", "string", "Boolean", "boolean", "Undefined", "undefined"]; var VariableChecker = (function () { function VariableChecker(opts) { var _this = this; this.caseCheck = ""; this.allowLeadingUnderscore = false; this.allowTrailingUnderscore = false; this.requireLeadingUnderscore = false; this.requireTrailingUnderscore = false; this.banKeywords = false; this.regex = null; this.varTags = opts.filter(function (v) { return contains(VALID_VAR_TAGS, v); }); if (contains(opts, PASCAL_OPTION)) { this.caseCheck = PASCAL_OPTION; } else if (contains(opts, CAMEL_OPTION)) { this.caseCheck = CAMEL_OPTION; } else if (contains(opts, SNAKE_OPTION)) { this.caseCheck = SNAKE_OPTION; } else if (contains(opts, UPPER_OPTION)) { this.caseCheck = UPPER_OPTION; } this.allowLeadingUnderscore = contains(opts, ALLOW_LEADING_UNDERSCORE_OPTION); this.allowTrailingUnderscore = contains(opts, ALLOW_TRAILING_UNDERSCORE_OPTION); this.requireLeadingUnderscore = contains(opts, REQUIRE_LEADING_UNDERSCORE_OPTION); this.requireTrailingUnderscore = contains(opts, REQUIRE_TRAILING_UNDERSCORE_OPTION); this.banKeywords = contains(opts, BAN_KEYWORDS_OPTION); opts.forEach(function (opt) { if (opt.regex !== undefined) { _this.regex = new RegExp(opt.regex); } }); } VariableChecker.prototype.requiredTagsFound = function (proposedTags) { var matches = true; this.varTags.forEach(function (tag) { if (!contains(proposedTags, tag)) { matches = false; } }); return matches; }; VariableChecker.prototype.failMessage = function (failMessage, tag) { return tag[0].toUpperCase() + tag.substr(1) + " " + failMessage; }; VariableChecker.prototype.checkName = function (name, walker, tag) { var variableName = name.text; var firstCharacter = variableName[0]; var lastCharacter = variableName[variableName.length - 1]; if ((this.regex !== null) && !variableName.match(this.regex)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(REGEX_FAIL, tag))); } if (this.banKeywords && contains(BANNED_KEYWORDS, variableName)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(KEYWORD_FAIL, tag))); } if ("_" === firstCharacter) { if (!this.allowLeadingUnderscore && !this.requireLeadingUnderscore) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(LEADING_FAIL, tag))); } variableName = variableName.slice(1); } else if (this.requireLeadingUnderscore) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(NO_LEADING_FAIL, tag))); } if (("_" === lastCharacter) && (variableName.length > 0)) { if (!this.allowTrailingUnderscore && !this.requireTrailingUnderscore) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(TRAILING_FAIL, tag))); } variableName = variableName.slice(0, -1); } else if (this.requireTrailingUnderscore) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(NO_TRAILING_FAIL, tag))); } if ((PASCAL_OPTION === this.caseCheck) && !isPascalCased(variableName)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(PASCAL_FAIL, tag))); } else if ((CAMEL_OPTION === this.caseCheck) && !isCamelCase(variableName)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(CAMEL_FAIL, tag))); } else if ((SNAKE_OPTION === this.caseCheck) && !isSnakeCase(variableName)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(SNAKE_FAIL, tag))); } else if ((UPPER_OPTION === this.caseCheck) && !isUpperCase(variableName)) { walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(UPPER_FAIL, tag))); } }; return VariableChecker; }()); var VariableNameWalker = (function (_super) { __extends(VariableNameWalker, _super); function VariableNameWalker(sourceFile, options) { var _this = _super.call(this, sourceFile, options) || this; _this.checkers = []; var sub_rules = options.ruleArguments; sub_rules.forEach(function (rule_opts) { _this.checkers.push(new VariableChecker(rule_opts)); }); return _this; } VariableNameWalker.prototype.visitClassDeclaration = function (node) { this.checkName(node, CLASS_TAG); _super.prototype.visitClassDeclaration.call(this, node); }; VariableNameWalker.prototype.visitMethodDeclaration = function (node) { this.checkName(node, METHOD_TAG); _super.prototype.visitMethodDeclaration.call(this, node); }; VariableNameWalker.prototype.visitInterfaceDeclaration = function (node) { this.checkName(node, INTERFACE_TAG); _super.prototype.visitInterfaceDeclaration.call(this, node); }; VariableNameWalker.prototype.visitBindingElement = function (node) { this.checkName(node, VARIABLE_TAG); _super.prototype.visitBindingElement.call(this, node); }; VariableNameWalker.prototype.visitParameterDeclaration = function (node) { var parameterProperty = Lint.hasModifier(node.modifiers, ts.SyntaxKind.PublicKeyword) || Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword) || Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword); this.checkName(node, parameterProperty ? PROPERTY_TAG : PARAMETER_TAG); _super.prototype.visitParameterDeclaration.call(this, node); }; VariableNameWalker.prototype.visitPropertyDeclaration = function (node) { this.checkName(node, PROPERTY_TAG); _super.prototype.visitPropertyDeclaration.call(this, node); }; VariableNameWalker.prototype.visitSetAccessor = function (node) { this.checkName(node, PROPERTY_TAG); _super.prototype.visitSetAccessor.call(this, node); }; VariableNameWalker.prototype.visitGetAccessor = function (node) { this.checkName(node, PROPERTY_TAG); _super.prototype.visitGetAccessor.call(this, node); }; VariableNameWalker.prototype.visitVariableDeclaration = function (node) { this.checkName(node, VARIABLE_TAG); _super.prototype.visitVariableDeclaration.call(this, node); }; VariableNameWalker.prototype.visitVariableStatement = function (node) { if (!Lint.hasModifier(node.modifiers, ts.SyntaxKind.DeclareKeyword)) { _super.prototype.visitVariableStatement.call(this, node); } }; VariableNameWalker.prototype.visitFunctionDeclaration = function (node) { this.checkName(node, FUNCTION_TAG); _super.prototype.visitFunctionDeclaration.call(this, node); }; VariableNameWalker.prototype.checkName = function (node, tag) { if (node.name && node.name.kind === ts.SyntaxKind.Identifier) { var matching_checker = this.getMatchingChecker(this.getNodeTags(node, tag)); if (matching_checker !== null) { matching_checker.checkName(node.name, this, tag); } } }; VariableNameWalker.prototype.getMatchingChecker = function (varTags) { var matching_checkers = this.checkers.filter(function (checker) { return checker.requiredTagsFound(varTags); }); if (matching_checkers.length > 0) { return matching_checkers[0]; } else { return null; } }; VariableNameWalker.prototype.getNodeTags = function (node, primaryTag) { var tags = [primaryTag]; if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword)) { tags.push(STATIC_TAG); } if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ConstKeyword)) { tags.push(CONST_TAG); } if (primaryTag === PROPERTY_TAG || primaryTag === METHOD_TAG) { if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword)) { tags.push(PRIVATE_TAG); } else if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword)) { tags.push(PROTECTED_TAG); } else { tags.push(PUBLIC_TAG); } } var nearest_body = nearestBody(node); if (!nearest_body.isSourceFile) { tags.push(LOCAL_TAG); } if (node.kind === ts.SyntaxKind.VariableDeclaration) { if (isConstVariable(node)) { tags.push(CONST_TAG); } } return tags; }; return VariableNameWalker; }(Lint.RuleWalker)); function nearestBody(node) { var VALID_PARENT_TYPES = [ ts.SyntaxKind.SourceFile, ts.SyntaxKind.FunctionDeclaration, ts.SyntaxKind.FunctionExpression, ts.SyntaxKind.ArrowFunction, ts.SyntaxKind.MethodDeclaration, ts.SyntaxKind.Constructor, ]; var ancestor = node.parent; while (ancestor && !contains(VALID_PARENT_TYPES, ancestor.kind)) { ancestor = ancestor.parent; } return { containingBody: ancestor, isSourceFile: (ancestor && ancestor.kind === ts.SyntaxKind.SourceFile) || !ancestor, }; } function isConstVariable(node) { var parentNode = (node.kind === ts.SyntaxKind.VariableDeclaration) ? node.parent : node.declarationList; return !parentNode || Lint.isNodeFlagSet(parentNode, ts.NodeFlags.Const); } function isPascalCased(name) { if (name.length <= 0) { return true; } var firstCharacter = name.charAt(0); return ((firstCharacter === firstCharacter.toUpperCase()) && name.indexOf("_") === -1); } function isCamelCase(name) { var firstCharacter = name.charAt(0); if (name.length <= 0) { return true; } if (!isLowerCase(firstCharacter)) { return false; } return name.indexOf("_") === -1; } function isSnakeCase(name) { return isLowerCase(name); } function isLowerCase(name) { return name === name.toLowerCase(); } function isUpperCase(name) { return name === name.toUpperCase(); } function contains(arr, value) { return arr.indexOf(value) !== -1; } var Rule = (function (_super) { __extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.prototype.apply = function (sourceFile) { var variableNameWalker = new VariableNameWalker(sourceFile, this.getOptions()); return this.applyWithWalker(variableNameWalker); }; return Rule; }(Lint.Rules.AbstractRule)); exports.Rule = Rule; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0VmFyaWFibGVOYW1lUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4dFZhcmlhYmxlTmFtZVJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQTBEL0IsSUFBTSxTQUFTLEdBQU8sT0FBTyxDQUFDO0FBQzlCLElBQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQztBQUNsQyxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsSUFBTSxZQUFZLEdBQUksVUFBVSxDQUFDO0FBQ2pDLElBQU0sVUFBVSxHQUFNLFFBQVEsQ0FBQztBQUMvQixJQUFNLFlBQVksR0FBSSxVQUFVLENBQUM7QUFDakMsSUFBTSxZQUFZLEdBQUksVUFBVSxDQUFDO0FBRWpDLElBQU0sU0FBUyxHQUFPLE9BQU8sQ0FBQztBQUM5QixJQUFNLFVBQVUsR0FBTSxRQUFRLENBQUM7QUFDL0IsSUFBTSxTQUFTLEdBQU8sT0FBTyxDQUFDO0FBQzlCLElBQU0sVUFBVSxHQUFNLFFBQVEsQ0FBQztBQUMvQixJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsSUFBTSxXQUFXLEdBQUssU0FBUyxDQUFDO0FBRWhDLElBQU0sY0FBYyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhO0lBQ3ZDLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVk7SUFDcEQsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ2hDLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFaEUsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLElBQU0sWUFBWSxHQUFJLE9BQU8sQ0FBQztBQUM5QixJQUFNLFlBQVksR0FBSSxPQUFPLENBQUM7QUFDOUIsSUFBTSxZQUFZLEdBQUksT0FBTyxDQUFDO0FBQzlCLElBQU0sK0JBQStCLEdBQU0sMEJBQTBCLENBQUM7QUFDdEUsSUFBTSxnQ0FB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LEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFD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