@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.
- package/dist/dev-shared.js +5243 -0
- package/dist/dev.attribution.js +2333 -0
- package/dist/dev.js +1758 -6621
- package/dist/observe/affects.js +127 -0
- package/dist/observe/attribution.js +1 -0
- package/dist/observe/boundaries.js +586 -0
- package/dist/observe/core/action.js +167 -0
- package/dist/observe/core/async.js +736 -0
- package/dist/observe/core/attribution-hooks.js +60 -0
- package/dist/observe/core/attribution.js +2318 -0
- package/dist/{types-cjs/core/constants.d.cts → observe/core/constants.js} +135 -71
- package/dist/{types-cjs/core/context.d.cts → observe/core/context.js} +37 -12
- package/dist/observe/core/core.js +1289 -0
- package/dist/observe/core/dev.js +232 -0
- package/dist/observe/core/effect.js +179 -0
- package/dist/observe/core/error.js +80 -0
- package/dist/observe/core/external.js +98 -0
- package/dist/observe/core/graph.js +155 -0
- package/dist/observe/core/heap.js +147 -0
- package/dist/observe/core/invariants.js +43 -0
- package/dist/observe/core/lanes.js +168 -0
- package/dist/observe/core/optimistic.js +438 -0
- package/dist/observe/core/owner.js +308 -0
- package/dist/observe/core/scheduler.js +1190 -0
- package/dist/observe/core/verdict.js +551 -0
- package/dist/observe/index.js +55 -0
- package/dist/observe/map.js +482 -0
- package/dist/{types-cjs/signals.d.cts → observe/signals.js} +305 -317
- package/dist/observe/store/index.js +38 -0
- package/dist/observe/store/next/optimistic.js +651 -0
- package/dist/observe/store/next/projection.js +242 -0
- package/dist/observe/store/next/reconcile.js +373 -0
- package/dist/observe/store/next/store.js +2213 -0
- package/dist/observe/store/next/target.js +51 -0
- package/dist/observe/store/store.js +323 -0
- package/dist/observe/store/storePath.js +103 -0
- package/dist/observe/store/utils.js +210 -0
- package/dist/prod/attribution.js +32 -0
- package/dist/prod/boundaries.js +3 -1
- package/dist/prod/core/action.js +52 -32
- package/dist/prod/core/async.js +177 -128
- package/dist/prod/core/attribution-hooks.js +3 -0
- package/dist/prod/core/constants.js +32 -1
- package/dist/prod/core/context.js +10 -16
- package/dist/prod/core/core.js +505 -286
- package/dist/prod/core/dev.js +2 -0
- package/dist/prod/core/effect.js +72 -43
- package/dist/prod/core/external.js +2 -2
- package/dist/prod/core/graph.js +40 -36
- package/dist/prod/core/heap.js +50 -51
- package/dist/prod/core/lanes.js +43 -22
- package/dist/prod/core/optimistic.js +224 -80
- package/dist/prod/core/owner.js +43 -39
- package/dist/prod/core/scheduler.js +347 -232
- package/dist/prod/core/verdict.js +71 -74
- package/dist/prod/index.js +9 -5
- package/dist/prod/map.js +311 -150
- package/dist/prod/signals.js +52 -38
- package/dist/prod/store/next/optimistic.js +127 -131
- package/dist/prod/store/next/projection.js +3 -3
- package/dist/prod/store/next/reconcile.js +149 -294
- package/dist/prod/store/next/store.js +694 -380
- package/dist/prod/store/next/target.js +32 -10
- package/dist/prod/store/store.js +12 -14
- package/dist/prod/store/utils.js +36 -27
- package/dist/types/attribution.d.ts +15 -0
- package/dist/types/attribution.prod.d.ts +13 -0
- package/dist/types/core/async.d.ts +1 -1
- package/dist/types/core/attribution-hooks.d.ts +183 -6
- package/dist/types/core/attribution.d.ts +435 -24
- package/dist/types/core/constants.d.ts +31 -0
- package/dist/types/core/core.d.ts +19 -3
- package/dist/types/core/dev.d.ts +165 -26
- package/dist/types/core/effect.d.ts +8 -1
- package/dist/types/core/heap.d.ts +5 -3
- package/dist/types/core/index.d.ts +2 -1
- package/dist/types/core/invariants.d.ts +1 -1
- package/dist/types/core/lanes.d.ts +17 -0
- package/dist/types/core/scheduler.d.ts +69 -4
- package/dist/types/core/types.d.ts +29 -9
- package/dist/types/index.d.ts +9 -2
- package/dist/types/map.d.ts +2 -0
- package/dist/types/signals.d.ts +10 -0
- package/dist/types/store/index.d.ts +4 -6
- package/dist/types/store/next/optimistic.d.ts +4 -2
- package/dist/types/store/next/reconcile.d.ts +5 -12
- package/dist/types/store/next/store.d.ts +8 -9
- package/dist/types/store/next/target.d.ts +56 -55
- package/dist/types/store/store.d.ts +14 -9
- package/dist/types/store/utils.d.ts +7 -0
- package/package.json +21 -16
- package/dist/node.cjs +0 -11121
- package/dist/prod/store/next/patch-hooks.js +0 -13
- package/dist/prod/store/next/patch.js +0 -614
- package/dist/types/store/next/patch-hooks.d.ts +0 -41
- package/dist/types/store/next/patch.d.ts +0 -91
- package/dist/types-cjs/affects.d.cts +0 -47
- package/dist/types-cjs/boundaries.d.cts +0 -175
- package/dist/types-cjs/core/action.d.cts +0 -64
- package/dist/types-cjs/core/async.d.cts +0 -23
- package/dist/types-cjs/core/attribution-hooks.d.cts +0 -63
- package/dist/types-cjs/core/attribution.d.cts +0 -239
- package/dist/types-cjs/core/core.d.cts +0 -176
- package/dist/types-cjs/core/dev.d.cts +0 -95
- package/dist/types-cjs/core/effect.d.cts +0 -30
- package/dist/types-cjs/core/error.d.cts +0 -56
- package/dist/types-cjs/core/external.d.cts +0 -15
- package/dist/types-cjs/core/graph.d.cts +0 -28
- package/dist/types-cjs/core/heap.d.cts +0 -22
- package/dist/types-cjs/core/index.d.cts +0 -13
- package/dist/types-cjs/core/invariants.d.cts +0 -59
- package/dist/types-cjs/core/lanes.d.cts +0 -44
- package/dist/types-cjs/core/optimistic.d.cts +0 -6
- package/dist/types-cjs/core/owner.d.cts +0 -124
- package/dist/types-cjs/core/scheduler.d.cts +0 -231
- package/dist/types-cjs/core/types.d.cts +0 -204
- package/dist/types-cjs/core/verdict.d.cts +0 -2
- package/dist/types-cjs/index.d.cts +0 -10
- package/dist/types-cjs/map.d.cts +0 -69
- package/dist/types-cjs/package.json +0 -3
- package/dist/types-cjs/store/index.d.cts +0 -21
- package/dist/types-cjs/store/next/optimistic.d.cts +0 -23
- package/dist/types-cjs/store/next/patch-hooks.d.cts +0 -41
- package/dist/types-cjs/store/next/patch.d.cts +0 -91
- package/dist/types-cjs/store/next/projection.d.cts +0 -8
- package/dist/types-cjs/store/next/reconcile.d.cts +0 -17
- package/dist/types-cjs/store/next/store.d.cts +0 -127
- package/dist/types-cjs/store/next/target.d.cts +0 -192
- package/dist/types-cjs/store/store.d.cts +0 -138
- package/dist/types-cjs/store/storePath.d.cts +0 -58
- 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.
|
|
50
|
+
const t = e.ce;
|
|
51
51
|
if (!t) return;
|
|
52
52
|
t.T |= CONFIG_CHILD_COMPANIONS;
|
|
53
|
-
(ext(t).
|
|
53
|
+
(ext(t).Dt ??= new Set).add(e);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function getPendingSignal(e) {
|
|
57
|
-
let t = e.o?.
|
|
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).
|
|
63
|
+
ext(e).Le = t;
|
|
64
64
|
e.T |= CONFIG_HAS_COMPANIONS;
|
|
65
65
|
markFirewallChildCompanions(e);
|
|
66
|
-
ext(t).
|
|
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.
|
|
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.
|
|
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.
|
|
115
|
+
const r = i.ie & REACTIVE_RECOMPUTING_DEPS ? i.et : undefined;
|
|
116
116
|
if (r !== null) {
|
|
117
|
-
for (let e = i.
|
|
118
|
-
if (!e.
|
|
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?.
|
|
127
|
+
for (const t of e.o.le) if (!t.o?.Ue) return false;
|
|
132
128
|
return true;
|
|
133
129
|
}
|
|
134
|
-
return e.o?.
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const
|
|
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.
|
|
162
|
-
return !!(n.ie & REACTIVE_MANUAL_WRITE) || !n.o?.
|
|
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.
|
|
169
|
-
if (hasActiveOverride(e)) return !e.
|
|
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?.
|
|
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?.
|
|
181
|
-
if (e.o?.
|
|
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?.
|
|
186
|
-
setSignal(e.o?.
|
|
182
|
+
if (e.o?.Le) {
|
|
183
|
+
setSignal(e.o?.Le, computePendingState(e));
|
|
187
184
|
}
|
|
188
|
-
if (e.o?.
|
|
185
|
+
if (e.o?.Qe) updatePendingSignal(e.o?.Qe);
|
|
189
186
|
}
|
|
190
187
|
|
|
191
188
|
function updateChildCompanions(e) {
|
|
192
|
-
const t = e.o?.
|
|
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?.
|
|
212
|
-
for (let t = e.u; t !== null; t = t.
|
|
213
|
-
for (let t = e.o?.i ?? null; t !== null; t = t.
|
|
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.
|
|
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?.
|
|
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.
|
|
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?.
|
|
257
|
-
if (t && (t.o?.
|
|
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.
|
|
260
|
-
t.
|
|
261
|
-
t.
|
|
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?.
|
|
263
|
+
const n = e.o?.Qe;
|
|
267
264
|
if (n && !(n.ie & REACTIVE_DISPOSED)) {
|
|
268
|
-
if ((n.o?.
|
|
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?.
|
|
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).
|
|
293
|
+
ext(e).Qe = t;
|
|
297
294
|
e.T |= CONFIG_HAS_COMPANIONS;
|
|
298
295
|
markFirewallChildCompanions(e);
|
|
299
|
-
ext(t).
|
|
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.
|
|
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?.
|
|
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.
|
|
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?.
|
|
354
|
-
const e = findLane(t.o?.
|
|
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
|
|
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.
|
|
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?.
|
|
375
|
+
const t = e.o?.Gt;
|
|
379
376
|
if (t === undefined) return false;
|
|
380
|
-
const n = 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.
|
|
413
|
+
const t = e.ge;
|
|
417
414
|
const n = t ? currentTransition(t) : activeTransition;
|
|
418
|
-
if (!n || n.
|
|
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.
|
|
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.
|
|
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?.
|
|
449
|
-
const r = n && (e.o?.
|
|
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).
|
|
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.
|
|
529
|
+
GlobalQueue.pe = syncCompanions;
|
|
533
530
|
|
|
534
|
-
GlobalQueue.
|
|
531
|
+
GlobalQueue.Ne = updatePendingSignal;
|
|
535
532
|
|
|
536
|
-
GlobalQueue.
|
|
533
|
+
GlobalQueue.ke = updateChildCompanions;
|
|
537
534
|
|
|
538
535
|
GlobalQueue.un = snapCompanionsToState;
|
|
539
536
|
|
|
540
|
-
GlobalQueue.
|
|
537
|
+
GlobalQueue.wt = latestRead;
|
|
541
538
|
|
|
542
|
-
GlobalQueue.
|
|
539
|
+
GlobalQueue.Wt = pendingCheckRead;
|
|
543
540
|
|
|
544
|
-
GlobalQueue.
|
|
541
|
+
GlobalQueue.jt = recordFreshRead;
|
|
545
542
|
|
|
546
|
-
GlobalQueue.
|
|
543
|
+
GlobalQueue.st = applyReask;
|
|
547
544
|
|
|
548
545
|
GlobalQueue.k = repollDownstreamVerdicts;
|
|
549
546
|
|
|
550
|
-
GlobalQueue.
|
|
547
|
+
GlobalQueue.ri = witnessAffects;
|
|
551
548
|
|
|
552
|
-
GlobalQueue.
|
|
549
|
+
GlobalQueue.si = wakeSuppressedProbes;
|
|
553
550
|
|
|
554
551
|
export { isPending, latest };
|
package/dist/prod/index.js
CHANGED
|
@@ -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
|
-
|
|
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 };
|