From 8837f5324a20da26b7865072abe54dfb93272d3a Mon Sep 17 00:00:00 2001 From: Jamund Ferguson Date: Fri, 9 Apr 2021 16:07:04 -0700 Subject: [PATCH] exempted array methods (fixes #212) --- __tests__/prefer-await-to-callbacks.js | 29 +++++++++++++++++++++++++- rules/prefer-await-to-callbacks.js | 25 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/__tests__/prefer-await-to-callbacks.js b/__tests__/prefer-await-to-callbacks.js index 78e7d640..4c391d7e 100644 --- a/__tests__/prefer-await-to-callbacks.js +++ b/__tests__/prefer-await-to-callbacks.js @@ -18,6 +18,17 @@ ruleTester.run('prefer-await-to-callbacks', rule, { 'dbConn.on("error", err => { console.error(err) })', 'dbConn.once("error", err => { console.error(err) })', 'heart(something => {})', + 'getErrors().map(error => responseTo(error))', + 'errors.filter(err => err.status === 402)', + 'errors.some(err => err.message.includes("Yo"))', + 'errors.every(err => err.status === 402)', + 'errors.filter(err => console.log(err))', + 'const error = errors.find(err => err.stack.includes("file.js"))', + 'this.myErrors.forEach(function(error) { log(error); })', + 'find(errors, function(err) { return err.type === "CoolError" })', + 'map(errors, function(error) { return err.type === "CoolError" })', + '_.find(errors, function(error) { return err.type === "CoolError" })', + '_.map(errors, function(err) { return err.type === "CoolError" })', ], invalid: [ @@ -58,7 +69,23 @@ ruleTester.run('prefer-await-to-callbacks', rule, { errors: [{ message }], }, { - code: 'heart(function(error) {})', + code: `async.map(files, fs.stat, function(err, results) { if (err) throw err; });`, + errors: [{ message }], + }, + { + code: `_.map(files, fs.stat, function(err, results) { if (err) throw err; });`, + errors: [{ message }], + }, + { + code: `map(files, fs.stat, function(err, results) { if (err) throw err; });`, + errors: [{ message }], + }, + { + code: `map(function(err, results) { if (err) throw err; });`, + errors: [{ message }], + }, + { + code: `customMap(errors, (err) => err.message)`, errors: [{ message }], }, ], diff --git a/rules/prefer-await-to-callbacks.js b/rules/prefer-await-to-callbacks.js index 03742ff9..db76f703 100644 --- a/rules/prefer-await-to-callbacks.js +++ b/rules/prefer-await-to-callbacks.js @@ -50,6 +50,31 @@ module.exports = { ) { return } + + // carve out exemption for map/filter/etc + const arrayMethods = [ + 'map', + 'every', + 'forEach', + 'some', + 'find', + 'filter', + ] + const isLodash = + node.callee.object && + ['lodash', 'underscore', '_'].includes(node.callee.object.name) + const callsArrayMethod = + node.callee.property && + arrayMethods.includes(node.callee.property.name) && + (node.arguments.length === 1 || + (node.arguments.length === 2 && isLodash)) + const isArrayMethod = + node.callee.name && + arrayMethods.includes(node.callee.name) && + node.arguments.length === 2 + if (callsArrayMethod || isArrayMethod) return + + // actually check for callbacks (I know this is the worst) if ( arg.params && arg.params[0] &&