@@ -1563,4 +1563,91 @@ describe('signals', () => {
15631563 assert . ok ( isClean , 'derived with no deps should be CLEAN' ) ;
15641564 } ;
15651565 } ) ;
1566+
1567+ // reproduction of issue #17352
1568+ test ( 'nested deriveds with parent-child dependencies stay reactive' , ( ) => {
1569+ const log : any [ ] = [ ] ;
1570+
1571+ return ( ) => {
1572+ const expanded_ids = new SvelteSet < string > ( ) ;
1573+ const nodes = proxy ( [
1574+ {
1575+ id : 'folder' ,
1576+ children : [ { id : 'file' } ]
1577+ } ,
1578+ { id : 'other' }
1579+ ] ) ;
1580+
1581+ let items_derived : Derived < any [ ] > ;
1582+ let visible_items_derived : Derived < any [ ] > ;
1583+
1584+ const destroy = effect_root ( ( ) => {
1585+ items_derived = derived ( function create_items (
1586+ list : any [ ] = nodes ,
1587+ parent ?: any ,
1588+ result : any [ ] = [ ]
1589+ ) {
1590+ for ( const node of list ) {
1591+ const expanded_d = derived ( ( ) => expanded_ids . has ( node . id ) ) ;
1592+ const visible_d = derived ( ( ) =>
1593+ parent === undefined ? true : $ . get ( parent . expanded_d ) && $ . get ( parent . visible_d )
1594+ ) ;
1595+
1596+ const item = {
1597+ node,
1598+ expanded_d,
1599+ visible_d,
1600+ get expanded ( ) {
1601+ return $ . get ( expanded_d ) ;
1602+ } ,
1603+ get visible ( ) {
1604+ return $ . get ( visible_d ) ;
1605+ }
1606+ } ;
1607+ result . push ( item ) ;
1608+
1609+ if ( node . children ) {
1610+ create_items ( node . children , item , result ) ;
1611+ }
1612+ }
1613+ return result ;
1614+ } ) ;
1615+
1616+ visible_items_derived = derived ( ( ) => $ . get ( items_derived ) . filter ( ( item ) => item . visible ) ) ;
1617+
1618+ render_effect ( ( ) => {
1619+ log . push ( $ . get ( visible_items_derived ) . length ) ;
1620+ } ) ;
1621+ } ) ;
1622+
1623+ flushSync ( ) ;
1624+ assert . deepEqual ( log , [ 2 ] , 'initial: folder and other visible' ) ;
1625+
1626+ expanded_ids . add ( 'folder' ) ;
1627+ flushSync ( ) ;
1628+ assert . deepEqual ( log , [ 2 , 3 ] , 'after expand: folder, file, other visible' ) ;
1629+
1630+ expanded_ids . delete ( 'folder' ) ;
1631+ flushSync ( ) ;
1632+ assert . deepEqual ( log , [ 2 , 3 , 2 ] , 'after collapse' ) ;
1633+
1634+ nodes . splice ( 1 , 1 ) ; // Remove 'other'
1635+
1636+ const snapshot = $ . get ( visible_items_derived ! ) ;
1637+ assert . equal ( snapshot . length , 1 , 'after delete: only folder visible' ) ;
1638+
1639+ flushSync ( ) ;
1640+ assert . deepEqual ( log , [ 2 , 3 , 2 , 1 ] , 'effect ran after delete' ) ;
1641+
1642+ expanded_ids . add ( 'folder' ) ;
1643+ flushSync ( ) ;
1644+ assert . deepEqual (
1645+ log ,
1646+ [ 2 , 3 , 2 , 1 , 2 ] ,
1647+ 'after expand post-delete: folder and file should be visible'
1648+ ) ;
1649+
1650+ destroy ( ) ;
1651+ } ;
1652+ } ) ;
15661653} ) ;
0 commit comments