@@ -79,6 +79,13 @@ const rule = {
7979 } ) ;
8080 }
8181 } ;
82+ /** Helper to validate string literal class names */
83+ const validateStringLiteral = ( value , node ) => {
84+ const classNames = value . split ( / \s + / ) ;
85+ classNames . forEach ( ( className ) => {
86+ validate ( className , node ) ;
87+ } ) ;
88+ } ;
8289 /** Helper to validate class names in object expressions */
8390 const validateObjectExpression = ( objExpr ) => {
8491 objExpr . properties . forEach ( ( prop ) => {
@@ -93,17 +100,36 @@ const rule = {
93100 // We ignore SpreadElement as it can't contain class names directly
94101 } ) ;
95102 } ;
103+ /** Helper to validate expressions that might contain class names */
104+ const validateExpression = ( expr ) => {
105+ switch ( expr . type ) {
106+ case 'Literal' :
107+ if ( typeof expr . value === 'string' ) {
108+ validateStringLiteral ( expr . value , expr ) ;
109+ }
110+ break ;
111+ case 'ObjectExpression' :
112+ validateObjectExpression ( expr ) ;
113+ break ;
114+ case 'ConditionalExpression' :
115+ // Handle ternary expressions: condition ? 'class1' : 'class2'
116+ validateExpression ( expr . consequent ) ;
117+ validateExpression ( expr . alternate ) ;
118+ break ;
119+ case 'LogicalExpression' :
120+ // Handle logical expressions: condition && 'class1'
121+ validateExpression ( expr . right ) ;
122+ break ;
123+ }
124+ } ;
96125 return {
97126 // Check JSX className attributes
98127 JSXAttribute ( node ) {
99128 var _a , _b , _c ;
100129 if ( node . name . type === 'JSXIdentifier' &&
101130 ( ( _a = options . classAttributes ) === null || _a === void 0 ? void 0 : _a . includes ( node . name . name ) ) ) {
102131 if ( ( ( _b = node . value ) === null || _b === void 0 ? void 0 : _b . type ) === 'Literal' && typeof node . value . value === 'string' ) {
103- const classNames = node . value . value . split ( / \s + / ) ;
104- classNames . forEach ( ( className ) => {
105- validate ( className , node ) ;
106- } ) ;
132+ validateStringLiteral ( node . value . value , node ) ;
107133 }
108134 else if ( ( ( _c = node . value ) === null || _c === void 0 ? void 0 : _c . type ) === 'JSXExpressionContainer' ) {
109135 const expr = node . value . expression ;
@@ -119,15 +145,7 @@ const rule = {
119145 if ( node . callee . type === 'Identifier' &&
120146 ( ( _a = options . classFunctions ) === null || _a === void 0 ? void 0 : _a . includes ( node . callee . name ) ) ) {
121147 node . arguments . forEach ( ( arg ) => {
122- if ( arg . type === 'Literal' && typeof arg . value === 'string' ) {
123- const classNames = arg . value . split ( / \s + / ) ;
124- classNames . forEach ( ( className ) => {
125- validate ( className , arg ) ;
126- } ) ;
127- }
128- else if ( arg . type === 'ObjectExpression' ) {
129- validateObjectExpression ( arg ) ;
130- }
148+ validateExpression ( arg ) ;
131149 } ) ;
132150 }
133151 } ,
0 commit comments