|
8 | 8 | user_effect
|
9 | 9 | } from '../../src/internal/client/reactivity/effects';
|
10 | 10 | 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'; |
12 | 12 | import { proxy } from '../../src/internal/client/proxy';
|
13 | 13 | import { derived } from '../../src/internal/client/reactivity/deriveds';
|
14 | 14 |
|
@@ -376,4 +376,51 @@ describe('signals', () => {
|
376 | 376 | assert.equal(teardown, 1);
|
377 | 377 | };
|
378 | 378 | });
|
| 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 | + }); |
379 | 426 | });
|
0 commit comments