@@ -26,44 +26,63 @@ const rule: TSESLint.RuleModule<"preferShowAnd" | "preferShowTernary", []> = {
26
26
return node . type === "JSXElement" || node . type === "JSXFragment" ? text : `{${ text } }` ;
27
27
} ;
28
28
29
+ const logicalExpressionHandler = ( node : T . LogicalExpression ) => {
30
+ if ( node . operator === "&&" && EXPENSIVE_TYPES . includes ( node . right . type ) ) {
31
+ context . report ( {
32
+ node,
33
+ messageId : "preferShowAnd" ,
34
+ fix : ( fixer ) =>
35
+ fixer . replaceText (
36
+ node . parent ?. type === "JSXExpressionContainer" &&
37
+ node . parent . parent ?. type === "JSXElement"
38
+ ? node . parent
39
+ : node ,
40
+ `<Show when={${ sourceCode . getText ( node . left ) } }>${ putIntoJSX ( node . right ) } </Show>`
41
+ ) ,
42
+ } ) ;
43
+ }
44
+ } ;
45
+ const conditionalExpressionHandler = ( node : T . ConditionalExpression ) => {
46
+ if (
47
+ EXPENSIVE_TYPES . includes ( node . consequent . type ) ||
48
+ EXPENSIVE_TYPES . includes ( node . alternate . type )
49
+ ) {
50
+ context . report ( {
51
+ node,
52
+ messageId : "preferShowTernary" ,
53
+ fix : ( fixer ) =>
54
+ fixer . replaceText (
55
+ node . parent ?. type === "JSXExpressionContainer" &&
56
+ node . parent . parent ?. type === "JSXElement"
57
+ ? node . parent
58
+ : node ,
59
+ `<Show when={${ sourceCode . getText ( node . test ) } } fallback={${ sourceCode . getText (
60
+ node . alternate
61
+ ) } }>${ putIntoJSX ( node . consequent ) } </Show>`
62
+ ) ,
63
+ } ) ;
64
+ }
65
+ } ;
66
+
29
67
return {
30
- "JSXElement > JSXExpressionContainer > LogicalExpression" : ( node : T . LogicalExpression ) => {
31
- if ( node . operator === "&&" && EXPENSIVE_TYPES . includes ( node . right . type ) ) {
32
- context . report ( {
33
- node,
34
- messageId : "preferShowAnd" ,
35
- fix : ( fixer ) =>
36
- fixer . replaceText (
37
- node . parent ?. type === "JSXExpressionContainer" &&
38
- node . parent . parent ?. type === "JSXElement"
39
- ? node . parent
40
- : node ,
41
- `<Show when={${ sourceCode . getText ( node . left ) } }>${ putIntoJSX ( node . right ) } </Show>`
42
- ) ,
43
- } ) ;
68
+ JSXExpressionContainer ( node ) {
69
+ if ( node . parent ?. type !== "JSXElement" ) {
70
+ return ;
44
71
}
45
- } ,
46
- "JSXElement > JSXExpressionContainer > ConditionalExpression" : (
47
- node : T . ConditionalExpression
48
- ) => {
49
- if (
50
- EXPENSIVE_TYPES . includes ( node . consequent . type ) ||
51
- EXPENSIVE_TYPES . includes ( node . alternate . type )
72
+ if ( node . expression . type === "LogicalExpression" ) {
73
+ logicalExpressionHandler ( node . expression ) ;
74
+ } else if (
75
+ node . expression . type === "ArrowFunctionExpression" &&
76
+ node . expression . body . type === "LogicalExpression"
77
+ ) {
78
+ logicalExpressionHandler ( node . expression . body ) ;
79
+ } else if ( node . expression . type === "ConditionalExpression" ) {
80
+ conditionalExpressionHandler ( node . expression ) ;
81
+ } else if (
82
+ node . expression . type === "ArrowFunctionExpression" &&
83
+ node . expression . body . type === "ConditionalExpression"
52
84
) {
53
- context . report ( {
54
- node,
55
- messageId : "preferShowTernary" ,
56
- fix : ( fixer ) =>
57
- fixer . replaceText (
58
- node . parent ?. type === "JSXExpressionContainer" &&
59
- node . parent . parent ?. type === "JSXElement"
60
- ? node . parent
61
- : node ,
62
- `<Show when={${ sourceCode . getText ( node . test ) } } fallback={${ sourceCode . getText (
63
- node . alternate
64
- ) } }>${ putIntoJSX ( node . consequent ) } </Show>`
65
- ) ,
66
- } ) ;
85
+ conditionalExpressionHandler ( node . expression . body ) ;
67
86
}
68
87
} ,
69
88
} ;
0 commit comments