如何使用tslint将黑名单导入特定文件

时间:2018-08-08 09:20:15

标签: angular tslint

TSLint是否支持将特定文件中的导入列入黑名单?如果是,我该如何配置?

1 个答案:

答案 0 :(得分:2)

我认为没有默认规则可以实现这一目标。但是TSLint可以使用自定义规则进行扩展。这是有关如何创建,包括和使用自定义规则https://palantir.github.io/tslint/develop/custom-rules/的很好的教程。

我们可以从现有import-blacklist规则开始并进行扩展。原始来源位于importBlacklistRule.ts

我们只需要扩展选项以包括文件名并检查文件名即可。这里是完整的清单:

import * as Path from "path";
import * as Lint from "tslint";
import { findImports, ImportKind } from "tsutils";
import * as TS from "typescript";

interface Options {
  imports: string[];
  files: string[];
}

export class Rule extends Lint.Rules.AbstractRule {
  public static FAILURE_STRING =
    "This import is blacklisted, import a submodule instead";

  public apply(sourceFile: TS.SourceFile): Lint.RuleFailure[] {
    return this.applyWithFunction(sourceFile, walk, this
      .ruleArguments[0] as Options);
  }
}

const walk = (ctx: Lint.WalkContext<Options>) => {
  if (ctx.options.files === undefined || ctx.options.imports === undefined) {
    return;
  }

  const fileName = Path.basename(ctx.sourceFile.fileName); // Strip off path
  if (ctx.options.files.indexOf(fileName) === -1) {
    // Could be extended to test for a regex.
    return;
  }

  for (const name of findImports(ctx.sourceFile, ImportKind.All)) {
    if (ctx.options.imports.indexOf(name.text) !== -1) {
      ctx.addFailure(
        name.getStart(ctx.sourceFile) + 1,
        name.end - 1,
        Rule.FAILURE_STRING
      );
    }
  }
};

在上面的示例中,我将import-blacklist规则简化为基本内容,并添加了文件名检查。

const fileName = Path.basename(ctx.sourceFile.fileName); // Strip off path
if (ctx.options.files.indexOf(fileName) === -1) {
    // Could be extended to test for a regex.
    return;
}

在此示例中,我们仅检查options.files中是否必须包含不带路径的文件名。您可以扩展此逻辑以检查正则表达式或满足您需求的任何东西。

在包含此规则的同时,您必须指定要检查的文件名和禁止的导入。

"custom-import-blacklist": [
  true,
  {
    "files": ["Index.ts"],
    "imports": ["xxx"]
  }
]