From 5a666d6285191d20eccff6030e1de29cc8a94bb1 Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Mon, 22 Jul 2024 10:28:22 +0800 Subject: [PATCH] feat(`prefer-await-to-then`): ignore constructor scope unless with `strict` option; fixes #436 --- __tests__/prefer-await-to-then.js | 18 ++++++++++++++++++ rules/lib/is-inside-callback.js | 4 ++-- rules/prefer-await-to-then.js | 15 ++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/__tests__/prefer-await-to-then.js b/__tests__/prefer-await-to-then.js index 2770c7b2..869039da 100644 --- a/__tests__/prefer-await-to-then.js +++ b/__tests__/prefer-await-to-then.js @@ -29,6 +29,11 @@ ruleTester.run('prefer-await-to-then', rule, { `function isThenable(obj) { return obj && typeof obj.then === 'function'; }`, + `class Foo { + constructor () { + doSomething.then(abc); + } + }`, ], invalid: [ @@ -65,6 +70,19 @@ ruleTester.run('prefer-await-to-then', rule, { }, ], }, + { + code: `class Foo { + constructor () { + doSomething.then(abc); + } + }`, + errors: [{ message }], + options: [ + { + strict: true, + }, + ], + }, { code: 'async function hi() { await thing().catch() }', errors: [{ message }], diff --git a/rules/lib/is-inside-callback.js b/rules/lib/is-inside-callback.js index fd915952..b1bb80e3 100644 --- a/rules/lib/is-inside-callback.js +++ b/rules/lib/is-inside-callback.js @@ -3,7 +3,7 @@ const isInsidePromise = require('./is-inside-promise') function isInsideCallback(node) { - const isCallExpression = + const isFunction = node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression' || node.type === 'FunctionDeclaration' // this may be controversial @@ -13,7 +13,7 @@ function isInsideCallback(node) { const name = node.params && node.params[0] && node.params[0].name const firstArgIsError = name === 'err' || name === 'error' - const isInACallback = isCallExpression && firstArgIsError + const isInACallback = isFunction && firstArgIsError return isInACallback } diff --git a/rules/prefer-await-to-then.js b/rules/prefer-await-to-then.js index 3c2fab76..fc70220e 100644 --- a/rules/prefer-await-to-then.js +++ b/rules/prefer-await-to-then.js @@ -40,6 +40,15 @@ module.exports = { }) } + /** Returns true if node is inside a constructor */ + function isInsideConstructor(node) { + return getAncestors(context, node).some((parent) => { + return ( + parent.type === 'MethodDefinition' && parent.kind === 'constructor' + ) + }) + } + /** * Returns true if node is created at the top-level scope. * Await statements are not allowed at the top level, @@ -53,7 +62,11 @@ module.exports = { return { 'CallExpression > MemberExpression.callee'(node) { - if (isTopLevelScoped(node) || (!strict && isInsideYieldOrAwait(node))) { + if ( + isTopLevelScoped(node) || + (!strict && isInsideYieldOrAwait(node)) || + (!strict && isInsideConstructor(node)) + ) { return }