我正在尝试创建一条tslint规则,以防止我们的测试人员提交包含.only
的测试/测试。
因此,如果他们尝试提交包含fixture.only
或test.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);
}
}
答案 0 :(得分:0)
此规则已在tslint-microsoft-contrib中以mocha-avoid-only
的形式存在。哇!
您要呼叫node.getStart()
,其中node
是CallExpression
,所以您得到的是describe.only(...)
的开头。
node.expression
是describe
node.name
是only
您要从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"
}
]
}
只需在Husky配置中引用此新的tslint文件即可。