diff --git a/build/lib/tslint/allowAsyncRule.js b/build/lib/tslint/allowAsyncRule.js new file mode 100644 index 00000000000..cad8e31c01d --- /dev/null +++ b/build/lib/tslint/allowAsyncRule.js @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +"use strict"; +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var ts = require("typescript"); +var Lint = require("tslint"); +var Rule = (function (_super) { + __extends(Rule, _super); + function Rule() { + return _super !== null && _super.apply(this, arguments) || this; + } + Rule.prototype.apply = function (sourceFile) { + var allowed = this.getOptions().ruleArguments[0]; + return this.applyWithWalker(new AsyncRuleWalker(sourceFile, this.getOptions(), allowed)); + }; + return Rule; +}(Lint.Rules.AbstractRule)); +exports.Rule = Rule; +var AsyncRuleWalker = (function (_super) { + __extends(AsyncRuleWalker, _super); + function AsyncRuleWalker(file, opts, allowed) { + var _this = _super.call(this, file, opts) || this; + _this.allowed = allowed; + return _this; + } + AsyncRuleWalker.prototype.visitMethodDeclaration = function (node) { + this.visitFunctionLikeDeclaration(node); + }; + AsyncRuleWalker.prototype.visitFunctionDeclaration = function (node) { + this.visitFunctionLikeDeclaration(node); + }; + AsyncRuleWalker.prototype.visitFunctionLikeDeclaration = function (node) { + var _this = this; + var flags = ts.getCombinedModifierFlags(node); + if (!(flags & ts.ModifierFlags.Async)) { + return; + } + var path = node.getSourceFile().path; + var pathParts = path.split(/\\|\//); + if (pathParts.some(function (part) { return _this.allowed.some(function (allowed) { return part === allowed; }); })) { + return; + } + var message = "You are not allowed to use async function in this layer. Allowed layers are: [" + this.allowed + "]"; + this.addFailure(this.createFailure(node.getStart(), node.getWidth(), message)); + }; + return AsyncRuleWalker; +}(Lint.RuleWalker)); diff --git a/build/lib/tslint/allowAsyncRule.ts b/build/lib/tslint/allowAsyncRule.ts new file mode 100644 index 00000000000..95e79516c2f --- /dev/null +++ b/build/lib/tslint/allowAsyncRule.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as ts from 'typescript'; +import * as Lint from 'tslint'; + +export class Rule extends Lint.Rules.AbstractRule { + public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { + const allowed = this.getOptions().ruleArguments[0] as string[]; + return this.applyWithWalker(new AsyncRuleWalker(sourceFile, this.getOptions(), allowed)); + } +} + +class AsyncRuleWalker extends Lint.RuleWalker { + + constructor(file: ts.SourceFile, opts: Lint.IOptions, private allowed: string[]) { + super(file, opts); + } + + protected visitMethodDeclaration(node: ts.MethodDeclaration): void { + this.visitFunctionLikeDeclaration(node); + } + + protected visitFunctionDeclaration(node: ts.FunctionDeclaration): void { + this.visitFunctionLikeDeclaration(node); + } + + private visitFunctionLikeDeclaration(node: ts.FunctionLikeDeclaration) { + const flags = ts.getCombinedModifierFlags(node); + + if (!(flags & ts.ModifierFlags.Async)) { + return; + } + + const path = node.getSourceFile().path; + const pathParts = path.split(/\\|\//); + + if (pathParts.some(part => this.allowed.some(allowed => part === allowed))) { + return; + } + + const message = `You are not allowed to use async function in this layer. Allowed layers are: [${this.allowed}]`; + this.addFailure(this.createFailure(node.getStart(), node.getWidth(), message)); + } +} diff --git a/tslint.json b/tslint.json index 084f4addff2..aae82a05a27 100644 --- a/tslint.json +++ b/tslint.json @@ -56,6 +56,15 @@ "restrictions": "**/vs/**" } ], - "duplicate-imports": true + "duplicate-imports": true, + "allow-async": [ + true, + [ + "node", + "electron-main", + "electron-browser", + "extensions" + ] + ] } -} +} \ No newline at end of file