@solidjs/signals 2.0.0-rc.6 → 2.0.0-rc.8

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 (131) hide show
  1. package/dist/dev-shared.js +5243 -0
  2. package/dist/dev.attribution.js +2333 -0
  3. package/dist/dev.js +1758 -6621
  4. package/dist/observe/affects.js +127 -0
  5. package/dist/observe/attribution.js +1 -0
  6. package/dist/observe/boundaries.js +586 -0
  7. package/dist/observe/core/action.js +167 -0
  8. package/dist/observe/core/async.js +736 -0
  9. package/dist/observe/core/attribution-hooks.js +60 -0
  10. package/dist/observe/core/attribution.js +2318 -0
  11. package/dist/{types-cjs/core/constants.d.cts → observe/core/constants.js} +135 -71
  12. package/dist/{types-cjs/core/context.d.cts → observe/core/context.js} +37 -12
  13. package/dist/observe/core/core.js +1289 -0
  14. package/dist/observe/core/dev.js +232 -0
  15. package/dist/observe/core/effect.js +179 -0
  16. package/dist/observe/core/error.js +80 -0
  17. package/dist/observe/core/external.js +98 -0
  18. package/dist/observe/core/graph.js +155 -0
  19. package/dist/observe/core/heap.js +147 -0
  20. package/dist/observe/core/invariants.js +43 -0
  21. package/dist/observe/core/lanes.js +168 -0
  22. package/dist/observe/core/optimistic.js +438 -0
  23. package/dist/observe/core/owner.js +308 -0
  24. package/dist/observe/core/scheduler.js +1190 -0
  25. package/dist/observe/core/verdict.js +551 -0
  26. package/dist/observe/index.js +55 -0
  27. package/dist/observe/map.js +482 -0
  28. package/dist/{types-cjs/signals.d.cts → observe/signals.js} +305 -317
  29. package/dist/observe/store/index.js +38 -0
  30. package/dist/observe/store/next/optimistic.js +651 -0
  31. package/dist/observe/store/next/projection.js +242 -0
  32. package/dist/observe/store/next/reconcile.js +373 -0
  33. package/dist/observe/store/next/store.js +2213 -0
  34. package/dist/observe/store/next/target.js +51 -0
  35. package/dist/observe/store/store.js +323 -0
  36. package/dist/observe/store/storePath.js +103 -0
  37. package/dist/observe/store/utils.js +210 -0
  38. package/dist/prod/attribution.js +32 -0
  39. package/dist/prod/boundaries.js +3 -1
  40. package/dist/prod/core/action.js +52 -32
  41. package/dist/prod/core/async.js +177 -128
  42. package/dist/prod/core/attribution-hooks.js +3 -0
  43. package/dist/prod/core/constants.js +32 -1
  44. package/dist/prod/core/context.js +10 -16
  45. package/dist/prod/core/core.js +505 -286
  46. package/dist/prod/core/dev.js +2 -0
  47. package/dist/prod/core/effect.js +72 -43
  48. package/dist/prod/core/external.js +2 -2
  49. package/dist/prod/core/graph.js +40 -36
  50. package/dist/prod/core/heap.js +50 -51
  51. package/dist/prod/core/lanes.js +43 -22
  52. package/dist/prod/core/optimistic.js +224 -80
  53. package/dist/prod/core/owner.js +43 -39
  54. package/dist/prod/core/scheduler.js +347 -232
  55. package/dist/prod/core/verdict.js +71 -74
  56. package/dist/prod/index.js +9 -5
  57. package/dist/prod/map.js +311 -150
  58. package/dist/prod/signals.js +52 -38
  59. package/dist/prod/store/next/optimistic.js +127 -131
  60. package/dist/prod/store/next/projection.js +3 -3
  61. package/dist/prod/store/next/reconcile.js +149 -294
  62. package/dist/prod/store/next/store.js +694 -380
  63. package/dist/prod/store/next/target.js +32 -10
  64. package/dist/prod/store/store.js +12 -14
  65. package/dist/prod/store/utils.js +36 -27
  66. package/dist/types/attribution.d.ts +15 -0
  67. package/dist/types/attribution.prod.d.ts +13 -0
  68. package/dist/types/core/async.d.ts +1 -1
  69. package/dist/types/core/attribution-hooks.d.ts +183 -6
  70. package/dist/types/core/attribution.d.ts +435 -24
  71. package/dist/types/core/constants.d.ts +31 -0
  72. package/dist/types/core/core.d.ts +19 -3
  73. package/dist/types/core/dev.d.ts +165 -26
  74. package/dist/types/core/effect.d.ts +8 -1
  75. package/dist/types/core/heap.d.ts +5 -3
  76. package/dist/types/core/index.d.ts +2 -1
  77. package/dist/types/core/invariants.d.ts +1 -1
  78. package/dist/types/core/lanes.d.ts +17 -0
  79. package/dist/types/core/scheduler.d.ts +69 -4
  80. package/dist/types/core/types.d.ts +29 -9
  81. package/dist/types/index.d.ts +9 -2
  82. package/dist/types/map.d.ts +2 -0
  83. package/dist/types/signals.d.ts +10 -0
  84. package/dist/types/store/index.d.ts +4 -6
  85. package/dist/types/store/next/optimistic.d.ts +4 -2
  86. package/dist/types/store/next/reconcile.d.ts +5 -12
  87. package/dist/types/store/next/store.d.ts +8 -9
  88. package/dist/types/store/next/target.d.ts +56 -55
  89. package/dist/types/store/store.d.ts +14 -9
  90. package/dist/types/store/utils.d.ts +7 -0
  91. package/package.json +21 -16
  92. package/dist/node.cjs +0 -11121
  93. package/dist/prod/store/next/patch-hooks.js +0 -13
  94. package/dist/prod/store/next/patch.js +0 -614
  95. package/dist/types/store/next/patch-hooks.d.ts +0 -41
  96. package/dist/types/store/next/patch.d.ts +0 -91
  97. package/dist/types-cjs/affects.d.cts +0 -47
  98. package/dist/types-cjs/boundaries.d.cts +0 -175
  99. package/dist/types-cjs/core/action.d.cts +0 -64
  100. package/dist/types-cjs/core/async.d.cts +0 -23
  101. package/dist/types-cjs/core/attribution-hooks.d.cts +0 -63
  102. package/dist/types-cjs/core/attribution.d.cts +0 -239
  103. package/dist/types-cjs/core/core.d.cts +0 -176
  104. package/dist/types-cjs/core/dev.d.cts +0 -95
  105. package/dist/types-cjs/core/effect.d.cts +0 -30
  106. package/dist/types-cjs/core/error.d.cts +0 -56
  107. package/dist/types-cjs/core/external.d.cts +0 -15
  108. package/dist/types-cjs/core/graph.d.cts +0 -28
  109. package/dist/types-cjs/core/heap.d.cts +0 -22
  110. package/dist/types-cjs/core/index.d.cts +0 -13
  111. package/dist/types-cjs/core/invariants.d.cts +0 -59
  112. package/dist/types-cjs/core/lanes.d.cts +0 -44
  113. package/dist/types-cjs/core/optimistic.d.cts +0 -6
  114. package/dist/types-cjs/core/owner.d.cts +0 -124
  115. package/dist/types-cjs/core/scheduler.d.cts +0 -231
  116. package/dist/types-cjs/core/types.d.cts +0 -204
  117. package/dist/types-cjs/core/verdict.d.cts +0 -2
  118. package/dist/types-cjs/index.d.cts +0 -10
  119. package/dist/types-cjs/map.d.cts +0 -69
  120. package/dist/types-cjs/package.json +0 -3
  121. package/dist/types-cjs/store/index.d.cts +0 -21
  122. package/dist/types-cjs/store/next/optimistic.d.cts +0 -23
  123. package/dist/types-cjs/store/next/patch-hooks.d.cts +0 -41
  124. package/dist/types-cjs/store/next/patch.d.cts +0 -91
  125. package/dist/types-cjs/store/next/projection.d.cts +0 -8
  126. package/dist/types-cjs/store/next/reconcile.d.cts +0 -17
  127. package/dist/types-cjs/store/next/store.d.cts +0 -127
  128. package/dist/types-cjs/store/next/target.d.cts +0 -192
  129. package/dist/types-cjs/store/store.d.cts +0 -138
  130. package/dist/types-cjs/store/storePath.d.cts +0 -58
  131. package/dist/types-cjs/store/utils.d.cts +0 -74
@@ -10,7 +10,7 @@ import { insertIntoHeap, queueFor, markHeap, enqueueSub } from "./heap.js";
10
10
 
11
11
  import "./invariants.js";
12
12
 
13
- import { findLane, hasActiveOverride, assignOrMergeLane } from "./lanes.js";
13
+ import { findLane, laneHeld, hasActiveOverride, assignOrMergeLane } from "./lanes.js";
14
14
 
15
15
  import { installOptimisticEngine } from "./optimistic.js";
16
16
 
@@ -47,23 +47,23 @@ let pendingProbe = null;
47
47
  * O(all-leaves-ever-read)-per-update pathology). Entries are permanent like
48
48
  * the companions themselves; a store with no leaf-level isPending()/latest()
49
49
  * reads never allocates the set or pays the walk. */ function markFirewallChildCompanions(e) {
50
- const t = e.st;
50
+ const t = e.ce;
51
51
  if (!t) return;
52
52
  t.T |= CONFIG_CHILD_COMPANIONS;
53
- (ext(t).St ??= new Set).add(e);
53
+ (ext(t).Dt ??= new Set).add(e);
54
54
  }
55
55
 
56
56
  function getPendingSignal(e) {
57
- let t = e.o?.ye;
57
+ let t = e.o?.Le;
58
58
  if (!t) {
59
59
  // Start false, write true if pending - ensures reversion returns to false
60
60
  t = optimisticSignal(false, {
61
61
  ownedWrite: true
62
62
  });
63
- ext(e).ye = t;
63
+ ext(e).Le = t;
64
64
  e.T |= CONFIG_HAS_COMPANIONS;
65
65
  markFirewallChildCompanions(e);
66
- ext(t).Tt = e;
66
+ ext(t).Gt = e;
67
67
  if (computePendingState(e)) setSignal(t, true);
68
68
  }
69
69
  return t;
@@ -72,7 +72,7 @@ function getPendingSignal(e) {
72
72
  function collectPendingSources(e) {
73
73
  if (!pendingProbe) return;
74
74
  pendingProbe.sources.add(e);
75
- const t = e.st || e;
75
+ const t = e.ce || e;
76
76
  if (t !== e) pendingProbe.sources.add(t);
77
77
  }
78
78
 
@@ -105,33 +105,29 @@ function collectPendingSources(e) {
105
105
  if (e.S & STATUS_ERROR) return false;
106
106
  if (t.has(e)) return false;
107
107
  t.add(e);
108
- const n = e.st;
108
+ const n = e.ce;
109
109
  if (n && markWalk(n, t)) return true;
110
110
  // Mid-recompute (the clearStatus companion poke runs before
111
111
  // trimStaleDeps), only the validated prefix [_deps.._depsTail] is this
112
112
  // pass's dependency set — walking past it would read dropped deps and
113
113
  // latch a stale verdict on the companion.
114
114
  const i = e;
115
- const r = i.ie & REACTIVE_RECOMPUTING_DEPS ? i.je : undefined;
115
+ const r = i.ie & REACTIVE_RECOMPUTING_DEPS ? i.et : undefined;
116
116
  if (r !== null) {
117
- for (let e = i.ut ?? null; e !== null; e = e.lt) {
118
- if (!e.ve && markWalk(e.ot, t)) return true;
117
+ for (let e = i.fe ?? null; e !== null; e = e.ae) {
118
+ if (!e.je && markWalk(e.Se, t)) return true;
119
119
  if (e === r) break;
120
120
  }
121
121
  }
122
122
  return false;
123
123
  }
124
124
 
125
- /** Gated entry: apps with no live mark pay one integer compare. */ function markCovered(e) {
126
- return activeAffectsMarks !== 0 && markWalk(e, new Set);
127
- }
128
-
129
125
  function quietPending(e) {
130
126
  if (e.o?.le) {
131
- for (const t of e.o.le) if (!t.o?.De) return false;
127
+ for (const t of e.o.le) if (!t.o?.Ue) return false;
132
128
  return true;
133
129
  }
134
- return e.o?.De ?? false;
130
+ return e.o?.Ue ?? false;
135
131
  }
136
132
 
137
133
  // NOTE: a loadingValue node's open loading window (_loading) is verdict-quiet
@@ -151,45 +147,46 @@ function computePendingState(e) {
151
147
  // Mark coverage is transitive by dep-graph reachability: a latest() shadow
152
148
  // reaches its owner (and a store leaf its firewall) through its own deps,
153
149
  // so the one walk covers direct marks, derivation, and companion chains.
154
- if (markCovered(e)) return true;
155
- const n = e.st;
156
- if (e.o?.Tt) {
157
- const t = e.o?.Tt;
158
- const n = t.st || t;
150
+ // Gated: apps with no live mark pay one integer compare.
151
+ if (activeAffectsMarks !== 0 && markWalk(e, new Set)) return true;
152
+ const n = e.ce;
153
+ if (e.o?.Gt) {
154
+ const t = e.o?.Gt;
155
+ const n = t.ce || t;
159
156
  return newQuestionInFlight(n);
160
157
  }
161
- if (n && e.Re !== NOT_PENDING && !hasActiveOverride(e)) {
162
- return !!(n.ie & REACTIVE_MANUAL_WRITE) || !n.o?.Ie && !(n.S & STATUS_PENDING) || !!(n.S & STATUS_PENDING) && quietPending(n);
158
+ if (n && e.Ge !== NOT_PENDING && !hasActiveOverride(e)) {
159
+ return !!(n.ie & REACTIVE_MANUAL_WRITE) || !n.o?.Pe && !(n.S & STATUS_PENDING) || !!(n.S & STATUS_PENDING) && quietPending(n);
163
160
  }
164
161
  // `!comp._loading`: a hold created while the loading window is still open is
165
162
  // the window's own landing in flight to its commit — verdict-quiet like the
166
163
  // rest of the window (the UNINITIALIZED check suppresses exactly this frame
167
164
  // for windowless first loads; born-committed nodes need their own gate, #2990).
168
- if (e.Re !== NOT_PENDING && !(t.S & STATUS_UNINITIALIZED) && !t.Ne) {
169
- if (hasActiveOverride(e)) return !e.pe || !e.pe(e.Re, unwrapOverride(e.o?.Pe));
165
+ if (e.Ge !== NOT_PENDING && !(t.S & STATUS_UNINITIALIZED) && !t.Ae) {
166
+ if (hasActiveOverride(e)) return !e.ve || !e.ve(e.Ge, unwrapOverride(e.o?.be));
170
167
  // A quiet re-ask's held landing still answers the same question: the
171
168
  // classification survives the landing (asyncWrite) and dies with the
172
169
  // commit (commitPendingNode) — verdict-quiet through the reveal, like
173
170
  // the loading window above (#3178).
174
- if (!t.o?.De) return true;
171
+ if (!t.o?.Ue) return true;
175
172
  }
176
173
  return newQuestionInFlight(t);
177
174
  }
178
175
 
179
176
  function syncCompanions(e, t) {
180
- if (e.o?.ye) updatePendingSignal(e);
181
- if (e.o?.Ce) setSignal(e.o?.Ce, t);
177
+ if (e.o?.Le) updatePendingSignal(e);
178
+ if (e.o?.Qe) setSignal(e.o?.Qe, t);
182
179
  }
183
180
 
184
181
  function updatePendingSignal(e) {
185
- if (e.o?.ye) {
186
- setSignal(e.o?.ye, computePendingState(e));
182
+ if (e.o?.Le) {
183
+ setSignal(e.o?.Le, computePendingState(e));
187
184
  }
188
- if (e.o?.Ce) updatePendingSignal(e.o?.Ce);
185
+ if (e.o?.Qe) updatePendingSignal(e.o?.Qe);
189
186
  }
190
187
 
191
188
  function updateChildCompanions(e) {
192
- const t = e.o?.St;
189
+ const t = e.o?.Dt;
193
190
  if (t === undefined) return;
194
191
  for (const e of t) updatePendingSignal(e);
195
192
  }
@@ -208,9 +205,9 @@ function updateChildCompanions(e) {
208
205
  const visit = e => {
209
206
  if (i.has(e)) return;
210
207
  i.add(e);
211
- if (e.o?.ye || e.o?.Ce) n(e);
212
- for (let t = e.u; t !== null; t = t.ae) visit(t.ce);
213
- for (let t = e.o?.i ?? null; t !== null; t = t.Se) {
208
+ if (e.o?.Le || e.o?.Qe) n(e);
209
+ for (let t = e.u; t !== null; t = t.Te) visit(t.Ie);
210
+ for (let t = e.o?.i ?? null; t !== null; t = t.Ee) {
214
211
  visit(t);
215
212
  }
216
213
  };
@@ -231,7 +228,7 @@ function updateChildCompanions(e) {
231
228
  if (suppressedProbes.size === 0) return;
232
229
  let t = false;
233
230
  for (const [n, i] of suppressedProbes) {
234
- const r = n.Ae;
231
+ const r = n.ge;
235
232
  const s = r ? currentTransition(r) : null;
236
233
  if (!s) {
237
234
  suppressedProbes.delete(n);
@@ -239,11 +236,11 @@ function updateChildCompanions(e) {
239
236
  }
240
237
  if (s !== e) continue;
241
238
  suppressedProbes.delete(n);
242
- const o = n.o?.ye?.o?.Je;
239
+ const o = n.o?.Le?.o?.Oe;
243
240
  for (const e of i) {
244
241
  if (e.ie & REACTIVE_DISPOSED) continue;
245
242
  e.ie |= REACTIVE_OPTIMISTIC_DIRTY;
246
- if (o) assignOrMergeLane(e, o); else if (e.o !== null) e.o.Je = undefined;
243
+ if (o) assignOrMergeLane(e, o); else if (e.o !== null) e.o.Oe = undefined;
247
244
  enqueueSub(e);
248
245
  t = true;
249
246
  }
@@ -253,19 +250,19 @@ function updateChildCompanions(e) {
253
250
 
254
251
  function snapCompanionsToState(e) {
255
252
  suppressedProbes.size !== 0 && suppressedProbes.delete(e);
256
- const t = e.o?.ye;
257
- if (t && (t.o?.Pe === undefined || t.o?.Pe === NOT_PENDING)) {
253
+ const t = e.o?.Le;
254
+ if (t && (t.o?.be === undefined || t.o?.be === NOT_PENDING)) {
258
255
  const n = computePendingState(e);
259
- if (t.be !== n || t.Re !== NOT_PENDING) {
260
- t.be = n;
261
- t.Re = NOT_PENDING;
256
+ if (t.me !== n || t.Ge !== NOT_PENDING) {
257
+ t.me = n;
258
+ t.Ge = NOT_PENDING;
262
259
  insertSubs(t);
263
260
  schedule();
264
261
  }
265
262
  }
266
- const n = e.o?.Ce;
263
+ const n = e.o?.Qe;
267
264
  if (n && !(n.ie & REACTIVE_DISPOSED)) {
268
- if ((n.o?.Pe === undefined || n.o?.Pe === NOT_PENDING) && n.Re === NOT_PENDING && !Object.is(n.be, e.be) && !(n.ie & (REACTIVE_DIRTY | REACTIVE_CHECK))) {
265
+ if ((n.o?.be === undefined || n.o?.be === NOT_PENDING) && n.Ge === NOT_PENDING && !Object.is(n.me, e.me) && !(n.ie & (REACTIVE_DIRTY | REACTIVE_CHECK))) {
269
266
  n.ie |= REACTIVE_DIRTY;
270
267
  insertIntoHeap(n, queueFor(n));
271
268
  insertSubs(n);
@@ -276,7 +273,7 @@ function snapCompanionsToState(e) {
276
273
  }
277
274
 
278
275
  function getLatestValueComputed(e) {
279
- let t = e.o?.Ce;
276
+ let t = e.o?.Qe;
280
277
  // A shadow disposed while unobserved (its gated reader unmounted at a
281
278
  // landing) is a corpse: sync writes into it equality-swallow against its
282
279
  // frozen _value, and a later read revives it via recompute — clearing
@@ -293,16 +290,16 @@ function getLatestValueComputed(e) {
293
290
  setContextInternal(null);
294
291
  // Detach from owner so it isn't disposed with effects
295
292
  t = optimisticComputed(() => read(e));
296
- ext(e).Ce = t;
293
+ ext(e).Qe = t;
297
294
  e.T |= CONFIG_HAS_COMPANIONS;
298
295
  markFirewallChildCompanions(e);
299
- ext(t).Tt = e;
296
+ ext(t).Gt = e;
300
297
  // Parent-child lane relationship
301
298
  // Backfill an in-flight write (mirrors getPendingSignal): the companion is
302
299
  // created lazily, possibly after the write was processed — syncCompanions
303
300
  // only pushes into companions that already exist, so the first latest()
304
301
  // read inside a held transition showed the committed value (#3041).
305
- if (e.Re !== NOT_PENDING && !hasActiveOverride(e)) setSignal(t, e.Re);
302
+ if (e.Ge !== NOT_PENDING && !hasActiveOverride(e)) setSignal(t, e.Ge);
306
303
  setContextInternal(r);
307
304
  setPendingCheckActive(i);
308
305
  setLatestReadActive(n);
@@ -314,7 +311,7 @@ function getLatestValueComputed(e) {
314
311
  const t = getLatestValueComputed(e);
315
312
  const n = latestReadActive;
316
313
  setLatestReadActive(false);
317
- const i = e.o?.Pe !== undefined && e.o?.Pe !== NOT_PENDING ? unwrapOverride(e.o?.Pe) : e.be;
314
+ const i = e.o?.be !== undefined && e.o?.be !== NOT_PENDING ? unwrapOverride(e.o?.be) : e.me;
318
315
  let r;
319
316
  try {
320
317
  // An untracked latest() read has no reading context, so read() never
@@ -323,7 +320,7 @@ function getLatestValueComputed(e) {
323
320
  // until the flush (#2922). Mirror the tracked-read pull here: mark the
324
321
  // queued staleness through the graph, then bring the shadow up to date.
325
322
  const e = queueFor(t);
326
- if (t.Me >= e.Qe && !(t.ie & (REACTIVE_DISPOSED | REACTIVE_ZOMBIE))) {
323
+ if (t.Be >= e.Ke && !(t.ie & (REACTIVE_DISPOSED | REACTIVE_ZOMBIE))) {
327
324
  markHeap(e);
328
325
  // Suspend probe collection during the pull (mirrors pendingCheckRead's
329
326
  // prepare): a probe through latest() answers for the SHADOW — the
@@ -350,10 +347,10 @@ function getLatestValueComputed(e) {
350
347
  setLatestReadActive(n);
351
348
  }
352
349
  if (t.S & STATUS_PENDING) return i;
353
- if (stale && currentOptimisticLane && t.o?.Je) {
354
- const e = findLane(t.o?.Je);
350
+ if (stale && currentOptimisticLane && t.o?.Oe) {
351
+ const e = findLane(t.o?.Oe);
355
352
  const n = findLane(currentOptimisticLane);
356
- if (e !== n && e.Oe.size > 0) {
353
+ if (e !== n && laneHeld(e)) {
357
354
  return i;
358
355
  }
359
356
  }
@@ -361,7 +358,7 @@ function getLatestValueComputed(e) {
361
358
  // speculative value in _pendingValue; a contextless read() only surfaces
362
359
  // _value. Overrides stay authoritative (A17), and stale readers keep the
363
360
  // other transition's committed view, matching read()'s own selection.
364
- if (t.Re !== NOT_PENDING && !hasActiveOverride(t) && !(stale && t.Ae && activeTransition !== t.Ae)) return t.Re;
361
+ if (t.Ge !== NOT_PENDING && !hasActiveOverride(t) && !(stale && t.ge && activeTransition !== t.ge)) return t.Ge;
365
362
  return r;
366
363
  }
367
364
 
@@ -375,9 +372,9 @@ function getLatestValueComputed(e) {
375
372
  * so the `_fn` check is belt-and-braces for this call site.
376
373
  */ function latestShadowWithInitializedParent(e) {
377
374
  if (typeof e.oe !== "function") return false;
378
- const t = e.o?.Tt;
375
+ const t = e.o?.Gt;
379
376
  if (t === undefined) return false;
380
- const n = t.st || t;
377
+ const n = t.ce || t;
381
378
  return !(n.S & STATUS_UNINITIALIZED);
382
379
  }
383
380
 
@@ -413,9 +410,9 @@ function getLatestValueComputed(e) {
413
410
  * reader saw is an input, and pending remains the truth for every reader
414
411
  * (#3028).
415
412
  */ function heldAwaitingAsync(e) {
416
- const t = e.Ae;
413
+ const t = e.ge;
417
414
  const n = t ? currentTransition(t) : activeTransition;
418
- if (!n || n.sn) return false;
415
+ if (!n || n.ft) return false;
419
416
  // A plain staged write (a signal/store leaf — no _fn) held while an action
420
417
  // is still running is an INPUT to a computation still in flight (#3078):
421
418
  // the pairing rule must not suppress the verdict, or a memo recomputing
@@ -430,14 +427,14 @@ function getLatestValueComputed(e) {
430
427
  // action check above; the reporter scan below is for transition-held
431
428
  // writes whose source async is still computing.
432
429
  if (!t) return false;
433
- for (const [e, t] of n._e) {
430
+ for (const [e, t] of n.Re) {
434
431
  if (t.size && e.S & STATUS_PENDING && e.o?._?.source === e) return true;
435
432
  }
436
433
  return false;
437
434
  }
438
435
 
439
436
  function recordFreshRead(e, t) {
440
- if (pendingProbe !== null && e.Re !== NOT_PENDING && t === e.Re) {
437
+ if (pendingProbe !== null && e.Ge !== NOT_PENDING && t === e.Ge) {
441
438
  if (heldAwaitingAsync(e)) return;
442
439
  pendingProbe.freshReads.add(e);
443
440
  }
@@ -445,10 +442,10 @@ function recordFreshRead(e, t) {
445
442
 
446
443
  function applyReask(e, t) {
447
444
  const n = !!(e.S & STATUS_PENDING);
448
- const i = t && !(n && !e.o?.De);
449
- const r = n && (e.o?.De ?? false) !== i;
445
+ const i = t && !(n && !e.o?.Ue);
446
+ const r = n && (e.o?.Ue ?? false) !== i;
450
447
  // Allocation-free for the quiet case: false is the extension default.
451
- if (i) ext(e).De = true; else if (e.o !== null) e.o.De = false;
448
+ if (i) ext(e).Ue = true; else if (e.o !== null) e.o.Ue = false;
452
449
  return r;
453
450
  }
454
451
 
@@ -529,26 +526,26 @@ function isPending(e) {
529
526
  // Hook installation (same late-binding pattern as GlobalQueue._update /
530
527
  // _propagateAffects): core call sites fire these behind the same guards the
531
528
  // direct calls used, so behavior is identical once this module loads.
532
- GlobalQueue.Ue = syncCompanions;
529
+ GlobalQueue.pe = syncCompanions;
533
530
 
534
- GlobalQueue.de = updatePendingSignal;
531
+ GlobalQueue.Ne = updatePendingSignal;
535
532
 
536
- GlobalQueue.me = updateChildCompanions;
533
+ GlobalQueue.ke = updateChildCompanions;
537
534
 
538
535
  GlobalQueue.un = snapCompanionsToState;
539
536
 
540
- GlobalQueue.gt = latestRead;
537
+ GlobalQueue.wt = latestRead;
541
538
 
542
- GlobalQueue.Ht = pendingCheckRead;
539
+ GlobalQueue.Wt = pendingCheckRead;
543
540
 
544
- GlobalQueue.kt = recordFreshRead;
541
+ GlobalQueue.jt = recordFreshRead;
545
542
 
546
- GlobalQueue.et = applyReask;
543
+ GlobalQueue.st = applyReask;
547
544
 
548
545
  GlobalQueue.k = repollDownstreamVerdicts;
549
546
 
550
- GlobalQueue.Wt = witnessAffects;
547
+ GlobalQueue.ri = witnessAffects;
551
548
 
552
- GlobalQueue.zt = wakeSuppressedProbes;
549
+ GlobalQueue.si = wakeSuppressedProbes;
553
550
 
554
551
  export { isPending, latest };
@@ -36,14 +36,18 @@ export { createOptimisticStoreNext as createOptimisticStore } from "./store/next
36
36
 
37
37
  export { createProjectionNext as createProjection } from "./store/next/projection.js";
38
38
 
39
- export { merge, omit } from "./store/utils.js";
40
-
41
- export { patchableRaw, registerPatch, registerRowOps, registerSlotPatchNext as registerSlotPatch } from "./store/next/patch.js";
39
+ export { merge, mergeSources, omit } from "./store/utils.js";
42
40
 
43
41
  export { storeHasFamily, storeHasOptimisticFamily, storeIsShallow } from "./store/next/store.js";
44
42
 
45
43
  export { storePath } from "./store/storePath.js";
46
44
 
47
- const DEV = undefined;
45
+ /**
46
+ * Observe tier (diagnostics channel, attribution hook slot + interaction
47
+ * frame): dev and observe builds. The attribution engine itself is the
48
+ * `@solidjs/signals/attribution` entry.
49
+ */ const OBSERVE = undefined;
50
+
51
+ /** Dev tier (devtools hooks, graph traversal, console reporting): dev builds only. */ const DEV = undefined;
48
52
 
49
- export { DEV };
53
+ export { DEV, OBSERVE };