@@ -405,7 +405,18 @@ const transformJSXElement = (
405
405
406
406
const { optimize = false } = state . opts ;
407
407
408
- const slotFlag = path . getData ( 'slotFlag' ) || SlotFlags . STABLE ;
408
+ // #541 - directives can't be resolved in optimized slots
409
+ // all parents should be deoptimized
410
+ if ( directives . length ) {
411
+ let currentPath = path ;
412
+ while ( currentPath . parentPath ?. isJSXElement ( ) ) {
413
+ currentPath = currentPath . parentPath ;
414
+ currentPath . setData ( 'slotFlag' , 0 ) ;
415
+ }
416
+ }
417
+
418
+ const slotFlag = path . getData ( 'slotFlag' ) ?? SlotFlags . STABLE ;
419
+ const optimizeSlots = optimize && slotFlag !== 0 ;
409
420
let VNodeChild ;
410
421
411
422
if ( children . length > 1 || slots ) {
@@ -431,7 +442,7 @@ const transformJSXElement = (
431
442
? ( slots ! as t . ObjectExpression ) . properties
432
443
: [ t . spreadElement ( slots ! ) ]
433
444
: [ ] ) ,
434
- optimize &&
445
+ optimizeSlots &&
435
446
t . objectProperty ( t . identifier ( '_' ) , t . numericLiteral ( slotFlag ) ) ,
436
447
] . filter ( Boolean as any )
437
448
)
@@ -452,7 +463,7 @@ const transformJSXElement = (
452
463
t . arrayExpression ( buildIIFE ( path , [ child ] ) )
453
464
)
454
465
) ,
455
- optimize &&
466
+ optimizeSlots &&
456
467
( t . objectProperty (
457
468
t . identifier ( '_' ) ,
458
469
t . numericLiteral ( slotFlag )
@@ -490,7 +501,7 @@ const transformJSXElement = (
490
501
t . arrayExpression ( buildIIFE ( path , [ slotId ] ) )
491
502
)
492
503
) ,
493
- optimize &&
504
+ optimizeSlots &&
494
505
( t . objectProperty (
495
506
t . identifier ( '_' ) ,
496
507
t . numericLiteral ( slotFlag )
@@ -517,7 +528,7 @@ const transformJSXElement = (
517
528
VNodeChild = t . objectExpression (
518
529
[
519
530
...child . properties ,
520
- optimize &&
531
+ optimizeSlots &&
521
532
t . objectProperty ( t . identifier ( '_' ) , t . numericLiteral ( slotFlag ) ) ,
522
533
] . filter ( Boolean as any )
523
534
) ;
0 commit comments