Skip to content

Commit 29fddfd

Browse files
scottoharabradzacher
authored andcommitted
fix(eslint-plugin): [require-await] Allow concise arrow function bodies (typescript-eslint#826)
1 parent 6a30de2 commit 29fddfd

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

packages/eslint-plugin/src/rules/require-await.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ export default util.createRule<Options, MessageIds>({
6464

6565
case AST_NODE_TYPES.ArrowFunctionExpression:
6666
rules.ArrowFunctionExpression(node);
67+
68+
// If body type is not BlockStatment, we need to check the return type here
69+
if (node.body.type !== AST_NODE_TYPES.BlockStatement) {
70+
const expression = parserServices.esTreeNodeToTSNodeMap.get(
71+
node.body,
72+
);
73+
scopeInfo.returnsPromise = isThenableType(expression);
74+
}
75+
6776
break;
6877
}
6978
}
@@ -102,6 +111,18 @@ export default util.createRule<Options, MessageIds>({
102111
}
103112
}
104113

114+
/**
115+
* Checks if the node returns a thenable type
116+
*
117+
* @param {ASTNode} node - The node to check
118+
* @returns {boolean}
119+
*/
120+
function isThenableType(node: ts.Node) {
121+
const type = checker.getTypeAtLocation(node);
122+
123+
return tsutils.isThenableType(checker, node, type);
124+
}
125+
105126
return {
106127
'FunctionDeclaration[async = true]': enterFunction,
107128
'FunctionExpression[async = true]': enterFunction,
@@ -122,10 +143,7 @@ export default util.createRule<Options, MessageIds>({
122143
return;
123144
}
124145

125-
const type = checker.getTypeAtLocation(expression);
126-
if (tsutils.isThenableType(checker, expression, type)) {
127-
scopeInfo.returnsPromise = true;
128-
}
146+
scopeInfo.returnsPromise = isThenableType(expression);
129147
},
130148

131149
AwaitExpression: rules.AwaitExpression as TSESLint.RuleFunction<

packages/eslint-plugin/tests/rules/require-await.test.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@ ruleTester.run('require-await', rule, {
4141
}`,
4242
},
4343
{
44-
// Non-async arrow function expression
44+
// Non-async arrow function expression (concise-body)
4545
code: `const numberOne = (): number => 1;`,
4646
},
47+
{
48+
// Non-async arrow function expression (block-body)
49+
code: `const numberOne = (): number => {
50+
return 1;
51+
};`,
52+
},
4753
{
4854
// Async function declaration with await
4955
code: `async function numberOne(): Promise<number> {
@@ -57,9 +63,15 @@ ruleTester.run('require-await', rule, {
5763
}`,
5864
},
5965
{
60-
// Async arrow function expression with await
66+
// Async arrow function expression with await (concise-body)
6167
code: `const numberOne = async (): Promise<number> => await 1;`,
6268
},
69+
{
70+
// Async arrow function expression with await (block-body)
71+
code: `const numberOne = async (): Promise<number> => {
72+
return await 1;
73+
};`,
74+
},
6375
{
6476
// Async function declaration with promise return
6577
code: `async function numberOne(): Promise<number> {
@@ -72,6 +84,16 @@ ruleTester.run('require-await', rule, {
7284
return Promise.resolve(1);
7385
}`,
7486
},
87+
{
88+
// Async arrow function with promise return (concise-body)
89+
code: `const numberOne = async (): Promise<number> => Promise.resolve(1);`,
90+
},
91+
{
92+
// Async arrow function with promise return (block-body)
93+
code: `const numberOne = async (): Promise<number> => {
94+
return Promise.resolve(1);
95+
};`,
96+
},
7597
{
7698
// Async function declaration with async function return
7799
code: `async function numberOne(): Promise<number> {
@@ -90,6 +112,22 @@ ruleTester.run('require-await', rule, {
90112
return Promise.resolve(x);
91113
}`,
92114
},
115+
{
116+
// Async arrow function with async function return (concise-body)
117+
code: `const numberOne = async (): Promise<number> => getAsyncNumber(1);
118+
const getAsyncNumber = async function(x: number): Promise<number> {
119+
return Promise.resolve(x);
120+
}`,
121+
},
122+
{
123+
// Async arrow function with async function return (block-body)
124+
code: `const numberOne = async (): Promise<number> => {
125+
return getAsyncNumber(1);
126+
};
127+
const getAsyncNumber = async function(x: number): Promise<number> {
128+
return Promise.resolve(x);
129+
}`,
130+
},
93131
],
94132

95133
invalid: [

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy