修复tslint规则时从字符串中间删除文本

时间:2019-01-13 19:34:40

标签: typescript tslint

我正在尝试创建一条tslint规则,以防止我们的测试人员提交包含.only的测试/测试。

因此,如果他们尝试提交包含fixture.onlytest.only的文件,则提交将失败(提交时,我使用Husky + git hooks来执行tslint命令)。

我想出了如何创建规则(意味着提交失败),但是最好也自动删除此代码(修复提交)。

有办法吗? 我找不到如何仅从头开始从节点中间删除文本。

这是JS代码

import * as ts from 'typescript';
import * as Lint from 'tslint';
import { IOptions } from 'tslint';

export class Rule extends Lint.Rules.AbstractRule {
  public static FAILURE_STRING = "Something bad happened - you're not 
  following the rules";

  public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
     return this.applyWithWalker(new TestcafeNoOnly(sourceFile, 
        this.getOptions()));
  }
}

// This worker visits every source file
class TestcafeNoOnly extends Lint.RuleWalker {
   private readonly FAILURE_STRING = 'Testcafe no only';
   private readonly PROHIBITED = ['fixture.only', 'test.only'];
   private readonly REGEX = new RegExp('^(' + this.PROHIBITED.join('|') + ')$');

  constructor(sourceFile: ts.SourceFile, options: IOptions) {
     super(sourceFile, options);
  }

  public visitCallExpression(node: ts.CallExpression) {
     const match = 
     node.expression.getText().replace(/(\r\n\t|\n|\r\t|\s)/gm, '').trim().match(this.REGEX);

    if (match) {
       const fix = Lint.Replacement.deleteText(node.getStart(), 5);
       this.addFailureAt(node.getStart(), match[0].length, this.FAILURE_STRING, fix);
    }

   super.visitCallExpression(node);
 }
}

2 个答案:

答案 0 :(得分:0)

此规则已在tslint-microsoft-contrib中以mocha-avoid-only的形式存在。哇!

您要呼叫node.getStart(),其中nodeCallExpression,所以您得到的是describe.only(...)的开头。

  • node.expressiondescribe
  • node.nameonly

您要从node.expression的结尾删除(因此即使其中有空格,它也包含.node.name的结尾。像这样:

Lint.Replacement.deleteFromTo(node.name.end, node.expression.end);

答案 1 :(得分:0)

一种解决方案是将您当前的tslint.json复制到(例如)tslint-no-only.json

tslint-no-only.json中修改rules部分:

"rules": {
        ...
        "ban": [
            true,
            "eval",
            {
                "name": ["test", "only"],
                "message": "do not commit with test.only"
            },
            {
                "name": ["fixture", "only"],
                "message": "do not commit with fixture.only"
            }
        ]
    }

只需在Hus​​ky配置中引用此新的tslint文件即可。