Skip to content

Commit 437ad4c

Browse files
committed
add test case for #17352
1 parent d117320 commit 437ad4c

File tree

1 file changed

+87
-0
lines changed
  • packages/svelte/tests/signals

1 file changed

+87
-0
lines changed

packages/svelte/tests/signals/test.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)