Skip to content

Commit 4ea8a5e

Browse files
authored
chore: add derived effect ownership tests (#11538)
* chore: add derived effect ownership tests * chore: add derived effect ownership tests
1 parent f219c79 commit 4ea8a5e

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

packages/svelte/src/internal/client/reactivity/deriveds.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ export function update_derived(derived, force_schedule) {
121121
*/
122122
export function destroy_derived(signal) {
123123
destroy_derived_children(signal);
124-
destroy_effect_children(signal);
125124
remove_reactions(signal, 0);
126125
set_signal_status(signal, DESTROYED);
127126

packages/svelte/tests/signals/test.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
user_effect
99
} from '../../src/internal/client/reactivity/effects';
1010
import { source, set } from '../../src/internal/client/reactivity/sources';
11-
import type { Derived } from '../../src/internal/client/types';
11+
import type { Derived, Value } from '../../src/internal/client/types';
1212
import { proxy } from '../../src/internal/client/proxy';
1313
import { derived } from '../../src/internal/client/reactivity/deriveds';
1414

@@ -376,4 +376,51 @@ describe('signals', () => {
376376
assert.equal(teardown, 1);
377377
};
378378
});
379+
380+
test('creating effects within a derived correctly handles ownership', () => {
381+
const log: Array<number | string> = [];
382+
let a: Value<unknown>;
383+
let inner: Value<string | number>;
384+
let outer: Value<string | number>;
385+
386+
const destroy = effect_root(() => {
387+
inner = source(0);
388+
outer = source(0);
389+
390+
render_effect(() => {
391+
a = derived(() => {
392+
log.push('outer', $.get(outer));
393+
effect(() => {
394+
log.push('inner', $.get(inner));
395+
});
396+
});
397+
});
398+
});
399+
400+
return () => {
401+
flushSync(() => {
402+
$.get(a);
403+
});
404+
assert.deepEqual(log, ['outer', 0, 'inner', 0]);
405+
log.length = 0;
406+
flushSync(() => {
407+
set(inner, 1);
408+
$.get(a);
409+
});
410+
assert.deepEqual(log, ['inner', 1]);
411+
log.length = 0;
412+
flushSync(() => {
413+
set(outer, 1);
414+
$.get(a);
415+
});
416+
assert.deepEqual(log, ['outer', 1, 'inner', 1]);
417+
log.length = 0;
418+
flushSync(() => {
419+
set(inner, 2);
420+
$.get(a);
421+
});
422+
assert.deepEqual(log, ['inner', 2]);
423+
destroy();
424+
};
425+
});
379426
});

0 commit comments

Comments
 (0)