@solidjs/signals 2.0.0-rc.15 → 2.0.0-rc.17

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.
Files changed (90) hide show
  1. package/dist/dev-shared.js +2268 -1734
  2. package/dist/dev.attribution.js +75 -52
  3. package/dist/dev.js +1348 -658
  4. package/dist/observe/affects-marks.js +86 -0
  5. package/dist/observe/affects.js +22 -73
  6. package/dist/observe/boundaries.js +192 -190
  7. package/dist/observe/core/async.js +177 -131
  8. package/dist/observe/core/attribution-queries.js +1 -1
  9. package/dist/observe/core/attribution.js +176 -159
  10. package/dist/observe/core/constants.js +17 -3
  11. package/dist/observe/core/context.js +5 -3
  12. package/dist/observe/core/core.js +520 -364
  13. package/dist/observe/core/dev.js +66 -38
  14. package/dist/observe/core/effect.js +50 -48
  15. package/dist/observe/core/error.js +5 -3
  16. package/dist/observe/core/external.js +5 -6
  17. package/dist/observe/core/graph.js +60 -44
  18. package/dist/observe/core/heap.js +33 -33
  19. package/dist/observe/core/identities.js +62 -0
  20. package/dist/observe/core/lanes.js +238 -260
  21. package/dist/observe/core/owner.js +117 -79
  22. package/dist/observe/core/scheduler.js +381 -217
  23. package/dist/observe/core/truth.js +45 -0
  24. package/dist/observe/core/verdict.js +91 -50
  25. package/dist/observe/deferred.js +184 -0
  26. package/dist/observe/index.js +7 -1
  27. package/dist/observe/map.js +345 -260
  28. package/dist/observe/reveal.js +76 -76
  29. package/dist/observe/signals.js +47 -31
  30. package/dist/observe/store/affects.js +18 -18
  31. package/dist/observe/store/edges.js +39 -0
  32. package/dist/observe/store/optimistic.js +146 -100
  33. package/dist/observe/store/projection.js +68 -55
  34. package/dist/observe/store/store.js +180 -118
  35. package/dist/prod/affects-marks.js +86 -0
  36. package/dist/prod/affects.js +23 -72
  37. package/dist/prod/boundaries.js +156 -154
  38. package/dist/prod/core/async.js +173 -127
  39. package/dist/prod/core/constants.js +17 -3
  40. package/dist/prod/core/context.js +5 -3
  41. package/dist/prod/core/core.js +495 -343
  42. package/dist/prod/core/effect.js +70 -68
  43. package/dist/prod/core/error.js +5 -3
  44. package/dist/prod/core/external.js +5 -6
  45. package/dist/prod/core/graph.js +60 -44
  46. package/dist/prod/core/heap.js +38 -38
  47. package/dist/prod/core/identities.js +62 -0
  48. package/dist/prod/core/lanes.js +230 -252
  49. package/dist/prod/core/owner.js +114 -77
  50. package/dist/prod/core/scheduler.js +327 -163
  51. package/dist/prod/core/truth.js +45 -0
  52. package/dist/prod/core/verdict.js +90 -49
  53. package/dist/prod/deferred.js +182 -0
  54. package/dist/prod/index.js +7 -1
  55. package/dist/prod/map.js +360 -275
  56. package/dist/prod/reveal.js +76 -76
  57. package/dist/prod/signals.js +42 -26
  58. package/dist/prod/store/affects.js +6 -6
  59. package/dist/prod/store/edges.js +39 -0
  60. package/dist/prod/store/optimistic.js +143 -98
  61. package/dist/prod/store/projection.js +25 -19
  62. package/dist/prod/store/store.js +157 -100
  63. package/dist/types/affects-marks.d.ts +14 -0
  64. package/dist/types/boundaries.d.ts +1 -1
  65. package/dist/types/core/async.d.ts +10 -0
  66. package/dist/types/core/constants.d.ts +13 -1
  67. package/dist/types/core/core.d.ts +54 -5
  68. package/dist/types/core/dev.d.ts +51 -13
  69. package/dist/types/core/error.d.ts +9 -1
  70. package/dist/types/core/graph.d.ts +11 -0
  71. package/dist/types/core/identities.d.ts +17 -0
  72. package/dist/types/core/index.d.ts +2 -1
  73. package/dist/types/core/lanes.d.ts +2 -14
  74. package/dist/types/core/owner.d.ts +9 -3
  75. package/dist/types/core/scheduler.d.ts +70 -32
  76. package/dist/types/core/truth.d.ts +16 -0
  77. package/dist/types/core/types.d.ts +21 -0
  78. package/dist/types/core/verdict.d.ts +32 -0
  79. package/dist/types/deferred.d.ts +28 -0
  80. package/dist/types/index.d.ts +6 -0
  81. package/dist/types/map.d.ts +2 -2
  82. package/dist/types/signals.d.ts +28 -7
  83. package/dist/types/store/edges.d.ts +9 -0
  84. package/dist/types/store/index.d.ts +10 -3
  85. package/dist/types/store/optimistic.d.ts +3 -2
  86. package/dist/types/store/projection.d.ts +4 -3
  87. package/dist/types/store/store.d.ts +1 -1
  88. package/dist/types/store/target.d.ts +16 -8
  89. package/dist/types/store/types.d.ts +14 -0
  90. package/package.json +1 -1
