Pur*_*ret 5 javascript abstract-syntax-tree eslint
这篇中等文章向我展示了如何防止await前面的属性:
"no-restricted-syntax": [
"error",
{
"message": "promise.then is unnecessary when using async/await",
"selector": "AwaitExpression[argument.callee.property.name=\" then\"]"
}
]
Run Code Online (Sandbox Code Playgroud)
但我想要相反,我想限制这些:
expect(screen.findByRole(...))....;
screen.findByRole(...);
Run Code Online (Sandbox Code Playgroud)
但允许这些:
expect(await screen.findByRole(...))....;
await screen.findByRole(...);
Run Code Online (Sandbox Code Playgroud)
我在测试文件的覆盖下尝试了这个:
expect(screen.findByRole(...))....;
screen.findByRole(...);
Run Code Online (Sandbox Code Playgroud)
但现在每一行都显示该错误。我也尝试将其放在*前面,希望它允许任何内容(*除非是后面跟着我禁止的语法表达式),但没有骰子。
我怎样才能做到这一点?
这个 AST 选择器似乎有效:
:not(AwaitExpression) > CallExpression[callee.property.name=/^findBy.*$/]
选择器查找调用以 开头的方法的非等待表达式的直接子级findBy...。
整个规则可能如下所示:
"no-restricted-syntax": [
"error",
{
"message": "findBy... queries must be preceded by an await",
"selector": ":not(AwaitExpression) > CallExpression[callee.property.name=/^findBy.*$/]"
}
]
Run Code Online (Sandbox Code Playgroud)
对于不是由对象调用的函数调用(例如,只是findByRole代替screen.findByRole),您可以省略property选择器中的嵌套属性,如下所示:
:not(AwaitExpression) > CallExpression[callee.name=/^findBy.*$/]
如果您想同时匹配独立函数和方法函数,您可以有两个单独的规则,或将它们与:matches(...)选择器结合起来。