@@ -22,9 +22,26 @@ fn jsx_fragments_diagnostic(span: Span, mode: FragmentMode) -> OxcDiagnostic {
2222 OxcDiagnostic :: warn ( msg) . with_help ( help) . with_label ( span)
2323}
2424
25- #[ derive( Debug , Default , Clone ) ]
26- pub struct JsxFragments {
27- mode : FragmentMode ,
25+ #[ derive( Debug , Clone , JsonSchema , Deserialize ) ]
26+ #[ serde( untagged) ]
27+ pub enum JsxFragments {
28+ Mode ( FragmentMode ) ,
29+ Object { mode : FragmentMode } ,
30+ }
31+
32+ impl Default for JsxFragments {
33+ fn default ( ) -> Self {
34+ JsxFragments :: Mode ( FragmentMode :: Syntax )
35+ }
36+ }
37+
38+ impl JsxFragments {
39+ fn mode ( & self ) -> FragmentMode {
40+ match self {
41+ JsxFragments :: Mode ( m) => * m,
42+ JsxFragments :: Object { mode } => * mode,
43+ }
44+ }
2845}
2946
3047#[ derive( Debug , Default , Clone , PartialEq , Eq , Copy , JsonSchema , Deserialize , Serialize ) ]
@@ -66,12 +83,6 @@ pub enum FragmentMode {
6683 Element ,
6784}
6885
69- impl From < & str > for FragmentMode {
70- fn from ( value : & str ) -> Self {
71- if value == "element" { Self :: Element } else { Self :: Syntax }
72- }
73- }
74-
7586declare_oxc_lint ! (
7687 /// ### What it does
7788 ///
@@ -91,18 +102,18 @@ impl Rule for JsxFragments {
91102 // Generally we should prefer the string-only syntax for compatibility with the original ESLint rule,
92103 // but we originally implemented the rule with only the object syntax, so we support both now.
93104 fn from_configuration ( value : Value ) -> Self {
94- Self {
95- mode : value
96- . get ( 0 )
97- . and_then ( |v| v . as_str ( ) . or_else ( || v . get ( "mode" ) . and_then ( Value :: as_str ) ) )
98- . map ( FragmentMode :: from )
99- . unwrap_or_default ( ) ,
100- }
105+ // We expect configuration to be an array with a single argument like ["syntax"] or [{"mode":"element"}]
106+ // Take the first element and deserialize that into our helper enum which supports both forms.
107+ value
108+ . get ( 0 )
109+ . cloned ( )
110+ . and_then ( |v| serde_json :: from_value :: < JsxFragments > ( v ) . ok ( ) )
111+ . unwrap_or_default ( )
101112 }
102113
103114 fn run < ' a > ( & self , node : & AstNode < ' a > , ctx : & LintContext < ' a > ) {
104115 match node. kind ( ) {
105- AstKind :: JSXElement ( jsx_elem) if self . mode == FragmentMode :: Syntax => {
116+ AstKind :: JSXElement ( jsx_elem) if self . mode ( ) == FragmentMode :: Syntax => {
106117 let Some ( closing_element) = & jsx_elem. closing_element else {
107118 return ;
108119 } ;
@@ -112,7 +123,7 @@ impl Rule for JsxFragments {
112123 return ;
113124 }
114125 ctx. diagnostic_with_fix (
115- jsx_fragments_diagnostic ( jsx_elem. opening_element . name . span ( ) , self . mode ) ,
126+ jsx_fragments_diagnostic ( jsx_elem. opening_element . name . span ( ) , self . mode ( ) ) ,
116127 |fixer| {
117128 let before_opening_tag = ctx. source_range ( Span :: new (
118129 jsx_elem. span ( ) . start ,
@@ -136,9 +147,9 @@ impl Rule for JsxFragments {
136147 } ,
137148 ) ;
138149 }
139- AstKind :: JSXFragment ( jsx_frag) if self . mode == FragmentMode :: Element => {
150+ AstKind :: JSXFragment ( jsx_frag) if self . mode ( ) == FragmentMode :: Element => {
140151 ctx. diagnostic_with_fix (
141- jsx_fragments_diagnostic ( jsx_frag. opening_fragment . span ( ) , self . mode ) ,
152+ jsx_fragments_diagnostic ( jsx_frag. opening_fragment . span ( ) , self . mode ( ) ) ,
142153 |fixer| {
143154 let before_opening_tag = ctx. source_range ( Span :: new (
144155 jsx_frag. span ( ) . start ,
0 commit comments