1- import { TSESTree } from '@typescript-eslint /utils'
2- import { createEslintRule } from '../utils'
1+ import { createEslintRule , getAccessorValue } from '.. /utils'
2+ import { parseVitestFnCall } from '../utils/parse-vitest-fn-call '
33
44export type MessageIds = 'noFocusedTests'
55const RULE_NAME = 'no-focused-tests'
@@ -9,16 +9,6 @@ export type Options = [
99 } > ,
1010]
1111
12- const isTestOrDescribe = ( node : TSESTree . Expression ) => {
13- return (
14- node . type === 'Identifier' && [ 'it' , 'test' , 'describe' ] . includes ( node . name )
15- )
16- }
17-
18- const isOnly = ( node : TSESTree . Expression | TSESTree . PrivateIdentifier ) => {
19- return node . type === 'Identifier' && node . name === 'only'
20- }
21-
2212export default createEslintRule < Options , MessageIds > ( {
2313 name : RULE_NAME ,
2414 meta : {
@@ -49,78 +39,30 @@ export default createEslintRule<Options, MessageIds>({
4939 const fixable = options [ 0 ] . fixable !
5040
5141 return {
52- ExpressionStatement ( node ) {
53- if ( node . expression . type === 'CallExpression' ) {
54- const { callee } = node . expression
55- if (
56- callee . type === 'MemberExpression' &&
57- isTestOrDescribe ( callee . object ) &&
58- isOnly ( callee . property )
59- ) {
60- context . report ( {
61- node : callee . property ,
62- messageId : 'noFocusedTests' ,
63- fix : ( fixer ) =>
64- fixable
65- ? fixer . removeRange ( [
66- callee . property . range [ 0 ] - 1 ,
67- callee . property . range [ 1 ] ,
68- ] )
69- : null ,
70- } )
71- }
72-
73- if ( callee . type === 'TaggedTemplateExpression' ) {
74- const tagCall =
75- callee . tag . type === 'MemberExpression' ? callee . tag . object : null
76- if ( ! tagCall ) return
42+ CallExpression ( node ) {
43+ const vitestFnCall = parseVitestFnCall ( node , context )
7744
78- if (
79- tagCall . type === 'MemberExpression' &&
80- isTestOrDescribe ( tagCall . object ) &&
81- isOnly ( tagCall . property )
82- ) {
83- context . report ( {
84- node : tagCall . property ,
85- messageId : 'noFocusedTests' ,
86- fix : ( fixer ) =>
87- fixable
88- ? fixer . removeRange ( [
89- tagCall . property . range [ 0 ] - 1 ,
90- tagCall . property . range [ 1 ] ,
91- ] )
92- : null ,
93- } )
94- }
95- }
45+ if ( ! vitestFnCall ) {
46+ return
9647 }
97- } ,
98- CallExpression ( node ) {
99- if ( node . callee . type === 'CallExpression' ) {
100- const { callee } = node . callee
10148
102- if (
103- callee . type === 'MemberExpression' &&
104- callee . object . type === 'MemberExpression' &&
105- isTestOrDescribe ( callee . object . object ) &&
106- isOnly ( callee . object . property ) &&
107- callee . property . type === 'Identifier' &&
108- callee . property . name === 'each'
109- ) {
110- const onlyCallee = callee . object . property
49+ const isTestOrDescribe = [ 'it' , 'test' , 'describe' ] . includes (
50+ vitestFnCall . name ,
51+ )
52+
53+ const onlyNode = vitestFnCall . members . find (
54+ ( m ) => getAccessorValue ( m ) === 'only' ,
55+ )
11156
112- context . report ( {
113- node : callee . object . property ,
114- messageId : 'noFocusedTests' ,
115- fix : ( fixer ) =>
116- fixable
117- ? fixer . removeRange ( [
118- onlyCallee . range [ 0 ] - 1 ,
119- onlyCallee . range [ 1 ] ,
120- ] )
121- : null ,
122- } )
123- }
57+ if ( isTestOrDescribe && onlyNode ) {
58+ context . report ( {
59+ node : onlyNode ,
60+ messageId : 'noFocusedTests' ,
61+ fix : ( fixer ) =>
62+ fixable
63+ ? fixer . removeRange ( [ onlyNode . range [ 0 ] - 1 , onlyNode . range [ 1 ] ] )
64+ : null ,
65+ } )
12466 }
12567 } ,
12668 }
0 commit comments