@@ -7,15 +7,24 @@ use crate::{
7
7
context:: LintContext ,
8
8
rule:: Rule ,
9
9
utils:: {
10
- collect_possible_jest_call_node, parse_general_jest_fn_call, JestFnKind , JestGeneralFnKind ,
11
- MemberExpressionElement , ParsedGeneralJestFnCall , PossibleJestNode ,
10
+ collect_possible_jest_call_node, get_test_plugin_name, parse_general_jest_fn_call,
11
+ JestFnKind , JestGeneralFnKind , MemberExpressionElement , ParsedGeneralJestFnCall ,
12
+ PossibleJestNode , TestPluginName ,
12
13
} ,
13
14
} ;
14
15
15
- fn no_focused_tests_diagnostic ( span0 : Span ) -> OxcDiagnostic {
16
- OxcDiagnostic :: warn ( "eslint-plugin-jest(no-focused-tests): Unexpected focused test." )
17
- . with_help ( "Remove focus from test." )
18
- . with_label ( span0)
16
+ fn no_focused_tests_diagnostic ( span0 : Span , x1 : TestPluginName ) -> OxcDiagnostic {
17
+ match x1 {
18
+ TestPluginName :: Jest => {
19
+ OxcDiagnostic :: warn ( format ! ( "{x1}(no-focused-tests): Unexpected focused test." ) )
20
+ . with_help ( "Remove focus from test." )
21
+ . with_label ( span0)
22
+ }
23
+ TestPluginName :: Vitest => {
24
+ OxcDiagnostic :: warn ( format ! ( "{x1}(no-focused-tests): Focused tests are not allowed." ) )
25
+ . with_label ( span0)
26
+ }
27
+ }
19
28
}
20
29
21
30
#[ derive( Debug , Default , Clone ) ]
@@ -49,19 +58,35 @@ declare_oxc_lint!(
49
58
/// table
50
59
/// `();
51
60
/// ```
61
+ ///
62
+ /// This rule is compatible with [eslint-plugin-vitest](https://github.com/veritem/eslint-plugin-vitest/blob/main/docs/rules/no-focused-tests.md),
63
+ /// to use it, add the following configuration to your `.eslintrc.json`:
64
+ ///
65
+ /// ```json
66
+ /// {
67
+ /// "rules": {
68
+ /// "vitest/no-focused-tests": "error"
69
+ /// }
70
+ /// }
71
+ /// ```
52
72
NoFocusedTests ,
53
73
correctness
54
74
) ;
55
75
56
76
impl Rule for NoFocusedTests {
57
77
fn run_once ( & self , ctx : & LintContext ) {
78
+ let plugin_name = get_test_plugin_name ( ctx) ;
58
79
for node in & collect_possible_jest_call_node ( ctx) {
59
- run ( node, ctx) ;
80
+ run ( node, plugin_name , ctx) ;
60
81
}
61
82
}
62
83
}
63
84
64
- fn run < ' a > ( possible_jest_node : & PossibleJestNode < ' a , ' _ > , ctx : & LintContext < ' a > ) {
85
+ fn run < ' a > (
86
+ possible_jest_node : & PossibleJestNode < ' a , ' _ > ,
87
+ plugin_name : TestPluginName ,
88
+ ctx : & LintContext < ' a > ,
89
+ ) {
65
90
let node = possible_jest_node. node ;
66
91
let AstKind :: CallExpression ( call_expr) = node. kind ( ) else {
67
92
return ;
@@ -75,30 +100,40 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>)
75
100
}
76
101
77
102
if name. starts_with ( 'f' ) {
78
- ctx. diagnostic_with_fix ( no_focused_tests_diagnostic ( call_expr. span ) , |fixer| {
79
- fixer. delete_range ( Span :: sized ( call_expr. span . start , 1 ) )
80
- } ) ;
103
+ ctx. diagnostic_with_fix (
104
+ no_focused_tests_diagnostic (
105
+ Span :: new (
106
+ call_expr. span . start ,
107
+ call_expr. span . start + u32:: try_from ( name. len ( ) ) . unwrap_or ( 1 ) ,
108
+ ) ,
109
+ plugin_name,
110
+ ) ,
111
+ |fixer| fixer. delete_range ( Span :: sized ( call_expr. span . start , 1 ) ) ,
112
+ ) ;
81
113
82
114
return ;
83
115
}
84
116
85
117
let only_node = members. iter ( ) . find ( |member| member. is_name_equal ( "only" ) ) ;
86
118
if let Some ( only_node) = only_node {
87
- ctx. diagnostic_with_fix ( no_focused_tests_diagnostic ( call_expr. span ) , |fixer| {
88
- let mut span = only_node. span . expand_left ( 1 ) ;
89
- if !matches ! ( only_node. element, MemberExpressionElement :: IdentName ( _) ) {
90
- span = span. expand_right ( 1 ) ;
91
- }
92
- fixer. delete_range ( span)
93
- } ) ;
119
+ ctx. diagnostic_with_fix (
120
+ no_focused_tests_diagnostic ( only_node. span , plugin_name) ,
121
+ |fixer| {
122
+ let mut span = only_node. span . expand_left ( 1 ) ;
123
+ if !matches ! ( only_node. element, MemberExpressionElement :: IdentName ( _) ) {
124
+ span = span. expand_right ( 1 ) ;
125
+ }
126
+ fixer. delete_range ( span)
127
+ } ,
128
+ ) ;
94
129
}
95
130
}
96
131
97
132
#[ test]
98
133
fn test ( ) {
99
134
use crate :: tester:: Tester ;
100
135
101
- let pass = vec ! [
136
+ let mut pass = vec ! [
102
137
( "describe()" , None ) ,
103
138
( "it()" , None ) ,
104
139
( "describe.skip()" , None ) ,
@@ -114,7 +149,7 @@ fn test() {
114
149
( "test.concurrent()" , None ) ,
115
150
] ;
116
151
117
- let fail = vec ! [
152
+ let mut fail = vec ! [
118
153
( "describe.only()" , None ) ,
119
154
// TODO: this need set setting like `settings: { jest: { globalAliases: { describe: ['context'] } } },`
120
155
// ("context.only()", None),
@@ -137,12 +172,47 @@ fn test() {
137
172
( "fit.each`table`()" , None ) ,
138
173
] ;
139
174
140
- let fix = vec ! [
175
+ let mut fix = vec ! [
141
176
( "describe.only('foo', () => {})" , "describe('foo', () => {})" , None ) ,
142
177
( "describe['only']('foo', () => {})" , "describe('foo', () => {})" , None ) ,
143
178
( "fdescribe('foo', () => {})" , "describe('foo', () => {})" , None ) ,
144
179
] ;
145
180
181
+ let pass_vitest = vec ! [
182
+ ( r#"it("test", () => {});"# , None ) ,
183
+ ( r#"describe("test group", () => {});"# , None ) ,
184
+ ( r#"it("test", () => {});"# , None ) ,
185
+ ( r#"describe("test group", () => {});"# , None ) ,
186
+ ] ;
187
+
188
+ let fail_vitest = vec ! [
189
+ (
190
+ r#"
191
+ import { it } from 'vitest';
192
+ it.only("test", () => {});
193
+ "# ,
194
+ None ,
195
+ ) ,
196
+ ( r#"describe.only("test", () => {});"# , None ) ,
197
+ ( r#"test.only("test", () => {});"# , None ) ,
198
+ ( r#"it.only.each([])("test", () => {});"# , None ) ,
199
+ ( r#"test.only.each``("test", () => {});"# , None ) ,
200
+ ( r#"it.only.each``("test", () => {});"# , None ) ,
201
+ ] ;
202
+
203
+ let fix_vitest = vec ! [
204
+ ( r#"it.only("test", () => {});"# , r#"it("test", () => {});"# , None ) ,
205
+ ( r#"describe.only("test", () => {});"# , r#"describe("test", () => {});"# , None ) ,
206
+ ( r#"test.only("test", () => {});"# , r#"test("test", () => {});"# , None ) ,
207
+ ( r#"it.only.each([])("test", () => {});"# , r#"it.each([])("test", () => {});"# , None ) ,
208
+ ( r#"test.only.each``("test", () => {});"# , r#"test.each``("test", () => {});"# , None ) ,
209
+ ( r#"it.only.each``("test", () => {});"# , r#"it.each``("test", () => {});"# , None ) ,
210
+ ] ;
211
+
212
+ pass. extend ( pass_vitest) ;
213
+ fail. extend ( fail_vitest) ;
214
+ fix. extend ( fix_vitest) ;
215
+
146
216
Tester :: new ( NoFocusedTests :: NAME , pass, fail)
147
217
. with_jest_plugin ( true )
148
218
. expect_fix ( fix)
0 commit comments