simplr-tslint
Version:
A set of TSLint rules used in SimplrJS projects.
58 lines • 9.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
const Lint = require("tslint");
const changeCase = require("change-case");
exports.ONLY_PRIMITIVES = "only-primitives";
class Rule extends Lint.Rules.TypedRule {
applyWithProgram(sourceFile, program) {
return this.applyWithWalker(new ConstVariableWalker(sourceFile, this.getOptions(), program));
}
}
// tslint:disable-next-line:max-line-length
Rule.failureMessage = "Const variables in source file or in module declaration must have (constant-case) format.";
exports.Rule = Rule;
class ConstVariableWalker extends Lint.ProgramAwareRuleWalker {
isNodeInModuleDeclaration(node) {
return ts.isModuleBlock(node) && node.parent != null && ts.isModuleDeclaration(node.parent);
}
isTypePrimitive(type) {
const primitive = ts.TypeFlags.String |
ts.TypeFlags.Number |
ts.TypeFlags.Boolean |
ts.TypeFlags.Enum |
ts.TypeFlags.EnumLiteral |
ts.TypeFlags.ESSymbol |
ts.TypeFlags.Void |
ts.TypeFlags.Undefined |
ts.TypeFlags.Null |
ts.TypeFlags.Literal |
ts.TypeFlags.UniqueESSymbol;
return Boolean(type.flags & primitive);
}
visitVariableStatement(node) {
super.visitVariableStatement(node);
if (node.parent == null || (!ts.isSourceFile(node.parent) && !this.isNodeInModuleDeclaration(node.parent))) {
return;
}
const typeChecker = this.getTypeChecker();
const variableDeclarationList = node.declarationList.declarations;
for (const variableDeclaration of variableDeclarationList) {
if (this.hasOption(exports.ONLY_PRIMITIVES)) {
const type = typeChecker.getTypeAtLocation(variableDeclaration);
if (!this.isTypePrimitive(type)) {
continue;
}
}
const name = variableDeclaration.name.getText();
const casedName = changeCase.constantCase(name);
if (name !== casedName) {
const nodeNameStart = variableDeclaration.name.getStart();
const nodeNameEnd = variableDeclaration.name.getWidth();
const fix = new Lint.Replacement(nodeNameStart, nodeNameEnd, casedName);
this.addFailure(this.createFailure(nodeNameStart, nodeNameEnd, Rule.failureMessage, fix));
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RWYXJpYWJsZU5hbWVSdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0VmFyaWFibGVOYW1lUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFpQztBQUNqQywrQkFBK0I7QUFDL0IsMENBQTBDO0FBRTdCLFFBQUEsZUFBZSxHQUFXLGlCQUFpQixDQUFDO0FBRXpELFVBQWtCLFNBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO0lBSW5DLGdCQUFnQixDQUFDLFVBQXlCLEVBQUUsT0FBbUI7UUFDbEUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7O0FBTEQsMkNBQTJDO0FBQ3BCLG1CQUFjLEdBQVcsMkZBQTJGLENBQUM7QUFGaEosb0JBT0M7QUFFRCx5QkFBMEIsU0FBUSxJQUFJLENBQUMsc0JBQXNCO0lBQ2pELHlCQUF5QixDQUFDLElBQWE7UUFDM0MsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFhO1FBQ2pDLE1BQU0sU0FBUyxHQUNYLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTTtZQUNuQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDbkIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPO1lBQ3BCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNqQixFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVc7WUFDeEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ3JCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNqQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFDdEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1lBQ2pCLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztZQUNwQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUVoQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxJQUEwQjtRQUNwRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDeEcsT0FBTztTQUNWO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7UUFFbEUsS0FBSyxNQUFNLG1CQUFtQixJQUFJLHVCQUF1QixFQUFFO1lBQ3ZELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBZSxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUVoRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDN0IsU0FBUztpQkFDWjthQUNKO1lBRUQsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM3RjtTQUNKO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcclxuaW1wb3J0ICogYXMgTGludCBmcm9tIFwidHNsaW50XCI7XHJcbmltcG9ydCAqIGFzIGNoYW5nZUNhc2UgZnJvbSBcImNoYW5nZS1jYXNlXCI7XHJcblxyXG5leHBvcnQgY29uc3QgT05MWV9QUklNSVRJVkVTOiBzdHJpbmcgPSBcIm9ubHktcHJpbWl0aXZlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJ1bGUgZXh0ZW5kcyBMaW50LlJ1bGVzLlR5cGVkUnVsZSB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGZhaWx1cmVNZXNzYWdlOiBzdHJpbmcgPSBcIkNvbnN0IHZhcmlhYmxlcyBpbiBzb3VyY2UgZmlsZSBvciBpbiBtb2R1bGUgZGVjbGFyYXRpb24gbXVzdCBoYXZlIChjb25zdGFudC1jYXNlKSBmb3JtYXQuXCI7XHJcblxyXG4gICAgcHVibGljIGFwcGx5V2l0aFByb2dyYW0oc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgcHJvZ3JhbTogdHMuUHJvZ3JhbSk6IExpbnQuUnVsZUZhaWx1cmVbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlXaXRoV2Fsa2VyKG5ldyBDb25zdFZhcmlhYmxlV2Fsa2VyKHNvdXJjZUZpbGUsIHRoaXMuZ2V0T3B0aW9ucygpLCBwcm9ncmFtKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbnN0VmFyaWFibGVXYWxrZXIgZXh0ZW5kcyBMaW50LlByb2dyYW1Bd2FyZVJ1bGVXYWxrZXIge1xyXG4gICAgcHJpdmF0ZSBpc05vZGVJbk1vZHVsZURlY2xhcmF0aW9uKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHMuaXNNb2R1bGVCbG9jayhub2RlKSAmJiBub2RlLnBhcmVudCAhPSBudWxsICYmIHRzLmlzTW9kdWxlRGVjbGFyYXRpb24obm9kZS5wYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNUeXBlUHJpbWl0aXZlKHR5cGU6IHRzLlR5cGUpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBwcmltaXRpdmUgPVxyXG4gICAgICAgICAgICB0cy5UeXBlRmxhZ3MuU3RyaW5nIHxcclxuICAgICAgICAgICAgdHMuVHlwZUZsYWdzLk51bWJlciB8XHJcbiAgICAgICAgICAgIHRzLlR5cGVGbGFncy5Cb29sZWFuIHxcclxuICAgICAgICAgICAgdHMuVHlwZUZsYWdzLkVudW0gfFxyXG4gICAgICAgICAgICB0cy5UeXBlRmxhZ3MuRW51bUxpdGVyYWwgfFxyXG4gICAgICAgICAgICB0cy5UeXBlRmxhZ3MuRVNTeW1ib2wgfFxyXG4gICAgICAgICAgICB0cy5UeXBlRmxhZ3MuVm9pZCB8XHJcbiAgICAgICAgICAgIHRzLlR5cGVGbGFncy5VbmRlZmluZWQgfFxyXG4gICAgICAgICAgICB0cy5UeXBlRmxhZ3MuTnVsbCB8XHJcbiAgICAgICAgICAgIHRzLlR5cGVGbGFncy5MaXRlcmFsIHxcclxuICAgICAgICAgICAgdHMuVHlwZUZsYWdzLlVuaXF1ZUVTU3ltYm9sO1xyXG5cclxuICAgICAgICByZXR1cm4gQm9vbGVhbih0eXBlLmZsYWdzICYgcHJpbWl0aXZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlzaXRWYXJpYWJsZVN0YXRlbWVudChub2RlOiB0cy5WYXJpYWJsZVN0YXRlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLnZpc2l0VmFyaWFibGVTdGF0ZW1lbnQobm9kZSk7XHJcbiAgICAgICAgaWYgKG5vZGUucGFyZW50ID09IG51bGwgfHwgKCF0cy5pc1NvdXJjZUZpbGUobm9kZS5wYXJlbnQpICYmICF0aGlzLmlzTm9kZUluTW9kdWxlRGVjbGFyYXRpb24obm9kZS5wYXJlbnQpKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0eXBlQ2hlY2tlciA9IHRoaXMuZ2V0VHlwZUNoZWNrZXIoKTtcclxuICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9uTGlzdCA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucztcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9uIG9mIHZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc09wdGlvbihPTkxZX1BSSU1JVElWRVMpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdHlwZUNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHlwZVByaW1pdGl2ZSh0eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lLmdldFRleHQoKTtcclxuICAgICAgICAgICAgY29uc3QgY2FzZWROYW1lID0gY2hhbmdlQ2FzZS5jb25zdGFudENhc2UobmFtZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gY2FzZWROYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlTmFtZVN0YXJ0ID0gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lLmdldFN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlTmFtZUVuZCA9IHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZS5nZXRXaWR0aCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpeCA9IG5ldyBMaW50LlJlcGxhY2VtZW50KG5vZGVOYW1lU3RhcnQsIG5vZGVOYW1lRW5kLCBjYXNlZE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGYWlsdXJlKHRoaXMuY3JlYXRlRmFpbHVyZShub2RlTmFtZVN0YXJ0LCBub2RlTmFtZUVuZCwgUnVsZS5mYWlsdXJlTWVzc2FnZSwgZml4KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19