@@ -224,7 +224,7 @@ function transformJsx(code: string, node: JSX) {
224
224
}
225
225
}
226
226
227
- function resolveExpression ( node : Node ) : EvaluatedValue {
227
+ function resolveExpression ( node : Node , parent ?: Node ) : EvaluatedValue {
228
228
if ( isLiteral ( node ) ) {
229
229
return resolveLiteral ( node )
230
230
} else if ( isJSX ( node ) ) {
@@ -242,35 +242,39 @@ function transformJsx(code: string, node: JSX) {
242
242
case 'UnaryExpression' :
243
243
return resolveUnaryExpression ( node )
244
244
case 'ConditionalExpression' :
245
- return resolveExpression ( node . test )
246
- ? resolveExpression ( node . consequent )
247
- : resolveExpression ( node . alternate )
245
+ return resolveExpression ( node . test , node )
246
+ ? resolveExpression ( node . consequent , node )
247
+ : resolveExpression ( node . alternate , node )
248
248
case 'SequenceExpression' : {
249
249
const expressions = node . expressions . map ( ( expr ) =>
250
- resolveExpression ( expr )
250
+ resolveExpression ( expr , node )
251
251
)
252
252
return expressions . slice ( - 1 ) [ 0 ]
253
253
}
254
254
case 'TSNonNullExpression' :
255
- return resolveExpression ( node . expression )
255
+ return resolveExpression ( node . expression , node )
256
256
case 'CallExpression' :
257
- return resolveCallExpression ( node )
257
+ return resolveCallExpression ( node , ! parent )
258
258
default :
259
259
return notSupported ( node )
260
260
}
261
261
}
262
262
263
- function resolveCallExpression ( node : CallExpression ) {
264
- if ( node . callee . type === 'Identifier' && node . callee . name === 'jsxRaw' ) {
263
+ function resolveCallExpression ( node : CallExpression , isTopLevel : boolean ) {
264
+ if (
265
+ isTopLevel &&
266
+ node . callee . type === 'Identifier' &&
267
+ node . callee . name === 'jsxRaw'
268
+ ) {
265
269
return `__RAW_${ getSource ( node . arguments [ 0 ] ) } _RAW`
266
270
}
267
271
268
272
return notSupported ( node )
269
273
}
270
274
271
275
function resolveBinary ( node : Binary ) {
272
- const left : any = resolveExpression ( node . left )
273
- const right : any = resolveExpression ( node . right )
276
+ const left : any = resolveExpression ( node . left , node )
277
+ const right : any = resolveExpression ( node . right , node )
274
278
switch ( node . operator ) {
275
279
case '+' :
276
280
return left + right
@@ -341,7 +345,7 @@ function transformJsx(code: string, node: JSX) {
341
345
}
342
346
343
347
function resolveUnaryExpression ( node : UnaryExpression ) {
344
- const value : any = resolveExpression ( node . argument )
348
+ const value : any = resolveExpression ( node . argument , node )
345
349
switch ( node . operator ) {
346
350
case '!' :
347
351
return ! value
@@ -385,7 +389,7 @@ function transformJsx(code: string, node: JSX) {
385
389
function resolveArrayExpression ( node : ArrayExpression ) {
386
390
const items : any [ ] = [ ]
387
391
for ( const [ i , element ] of node . elements . entries ( ) ) {
388
- if ( element ) items [ i ] = resolveExpression ( element )
392
+ if ( element ) items [ i ] = resolveExpression ( element , node )
389
393
}
390
394
return items
391
395
}
@@ -399,10 +403,10 @@ function transformJsx(code: string, node: JSX) {
399
403
if ( isIdentifier ( prop . key ) && ! prop . computed ) {
400
404
key = prop . key . name
401
405
} else {
402
- key = resolveExpression ( prop . key )
406
+ key = resolveExpression ( prop . key , prop )
403
407
}
404
408
405
- obj [ key ] = resolveExpression ( prop . value )
409
+ obj [ key ] = resolveExpression ( prop . value , prop )
406
410
}
407
411
408
412
return obj
@@ -412,7 +416,9 @@ function transformJsx(code: string, node: JSX) {
412
416
return node . quasis . reduce ( ( prev , curr , idx ) => {
413
417
if ( node . expressions [ idx ] ) {
414
418
return (
415
- prev + curr . value . cooked + resolveExpression ( node . expressions [ idx ] )
419
+ prev +
420
+ curr . value . cooked +
421
+ resolveExpression ( node . expressions [ idx ] , node )
416
422
)
417
423
}
418
424
return prev + curr . value . cooked
0 commit comments