使用 eslint no-restricted-syntax 防止 screen.findByX 不等待?

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)

但现在每一行都显示该错误。我也尝试将其放在*前面,希望它允许任何内容(*除非是后面跟着我禁止的语法表达式),但没有骰子。

我怎样才能做到这一点?

Ste*_*eve 2

这个 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(...)选择器结合起来。

试试看

您可以在 ESLint Playground 上尝试一下