UNPKG

simplr-tslint

Version:

A set of TSLint rules used in SimplrJS projects.

98 lines 15.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ts = require("typescript"); const Lint = require("tslint"); const changeCase = require("change-case"); const BACKING_FIELD_PREFIX = "_"; class Rule extends Lint.Rules.AbstractRule { static accessorFailureMessageFactory(expectedName) { return `Accessor name must be the same as a backing field. Expected name "${expectedName}".`; } apply(sourceFile) { return this.applyWithWalker(new BackingFieldsWalker(sourceFile, this.getOptions())); } } Rule.usageFailureMessage = "Backing field can only be used in getter and setter."; exports.Rule = Rule; class BackingFieldsWalker extends Lint.RuleWalker { checkPropertyPrefix(name) { return name === BACKING_FIELD_PREFIX + changeCase.camelCase(name); } removePrefix(name) { return name.substring(BACKING_FIELD_PREFIX.length, name.length); } accessorNameEquals(accessorName, backingFieldName) { return BACKING_FIELD_PREFIX + accessorName === backingFieldName; } isMemberOfClassDeclaration(classDeclaration, name) { for (const member of classDeclaration.members) { // Property if (ts.isPropertyDeclaration(member) && member.modifiers != null && member.modifiers.findIndex(x => x.kind === ts.SyntaxKind.PrivateKeyword) !== -1 && member.name.getText() === name) { return true; } // Constructor Parameter Property. if (ts.isConstructorDeclaration(member)) { for (const parameter of member.parameters) { if (parameter.modifiers != null && parameter.modifiers.findIndex(x => x.kind === ts.SyntaxKind.PrivateKeyword) !== -1 && parameter.name.getText() === name) { return true; } } } } return false; } visitSourceFile(node) { // This rule should only work in source files. if (!node.isDeclarationFile) { super.visitSourceFile(node); } } visitPropertyAccessExpression(node) { super.visitPropertyAccessExpression(node); // "this._something" if (node.expression.kind !== ts.SyntaxKind.ThisKeyword) { return; } const name = node.name.getText(); if (!this.checkPropertyPrefix(name)) { return; } let currentParentNode = node.parent; let classDeclaration; let accessor; while (currentParentNode != null) { if (ts.isGetAccessorDeclaration(currentParentNode) || ts.isSetAccessorDeclaration(currentParentNode)) { accessor = currentParentNode; } if (ts.isClassDeclaration(currentParentNode)) { classDeclaration = currentParentNode; break; } currentParentNode = currentParentNode.parent; } if (classDeclaration == null || !this.isMemberOfClassDeclaration(classDeclaration, name)) { return; } if (accessor != null) { const accessorNameNode = accessor.name; const casedAccessorName = changeCase.camelCase(accessorNameNode.getText()); if (!this.accessorNameEquals(casedAccessorName, name)) { const expectedAccessorName = this.removePrefix(name); const accessorNameNodeStart = accessorNameNode.getStart(); const accessorNameNodeWidth = accessorNameNode.getWidth(); const fix = new Lint.Replacement(accessorNameNodeStart, accessorNameNodeWidth, expectedAccessorName); this.addFailureAt(accessorNameNodeStart, accessorNameNodeWidth, Rule.accessorFailureMessageFactory(expectedAccessorName), fix); } } else { // Backing field can only be used in GetAccessor and SetAccessor declarations. this.addFailureAtNode(node, Rule.usageFailureMessage); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2luZ0ZpZWxkUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iYWNraW5nRmllbGRSdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsaUNBQWlDO0FBQ2pDLCtCQUErQjtBQUMvQiwwQ0FBMEM7QUFFMUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFakMsVUFBa0IsU0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVk7SUFFdEMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFlBQW9CO1FBQzVELE9BQU8scUVBQXFFLFlBQVksSUFBSSxDQUFDO0lBQ2pHLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBeUI7UUFDbEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQzs7QUFQc0Isd0JBQW1CLEdBQVcsc0RBQXNELENBQUM7QUFEaEgsb0JBU0M7QUFFRCx5QkFBMEIsU0FBUSxJQUFJLENBQUMsVUFBVTtJQUNyQyxtQkFBbUIsQ0FBQyxJQUFZO1FBQ3BDLE9BQU8sSUFBSSxLQUFLLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFZO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxZQUFvQixFQUFFLGdCQUF3QjtRQUNyRSxPQUFPLG9CQUFvQixHQUFHLFlBQVksS0FBSyxnQkFBZ0IsQ0FBQztJQUNwRSxDQUFDO0lBRU8sMEJBQTBCLENBQUMsZ0JBQXFDLEVBQUUsSUFBWTtRQUNsRixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtZ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QkFDbkQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLHFCQUFxQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLHFCQUFxQixHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFFckcsSUFBSSxDQUFDLFlBQVksQ0FDYixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUN4RCxHQUFHLENBQ04sQ0FBQzthQUNMO1NBQ0o7YUFBTTtZQUNILDhFQUE4RTtZQUM5RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcclxuaW1wb3J0ICogYXMgTGludCBmcm9tIFwidHNsaW50XCI7XHJcbmltcG9ydCAqIGFzIGNoYW5nZUNhc2UgZnJvbSBcImNoYW5nZS1jYXNlXCI7XHJcblxyXG5jb25zdCBCQUNLSU5HX0ZJRUxEX1BSRUZJWCA9IFwiX1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJ1bGUgZXh0ZW5kcyBMaW50LlJ1bGVzLkFic3RyYWN0UnVsZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHVzYWdlRmFpbHVyZU1lc3NhZ2U6IHN0cmluZyA9IFwiQmFja2luZyBmaWVsZCBjYW4gb25seSBiZSB1c2VkIGluIGdldHRlciBhbmQgc2V0dGVyLlwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBhY2Nlc3NvckZhaWx1cmVNZXNzYWdlRmFjdG9yeShleHBlY3RlZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGBBY2Nlc3NvciBuYW1lIG11c3QgYmUgdGhlIHNhbWUgYXMgYSBiYWNraW5nIGZpZWxkLiBFeHBlY3RlZCBuYW1lIFwiJHtleHBlY3RlZE5hbWV9XCIuYDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHkoc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IExpbnQuUnVsZUZhaWx1cmVbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlXaXRoV2Fsa2VyKG5ldyBCYWNraW5nRmllbGRzV2Fsa2VyKHNvdXJjZUZpbGUsIHRoaXMuZ2V0T3B0aW9ucygpKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJhY2tpbmdGaWVsZHNXYWxrZXIgZXh0ZW5kcyBMaW50LlJ1bGVXYWxrZXIge1xyXG4gICAgcHJpdmF0ZSBjaGVja1Byb3BlcnR5UHJlZml4KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBuYW1lID09PSBCQUNLSU5HX0ZJRUxEX1BSRUZJWCArIGNoYW5nZUNhc2UuY2FtZWxDYXNlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlUHJlZml4KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKEJBQ0tJTkdfRklFTERfUFJFRklYLmxlbmd0aCwgbmFtZS5sZW5ndGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWNjZXNzb3JOYW1lRXF1YWxzKGFjY2Vzc29yTmFtZTogc3RyaW5nLCBiYWNraW5nRmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gQkFDS0lOR19GSUVMRF9QUkVGSVggKyBhY2Nlc3Nvck5hbWUgPT09IGJhY2tpbmdGaWVsZE5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc01lbWJlck9mQ2xhc3NEZWNsYXJhdGlvbihjbGFzc0RlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBjbGFzc0RlY2xhcmF0aW9uLm1lbWJlcnMpIHtcclxuICAgICAgICAgICAgLy8gUHJvcGVydHlcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG1lbWJlcikgJiZcclxuICAgICAgICAgICAgICAgIG1lbWJlci5tb2RpZmllcnMgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgbWVtYmVyLm1vZGlmaWVycy5maW5kSW5kZXgoeCA9PiB4LmtpbmQgPT09IHRzLlN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpICE9PSAtMSAmJlxyXG4gICAgICAgICAgICAgICAgbWVtYmVyLm5hbWUuZ2V0VGV4dCgpID09PSBuYW1lXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yIFBhcmFtZXRlciBQcm9wZXJ0eS5cclxuICAgICAgICAgICAgaWYgKHRzLmlzQ29uc3RydWN0b3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBtZW1iZXIucGFyYW1ldGVycykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLm1vZGlmaWVycyAhPSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5tb2RpZmllcnMuZmluZEluZGV4KHggPT4geC5raW5kID09PSB0cy5TeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSAhPT0gLTEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLm5hbWUuZ2V0VGV4dCgpID09PSBuYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aXNpdFNvdXJjZUZpbGUobm9kZTogdHMuU291cmNlRmlsZSk6IHZvaWQge1xyXG4gICAgICAgIC8vIFRoaXMgcnVsZSBzaG91bGQgb25seSB3b3JrIGluIHNvdXJjZSBmaWxlcy5cclxuICAgICAgICBpZiAoIW5vZGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcclxuICAgICAgICAgICAgc3VwZXIudmlzaXRTb3VyY2VGaWxlKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlzaXRQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZTogdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIudmlzaXRQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZSk7XHJcbiAgICAgICAgLy8gXCJ0aGlzLl9zb21ldGhpbmdcIlxyXG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24ua2luZCAhPT0gdHMuU3ludGF4S2luZC5UaGlzS2V5d29yZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuYW1lID0gbm9kZS5uYW1lLmdldFRleHQoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eVByZWZpeChuYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudFBhcmVudE5vZGU6IHRzLk5vZGUgfCB1bmRlZmluZWQgPSBub2RlLnBhcmVudDtcclxuICAgICAgICBsZXQgY2xhc3NEZWNsYXJhdGlvbjogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgYWNjZXNzb3I6IHRzLkdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCB0cy5TZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50Tm9kZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0cy5pc0dldEFjY2Vzc29yRGVjbGFyYXRpb24oY3VycmVudFBhcmVudE5vZGUpIHx8IHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihjdXJyZW50UGFyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgIGFjY2Vzc29yID0gY3VycmVudFBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oY3VycmVudFBhcmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uID0gY3VycmVudFBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudFBhcmVudE5vZGUgPSBjdXJyZW50UGFyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbiA9PSBudWxsIHx8ICF0aGlzLmlzTWVtYmVyT2ZDbGFzc0RlY2xhcmF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY2Nlc3NvciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjY2Vzc29yTmFtZU5vZGUgPSBhY2Nlc3Nvci5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBjYXNlZEFjY2Vzc29yTmFtZSA9IGNoYW5nZUNhc2UuY2FtZWxDYXNlKGFjY2Vzc29yTmFtZU5vZGUuZ2V0VGV4dCgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5hY2Nlc3Nvck5hbWVFcXVhbHMoY2FzZWRBY2Nlc3Nvck5hbWUsIG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZEFjY2Vzc29yTmFtZSA9IHRoaXMucmVtb3ZlUHJlZml4KG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzb3JOYW1lTm9kZVN0YXJ0ID0gYWNjZXNzb3JOYW1lTm9kZS5nZXRTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzb3JOYW1lTm9kZVdpZHRoID0gYWNjZXNzb3JOYW1lTm9kZS5nZXRXaWR0aCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZml4ID0gbmV3IExpbnQuUmVwbGFjZW1lbnQoYWNjZXNzb3JOYW1lTm9kZVN0YXJ0LCBhY2Nlc3Nvck5hbWVOb2RlV2lkdGgsIGV4cGVjdGVkQWNjZXNzb3JOYW1lKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZhaWx1cmVBdChcclxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nvck5hbWVOb2RlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JOYW1lTm9kZVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIFJ1bGUuYWNjZXNzb3JGYWlsdXJlTWVzc2FnZUZhY3RvcnkoZXhwZWN0ZWRBY2Nlc3Nvck5hbWUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpeFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEJhY2tpbmcgZmllbGQgY2FuIG9ubHkgYmUgdXNlZCBpbiBHZXRBY2Nlc3NvciBhbmQgU2V0QWNjZXNzb3IgZGVjbGFyYXRpb25zLlxyXG4gICAgICAgICAgICB0aGlzLmFkZEZhaWx1cmVBdE5vZGUobm9kZSwgUnVsZS51c2FnZUZhaWx1cmVNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19