vrsource-tslint-rules
Version:
Extension rules for tslint
315 lines • 30.4 kB
JavaScript
"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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