@@ -21,45 +21,66 @@
create(context) {
const options = context.options[0] || {}
const allowThen = options.allowThen
+ const allowFinally = options.allowFinally
let terminationMethod = options.terminationMethod || 'catch'
if (typeof terminationMethod === 'string') {
terminationMethod = [terminationMethod]
}
- return {
- ExpressionStatement(node) {
- if (!isPromise(node.expression)) {
- return
- }
-
+ function isAllowedPromiseTermination(expression) {
// somePromise.then(a, b)
if (
allowThen &&
- node.expression.type === 'CallExpression' &&
- node.expression.callee.type === 'MemberExpression' &&
- node.expression.callee.property.name === 'then' &&
- node.expression.arguments.length === 2
+ expression.type === 'CallExpression' &&
+ expression.callee.type === 'MemberExpression' &&
+ expression.callee.property.name === 'then' &&
+ expression.arguments.length === 2
) {
- return
+ return true
+ }
+
+ // somePromise.catch().finally(fn)
+ if (
+ allowFinally &&
+ expression.type === 'CallExpression' &&
+ expression.callee.type === 'MemberExpression' &&
+ expression.callee.property.name === 'finally' &&
+ isPromise(expression.callee.object) &&
+ isAllowedPromiseTermination(expression.callee.object)
+ ) {
+ return true
}
// somePromise.catch()
if (
- node.expression.type === 'CallExpression' &&
- node.expression.callee.type === 'MemberExpression' &&
- terminationMethod.indexOf(node.expression.callee.property.name) !== -1
+ expression.type === 'CallExpression' &&
+ expression.callee.type === 'MemberExpression' &&
+ terminationMethod.indexOf(expression.callee.property.name) !== -1
) {
- return
+ return true
}
// somePromise['catch']()
if (
- node.expression.type === 'CallExpression' &&
- node.expression.callee.type === 'MemberExpression' &&
- node.expression.callee.property.type === 'Literal' &&
- node.expression.callee.property.value === 'catch'
+ expression.type === 'CallExpression' &&
+ expression.callee.type === 'MemberExpression' &&
+ expression.callee.property.type === 'Literal' &&
+ expression.callee.property.value === 'catch'
) {
+ return true
+ }
+
+ return false
+ }
+
+ return {
+ ExpressionStatement(node) {
+ if (!isPromise(node.expression)) {
+ return
+ }
+
+ if (isAllowedPromiseTermination(node.expression)) {
return
}