@@ -32,124 +32,124 @@ const SEQUENTIAL_ACCESSOR = () => "sequential";
32
32
 
33
33
  const isController = t => t instanceof RevealController;
34
34
 
35
- const slotReady = t => isController(t) ? t.Rt() : ready(t);
35
+ const slotReady = t => isController(t) ? t.St() : ready(t);
36
36
 
37
- const slotMinReady = t => isController(t) ? t.Ct() : ready(t);
37
+ const slotMinReady = t => isController(t) ? t.Rt() : ready(t);
38
38
 
39
39
  /** Force a slot's state. A boundary re-derives its output when it changes;
40
40
  * a nested controller passes the state on to its own slots. Released
41
41
  * (`!gated`), a nested controller leaves its parent's ownership and runs its
42
42
  * own order; a boundary leaves when it has shown content (boundaries.ts). */ function setSlotState(t, e, s, r) {
43
43
  if (isController(t)) {
44
- t.ne = s;
45
- t.re = r;
46
- t.vt();
44
+ t.$ = s;
45
+ t.ee = r;
46
+ t._t();
47
47
  // Released and ready — every slot of its own has shown — it graduates,
48
48
  // as a boundary does when it shows content. Released at the frontier
49
49
  // but not ready, it stays the parent's frontier.
50
- if (!s && t.Lt && t._parent === e) t._parent = null;
50
+ if (!s && t.Ct && t._parent === e) t._parent = null;
51
51
  return;
52
52
  }
53
- if (t.ne !== s || t.re !== r) {
54
- t.ne = s;
55
- t.re = r;
53
+ if (t.$ !== s || t.ee !== r) {
54
+ t.$ = s;
55
+ t.ee = r;
56
56
  redraw(t);
57
57
  }
58
58
  }
59
59
 
60
60
  class RevealController {
61
- qt;
62
- Vt;
63
- Ft=[];
61
+ yt;
62
+ Et;
63
+ At=[];
64
64
  /** The controller gating this one, until it releases this one. */
65
65
  _parent=null;
66
66
  /** The state a parent forces on this whole group. */
67
- ne=false;
68
- re=false;
69
- Lt=true;
70
- Qt=true;
71
- Tt=false;
67
+ $=false;
68
+ ee=false;
69
+ Ct=true;
70
+ kt=true;
71
+ vt=false;
72
72
  constructor(t, e) {
73
- this.qt = t;
74
- this.Vt = e;
73
+ this.yt = t;
74
+ this.Et = e;
75
75
  }
76
76
  /** A slot that has left this controller's ownership: a boundary that has
77
77
  * shown content, a nested group that is ready. Shown is shown — it counts
78
- * as ready whatever happens to it later (a re-arm gates nobody else). */ Ut(t) {
79
- return (isController(t) ? t._parent : t.H) !== this;
78
+ * as ready whatever happens to it later (a re-arm gates nobody else). */ gt(t) {
79
+ return (isController(t) ? t._parent : t.V) !== this;
80
80
  }
81
81
  /** The slots this controller still owns, in registration order — the
82
- * ones the order's state is forced on. */ Wt(t) {
83
- for (let e = 0; e < this.Ft.length; e++) {
84
- const s = this.Ft[e];
85
- if (!this.Ut(s) && t(s) === false) return false;
82
+ * ones the order's state is forced on. */ Lt(t) {
83
+ for (let e = 0; e < this.At.length; e++) {
84
+ const s = this.At[e];
85
+ if (!this.gt(s) && t(s) === false) return false;
86
86
  }
87
87
  return true;
88
88
  }
89
- /** Readiness is judged over every slot, done ones as ready. */ Rt() {
90
- for (let t = 0; t < this.Ft.length; t++) {
91
- const e = this.Ft[t];
92
- if (!this.Ut(e) && !slotReady(e)) return false;
89
+ /** Readiness is judged over every slot, done ones as ready. */ St() {
90
+ for (let t = 0; t < this.At.length; t++) {
91
+ const e = this.At[t];
92
+ if (!this.gt(e) && !slotReady(e)) return false;
93
93
  }
94
94
  return true;
95
95
  }
96
96
  /** Something visible to show under its own order — what an enclosing
97
97
  * `together` waits for: `together` — every slot minimally ready;
98
- * `sequential` — the first slot; `natural` — any. */ Ct() {
99
- const t = untrack(this.qt);
100
- const e = this.Ft;
98
+ * `sequential` — the first slot; `natural` — any. */ Rt() {
99
+ const t = untrack(this.yt);
100
+ const e = this.At;
101
101
  if (e.length === 0) return true;
102
- if (t === "sequential") return this.Ut(e[0]) || slotMinReady(e[0]);
102
+ if (t === "sequential") return this.gt(e[0]) || slotMinReady(e[0]);
103
103
  for (let s = 0; s < e.length; s++) {
104
- const r = this.Ut(e[s]) || slotMinReady(e[s]);
104
+ const r = this.gt(e[s]) || slotMinReady(e[s]);
105
105
  if (t === "natural" ? r : !r) return t === "natural";
106
106
  }
107
107
  return t !== "natural";
108
108
  }
109
- ue(t) {
110
- if (this.Ft.includes(t)) return;
111
- this.Ft.push(t);
109
+ oe(t) {
110
+ if (this.At.includes(t)) return;
111
+ this.At.push(t);
112
112
  // Gated from the start (collapsed in a collapsed sequential tail); the
113
113
  // evaluation releases what the order allows.
114
- const e = untrack(this.qt) === "sequential" && !!untrack(this.Vt);
114
+ const e = untrack(this.yt) === "sequential" && !!untrack(this.Et);
115
115
  if (isController(t)) {
116
116
  t._parent = this;
117
- t.ne = true;
118
- t.re = e;
119
- t.vt();
117
+ t.$ = true;
118
+ t.ee = e;
119
+ t._t();
120
120
  } else {
121
- t.H = this;
122
- t.ne = true;
123
- t.re = e;
121
+ t.V = this;
122
+ t.$ = true;
123
+ t.ee = e;
124
124
  }
125
- untrack(() => this.vt());
125
+ untrack(() => this._t());
126
126
  }
127
- oe(t) {
128
- const e = this.Ft.indexOf(t);
129
- if (e >= 0) this.Ft.splice(e, 1);
130
- untrack(() => this.vt());
127
+ te(t) {
128
+ const e = this.At.indexOf(t);
129
+ if (e >= 0) this.At.splice(e, 1);
130
+ untrack(() => this._t());
131
131
  }
132
132
  /** Apply the order to the owned slots — or, gated by a parent, its state
133
- * to all of them. */ vt() {
134
- if (this.Tt) return;
135
- this.Tt = true;
136
- const t = this.Lt;
137
- const e = this.Qt;
133
+ * to all of them. */ _t() {
134
+ if (this.vt) return;
135
+ this.vt = true;
136
+ const t = this.Ct;
137
+ const e = this.kt;
138
138
  try {
139
- const t = untrack(this.qt);
140
- const e = t === "sequential" && !!untrack(this.Vt);
141
- if (this.ne) {
142
- this.Wt(t => setSlotState(t, this, true, this.re));
139
+ const t = untrack(this.yt);
140
+ const e = t === "sequential" && !!untrack(this.Et);
141
+ if (this.$) {
142
+ this.Lt(t => setSlotState(t, this, true, this.ee));
143
143
  } else if (t === "natural") {
144
- this.Wt(t => {
144
+ this.Lt(t => {
145
145
  if (isController(t)) setSlotState(t, this, false, false); else setSlotState(t, this, !ready(t), false);
146
146
  });
147
147
  } else if (t === "together") {
148
- const t = this.Wt(slotMinReady);
149
- this.Wt(e => setSlotState(e, this, !t, false));
148
+ const t = this.Lt(slotMinReady);
149
+ this.Lt(e => setSlotState(e, this, !t, false));
150
150
  } else {
151
151
  let t = false;
152
- this.Wt(s => {
152
+ this.Lt(s => {
153
153
  if (t) return setSlotState(s, this, true, e);
154
154
  if (slotReady(s)) return setSlotState(s, this, false, false);
155
155
  t = true;
@@ -159,11 +159,11 @@ class RevealController {
159
159
  });
160
160
  }
161
161
  } finally {
162
- this.Lt = this.Rt();
163
- this.Qt = this.Ct();
164
- this.Tt = false;
162
+ this.Ct = this.St();
163
+ this.kt = this.Rt();
164
+ this.vt = false;
165
165
  }
166
- if (this._parent !== null && (t !== this.Lt || e !== this.Qt)) this._parent.vt();
166
+ if (this._parent !== null && (t !== this.Ct || e !== this.kt)) this._parent._t();
167
167
  }
168
168
  }
169
169
 
@@ -179,23 +179,23 @@ class RevealController {
179
179
  * slots behind the frontier render nothing instead of their fallbacks
180
180
  */ function createRevealOrder(t, e) {
181
181
  const s = createOwner();
182
- const r = s.D[REVEAL];
182
+ const r = s.A[REVEAL];
183
183
  const i = new RevealController(e?.order || SEQUENTIAL_ACCESSOR, e?.collapsed || FALSE_ACCESSOR);
184
- s.D = {
185
- ...s.D,
184
+ s.A = {
185
+ ...s.A,
186
186
  [REVEAL]: i
187
187
  };
188
188
  return runWithOwner(s, () => {
189
189
  const e = t();
190
190
  const s = computed(() => {
191
- i.qt();
192
- i.Vt();
193
- i.vt();
191
+ i.yt();
192
+ i.Et();
193
+ i._t();
194
194
  });
195
195
  if (false) ;
196
196
  if (r) {
197
- r.ue(i);
198
- cleanup(() => r.oe(i));
197
+ r.oe(i);
198
+ cleanup(() => r.te(i));
199
199
  }
200
200
  return e;
201
201
  });
@@ -204,9 +204,9 @@ class RevealController {
204
204
  // Installed at module evaluation — present exactly when something imports
205
205
  // `createRevealOrder`; a Loading boundary without one pays a null check.
206
206
  setRevealHooks({
207
- ue: (t, e) => t.ue(e),
208
207
  oe: (t, e) => t.oe(e),
209
- P: t => t.vt()
208
+ te: (t, e) => t.te(e),
209
+ P: t => t._t()
210
210
  });
211
211
 
212
212
  export { createRevealOrder };
@@ -10,9 +10,13 @@ import { globalQueue, flushTransaction, dirtyQueue, GlobalQueue, resolveTx, pass
10
10
 
11
11
  import { cleanup, createRoot, getOwner, dispose } from "./core/owner.js";
12
12
 
13
+ import { signalHook } from "./core/identities.js";
14
+
13
15
  import { effect, trackedEffect } from "./core/effect.js";
14
16
 
15
- import { optimisticWrite, truthRead, truthConfirmed } from "./core/lanes.js";
17
+ import { optimisticWrite } from "./core/lanes.js";
18
+
19
+ import { truthRead, truthConfirmed } from "./core/truth.js";
16
20
 
17
21
  /**
18
22
  * Low-level reactive-cleanup primitive. Registers a callback that runs when
@@ -71,17 +75,18 @@ function accessor(e) {
71
75
  function createSignal(e, t) {
72
76
  if (typeof e === "function") {
73
77
  const r = computed(e, t);
74
- r.i &= ~CONFIG_AUTO_DISPOSE;
78
+ r.l &= ~CONFIG_AUTO_DISPOSE;
75
79
  return [ accessor(r), setMemo.bind(null, r) ];
76
80
  }
77
81
  const r = signal(e, t);
82
+ if (signalHook !== null) signalHook(r);
78
83
  return [ accessor(r), setSignal.bind(null, r) ];
79
84
  }
80
85
 
81
86
  function createOptimistic(e, t) {
82
87
  if (typeof e === "function") {
83
88
  const r = computed(e, t);
84
- r.i &= ~CONFIG_AUTO_DISPOSE;
89
+ r.l &= ~CONFIG_AUTO_DISPOSE;
85
90
  return [ accessor(r), optimisticWrite.bind(null, r) ];
86
91
  }
87
92
  const r = signal(e, t);
@@ -158,7 +163,7 @@ function createMemo(e, t) {
158
163
  * );
159
164
  * ```
160
165
  *
161
- * @description https://docs.solidjs.com/reference/basic-reactivity/create-effect
166
+ * @description https://v2.solidjs.com/reference/solid-js/reactivity/create-effect
162
167
  */ function createEffect(e, t, r) {
163
168
  effect(e, t.effect || t, t.error, {
164
169
  user: true,
@@ -193,7 +198,7 @@ function createMemo(e, t) {
193
198
  * }
194
199
  * ```
195
200
  *
196
- * @description https://docs.solidjs.com/reference/secondary-primitives/create-render-effect
201
+ * @description https://v2.solidjs.com/reference/solid-js/advanced/specialized-reactivity/create-render-effect
197
202
  */ function createRenderEffect(e, t, r) {
198
203
  effect(e, t, undefined, r);
199
204
  }
@@ -241,7 +246,7 @@ function createMemo(e, t) {
241
246
  * });
242
247
  * ```
243
248
  *
244
- * @description https://docs.solidjs.com/reference/secondary-primitives/create-tracked-effect
249
+ * @description https://v2.solidjs.com/reference/solid-js/advanced/specialized-reactivity/create-tracked-effect
245
250
  */ function createTrackedEffect(e, t) {
246
251
  trackedEffect(e, t);
247
252
  }
@@ -270,7 +275,7 @@ function createMemo(e, t) {
270
275
  * setCount(1); // logs once, reaction re-armed for next change
271
276
  * ```
272
277
  *
273
- * @description https://docs.solidjs.com/reference/secondary-primitives/create-reaction
278
+ * @description https://v2.solidjs.com/reference/solid-js/advanced/specialized-reactivity/create-reaction
274
279
  */ function createReaction(e, t) {
275
280
  let r = undefined;
276
281
  cleanup(() => r?.());
@@ -287,7 +292,12 @@ function createMemo(e, t) {
287
292
  o = undefined;
288
293
  }
289
294
  runWithOwner(n, () => {
290
- effect(() => (c(), o = getOwner()), t => {
295
+ effect(() => {
296
+ const e = getOwner();
297
+ o = e;
298
+ c();
299
+ return e;
300
+ }, t => {
291
301
  o = undefined;
292
302
  r?.();
293
303
  const n = (e.effect || e)?.();
@@ -321,34 +331,40 @@ function createMemo(e, t) {
321
331
  * joined it (L2, born held — A29) and delivers at that commit: the
322
332
  * committed view, never a foreign hold's unrevealed frame. */ function watch(e, t, r, n = 0, o, c = flushTransaction) {
323
333
  if (n & CONFIG_AUTHORITATIVE) {
324
- GlobalQueue.En = truthRead;
325
- GlobalQueue.un = truthConfirmed;
334
+ GlobalQueue.rn = truthRead;
335
+ GlobalQueue.sn = truthConfirmed;
326
336
  }
327
337
  // `config` is on the node for its first pass too (the pass runs inside
328
338
  // `computed()`): `until`'s predicate is authoritative from its first read,
329
339
  // or an already-displayed guess would satisfy it in a later slice. (REDERIVE
330
340
  // after: the first pass's own error is the promise's rejection.)
331
341
  computed(() => {
332
- let n;
342
+ let u, i = false;
333
343
  try {
334
- n = e();
344
+ u = e();
335
345
  } catch (e) {
336
346
  if (e instanceof NotReadyError) throw e;
337
- queueMicrotask(() => r(unwrapStatusError(e)));
338
- return;
347
+ // An error is an answer (D-41): delivered by the same frame rule.
348
+ u = unwrapStatusError(e);
349
+ i = true;
339
350
  }
340
- const u = getOwner();
351
+ const s = getOwner();
352
+ // A truth reader waits out a `createDeferred` flight its value derives
353
+ // from, which serves everyone else the stale answer (D-40).
354
+ const f = n & CONFIG_AUTHORITATIVE && GlobalQueue.er?.(s);
355
+ if (f) throw new NotReadyError(f);
341
356
  // (Outside a flush a mainline pass joins through `passTx`.)
342
- const i = flushTransaction ?? passTx;
343
- if (u.R & REACTIVE_JOINED && i !== null && (c === null || resolveTx(c) !== resolveTx(i))) {
344
- staleReader(u, resolveTx(i));
357
+ const a = flushTransaction ?? passTx;
358
+ if (s.R & REACTIVE_JOINED && a !== null && (c === null || resolveTx(c) !== resolveTx(a))) {
359
+ staleReader(s, resolveTx(a));
345
360
  return;
346
361
  }
347
- o?.(n);
348
- queueMicrotask(() => t(n));
362
+ if (i) return void queueMicrotask(() => r(u));
363
+ o?.(u);
364
+ queueMicrotask(() => t(u));
349
365
  }, {
350
- Me: n
351
- }).i |= CONFIG_REDERIVE;
366
+ Le: n
367
+ }).l |= CONFIG_REDERIVE;
352
368
  }
353
369
 
354
370
  /**
@@ -447,7 +463,7 @@ function createMemo(e, t) {
447
463
  // guessed node's own re-ask is not answered by it (#3895): park
448
464
  // on that flight, or reject with its error.
449
465
  const e = read(t);
450
- if (t.i & CONFIG_GUESS && t.S & (STATUS_PENDING | STATUS_ERROR)) throw t.m?.F;
466
+ if (t.l & CONFIG_GUESS && t.m & (STATUS_PENDING | STATUS_ERROR)) throw t.T?.F;
451
467
  return e;
452
468
  }, t => {
453
469
  n(typeof e === "function" ? t : e);
@@ -525,7 +541,7 @@ function createMemo(e, t) {
525
541
  // The flip, inside the pass of the flush carrying it: the flush
526
542
  // joins the action's transaction, and what it staged is held and
527
543
  // revealed with the action.
528
- if (e && c !== null && globalQueue.X && resolveTx(c).tt !== 0) joinFuture(c);
544
+ if (e && c !== null && globalQueue.q && resolveTx(c).tt !== 0) joinFuture(c);
529
545
  });
530
546
  if (t?.timeout !== undefined) i = setTimeout(() => settle(() => n(new TimeoutError)), t.timeout);
531
547
  if (o !== undefined) {
@@ -633,7 +649,7 @@ function createMemo(e, t) {
633
649
  * on owner disposal
634
650
  */ function onSettled(e) {
635
651
  const t = getOwner();
636
- t && !(t.i & CONFIG_CHILDREN_FORBIDDEN) ? trackedEffect(() => untrack(e), undefined) : globalQueue.enqueue(EFFECT_USER, function fire() {
652
+ t && !(t.l & CONFIG_CHILDREN_FORBIDDEN) ? trackedEffect(() => untrack(e), undefined) : globalQueue.enqueue(EFFECT_USER, function fire() {
637
653
  // Settled means derived. A settle that reverts optimism (or replays
638
654
  // gated reads) only enqueues the affected subscribers; the pass after
639
655
  // the commit re-derives them. Fired in the commit pass, the callback
@@ -641,7 +657,7 @@ function createMemo(e, t) {
641
657
  // still holding the optimistic value — reads do not pull (#3411). Fall
642
658
  // to the next pass while the heap has work; `run` swapped the queue,
643
659
  // so this lands there, and `enqueue` keeps the drain alive.
644
- if (dirtyQueue.ft >= dirtyQueue.Ue) return globalQueue.enqueue(EFFECT_USER, fire);
660
+ if (dirtyQueue.et >= dirtyQueue.Ge) return globalQueue.enqueue(EFFECT_USER, fire);
645
661
  // Unowned, out-of-band fire (no owner, or a children-forbidden one this
646
662
  // one-shot must not bind to): a returned cleanup has no lifecycle to
647
663
  // attach to. Reject it in dev; in production the return is simply
@@ -1,4 +1,4 @@
1
- import { GlobalQueue } from "../core/scheduler.js";
1
+ import { GlobalQueue, releaseMarksHook } from "../core/scheduler.js";
2
2
 
3
3
  import { optHooks, installAffectsHooks } from "./hooks.js";
4
4
 
@@ -40,7 +40,7 @@ function scopeOf(e, o) {
40
40
  if (n === undefined) scopes.set(e, n = {
41
41
  eo: new Set,
42
42
  oo: [],
43
- ot: o
43
+ ze: o
44
44
  });
45
45
  return n;
46
46
  }
@@ -94,7 +94,7 @@ function scopeOf(e, o) {
94
94
  * backings (§7b): a view's backing is another store's proxy — marks cover
95
95
  * the BASE raw, so every identity along the chain is checked. */ function covering(e, o, n) {
96
96
  for (const [t, s] of scopes) {
97
- if (t === n || s.ot !== undefined && s.ot !== o) continue;
97
+ if (t === n || s.ze !== undefined && s.ze !== o) continue;
98
98
  for (let o = e.v; ;) {
99
99
  if (s.eo.has(o)) return t;
100
100
  const e = o?.[$TARGET];
@@ -116,14 +116,14 @@ function scopeOf(e, o) {
116
116
  if (scopes.size === 0 || n === $AFFECTS) return;
117
117
  const t = covering(e, n, o);
118
118
  if (!t) return;
119
- GlobalQueue.O(o);
119
+ GlobalQueue.N(o);
120
120
  scopes.get(t).oo.push(o);
121
121
  },
122
122
  // An untracked probe (`isPending(() => s.x)` with no observer) reading a
123
123
  // record a live mark covers: no node carries the mark for it — the
124
124
  // verdict is told directly.
125
125
  ro(e, o) {
126
- if (e.n?.[$AFFECTS]?.m?.T || covering(e, o)) GlobalQueue.ct();
126
+ if (e.n?.[$AFFECTS]?.T?.I || covering(e, o)) GlobalQueue.rt();
127
127
  }
128
128
  };
129
129
 
@@ -136,7 +136,7 @@ function scopeOf(e, o) {
136
136
  const o = scopes.get(e);
137
137
  if (o === undefined) return;
138
138
  scopes.delete(e);
139
- GlobalQueue.k(o.oo);
139
+ releaseMarksHook(o.oo);
140
140
  }
141
141
 
142
142
  export { installStoreAffects, releaseMarkScope, storeMarks };
@@ -0,0 +1,39 @@
1
+ import { CONFIG_SLOT_NODE } from "../core/constants.js";
2
+
3
+ import { signalName } from "../core/identities.js";
4
+
5
+ import { $TARGET } from "./types.js";
6
+
7
+ /**
8
+ * Deferred hydration, dependency edges for stores. Only the frames client
9
+ * imports this module, so nothing here ships without it.
10
+ *
11
+ * A plain store root (`createStore` over an object) is named like a plain
12
+ * signal (core/identities.ts: `<owner id>~<n>`, on the same count), and the
13
+ * whole store goes by that one name: the server records it for any read of
14
+ * the store, at any depth, and a setter call on the store — on its root or
15
+ * on a proxy nested in it — is a write to it. Its readers mount at the
16
+ * setter's entry, before the draft runs, as a plain signal's do.
17
+ */
18
+ /**
19
+ * @internal The name of the store `x` belongs to — `x` a store proxy (a
20
+ * setter's entry) or one of its property nodes (the setter notifying it) —
21
+ * or undefined when it has none or it cannot be placed: a projection or
22
+ * optimistic family, a store chained over another store's proxy, a root
23
+ * named twice, or a proxy reached through a store other than the one it
24
+ * was named as the root of.
25
+ */ function storeName(e) {
26
+ if (e === undefined) return undefined;
27
+ let n = e.l & CONFIG_SLOT_NODE ? e.O : e[$TARGET];
28
+ if (n === undefined) return undefined;
29
+ // Up to the root; a target on the way named as a root of its own is one
30
+ // object in two stores.
31
+ while (n.u !== null) {
32
+ if (n.fam !== null || n.ch || signalName(n) !== undefined) return undefined;
33
+ n = n.u;
34
+ }
35
+ if (n.fam !== null || n.ch) return undefined;
36
+ return signalName(n) || undefined;
37
+ }
38
+
39
+ export { storeName };