1- import enhance from 'enhance-visitors' ;
21import { getTestModifiers , unwrapTypeExpression } from './util.js' ;
32
4- export default ( ) => {
3+ export default context => {
54 let isTestFile = false ;
6- let currentTestNode ;
75 const testIdentifiers = new Set ( ) ;
86
97 function isTestFunctionCall ( node ) {
@@ -18,11 +16,8 @@ export default () => {
1816 return false ;
1917 }
2018
21- function getTestModifierNames ( node ) {
22- return getTestModifiers ( node ) . map ( property => property . name ) ;
23- }
19+ const getModifierNames = node => getTestModifiers ( node ) . map ( property => property . name ) ;
2420
25- /* eslint quote-props: [2, "as-needed"] */
2621 const predefinedRules = {
2722 ImportDeclaration ( node ) {
2823 if ( node . source . value !== 'ava' || node . importKind === 'type' ) {
@@ -51,37 +46,57 @@ export default () => {
5146 testIdentifiers . add ( node . id . name ) ;
5247 }
5348 } ,
54- CallExpression ( node ) {
55- if ( isTestFunctionCall ( node . callee ) ) {
56- // Entering test function
57- currentTestNode = node ;
58- }
59- } ,
60- 'CallExpression:exit' ( node ) {
61- if ( currentTestNode === node ) {
62- // Leaving test function
63- currentTestNode = undefined ;
64- }
65- } ,
6649 'Program:exit' ( ) {
6750 isTestFile = false ;
6851 testIdentifiers . clear ( ) ;
6952 } ,
7053 } ;
7154
7255 return {
73- hasTestModifier : module_ => getTestModifierNames ( currentTestNode ) . includes ( module_ ) ,
74- hasNoUtilityModifier ( ) {
75- const modifiers = getTestModifierNames ( currentTestNode ) ;
56+ isInTestFile : ( ) => isTestFile ,
57+ isTestNode : node => node . type === 'CallExpression' && isTestFunctionCall ( node . callee ) ,
58+ isInTestNode ( node ) {
59+ if ( node . type === 'CallExpression' && isTestFunctionCall ( node . callee ) ) {
60+ return node ;
61+ }
62+
63+ const ancestors = context . sourceCode . getAncestors ( node ) ;
64+ for ( let index = ancestors . length - 1 ; index >= 0 ; index -- ) {
65+ const ancestor = ancestors [ index ] ;
66+ if ( ancestor . type === 'CallExpression' && isTestFunctionCall ( ancestor . callee ) ) {
67+ return ancestor ;
68+ }
69+ }
70+
71+ return undefined ;
72+ } ,
73+ hasTestModifier : ( node , modifier ) => getModifierNames ( node ) . includes ( modifier ) ,
74+ hasNoUtilityModifier ( node ) {
75+ const modifiers = getModifierNames ( node ) ;
7676 return ! modifiers . includes ( 'before' )
7777 && ! modifiers . includes ( 'beforeEach' )
7878 && ! modifiers . includes ( 'after' )
7979 && ! modifiers . includes ( 'afterEach' )
8080 && ! modifiers . includes ( 'macro' ) ;
8181 } ,
82- isInTestFile : ( ) => isTestFile ,
83- isInTestNode : ( ) => currentTestNode ,
84- isTestNode : node => currentTestNode === node ,
85- merge : customHandlers => enhance . mergeVisitors ( [ predefinedRules , customHandlers ] ) ,
82+ merge : customHandlers => ( {
83+ ...predefinedRules ,
84+ ...Object . fromEntries ( Object . entries ( customHandlers ) . map ( ( [ key , custom ] ) => {
85+ const predefined = predefinedRules [ key ] ;
86+ if ( ! predefined ) {
87+ return [ key , custom ] ;
88+ }
89+
90+ return [ key , key . endsWith ( ':exit' )
91+ ? node => {
92+ custom ( node ) ;
93+ predefined ( node ) ;
94+ }
95+ : node => {
96+ predefined ( node ) ;
97+ custom ( node ) ;
98+ } ] ;
99+ } ) ) ,
100+ } ) ,
86101 } ;
87102} ;
0 commit comments