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