From 728ba84b8c768d96b14558f6ed9efb81d40ebba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Bisson?= Date: Sun, 14 Jan 2024 17:26:31 +0100 Subject: [PATCH 01/18] Add `no-await-in-promise-methods` rule --- configs/recommended.js | 1 + docs/rules/no-await-in-promise-methods.md | 36 ++++++++++++ readme.md | 1 + rules/no-await-in-promise-methods.js | 65 +++++++++++++++++++++ rules/utils/is-promise-method-with-array.js | 13 +++++ test/no-await-in-promise-methods.mjs | 48 +++++++++++++++ 6 files changed, 164 insertions(+) create mode 100644 docs/rules/no-await-in-promise-methods.md create mode 100644 rules/no-await-in-promise-methods.js create mode 100644 rules/utils/is-promise-method-with-array.js create mode 100644 test/no-await-in-promise-methods.mjs diff --git a/configs/recommended.js b/configs/recommended.js index 67f99a8472..b4f4e8f9d6 100644 --- a/configs/recommended.js +++ b/configs/recommended.js @@ -21,6 +21,7 @@ module.exports = { 'unicorn/no-array-push-push': 'error', 'unicorn/no-array-reduce': 'error', 'unicorn/no-await-expression-member': 'error', + 'unicorn/no-await-in-promise-methods': 'error', 'unicorn/no-console-spaces': 'error', 'unicorn/no-document-cookie': 'error', 'unicorn/no-empty-file': 'error', diff --git a/docs/rules/no-await-in-promise-methods.md b/docs/rules/no-await-in-promise-methods.md new file mode 100644 index 0000000000..1c24d80cd6 --- /dev/null +++ b/docs/rules/no-await-in-promise-methods.md @@ -0,0 +1,36 @@ +# Disallow using `await` in `Promise` method parameters + +💼 This rule is enabled in the ✅ `recommended` [config](https://github.com/sindresorhus/eslint-plugin-unicorn#preset-configs). + +💡 This rule is manually fixable by [editor suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions). + + + + +Awaited parameters in a Promise.all(), Promise.allSettled(), Promise.any() or Promise.race() method is probably a mistake. + +## Fail + +```js +Promise.all([promise, await promise, await promise, promise]) + +Promise.allSettled([promise, await promise, await promise, promise]) + +Promise.any([promise, await promise, await promise, promise]) + +Promise.race([promise, await promise, await promise, promise]) +``` + +## Pass + +```js +Promise.all([promise, promise, promise, promise]) + +Promise.allSettled([promise, promise, promise, promise]) + +Promise.any([promise, promise, promise, promise]) + +Promise.race([promise, promise, promise, promise]) + +Promise.resolve([await promise]) +``` diff --git a/readme.md b/readme.md index 47c31feef5..e8194a8097 100644 --- a/readme.md +++ b/readme.md @@ -131,6 +131,7 @@ If you don't use the preset, ensure you use the same `env` and `parserOptions` c | [no-array-push-push](docs/rules/no-array-push-push.md) | Enforce combining multiple `Array#push()` into one call. | ✅ | 🔧 | 💡 | | [no-array-reduce](docs/rules/no-array-reduce.md) | Disallow `Array#reduce()` and `Array#reduceRight()`. | ✅ | | | | [no-await-expression-member](docs/rules/no-await-expression-member.md) | Disallow member access from await expression. | ✅ | 🔧 | | +| [no-await-in-promise-methods](docs/rules/no-await-in-promise-methods.md) | Disallow using `await` in `Promise` method parameters. | ✅ | | 💡 | | [no-console-spaces](docs/rules/no-console-spaces.md) | Do not use leading/trailing space between `console.log` parameters. | ✅ | 🔧 | | | [no-document-cookie](docs/rules/no-document-cookie.md) | Do not use `document.cookie` directly. | ✅ | | | | [no-empty-file](docs/rules/no-empty-file.md) | Disallow empty files. | ✅ | | | diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js new file mode 100644 index 0000000000..1ac4bb2167 --- /dev/null +++ b/rules/no-await-in-promise-methods.js @@ -0,0 +1,65 @@ +'use strict'; +const isPromiseMethodWithArray = require('./utils/is-promise-method-with-array.js'); + +const MESSAGE_ID_ERROR = 'no-await-in-promise-methods/error'; +const MESSAGE_ID_SUGGESTION = 'no-await-in-promise-methods/suggestion'; +const messages = { + [MESSAGE_ID_ERROR]: 'Parameters in `Promise.{{method}}` should not be awaited.', + [MESSAGE_ID_SUGGESTION]: 'Remove `await`.', +}; +const METHODS = ['all', 'allSettled', 'any', 'race']; + +const getArrayElements = node => node.arguments[0].elements; + +const getMethodName = node => node.callee.property.name; + +const getFixer = ({sourceCode}, awaitedElements) => function * (fixer) { + for (const awaitedElement of awaitedElements) { + const firstToken = sourceCode.getFirstToken(awaitedElement); + const secondToken = sourceCode.getTokenAfter(firstToken); + + yield fixer.removeRange([firstToken.range[0], secondToken.range[0]]); + } +}; + +/** @param {import('eslint').Rule.RuleContext} context */ +const create = context => ({ + CallExpression(node) { + if (!isPromiseMethodWithArray(node, METHODS)) { + return; + } + + const awaitedElements = getArrayElements(node).filter(element => element?.type === 'AwaitExpression'); + + if (awaitedElements.length === 0) { + return; + } + + context.report({ + node, + messageId: MESSAGE_ID_ERROR, + data: { + method: getMethodName(node), + }, + suggest: [ + { + messageId: MESSAGE_ID_SUGGESTION, + fix: getFixer(context, awaitedElements), + }, + ], + }); + }, +}); + +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + create, + meta: { + type: 'suggestion', + docs: { + description: 'Disallow using `await` in `Promise` method parameters.', + }, + hasSuggestions: true, + messages, + }, +}; diff --git a/rules/utils/is-promise-method-with-array.js b/rules/utils/is-promise-method-with-array.js new file mode 100644 index 0000000000..845f5b7bd1 --- /dev/null +++ b/rules/utils/is-promise-method-with-array.js @@ -0,0 +1,13 @@ +'use strict'; +const {isMethodCall} = require('../ast/index.js'); + +const isPromiseMethodWithArray = (node, methods) => + node.callee.type === 'MemberExpression' + && node.callee.object.type === 'Identifier' + && node.callee.object.name === 'Promise' + && isMethodCall(node, methods) + && node.arguments.length === 1 + && node.arguments[0].type === 'ArrayExpression' + && node.arguments[0].elements.some(element => element !== null); + +module.exports = isPromiseMethodWithArray; diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs new file mode 100644 index 0000000000..08fa878401 --- /dev/null +++ b/test/no-await-in-promise-methods.mjs @@ -0,0 +1,48 @@ +import {getTester} from './utils/test.mjs'; + +const {test} = getTester(import.meta); + +const createSuggestionError = output => [{ + messageId: 'no-await-in-promise-methods/error', + suggestions: [ + { + messageId: 'no-await-in-promise-methods/suggestion', + output, + }, + ], +}]; + +test({ + valid: [ + 'Promise.all([promise, promise, promise, promise])', + 'Promise.allSettled([promise, promise, promise, promise])', + 'Promise.any([promise, promise, promise, promise])', + 'Promise.race([promise, promise, promise, promise])', + 'Promise.resolve([await promise])', + 'Promise[all]([await promise])', + 'Promise.all([,])', + ], + + invalid: [ + { + code: 'Promise.all([promise, await promise, await promise, promise])', + suggestion: 'Promise.all([promise, promise, promise, promise])', + }, + { + code: 'Promise.all([, await promise])', + suggestion: 'Promise.all([, promise])', + }, + { + code: 'Promise.allSettled([promise, await promise, await promise, promise])', + suggestion: 'Promise.allSettled([promise, promise, promise, promise])', + }, + { + code: 'Promise.any([promise, await promise, await promise, promise])', + suggestion: 'Promise.any([promise, promise, promise, promise])', + }, + { + code: 'Promise.race([promise, await promise, await promise, promise])', + suggestion: 'Promise.race([promise, promise, promise, promise])', + }, + ].map(({code, suggestion}) => ({code, errors: createSuggestionError(suggestion)})), +}); From 5161d7b20ad84b44c32f18b517151a07c990deb3 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:00:00 +0800 Subject: [PATCH 02/18] Use snapshot test --- test/no-await-in-promise-methods.mjs | 39 ++----- .../no-await-in-promise-methods.mjs.md | 100 ++++++++++++++++++ .../no-await-in-promise-methods.mjs.snap | Bin 0 -> 464 bytes 3 files changed, 107 insertions(+), 32 deletions(-) create mode 100644 test/snapshots/no-await-in-promise-methods.mjs.md create mode 100644 test/snapshots/no-await-in-promise-methods.mjs.snap diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index 08fa878401..623920dd0c 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -2,17 +2,7 @@ import {getTester} from './utils/test.mjs'; const {test} = getTester(import.meta); -const createSuggestionError = output => [{ - messageId: 'no-await-in-promise-methods/error', - suggestions: [ - { - messageId: 'no-await-in-promise-methods/suggestion', - output, - }, - ], -}]; - -test({ +test.snapshot({ valid: [ 'Promise.all([promise, promise, promise, promise])', 'Promise.allSettled([promise, promise, promise, promise])', @@ -24,25 +14,10 @@ test({ ], invalid: [ - { - code: 'Promise.all([promise, await promise, await promise, promise])', - suggestion: 'Promise.all([promise, promise, promise, promise])', - }, - { - code: 'Promise.all([, await promise])', - suggestion: 'Promise.all([, promise])', - }, - { - code: 'Promise.allSettled([promise, await promise, await promise, promise])', - suggestion: 'Promise.allSettled([promise, promise, promise, promise])', - }, - { - code: 'Promise.any([promise, await promise, await promise, promise])', - suggestion: 'Promise.any([promise, promise, promise, promise])', - }, - { - code: 'Promise.race([promise, await promise, await promise, promise])', - suggestion: 'Promise.race([promise, promise, promise, promise])', - }, - ].map(({code, suggestion}) => ({code, errors: createSuggestionError(suggestion)})), + 'Promise.all([promise, await promise, await promise, promise])', + 'Promise.all([, await promise])', + 'Promise.allSettled([promise, await promise, await promise, promise])', + 'Promise.any([promise, await promise, await promise, promise])', + 'Promise.race([promise, await promise, await promise, promise])', + ], }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md new file mode 100644 index 0000000000..3c691ef490 --- /dev/null +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -0,0 +1,100 @@ +# Snapshot report for `test/no-await-in-promise-methods.mjs` + +The actual snapshot is saved in `no-await-in-promise-methods.mjs.snap`. + +Generated by [AVA](https://avajs.dev). + +## invalid(1): Promise.all([promise, await promise, await promise, promise]) + +> Input + + `␊ + 1 | Promise.all([promise, await promise, await promise, promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.all([promise, await promise, await promise, promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([promise, promise, promise, promise])␊ + ` + +## invalid(2): Promise.all([, await promise]) + +> Input + + `␊ + 1 | Promise.all([, await promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.all([, await promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([, promise])␊ + ` + +## invalid(3): Promise.allSettled([promise, await promise, await promise, promise]) + +> Input + + `␊ + 1 | Promise.allSettled([promise, await promise, await promise, promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.allSettled([promise, await promise, await promise, promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.allSettled([promise, promise, promise, promise])␊ + ` + +## invalid(4): Promise.any([promise, await promise, await promise, promise]) + +> Input + + `␊ + 1 | Promise.any([promise, await promise, await promise, promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.any([promise, await promise, await promise, promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.any([promise, promise, promise, promise])␊ + ` + +## invalid(5): Promise.race([promise, await promise, await promise, promise]) + +> Input + + `␊ + 1 | Promise.race([promise, await promise, await promise, promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.race([promise, await promise, await promise, promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.race([promise, promise, promise, promise])␊ + ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap new file mode 100644 index 0000000000000000000000000000000000000000..e86f25ae2b9b4d0c990b4690808932847bb55ff4 GIT binary patch literal 464 zcmV;>0WbbRRzVdtKKnqP2~{xfJAK^espO<9+d|3V$aRS#*R}P`W@cR3jm&noYysFX zSWd)3M(W70!n?kj$lPT8u+CaDYn`Sb1OPCAhh++?#3LP4=t-a)oRA?0WLx;m1uhiS zabg4Af@K|~Tvp9*wNNT5IM|1F2`;fCdI-*^q*M4ZmAQ{u6141j!W(xEh}sK?I*Jk% znRXH~MGcwVBy+JYiA?NhOl&1G5%07}=>Im=MZ&8F;T`MY)leyhZW>$RR*U!|?$lT- z5rj7lgkb^*=6WgYi0`4A+FNC|;uADk9J5nY4711ke{hOSM2t?6k!l|-ic8dHx^rVN$R*j@9e8e3XftRnOJ30EI&WnmmX G3jhEP=hA}! literal 0 HcmV?d00001 From d91eb235e02b65b1862c9aa3d3e6a3f7b7216f28 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:02:06 +0800 Subject: [PATCH 03/18] Better names --- test/no-await-in-promise-methods.mjs | 16 +++---- .../no-await-in-promise-methods.mjs.md | 40 +++++++++--------- .../no-await-in-promise-methods.mjs.snap | Bin 464 -> 483 bytes 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index 623920dd0c..fc99a926a4 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -4,20 +4,20 @@ const {test} = getTester(import.meta); test.snapshot({ valid: [ - 'Promise.all([promise, promise, promise, promise])', - 'Promise.allSettled([promise, promise, promise, promise])', - 'Promise.any([promise, promise, promise, promise])', - 'Promise.race([promise, promise, promise, promise])', + 'Promise.all([promise1, promise2, promise3, promise4])', + 'Promise.allSettled([promise1, promise2, promise3, promise4])', + 'Promise.any([promise1, promise2, promise3, promise4])', + 'Promise.race([promise1, promise2, promise3, promise4])', 'Promise.resolve([await promise])', 'Promise[all]([await promise])', 'Promise.all([,])', ], invalid: [ - 'Promise.all([promise, await promise, await promise, promise])', + 'Promise.all([promise1, await promise2, await promise3, promise4])', 'Promise.all([, await promise])', - 'Promise.allSettled([promise, await promise, await promise, promise])', - 'Promise.any([promise, await promise, await promise, promise])', - 'Promise.race([promise, await promise, await promise, promise])', + 'Promise.allSettled([promise1, await promise2, await promise3, promise4])', + 'Promise.any([promise1, await promise2, await promise3, promise4])', + 'Promise.race([promise1, await promise2, await promise4, promise4])', ], }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index 3c691ef490..dece3001bc 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -4,23 +4,23 @@ The actual snapshot is saved in `no-await-in-promise-methods.mjs.snap`. Generated by [AVA](https://avajs.dev). -## invalid(1): Promise.all([promise, await promise, await promise, promise]) +## invalid(1): Promise.all([promise1, await promise2, await promise3, promise4]) > Input `␊ - 1 | Promise.all([promise, await promise, await promise, promise])␊ + 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ ` > Error 1/1 `␊ - > 1 | Promise.all([promise, await promise, await promise, promise])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([promise, promise, promise, promise])␊ + 1 | Promise.all([promise1, promise2, promise3, promise4])␊ ` ## invalid(2): Promise.all([, await promise]) @@ -42,59 +42,59 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.all([, promise])␊ ` -## invalid(3): Promise.allSettled([promise, await promise, await promise, promise]) +## invalid(3): Promise.allSettled([promise1, await promise2, await promise3, promise4]) > Input `␊ - 1 | Promise.allSettled([promise, await promise, await promise, promise])␊ + 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ ` > Error 1/1 `␊ - > 1 | Promise.allSettled([promise, await promise, await promise, promise])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + > 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.allSettled([promise, promise, promise, promise])␊ + 1 | Promise.allSettled([promise1, promise2, promise3, promise4])␊ ` -## invalid(4): Promise.any([promise, await promise, await promise, promise]) +## invalid(4): Promise.any([promise1, await promise2, await promise3, promise4]) > Input `␊ - 1 | Promise.any([promise, await promise, await promise, promise])␊ + 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ ` > Error 1/1 `␊ - > 1 | Promise.any([promise, await promise, await promise, promise])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + > 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.any([promise, promise, promise, promise])␊ + 1 | Promise.any([promise1, promise2, promise3, promise4])␊ ` -## invalid(5): Promise.race([promise, await promise, await promise, promise]) +## invalid(5): Promise.race([promise1, await promise2, await promise4, promise4]) > Input `␊ - 1 | Promise.race([promise, await promise, await promise, promise])␊ + 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ ` > Error 1/1 `␊ - > 1 | Promise.race([promise, await promise, await promise, promise])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + > 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.race([promise, promise, promise, promise])␊ + 1 | Promise.race([promise1, promise2, promise4, promise4])␊ ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index e86f25ae2b9b4d0c990b4690808932847bb55ff4..4a6d9671ea78e247f9af9af5b5bb3030eac5b048 100644 GIT binary patch literal 483 zcmV<90UZ88RzVc~XN=>9#A9wi?`1=Q98F|G&(<-#005J&5rHOCl+LIwx#^C~>n^ zt_)R=cZt9SL}~W6H!G|>phrX`%>3plz=Bb7Arn*7#1vOpuPqFqi|P z!~4_)#w9fIY#8hoO!F}1XV&`dHWrd_2G)^PhD+S#0}Rfmq*GX)(88`IsgP68UZoo(vEgyRdA3It;qMcR=|KBE?k60EB@5&Faq=r|+Qc~=u zwJ91(%+=_$iS)EUyeUAuYJf&%+Q$(YOJ>txwM9@+4ZPF7r@SSKsC z*l(XKHe6rWRMTQocHvWY9H7iYExd9d_HxYX3T9`apNOxd0WbbRRzVdtKKnqP2~{xfJAK^espO<9+d|3V$aRS#*R}P`W@cR3jm&noYysFX zSWd)3M(W70!n?kj$lPT8u+CaDYn`Sb1OPCAhh++?#3LP4=t-a)oRA?0WLx;m1uhiS zabg4Af@K|~Tvp9*wNNT5IM|1F2`;fCdI-*^q*M4ZmAQ{u6141j!W(xEh}sK?I*Jk% znRXH~MGcwVBy+JYiA?NhOl&1G5%07}=>Im=MZ&8F;T`MY)leyhZW>$RR*U!|?$lT- z5rj7lgkb^*=6WgYi0`4A+FNC|;uADk9J5nY4711ke{hOSM2t?6k!l|-ic8dHx^rVN$R*j@9e8e3XftRnOJ30EI&WnmmX G3jhEP=hA}! From d7d4dccd4cf1bea0f229bd6a59c9e7fb1defa0c2 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:07:53 +0800 Subject: [PATCH 04/18] Report problems ONE by ONE --- rules/no-await-in-promise-methods.js | 54 ++++++-------- .../no-await-in-promise-methods.mjs.md | 70 ++++++++++++++---- .../no-await-in-promise-methods.mjs.snap | Bin 483 -> 549 bytes 3 files changed, 80 insertions(+), 44 deletions(-) diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js index 1ac4bb2167..19ec23e57a 100644 --- a/rules/no-await-in-promise-methods.js +++ b/rules/no-await-in-promise-methods.js @@ -9,45 +9,37 @@ const messages = { }; const METHODS = ['all', 'allSettled', 'any', 'race']; -const getArrayElements = node => node.arguments[0].elements; - -const getMethodName = node => node.callee.property.name; - -const getFixer = ({sourceCode}, awaitedElements) => function * (fixer) { - for (const awaitedElement of awaitedElements) { - const firstToken = sourceCode.getFirstToken(awaitedElement); - const secondToken = sourceCode.getTokenAfter(firstToken); - - yield fixer.removeRange([firstToken.range[0], secondToken.range[0]]); - } -}; - /** @param {import('eslint').Rule.RuleContext} context */ const create = context => ({ - CallExpression(node) { + * CallExpression(node) { if (!isPromiseMethodWithArray(node, METHODS)) { return; } - const awaitedElements = getArrayElements(node).filter(element => element?.type === 'AwaitExpression'); + for (const element of node.arguments[0].elements) { + if (element?.type !== 'AwaitExpression') { + continue; + } - if (awaitedElements.length === 0) { - return; - } - - context.report({ - node, - messageId: MESSAGE_ID_ERROR, - data: { - method: getMethodName(node), - }, - suggest: [ - { - messageId: MESSAGE_ID_SUGGESTION, - fix: getFixer(context, awaitedElements), + yield { + node: element, + messageId: MESSAGE_ID_ERROR, + data: { + method: node.callee.property.name, }, - ], - }); + suggest: [ + { + messageId: MESSAGE_ID_SUGGESTION, + * fix(fixer) { + const firstToken = context.sourceCode.getFirstToken(element); + const secondToken = context.sourceCode.getTokenAfter(firstToken); + + yield fixer.removeRange([firstToken.range[0], secondToken.range[0]]); + }, + }, + ], + }; + } }, }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index dece3001bc..f66c46005a 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -12,15 +12,26 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ ` -> Error 1/1 +> Error 1/2 + + `␊ + > 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([promise1, promise2, await promise3, promise4])␊ + ` + +> Error 2/2 `␊ > 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([promise1, promise2, promise3, promise4])␊ + 1 | Promise.all([promise1, await promise2, promise3, promise4])␊ ` ## invalid(2): Promise.all([, await promise]) @@ -35,7 +46,7 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.all([, await promise])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ @@ -50,15 +61,26 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ ` -> Error 1/1 +> Error 1/2 + + `␊ + > 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.allSettled([promise1, promise2, await promise3, promise4])␊ + ` + +> Error 2/2 `␊ > 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.allSettled([promise1, promise2, promise3, promise4])␊ + 1 | Promise.allSettled([promise1, await promise2, promise3, promise4])␊ ` ## invalid(4): Promise.any([promise1, await promise2, await promise3, promise4]) @@ -69,15 +91,26 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ ` -> Error 1/1 +> Error 1/2 + + `␊ + > 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.any([promise1, promise2, await promise3, promise4])␊ + ` + +> Error 2/2 `␊ > 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.any([promise1, promise2, promise3, promise4])␊ + 1 | Promise.any([promise1, await promise2, promise3, promise4])␊ ` ## invalid(5): Promise.race([promise1, await promise2, await promise4, promise4]) @@ -88,13 +121,24 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ ` -> Error 1/1 +> Error 1/2 + + `␊ + > 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.race([promise1, promise2, await promise4, promise4])␊ + ` + +> Error 2/2 `␊ > 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + | ^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.race([promise1, promise2, promise4, promise4])␊ + 1 | Promise.race([promise1, await promise2, promise4, promise4])␊ ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index 4a6d9671ea78e247f9af9af5b5bb3030eac5b048..24d11b6cb4f00e6636de6612ffeecd9d086bfcb9 100644 GIT binary patch literal 549 zcmV+=0^0pSRzVXnvYYq=`0?-p897bowaZV?!ugpW7m^x~jHO9@izNR6LiZ|Pl-N>M# zJCXfpP6Cjj7hXuh6qPZ>IlbB9L#f+n-LAEDAC*q$BnAM`g9%j<3i8N64a~7&0?|RW ziK}4NSc__)GY(}u6vSFml8)zGQlV9?Vv`f5gPfAHaD^MJjY0jDRFnP`rszL8GYn>c zoKh?X&jJIwBnE5G#M!97nJ6j6%J`9$amAT&$Hn#lzm5W&5dwVZ^-R|-p6NUgoU!NW z4EIf**w=$@!qu>GoMa2#wS_J%qAOs|Dc0sSrAq?jy!*AG^gQkGA=shgVTW*%Xr@JOW-(vW1$39*U0qv= zjald-w-^R%&m>gFFRhH9*fMUQ3J#1S;~(;(5b|@!ugtFGnQ|sLOm#Xegqpv_f_Z8n nzp|!s_GStO?xep69GXkxumM~qq}_*$l2U#EYAAOAq!9oBU%v!A literal 483 zcmV<90UZ88RzVc~XN=>9#A9wi?`1=Q98F|G&(<-#005J&5rHOCl+LIwx#^C~>n^ zt_)R=cZt9SL}~W6H!G|>phrX`%>3plz=Bb7Arn*7#1vOpuPqFqi|P z!~4_)#w9fIY#8hoO!F}1XV&`dHWrd_2G)^PhD+S#0}Rfmq*GX)(88`IsgP68UZoo(vEgyRdA3It;qMcR=|KBE?k60EB@5&Faq=r|+Qc~=u zwJ91(%+=_$iS)EUyeUAuYJf&%+Q$(YOJ>txwM9@+4ZPF7r@SSKsC z*l(XKHe6rWRMTQocHvWY9H7iYExd9d_HxYX3T9`apNOxd Date: Sun, 28 Jan 2024 05:09:38 +0800 Subject: [PATCH 05/18] Remove meaningless check --- rules/utils/is-promise-method-with-array.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rules/utils/is-promise-method-with-array.js b/rules/utils/is-promise-method-with-array.js index 845f5b7bd1..659ca74680 100644 --- a/rules/utils/is-promise-method-with-array.js +++ b/rules/utils/is-promise-method-with-array.js @@ -7,7 +7,6 @@ const isPromiseMethodWithArray = (node, methods) => && node.callee.object.name === 'Promise' && isMethodCall(node, methods) && node.arguments.length === 1 - && node.arguments[0].type === 'ArrayExpression' - && node.arguments[0].elements.some(element => element !== null); + && node.arguments[0].type === 'ArrayExpression'; module.exports = isPromiseMethodWithArray; From ec860c7e7b7e5e1e0890ae48ef839e6c06c9cd9a Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:13:37 +0800 Subject: [PATCH 06/18] Correct use of `isPromiseMethodWithArray` --- rules/utils/is-promise-method-with-array.js | 12 +++++++----- test/no-await-in-promise-methods.mjs | 6 +++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/rules/utils/is-promise-method-with-array.js b/rules/utils/is-promise-method-with-array.js index 659ca74680..3416d2253c 100644 --- a/rules/utils/is-promise-method-with-array.js +++ b/rules/utils/is-promise-method-with-array.js @@ -2,11 +2,13 @@ const {isMethodCall} = require('../ast/index.js'); const isPromiseMethodWithArray = (node, methods) => - node.callee.type === 'MemberExpression' - && node.callee.object.type === 'Identifier' - && node.callee.object.name === 'Promise' - && isMethodCall(node, methods) - && node.arguments.length === 1 + isMethodCall(node, { + object: 'Promise', + methods, + optionalMember: false, + optionalCall: false, + argumentsLength: 1, + }) && node.arguments[0].type === 'ArrayExpression'; module.exports = isPromiseMethodWithArray; diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index fc99a926a4..646b68580e 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -9,8 +9,12 @@ test.snapshot({ 'Promise.any([promise1, promise2, promise3, promise4])', 'Promise.race([promise1, promise2, promise3, promise4])', 'Promise.resolve([await promise])', - 'Promise[all]([await promise])', 'Promise.all([,])', + 'Promise[all]([await promise])', + 'Promise.all?.([await promise])', + 'Promise?.all([await promise])', + 'Promise.notListedMethod([await promise])', + 'NotPromise.all([await promise])', ], invalid: [ From 450847c93088555c634b643eca3bb4feca81a86f Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:16:35 +0800 Subject: [PATCH 07/18] Rewrite tests --- test/no-await-in-promise-methods.mjs | 12 +- .../no-await-in-promise-methods.mjs.md | 117 ++++++++++-------- .../no-await-in-promise-methods.mjs.snap | Bin 549 -> 540 bytes 3 files changed, 72 insertions(+), 57 deletions(-) diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index 646b68580e..d48f431ebb 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -16,12 +16,14 @@ test.snapshot({ 'Promise.notListedMethod([await promise])', 'NotPromise.all([await promise])', ], - invalid: [ - 'Promise.all([promise1, await promise2, await promise3, promise4])', + 'Promise.all([await promise])', + 'Promise.allSettled([await promise])', + 'Promise.any([await promise])', + 'Promise.race([await promise])', 'Promise.all([, await promise])', - 'Promise.allSettled([promise1, await promise2, await promise3, promise4])', - 'Promise.any([promise1, await promise2, await promise3, promise4])', - 'Promise.race([promise1, await promise2, await promise4, promise4])', + 'Promise.all([, await promise,])', + 'Promise.all([, await promise],)', + 'Promise.all([, await (0, promise)],)', ], }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index f66c46005a..2bac2c7c3f 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -4,141 +4,154 @@ The actual snapshot is saved in `no-await-in-promise-methods.mjs.snap`. Generated by [AVA](https://avajs.dev). -## invalid(1): Promise.all([promise1, await promise2, await promise3, promise4]) +## invalid(1): Promise.all([await promise]) > Input `␊ - 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ + 1 | Promise.all([await promise])␊ ` -> Error 1/2 - - `␊ - > 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([promise1, promise2, await promise3, promise4])␊ - ` - -> Error 2/2 +> Error 1/1 `␊ - > 1 | Promise.all([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.all([await promise])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([promise1, await promise2, promise3, promise4])␊ + 1 | Promise.all([promise])␊ ` -## invalid(2): Promise.all([, await promise]) +## invalid(2): Promise.allSettled([await promise]) > Input `␊ - 1 | Promise.all([, await promise])␊ + 1 | Promise.allSettled([await promise])␊ ` > Error 1/1 `␊ - > 1 | Promise.all([, await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.allSettled([await promise])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([, promise])␊ + 1 | Promise.allSettled([promise])␊ ` -## invalid(3): Promise.allSettled([promise1, await promise2, await promise3, promise4]) +## invalid(3): Promise.any([await promise]) > Input `␊ - 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ + 1 | Promise.any([await promise])␊ ` -> Error 1/2 +> Error 1/1 `␊ - > 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + > 1 | Promise.any([await promise])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.allSettled([promise1, promise2, await promise3, promise4])␊ + 1 | Promise.any([promise])␊ + ` + +## invalid(4): Promise.race([await promise]) + +> Input + + `␊ + 1 | Promise.race([await promise])␊ ` -> Error 2/2 +> Error 1/1 `␊ - > 1 | Promise.allSettled([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + > 1 | Promise.race([await promise])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.allSettled([promise1, await promise2, promise3, promise4])␊ + 1 | Promise.race([promise])␊ ` -## invalid(4): Promise.any([promise1, await promise2, await promise3, promise4]) +## invalid(5): Promise.all([, await promise]) > Input `␊ - 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ + 1 | Promise.all([, await promise])␊ ` -> Error 1/2 +> Error 1/1 `␊ - > 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + > 1 | Promise.all([, await promise])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.any([promise1, promise2, await promise3, promise4])␊ + 1 | Promise.all([, promise])␊ ` -> Error 2/2 +## invalid(6): Promise.all([, await promise,]) + +> Input + + `␊ + 1 | Promise.all([, await promise,])␊ + ` + +> Error 1/1 `␊ - > 1 | Promise.any([promise1, await promise2, await promise3, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + > 1 | Promise.all([, await promise,])␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.any([promise1, await promise2, promise3, promise4])␊ + 1 | Promise.all([, promise,])␊ ` -## invalid(5): Promise.race([promise1, await promise2, await promise4, promise4]) +## invalid(7): Promise.all([, await promise],) > Input `␊ - 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ + 1 | Promise.all([, await promise],)␊ ` -> Error 1/2 +> Error 1/1 `␊ - > 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + > 1 | Promise.all([, await promise],)␊ + | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.race([promise1, promise2, await promise4, promise4])␊ + 1 | Promise.all([, promise],)␊ + ` + +## invalid(8): Promise.all([, await (0, promise)],) + +> Input + + `␊ + 1 | Promise.all([, await (0, promise)],)␊ ` -> Error 2/2 +> Error 1/1 `␊ - > 1 | Promise.race([promise1, await promise2, await promise4, promise4])␊ - | ^^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + > 1 | Promise.all([, await (0, promise)],)␊ + | ^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.race([promise1, await promise2, promise4, promise4])␊ + 1 | Promise.all([, (0, promise)],)␊ ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index 24d11b6cb4f00e6636de6612ffeecd9d086bfcb9..edadfca4a7ecafacfc7bbc4eff4ee03584171dcf 100644 GIT binary patch literal 540 zcmV+%0^|KbRzVAlPT@DuC7x_uXFRUM9f+7h1g1bO9RM4XJkWT zf>xPe7e=Eg`<0vcsy8#2h-+uz9RPq1DC^$4;F4Oj&Lp#J;09DYu?pBvW>e^3m=dZC zdTFMoHSJ)+ODi{PHD*h08j#IoOK`>NW{W|k_mh=0c3}Ra;^&rSTF%#9u#5|qQ^Cqi zO2PC9Zl{Xde(*7drBFWQUof|c@D0r&ia*5sN>8)tVE5s)gIUabX^r;pXAx{&G0)9dDJG#o7Df)zYq7JXn5#PW*Rw(kMZ2uil5kS+Sj@DMh6kUdTBNO4fBNO9uQnSGKePlttLznMl7+>;m5K5tjCB=}8GW4}j e$O8p(VcKrmFWh!$H4gdgwKM6tr literal 549 zcmV+=0^0pSRzVXnvYYq=`0?-p897bowaZV?!ugpW7m^x~jHO9@izNR6LiZ|Pl-N>M# zJCXfpP6Cjj7hXuh6qPZ>IlbB9L#f+n-LAEDAC*q$BnAM`g9%j<3i8N64a~7&0?|RW ziK}4NSc__)GY(}u6vSFml8)zGQlV9?Vv`f5gPfAHaD^MJjY0jDRFnP`rszL8GYn>c zoKh?X&jJIwBnE5G#M!97nJ6j6%J`9$amAT&$Hn#lzm5W&5dwVZ^-R|-p6NUgoU!NW z4EIf**w=$@!qu>GoMa2#wS_J%qAOs|Dc0sSrAq?jy!*AG^gQkGA=shgVTW*%Xr@JOW-(vW1$39*U0qv= zjald-w-^R%&m>gFFRhH9*fMUQ3J#1S;~(;(5b|@!ugtFGnQ|sLOm#Xegqpv_f_Z8n nzp|!s_GStO?xep69GXkxumM~qq}_*$l2U#EYAAOAq!9oBU%v!A From e2f107278be717672027b6d6d97d9931d8a1a8e4 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:23:13 +0800 Subject: [PATCH 08/18] More tests, simplify logic, update message --- rules/no-await-in-promise-methods.js | 11 +-- test/no-await-in-promise-methods.mjs | 9 +- .../no-await-in-promise-methods.mjs.md | 89 ++++++++++++++---- .../no-await-in-promise-methods.mjs.snap | Bin 540 -> 641 bytes 4 files changed, 80 insertions(+), 29 deletions(-) diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js index 19ec23e57a..719636d216 100644 --- a/rules/no-await-in-promise-methods.js +++ b/rules/no-await-in-promise-methods.js @@ -4,7 +4,7 @@ const isPromiseMethodWithArray = require('./utils/is-promise-method-with-array.j const MESSAGE_ID_ERROR = 'no-await-in-promise-methods/error'; const MESSAGE_ID_SUGGESTION = 'no-await-in-promise-methods/suggestion'; const messages = { - [MESSAGE_ID_ERROR]: 'Parameters in `Promise.{{method}}` should not be awaited.', + [MESSAGE_ID_ERROR]: 'Promise in `Promise.{{method}}()` should not be awaited.', [MESSAGE_ID_SUGGESTION]: 'Remove `await`.', }; const METHODS = ['all', 'allSettled', 'any', 'race']; @@ -30,11 +30,10 @@ const create = context => ({ suggest: [ { messageId: MESSAGE_ID_SUGGESTION, - * fix(fixer) { - const firstToken = context.sourceCode.getFirstToken(element); - const secondToken = context.sourceCode.getTokenAfter(firstToken); - - yield fixer.removeRange([firstToken.range[0], secondToken.range[0]]); + fix(fixer) { + const awaitToken = context.sourceCode.getFirstToken(element); + const secondToken = context.sourceCode.getTokenAfter(awaitToken); + return fixer.removeRange([awaitToken.range[0], secondToken.range[0]]); }, }, ], diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index d48f431ebb..b5498b0f3a 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -15,6 +15,7 @@ test.snapshot({ 'Promise?.all([await promise])', 'Promise.notListedMethod([await promise])', 'NotPromise.all([await promise])', + 'Promise.all([(await promise, 0)])', ], invalid: [ 'Promise.all([await promise])', @@ -22,8 +23,10 @@ test.snapshot({ 'Promise.any([await promise])', 'Promise.race([await promise])', 'Promise.all([, await promise])', - 'Promise.all([, await promise,])', - 'Promise.all([, await promise],)', - 'Promise.all([, await (0, promise)],)', + 'Promise.all([await promise,])', + 'Promise.all([await promise],)', + 'Promise.all([await (0, promise)],)', + 'Promise.all([await await promise])', + 'Promise.all([...foo, await promise1, await promise2])', ], }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index 2bac2c7c3f..c7966da760 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -16,7 +16,7 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.all([await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ @@ -35,7 +35,7 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.allSettled([await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.allSettled\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.allSettled()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ @@ -54,7 +54,7 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.any([await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.any\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.any()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ @@ -73,7 +73,7 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.race([await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.race\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.race()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ @@ -92,66 +92,115 @@ Generated by [AVA](https://avajs.dev). `␊ > 1 | Promise.all([, await promise])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ 1 | Promise.all([, promise])␊ ` -## invalid(6): Promise.all([, await promise,]) +## invalid(6): Promise.all([await promise,]) > Input `␊ - 1 | Promise.all([, await promise,])␊ + 1 | Promise.all([await promise,])␊ ` > Error 1/1 `␊ - > 1 | Promise.all([, await promise,])␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.all([await promise,])␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([, promise,])␊ + 1 | Promise.all([promise,])␊ ` -## invalid(7): Promise.all([, await promise],) +## invalid(7): Promise.all([await promise],) > Input `␊ - 1 | Promise.all([, await promise],)␊ + 1 | Promise.all([await promise],)␊ ` > Error 1/1 `␊ - > 1 | Promise.all([, await promise],)␊ - | ^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.all([await promise],)␊ + | ^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([, promise],)␊ + 1 | Promise.all([promise],)␊ ` -## invalid(8): Promise.all([, await (0, promise)],) +## invalid(8): Promise.all([await (0, promise)],) > Input `␊ - 1 | Promise.all([, await (0, promise)],)␊ + 1 | Promise.all([await (0, promise)],)␊ ` > Error 1/1 `␊ - > 1 | Promise.all([, await (0, promise)],)␊ - | ^^^^^^^^^^^^^^^^^^ Parameters in \`Promise.all\` should not be awaited.␊ + > 1 | Promise.all([await (0, promise)],)␊ + | ^^^^^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([, (0, promise)],)␊ + 1 | Promise.all([(0, promise)],)␊ + ` + +## invalid(9): Promise.all([await await promise]) + +> Input + + `␊ + 1 | Promise.all([await await promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.all([await await promise])␊ + | ^^^^^^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([await promise])␊ + ` + +## invalid(10): Promise.all([...foo, await promise1, await promise2]) + +> Input + + `␊ + 1 | Promise.all([...foo, await promise1, await promise2])␊ + ` + +> Error 1/2 + + `␊ + > 1 | Promise.all([...foo, await promise1, await promise2])␊ + | ^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([...foo, promise1, await promise2])␊ + ` + +> Error 2/2 + + `␊ + > 1 | Promise.all([...foo, await promise1, await promise2])␊ + | ^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([...foo, await promise1, promise2])␊ ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index edadfca4a7ecafacfc7bbc4eff4ee03584171dcf..12996fca737b04ee58a1074e50ec21af23de0c75 100644 GIT binary patch literal 641 zcmV-{0)G8LRzV@P)aafqFlI2}dm;#(`_8~c6oV&~WXfQ!8^+0Qd7ndJ0a zk0r;1v$z+yTd-Al6(j+cdm8DqkE-u zvwPnG2;j6f!=aoED5r0d;YdzXK6Y;vV=i6oIxp-w005_;jnBoQt_GGsR7`Rs$PUGb z$B+mK0}7L58vBm(c+SJw866zZOfr!`&=0oYJv|b~6r#y3BOj}mSt<59O+`AsTzU1C zSEzgKP$@Z$8?bF^Y>&#*sER`M0!{B8qE{J*AkJc`au=F3U%Xv5@5HsDY;yANorq+d zs}r%D^L1i!vdC=Xb=tjL<+Wb$O35B=0Jf%qJuoJKhM;11G%?2%!-KHCvztw_78h;0 zRJ+=WQhQ?VcOF>T)-|?e>}7 b^t=C7=yn(0tV~tm!+!W1!*W@)O%nhB(pEST literal 540 zcmV+%0^|KbRzVAlPT@DuC7x_uXFRUM9f+7h1g1bO9RM4XJkWT zf>xPe7e=Eg`<0vcsy8#2h-+uz9RPq1DC^$4;F4Oj&Lp#J;09DYu?pBvW>e^3m=dZC zdTFMoHSJ)+ODi{PHD*h08j#IoOK`>NW{W|k_mh=0c3}Ra;^&rSTF%#9u#5|qQ^Cqi zO2PC9Zl{Xde(*7drBFWQUof|c@D0r&ia*5sN>8)tVE5s)gIUabX^r;pXAx{&G0)9dDJG#o7Df)zYq7JXn5#PW*Rw(kMZ2uil5kS+Sj@DMh6kUdTBNO4fBNO9uQnSGKePlttLznMl7+>;m5K5tjCB=}8GW4}j e$O8p(VcKrmFWh!$H4gdgwKM6tr From eccc8435210cec2ab84aafa28489e7fcb438ef05 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:25:07 +0800 Subject: [PATCH 09/18] More tests --- test/no-await-in-promise-methods.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index b5498b0f3a..ed39f3d1de 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -8,7 +8,6 @@ test.snapshot({ 'Promise.allSettled([promise1, promise2, promise3, promise4])', 'Promise.any([promise1, promise2, promise3, promise4])', 'Promise.race([promise1, promise2, promise3, promise4])', - 'Promise.resolve([await promise])', 'Promise.all([,])', 'Promise[all]([await promise])', 'Promise.all?.([await promise])', @@ -16,6 +15,11 @@ test.snapshot({ 'Promise.notListedMethod([await promise])', 'NotPromise.all([await promise])', 'Promise.all([(await promise, 0)])', + 'new Promise.all([await promise])', + + // We are not checking these cases + 'globalThis.Promise.all([await promise])', + 'Promise["all"]([await promise])', ], invalid: [ 'Promise.all([await promise])', From 64cc6055ee01d4f0d73eee869451461346754175 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:30:07 +0800 Subject: [PATCH 10/18] Minor refactoring --- rules/no-await-in-promise-methods.js | 20 +++++++++++++++----- rules/utils/is-promise-method-with-array.js | 14 -------------- test/no-await-in-promise-methods.mjs | 4 ++++ 3 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 rules/utils/is-promise-method-with-array.js diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js index 719636d216..2937cee02a 100644 --- a/rules/no-await-in-promise-methods.js +++ b/rules/no-await-in-promise-methods.js @@ -1,5 +1,5 @@ 'use strict'; -const isPromiseMethodWithArray = require('./utils/is-promise-method-with-array.js'); +const {isMethodCall} = require('./ast/index.js'); const MESSAGE_ID_ERROR = 'no-await-in-promise-methods/error'; const MESSAGE_ID_SUGGESTION = 'no-await-in-promise-methods/suggestion'; @@ -9,14 +9,24 @@ const messages = { }; const METHODS = ['all', 'allSettled', 'any', 'race']; +const isPromiseMethodCallWithArrayExpression = (node) => + isMethodCall(node, { + object: 'Promise', + methods: METHODS, + optionalMember: false, + optionalCall: false, + argumentsLength: 1, + }) + && node.arguments[0].type === 'ArrayExpression'; + /** @param {import('eslint').Rule.RuleContext} context */ const create = context => ({ - * CallExpression(node) { - if (!isPromiseMethodWithArray(node, METHODS)) { + * CallExpression(callExpression) { + if (!isPromiseMethodCallWithArrayExpression(callExpression)) { return; } - for (const element of node.arguments[0].elements) { + for (const element of callExpression.arguments[0].elements) { if (element?.type !== 'AwaitExpression') { continue; } @@ -25,7 +35,7 @@ const create = context => ({ node: element, messageId: MESSAGE_ID_ERROR, data: { - method: node.callee.property.name, + method: callExpression.callee.property.name, }, suggest: [ { diff --git a/rules/utils/is-promise-method-with-array.js b/rules/utils/is-promise-method-with-array.js deleted file mode 100644 index 3416d2253c..0000000000 --- a/rules/utils/is-promise-method-with-array.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; -const {isMethodCall} = require('../ast/index.js'); - -const isPromiseMethodWithArray = (node, methods) => - isMethodCall(node, { - object: 'Promise', - methods, - optionalMember: false, - optionalCall: false, - argumentsLength: 1, - }) - && node.arguments[0].type === 'ArrayExpression'; - -module.exports = isPromiseMethodWithArray; diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index ed39f3d1de..6fa59f92eb 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -8,6 +8,10 @@ test.snapshot({ 'Promise.allSettled([promise1, promise2, promise3, promise4])', 'Promise.any([promise1, promise2, promise3, promise4])', 'Promise.race([promise1, promise2, promise3, promise4])', + 'Promise.all(...[await promise])', + 'Promise.all([await promise], extraArguments)', + 'Promise.all()', + 'Promise.all(notArrayExpression)', 'Promise.all([,])', 'Promise[all]([await promise])', 'Promise.all?.([await promise])', From 7189e61afa4d86fb8bd6377f53d0862dc4d682ad Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:33:14 +0800 Subject: [PATCH 11/18] Update docs --- docs/rules/no-await-in-promise-methods.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/rules/no-await-in-promise-methods.md b/docs/rules/no-await-in-promise-methods.md index 1c24d80cd6..da42e965eb 100644 --- a/docs/rules/no-await-in-promise-methods.md +++ b/docs/rules/no-await-in-promise-methods.md @@ -7,30 +7,28 @@ -Awaited parameters in a Promise.all(), Promise.allSettled(), Promise.any() or Promise.race() method is probably a mistake. +Awaited parameters in `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or `Promise.race()` is probably a mistake. ## Fail ```js -Promise.all([promise, await promise, await promise, promise]) +Promise.all([await promise1, promise2]); -Promise.allSettled([promise, await promise, await promise, promise]) +Promise.allSettled([await promise1, promise2]); -Promise.any([promise, await promise, await promise, promise]) +Promise.any([await promise1, promise2]); -Promise.race([promise, await promise, await promise, promise]) +Promise.race([await promise1, promise2]); ``` ## Pass ```js -Promise.all([promise, promise, promise, promise]) +Promise.all([promise1, promise2]); -Promise.allSettled([promise, promise, promise, promise]) +Promise.allSettled([promise1, promise2]); -Promise.any([promise, promise, promise, promise]) +Promise.any([promise1, promise2]); -Promise.race([promise, promise, promise, promise]) - -Promise.resolve([await promise]) +Promise.race([promise1, promise2]); ``` From 3dcec74e6f50c93342c73125437f2e593f514a42 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:36:03 +0800 Subject: [PATCH 12/18] Linting --- rules/no-await-in-promise-methods.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js index 2937cee02a..6d9c1daae9 100644 --- a/rules/no-await-in-promise-methods.js +++ b/rules/no-await-in-promise-methods.js @@ -9,7 +9,7 @@ const messages = { }; const METHODS = ['all', 'allSettled', 'any', 'race']; -const isPromiseMethodCallWithArrayExpression = (node) => +const isPromiseMethodCallWithArrayExpression = node => isMethodCall(node, { object: 'Promise', methods: METHODS, From 27320058c5aab154b81249847ba8d845bb318399 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sun, 28 Jan 2024 05:36:35 +0800 Subject: [PATCH 13/18] Update no-await-in-promise-methods.md --- docs/rules/no-await-in-promise-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/no-await-in-promise-methods.md b/docs/rules/no-await-in-promise-methods.md index da42e965eb..51348c3817 100644 --- a/docs/rules/no-await-in-promise-methods.md +++ b/docs/rules/no-await-in-promise-methods.md @@ -7,7 +7,7 @@ -Awaited parameters in `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or `Promise.race()` is probably a mistake. +Awaited promises in `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or `Promise.race()` is probably a mistake. ## Fail From 74aac6279303f54251ced174aeb2a148bd1efd7b Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:41:24 +0800 Subject: [PATCH 14/18] Add test --- test/no-await-in-promise-methods.mjs | 1 + .../no-await-in-promise-methods.mjs.md | 19 ++++++++++++++++++ .../no-await-in-promise-methods.mjs.snap | Bin 641 -> 690 bytes 3 files changed, 20 insertions(+) diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index 6fa59f92eb..f8419de93c 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -36,5 +36,6 @@ test.snapshot({ 'Promise.all([await (0, promise)],)', 'Promise.all([await await promise])', 'Promise.all([...foo, await promise1, await promise2])', + 'Promise.all([await /* comment*/ promise])', ], }); diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index c7966da760..a474bed02d 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -204,3 +204,22 @@ Generated by [AVA](https://avajs.dev). Suggestion 1/1: Remove \`await\`.␊ 1 | Promise.all([...foo, await promise1, promise2])␊ ` + +## invalid(11): Promise.all([await /* comment*/ promise]) + +> Input + + `␊ + 1 | Promise.all([await /* comment*/ promise])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.all([await /* comment*/ promise])␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([promise])␊ + ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index 12996fca737b04ee58a1074e50ec21af23de0c75..3c234fb322db45d3b0c0d30d78f029ab970dada7 100644 GIT binary patch literal 690 zcmV;j0!{rvRzVcs3#t`O9hu)B?%|*zgpBZlFO48i7Tcq zP$%Ka#UG0Z00000000Bs*iCQKFc=5$7Q~ApE*#K6Tpmp@ni7&F8+(%gfy4oE8SDZ= zLrEKNvqU{q(3hRr#vFx zIy62FA{usFa}V|tHlQi7gDC2J3cd!E!*Kf7p-Iy?7^WwTr{6EaFyO%l?`rEtYdqT5 zTDRK|3;-9-D>Dod1w9gxH}P=9rzs!Xck(e;uD6Zn`Wyg&bCAa8{18V2jls_+nLeZ^ zY!rnMGY&lhlVlRwhVf+1!#EfnACr_*7K7`!d+?qN*eL;ja!TLE>ZMkSzD^RBj1L!H zj_~qiuLHt)M8Xu;$@UYp?a>Qw~FYM#vzEaSc=?*Ce3bMFPnAZMqV~P`}a;n zGA`ALSkC1-F+N*lw())Hy-eY?ne$45KB)n=A%Q(qE&vTd#qLRBhAM^!VST4Jn`A96 z+VocSYF(lBR9){Z(6VhxY-`vIUPwXR?n`dB&^51^gie@^Sof?#y(;=`t8%Ae&E9Wl z2nwYZB+R=Nn6qv(ms=CBT~YH@_OiaN za@w|i#F(;YaFyR)Uiil!;kT0TGwk~6hNI~F68cLNz4i&p-x;A9kAkR#w#eDj;fX@~ zQla1dw?a3&@M>ks3hz0dXv?jvElWP4IbGr_p)FQis<%clxF5N$t4dMcn| Y&MgV8H}x*Le)-({8xN^uFESMX0EjqAvj6}9 literal 641 zcmV-{0)G8LRzV@P)aafqFlI2}dm;#(`_8~c6oV&~WXfQ!8^+0Qd7ndJ0a zk0r;1v$z+yTd-Al6(j+cdm8DqkE-u zvwPnG2;j6f!=aoED5r0d;YdzXK6Y;vV=i6oIxp-w005_;jnBoQt_GGsR7`Rs$PUGb z$B+mK0}7L58vBm(c+SJw866zZOfr!`&=0oYJv|b~6r#y3BOj}mSt<59O+`AsTzU1C zSEzgKP$@Z$8?bF^Y>&#*sER`M0!{B8qE{J*AkJc`au=F3U%Xv5@5HsDY;yANorq+d zs}r%D^L1i!vdC=Xb=tjL<+Wb$O35B=0Jf%qJuoJKhM;11G%?2%!-KHCvztw_78h;0 zRJ+=WQhQ?VcOF>T)-|?e>}7 b^t=C7=yn(0tV~tm!+!W1!*W@)O%nhB(pEST From da04831d3cb68cc90d7bbf738ec0c86747e08925 Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:44:04 +0800 Subject: [PATCH 15/18] Preserve comments --- rules/no-await-in-promise-methods.js | 8 +++++--- .../no-await-in-promise-methods.mjs.md | 2 +- .../no-await-in-promise-methods.mjs.snap | Bin 690 -> 694 bytes 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/rules/no-await-in-promise-methods.js b/rules/no-await-in-promise-methods.js index 6d9c1daae9..4e428558bd 100644 --- a/rules/no-await-in-promise-methods.js +++ b/rules/no-await-in-promise-methods.js @@ -1,5 +1,6 @@ 'use strict'; const {isMethodCall} = require('./ast/index.js'); +const {removeSpacesAfter} = require('./fix/index.js'); const MESSAGE_ID_ERROR = 'no-await-in-promise-methods/error'; const MESSAGE_ID_SUGGESTION = 'no-await-in-promise-methods/suggestion'; @@ -40,10 +41,11 @@ const create = context => ({ suggest: [ { messageId: MESSAGE_ID_SUGGESTION, - fix(fixer) { + * fix(fixer) { + const {sourceCode} = context; const awaitToken = context.sourceCode.getFirstToken(element); - const secondToken = context.sourceCode.getTokenAfter(awaitToken); - return fixer.removeRange([awaitToken.range[0], secondToken.range[0]]); + yield fixer.remove(awaitToken); + yield removeSpacesAfter(awaitToken, sourceCode, fixer); }, }, ], diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index a474bed02d..289f942de4 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -221,5 +221,5 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 1/1: Remove \`await\`.␊ - 1 | Promise.all([promise])␊ + 1 | Promise.all([/* comment*/ promise])␊ ` diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index 3c234fb322db45d3b0c0d30d78f029ab970dada7..f1321a511be55254c01b54511b86645a1a52506f 100644 GIT binary patch literal 694 zcmV;n0!jTrRzVPKPFa?Cy0PiQ|(iS0*G>$CsO4;c(5e;t}(8vBFvgtGLe8~@fG=wpD`6SbW z^n?zh0Ak9ZOJJN#0^2awW;~38;qfs^Sx94WI?f(^AbomDz#E^^v$1-~l?vY^2~9?a zbFU8faz(EL!dOIt3T(Rq+mqsDltrO>j-a=K=#|DHh|^f|+_@&rZeA~&b>c=|Ha`3J zPDC=U)QMQm)jBagn`gGsed@hT?zNfoO8g$F0Jb53J(4Z}4MD{o2x5jTh6iDNr#BmC z%`e*IR`qIauC^twcNS>bHU+j-Yz8l+pl-{8+Z}YxD<+{6W-Zn|t57dRzilgbD%SM< zhK8VSOM=^N{a(eY|7OLiV)j(MyR>Ftc4*DWY!p;;v&&i)&1`PAgPXP1vu-s}xE%qm zT@EKDp?a%=-jYI3PSX)Cv?E?R1?Db}sa^6aV^&%A9t)WF6`0d*GZ$MEuU%2|b@sBp zE_2$peMG6WXKcs3#t`O9hu)B?%|*zgpBZlFO48i7Tcq zP$%Ka#UG0Z00000000Bs*iCQKFc=5$7Q~ApE*#K6Tpmp@ni7&F8+(%gfy4oE8SDZ= zLrEKNvqU{q(3hRr#vFx zIy62FA{usFa}V|tHlQi7gDC2J3cd!E!*Kf7p-Iy?7^WwTr{6EaFyO%l?`rEtYdqT5 zTDRK|3;-9-D>Dod1w9gxH}P=9rzs!Xck(e;uD6Zn`Wyg&bCAa8{18V2jls_+nLeZ^ zY!rnMGY&lhlVlRwhVf+1!#EfnACr_*7K7`!d+?qN*eL;ja!TLE>ZMkSzD^RBj1L!H zj_~qiuLHt)M8Xu;$@UYp?a>Qw~FYM#vzEaSc=?*Ce3bMFPnAZMqV~P`}a;n zGA`ALSkC1-F+N*lw())Hy-eY?ne$45KB)n=A%Q(qE&vTd#qLRBhAM^!VST4Jn`A96 z+VocSYF(lBR9){Z(6VhxY-`vIUPwXR?n`dB&^51^gie@^Sof?#y(;=`t8%Ae&E9Wl z2nwYZB+R=Nn6qv(ms=CBT~YH@_OiaN za@w|i#F(;YaFyR)Uiil!;kT0TGwk~6hNI~F68cLNz4i&p-x;A9kAkR#w#eDj;fX@~ zQla1dw?a3&@M>ks3hz0dXv?jvElWP4IbGr_p)FQis<%clxF5N$t4dMcn| Y&MgV8H}x*Le)-({8xN^uFESMX0EjqAvj6}9 From 12d626f404004befab976c9e28b3855c0c0d5f1d Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Jan 2024 05:45:13 +0800 Subject: [PATCH 16/18] Add another test --- test/no-await-in-promise-methods.mjs | 1 + .../no-await-in-promise-methods.mjs.md | 25 +++++++++++++++--- .../no-await-in-promise-methods.mjs.snap | Bin 694 -> 723 bytes 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/test/no-await-in-promise-methods.mjs b/test/no-await-in-promise-methods.mjs index f8419de93c..b439f2fd89 100644 --- a/test/no-await-in-promise-methods.mjs +++ b/test/no-await-in-promise-methods.mjs @@ -34,6 +34,7 @@ test.snapshot({ 'Promise.all([await promise,])', 'Promise.all([await promise],)', 'Promise.all([await (0, promise)],)', + 'Promise.all([await (( promise ))])', 'Promise.all([await await promise])', 'Promise.all([...foo, await promise1, await promise2])', 'Promise.all([await /* comment*/ promise])', diff --git a/test/snapshots/no-await-in-promise-methods.mjs.md b/test/snapshots/no-await-in-promise-methods.mjs.md index 289f942de4..eb098f193d 100644 --- a/test/snapshots/no-await-in-promise-methods.mjs.md +++ b/test/snapshots/no-await-in-promise-methods.mjs.md @@ -156,7 +156,26 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.all([(0, promise)],)␊ ` -## invalid(9): Promise.all([await await promise]) +## invalid(9): Promise.all([await (( promise ))]) + +> Input + + `␊ + 1 | Promise.all([await (( promise ))])␊ + ` + +> Error 1/1 + + `␊ + > 1 | Promise.all([await (( promise ))])␊ + | ^^^^^^^^^^^^^^^^^^^ Promise in \`Promise.all()\` should not be awaited.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/1: Remove \`await\`.␊ + 1 | Promise.all([(( promise ))])␊ + ` + +## invalid(10): Promise.all([await await promise]) > Input @@ -175,7 +194,7 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.all([await promise])␊ ` -## invalid(10): Promise.all([...foo, await promise1, await promise2]) +## invalid(11): Promise.all([...foo, await promise1, await promise2]) > Input @@ -205,7 +224,7 @@ Generated by [AVA](https://avajs.dev). 1 | Promise.all([...foo, await promise1, promise2])␊ ` -## invalid(11): Promise.all([await /* comment*/ promise]) +## invalid(12): Promise.all([await /* comment*/ promise]) > Input diff --git a/test/snapshots/no-await-in-promise-methods.mjs.snap b/test/snapshots/no-await-in-promise-methods.mjs.snap index f1321a511be55254c01b54511b86645a1a52506f..86985f2171b422fb2f341e7ed7d7209eab414116 100644 GIT binary patch literal 723 zcmV;^0xbPORzV|bhj*P#qNhS|C%yKvi0_yX_4dkp+O>PEEpHT`u#SjZys zT@T|^KMDigG4^0Tq5Uu=mLEm>XaAcYG8jz$IyAyG_6O++W$BNLAn=+0(Y@Zf)f#Q> z8?C$ThZ=wb=h6&~M1Ge<h`tz_u%}Jt?0?RTQe{2zo1sUS%ADIE^LGoomwU;_GFzPTa`L#%KTD ziActkIuXmcS|`S5^UOB7&U!C{du`^t62C_jz%~T1M}-qWLr}2?f|ynm!-KHCt2Y~G z%`e*IQtQ<^Ty3lPyfdMeZBt-d#U^+u1$A2%-0q;yymAscFdOmQGfVZ7^xL*{rD9Is zZ)gbWwj{XSu3xK|&0nmTDrQgRt4nhRW{2jC%tk>CH@mD=+05c*JGhy?o^`8%!tDrf zoocv35~{Z<=q*X~ifMI(3+;%PPJ+2xfvNKtFbr&Rs$+^tDCT1U^S%tTkfwyWxSD9~ zBrku?I?h?Uf>GvFS;eSxPW#rd*qnIn%ABt=&eF#h%d(CrEi3_@!f!V({PVByJ3;t4 zc7CeiDEhvD{t87`K0x&+0BFXoz$;N(PKPFa?Cy0PiQ|(iS0*G>$CsO4;c(5e;t}(8vBFvgtGLe8~@fG=wpD`6SbW z^n?zh0Ak9ZOJJN#0^2awW;~38;qfs^Sx94WI?f(^AbomDz#E^^v$1-~l?vY^2~9?a zbFU8faz(EL!dOIt3T(Rq+mqsDltrO>j-a=K=#|DHh|^f|+_@&rZeA~&b>c=|Ha`3J zPDC=U)QMQm)jBagn`gGsed@hT?zNfoO8g$F0Jb53J(4Z}4MD{o2x5jTh6iDNr#BmC z%`e*IR`qIauC^twcNS>bHU+j-Yz8l+pl-{8+Z}YxD<+{6W-Zn|t57dRzilgbD%SM< zhK8VSOM=^N{a(eY|7OLiV)j(MyR>Ftc4*DWY!p;;v&&i)&1`PAgPXP1vu-s}xE%qm zT@EKDp?a%=-jYI3PSX)Cv?E?R1?Db}sa^6aV^&%A9t)WF6`0d*GZ$MEuU%2|b@sBp zE_2$peMG6WXK Date: Sun, 28 Jan 2024 05:47:16 +0800 Subject: [PATCH 17/18] Update no-await-in-promise-methods.md --- docs/rules/no-await-in-promise-methods.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/rules/no-await-in-promise-methods.md b/docs/rules/no-await-in-promise-methods.md index 51348c3817..1130ff0ad7 100644 --- a/docs/rules/no-await-in-promise-methods.md +++ b/docs/rules/no-await-in-promise-methods.md @@ -12,23 +12,23 @@ Awaited promises in `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or ## Fail ```js -Promise.all([await promise1, promise2]); +Promise.all([await promise, anotherPromise]); -Promise.allSettled([await promise1, promise2]); +Promise.allSettled([await promise, anotherPromise]); -Promise.any([await promise1, promise2]); +Promise.any([await promise, anotherPromise]); -Promise.race([await promise1, promise2]); +Promise.race([await promise, anotherPromise]); ``` ## Pass ```js -Promise.all([promise1, promise2]); +Promise.all([promise, anotherPromise]); -Promise.allSettled([promise1, promise2]); +Promise.allSettled([promise, anotherPromise]); -Promise.any([promise1, promise2]); +Promise.any([promise, anotherPromise]); -Promise.race([promise1, promise2]); +Promise.race([promise, anotherPromise]); ``` From 18af38a10ebb9c0e7d8aae4588e9c1af09d1b0ad Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 22 Feb 2024 13:59:10 +0700 Subject: [PATCH 18/18] Update no-await-in-promise-methods.md --- docs/rules/no-await-in-promise-methods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/no-await-in-promise-methods.md b/docs/rules/no-await-in-promise-methods.md index 1130ff0ad7..1da102aa98 100644 --- a/docs/rules/no-await-in-promise-methods.md +++ b/docs/rules/no-await-in-promise-methods.md @@ -7,7 +7,7 @@ -Awaited promises in `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or `Promise.race()` is probably a mistake. +Using `await` on promises passed as arguments to `Promise.all()`, `Promise.allSettled()`, `Promise.any()`, or `Promise.race()` is likely a mistake. ## Fail