@esportsplus/reactivity 0.36.4 → 0.36.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/system.js CHANGED
@@ -679,7 +679,12 @@ const read = (node) => {
679
679
  }
680
680
  let height = node.height;
681
681
  if (height >= observer.height) {
682
+ let queued = observer.state & STATE_IN_HEAP;
683
+ if (queued)
684
+ deleteFromHeap(observer);
682
685
  observer.height = height + 1;
686
+ if (queued)
687
+ insertIntoHeap(observer);
683
688
  }
684
689
  if (height >= heap_i || node.state & STATE_NOTIFY_MASK) {
685
690
  pull(node);
package/package.json CHANGED
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "type": "module",
38
38
  "types": "build/index.d.ts",
39
- "version": "0.36.4",
39
+ "version": "0.36.5",
40
40
  "scripts": {
41
41
  "agent:bench": "vitest bench --run",
42
42
  "agent:test": "tsc --noEmit && vitest run",
package/src/system.ts CHANGED
@@ -1006,7 +1006,11 @@ const read = <T>(node: Signal<T> | Computed<T>): T => {
1006
1006
  let height = (node as Computed<T>).height;
1007
1007
 
1008
1008
  if (height >= observer.height) {
1009
+ let queued = observer.state & STATE_IN_HEAP;
1010
+
1011
+ if (queued) deleteFromHeap(observer);
1009
1012
  observer.height = height + 1;
1013
+ if (queued) insertIntoHeap(observer);
1010
1014
  }
1011
1015
 
1012
1016
  if (height >= heap_i || (node as Computed<T>).state & STATE_NOTIFY_MASK) {
@@ -1,8 +1,56 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { batch, computed, effect, flush, read, signal, write } from '~/system';
2
+ import { batch, computed, effect, flush, read, root, signal, write } from '~/system';
3
3
 
4
4
 
5
5
  describe('flush()', () => {
6
+ it('settles a requeued effect that discovers a deeper computed dependency', () => {
7
+ let runs = 0,
8
+ values: number[] = [],
9
+ trigger = signal(false),
10
+ source = signal(1);
11
+
12
+ let dispose = root((dispose) => {
13
+ let deep = computed(() => read(source));
14
+
15
+ for (let i = 0; i < 4; i++) {
16
+ let previous = deep;
17
+ deep = computed(() => read(previous) + 1);
18
+ }
19
+
20
+ effect(() => {
21
+ runs++;
22
+
23
+ if (read(trigger)) {
24
+ write(trigger, false);
25
+ values.push(read(deep));
26
+ }
27
+ });
28
+
29
+ return dispose;
30
+ });
31
+
32
+ try {
33
+ write(trigger, true);
34
+ flush();
35
+
36
+ expect(runs).toBe(3);
37
+ expect(values).toEqual([5]);
38
+
39
+ write(trigger, true);
40
+ flush();
41
+
42
+ expect(runs).toBe(5);
43
+ expect(values).toEqual([5, 5]);
44
+ }
45
+ finally {
46
+ dispose();
47
+ }
48
+
49
+ write(trigger, true);
50
+ flush();
51
+ expect(runs).toBe(5);
52
+ });
53
+
6
54
  it('runs the dependent effect synchronously before returning', () => {
7
55
  let runs = 0,
8
56
  s = signal(0);