2020-03-07 11:45:40 +08:00
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . default = void 0 ;
2020-03-31 20:40:00 +08:00
var _experimentalUtils = require ( "@typescript-eslint/experimental-utils" ) ;
2020-03-07 11:45:40 +08:00
2020-03-31 20:40:00 +08:00
var _utils = require ( "./utils" ) ;
2020-03-07 11:45:40 +08:00
var _default = ( 0 , _utils . createRule ) ( {
name : _ _filename ,
meta : {
docs : {
category : 'Best Practices' ,
description : 'Avoid using a callback in asynchronous tests' ,
2020-07-14 01:09:22 +08:00
recommended : 'error' ,
2020-06-27 02:01:06 +08:00
suggestion : true
2020-03-07 11:45:40 +08:00
} ,
messages : {
2020-03-31 20:40:00 +08:00
illegalTestCallback : 'Illegal usage of test callback' ,
2020-06-27 02:01:06 +08:00
suggestWrappingInPromise : 'Wrap in `new Promise({{ callback }} => ...`' ,
2020-03-31 20:40:00 +08:00
useAwaitInsteadOfCallback : 'Use await instead of callback in async functions'
2020-03-07 11:45:40 +08:00
} ,
schema : [ ] ,
type : 'suggestion'
} ,
defaultOptions : [ ] ,
create ( context ) {
return {
CallExpression ( node ) {
if ( ! ( 0 , _utils . isTestCase ) ( node ) || node . arguments . length !== 2 ) {
return ;
}
2020-03-31 20:40:00 +08:00
const [ , callback ] = node . arguments ;
2020-03-07 11:45:40 +08:00
if ( ! ( 0 , _utils . isFunction ) ( callback ) || callback . params . length !== 1 ) {
return ;
}
2020-03-31 20:40:00 +08:00
const [ argument ] = callback . params ;
2020-06-27 02:01:06 +08:00
if ( argument . type !== _experimentalUtils . AST _NODE _TYPES . Identifier ) {
context . report ( {
node : argument ,
messageId : 'illegalTestCallback'
} ) ;
return ;
}
2020-03-31 20:40:00 +08:00
if ( callback . async ) {
context . report ( {
node : argument ,
messageId : 'useAwaitInsteadOfCallback'
} ) ;
return ;
}
2020-03-07 11:45:40 +08:00
context . report ( {
node : argument ,
messageId : 'illegalTestCallback' ,
2020-06-27 02:01:06 +08:00
suggest : [ {
messageId : 'suggestWrappingInPromise' ,
data : {
callback : argument . name
} ,
fix ( fixer ) {
const {
body
} = callback ;
/* istanbul ignore if https://github.com/typescript-eslint/typescript-eslint/issues/734 */
if ( ! body ) {
throw new Error ( ` Unexpected null when attempting to fix ${ context . getFilename ( ) } - please file a github issue at https://github.com/jest-community/eslint-plugin-jest ` ) ;
}
const sourceCode = context . getSourceCode ( ) ;
const firstBodyToken = sourceCode . getFirstToken ( body ) ;
const lastBodyToken = sourceCode . getLastToken ( body ) ;
const tokenBeforeArgument = sourceCode . getTokenBefore ( argument ) ;
const tokenAfterArgument = sourceCode . getTokenAfter ( argument ) ;
/* istanbul ignore if */
if ( ! firstBodyToken || ! lastBodyToken || ! tokenBeforeArgument || ! tokenAfterArgument ) {
throw new Error ( ` Unexpected null when attempting to fix ${ context . getFilename ( ) } - please file a github issue at https://github.com/jest-community/eslint-plugin-jest ` ) ;
}
const argumentInParens = tokenBeforeArgument . value === '(' && tokenAfterArgument . value === ')' ;
let argumentFix = fixer . replaceText ( argument , '()' ) ;
if ( argumentInParens ) {
argumentFix = fixer . remove ( argument ) ;
}
let newCallback = argument . name ;
if ( argumentInParens ) {
newCallback = ` ( ${ newCallback } ) ` ;
}
let beforeReplacement = ` new Promise( ${ newCallback } => ` ;
let afterReplacement = ')' ;
let replaceBefore = true ;
if ( body . type === _experimentalUtils . AST _NODE _TYPES . BlockStatement ) {
const keyword = 'return' ;
beforeReplacement = ` ${ keyword } ${ beforeReplacement } { ` ;
afterReplacement += '}' ;
replaceBefore = false ;
}
return [ argumentFix , replaceBefore ? fixer . insertTextBefore ( firstBodyToken , beforeReplacement ) : fixer . insertTextAfter ( firstBodyToken , beforeReplacement ) , fixer . insertTextAfter ( lastBodyToken , afterReplacement ) ] ;
2020-03-07 11:45:40 +08:00
}
2020-06-27 02:01:06 +08:00
} ]
2020-03-07 11:45:40 +08:00
} ) ;
}
} ;
}
} ) ;
exports . default = _default ;