@solidjs/signals 2.0.0-rc.7 → 2.0.0-rc.9
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 +6357 -0
- package/dist/dev.attribution.js +2485 -0
- package/dist/dev.js +2851 -7027
- package/dist/observe/affects.js +129 -0
- package/dist/observe/attribution.js +7 -0
- package/dist/observe/boundaries.js +641 -0
- package/dist/observe/core/action.js +177 -0
- package/dist/observe/core/async.js +846 -0
- package/dist/observe/core/attribution-costs.js +66 -0
- package/dist/observe/core/attribution-feedback.js +282 -0
- package/dist/observe/core/attribution-hooks.js +82 -0
- package/dist/observe/core/attribution-queries.js +28 -0
- package/dist/observe/core/attribution.js +2095 -0
- package/dist/observe/core/constants.js +248 -0
- package/dist/{types-cjs/core/context.d.cts → observe/core/context.js} +37 -12
- package/dist/observe/core/core.js +1789 -0
- package/dist/observe/core/dev.js +293 -0
- package/dist/observe/core/effect.js +195 -0
- package/dist/observe/core/error-hooks.js +71 -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 +45 -0
- package/dist/observe/core/lanes.js +205 -0
- package/dist/observe/core/optimistic.js +585 -0
- package/dist/observe/core/owner.js +322 -0
- package/dist/observe/core/scheduler.js +1428 -0
- package/dist/observe/core/verdict.js +669 -0
- package/dist/observe/index.js +59 -0
- package/dist/observe/map.js +484 -0
- package/dist/{types-cjs/signals.d.cts → observe/signals.js} +311 -317
- package/dist/observe/store/index.js +40 -0
- package/dist/observe/store/next/optimistic.js +660 -0
- package/dist/observe/store/next/projection.js +255 -0
- package/dist/observe/store/next/reconcile.js +375 -0
- package/dist/observe/store/next/store.js +2327 -0
- package/dist/observe/store/next/target.js +51 -0
- package/dist/observe/store/store.js +325 -0
- package/dist/observe/store/storePath.js +103 -0
- package/dist/observe/store/utils.js +1023 -0
- package/dist/prod/attribution.js +41 -0
- package/dist/prod/boundaries.js +128 -76
- package/dist/prod/core/action.js +65 -37
- package/dist/prod/core/async.js +324 -172
- package/dist/prod/core/constants.js +57 -1
- package/dist/prod/core/context.js +3 -3
- package/dist/prod/core/core.js +1003 -364
- package/dist/prod/core/dev.js +17 -1
- package/dist/prod/core/effect.js +76 -42
- package/dist/prod/core/error-hooks.js +71 -0
- package/dist/prod/core/external.js +4 -4
- package/dist/prod/core/graph.js +37 -37
- package/dist/prod/core/heap.js +61 -56
- package/dist/prod/core/lanes.js +107 -63
- package/dist/prod/core/optimistic.js +374 -93
- package/dist/prod/core/owner.js +62 -46
- package/dist/prod/core/scheduler.js +653 -286
- package/dist/prod/core/verdict.js +245 -127
- package/dist/prod/index.js +15 -5
- package/dist/prod/map.js +292 -141
- package/dist/prod/signals.js +29 -16
- package/dist/prod/store/next/optimistic.js +77 -55
- package/dist/prod/store/next/projection.js +31 -20
- package/dist/prod/store/next/reconcile.js +87 -84
- package/dist/prod/store/next/store.js +718 -401
- package/dist/prod/store/next/target.js +32 -10
- package/dist/prod/store/store.js +12 -14
- package/dist/prod/store/utils.js +950 -130
- package/dist/types/attribution.d.ts +20 -0
- package/dist/types/attribution.prod.d.ts +22 -0
- package/dist/types/boundaries.d.ts +10 -1
- package/dist/types/core/action.d.ts +12 -5
- package/dist/types/core/async.d.ts +1 -1
- package/dist/types/core/attribution-costs.d.ts +35 -0
- package/dist/types/core/attribution-feedback.d.ts +133 -0
- package/dist/types/core/attribution-hooks.d.ts +147 -9
- package/dist/types/core/attribution-queries.d.ts +10 -0
- package/dist/types/core/attribution.d.ts +216 -182
- package/dist/types/core/constants.d.ts +56 -0
- package/dist/types/core/core.d.ts +190 -2
- package/dist/types/core/dev.d.ts +246 -28
- package/dist/types/core/effect.d.ts +8 -1
- package/dist/types/core/error-hooks.d.ts +71 -0
- package/dist/types/core/index.d.ts +4 -1
- package/dist/types/core/invariants.d.ts +4 -0
- package/dist/types/core/lanes.d.ts +39 -5
- package/dist/types/core/scheduler.d.ts +153 -0
- package/dist/types/core/types.d.ts +32 -9
- package/dist/types/index.d.ts +10 -3
- package/dist/types/map.d.ts +2 -0
- package/dist/types/signals.d.ts +8 -0
- package/dist/types/store/index.d.ts +2 -0
- package/dist/types/store/next/optimistic.d.ts +1 -1
- package/dist/types/store/next/store.d.ts +11 -5
- package/dist/types/store/next/target.d.ts +37 -10
- package/dist/types/store/utils.d.ts +178 -0
- package/package.json +21 -17
- package/dist/node.cjs +0 -10541
- package/dist/node.dev.cjs +0 -13724
- 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 -127
- package/dist/types-cjs/core/attribution.d.cts +0 -495
- package/dist/types-cjs/core/constants.d.cts +0 -159
- package/dist/types-cjs/core/core.d.cts +0 -185
- package/dist/types-cjs/core/dev.d.cts +0 -136
- 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 -24
- 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 -54
- 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 -236
- 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 -18
- package/dist/types-cjs/store/next/optimistic.d.cts +0 -25
- package/dist/types-cjs/store/next/projection.d.cts +0 -8
- package/dist/types-cjs/store/next/reconcile.d.cts +0 -10
- package/dist/types-cjs/store/next/store.d.cts +0 -121
- package/dist/types-cjs/store/next/target.d.cts +0 -166
- package/dist/types-cjs/store/store.d.cts +0 -143
- package/dist/types-cjs/store/storePath.d.cts +0 -58
- package/dist/types-cjs/store/utils.d.cts +0 -74
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
const REACTIVE_NONE = 0;
|
|
2
|
+
|
|
3
|
+
const REACTIVE_CHECK = 1 << 0;
|
|
4
|
+
|
|
5
|
+
const REACTIVE_DIRTY = 1 << 1;
|
|
6
|
+
|
|
7
|
+
const REACTIVE_RECOMPUTING_DEPS = 1 << 2;
|
|
8
|
+
|
|
9
|
+
const REACTIVE_IN_HEAP = 1 << 3;
|
|
10
|
+
|
|
11
|
+
const REACTIVE_IN_HEAP_HEIGHT = 1 << 4;
|
|
12
|
+
|
|
13
|
+
const REACTIVE_ZOMBIE = 1 << 5;
|
|
14
|
+
|
|
15
|
+
const REACTIVE_DISPOSED = 1 << 6;
|
|
16
|
+
|
|
17
|
+
const REACTIVE_OPTIMISTIC_DIRTY = 1 << 7;
|
|
18
|
+
|
|
19
|
+
const REACTIVE_SNAPSHOT_STALE = 1 << 8;
|
|
20
|
+
|
|
21
|
+
const REACTIVE_LAZY = 1 << 9;
|
|
22
|
+
|
|
23
|
+
const REACTIVE_MANUAL_WRITE = 1 << 10;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The pending recompute is a re-ask of the same question: `refresh()` dirtied
|
|
27
|
+
* the node while no tracked input changed value. Cleared whenever a real
|
|
28
|
+
* value-change notification arrives (`insertSubs`), and consumed by
|
|
29
|
+
* `recompute` into the node's `_reask` classification — a quiet (re-ask)
|
|
30
|
+
* pending window does not read as pending (question-scoped pending model).
|
|
31
|
+
*/ const REACTIVE_REASK = 1 << 11;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A dependency write landed while this subscriber was mid-recompute — a
|
|
35
|
+
* nested pull committed beneath one of its reads (#3037). The heap refuses
|
|
36
|
+
* RECOMPUTING nodes, so recompute's tail consumes this latch and reschedules:
|
|
37
|
+
* values the pass read before the nested commit are stale. Only set for
|
|
38
|
+
* links validated this pass (gen-current): a write to an untouched link is
|
|
39
|
+
* either re-read later in the pass (fresh) or trimmed with it (not a dep).
|
|
40
|
+
*/ const REACTIVE_MISSED_WAKE = 1 << 12;
|
|
41
|
+
|
|
42
|
+
// Static configuration bits packed into Owner/Computed/Signal _config.
|
|
43
|
+
const CONFIG_OWNED_WRITE = 1 << 0;
|
|
44
|
+
|
|
45
|
+
const CONFIG_NO_SNAPSHOT = 1 << 1;
|
|
46
|
+
|
|
47
|
+
const CONFIG_TRANSPARENT = 1 << 2;
|
|
48
|
+
|
|
49
|
+
const CONFIG_IN_SNAPSHOT_SCOPE = 1 << 3;
|
|
50
|
+
|
|
51
|
+
const CONFIG_CHILDREN_FORBIDDEN = 1 << 4;
|
|
52
|
+
|
|
53
|
+
const CONFIG_AUTO_DISPOSE = 1 << 5;
|
|
54
|
+
|
|
55
|
+
const CONFIG_SYNC = 1 << 6;
|
|
56
|
+
|
|
57
|
+
// Presence bits (stage-3 hot-path monomorphism, DESIGN-PATCH-CHANNEL §11b):
|
|
58
|
+
// optional per-node slots (_overrideValue, _pendingSignal/_latestValueComputed,
|
|
59
|
+
// _snapshotValue, _optimisticLane) are NOT part of every node's hidden class —
|
|
60
|
+
// reading a missing property defeats V8's inline caches on the hottest write/
|
|
61
|
+
// notify loops. These bits live on the always-present `_config` so hot paths
|
|
62
|
+
// pay one monomorphic masked read and only touch the optional field when its
|
|
63
|
+
// installer flagged it. Bits are STICKY ("may be set") — the guarded field
|
|
64
|
+
// read remains authoritative.
|
|
65
|
+
const CONFIG_OPTIMISTIC = 1 << 7;
|
|
66
|
+
|
|
67
|
+
const CONFIG_HAS_COMPANIONS = 1 << 8;
|
|
68
|
+
|
|
69
|
+
const CONFIG_HAS_SNAPSHOT = 1 << 9;
|
|
70
|
+
|
|
71
|
+
const CONFIG_HAS_LANE = 1 << 10;
|
|
72
|
+
|
|
73
|
+
/** Set on a FIREWALL computed when any of its child signals creates an
|
|
74
|
+
* isPending()/latest() companion. Gates the post-recompute child-companion
|
|
75
|
+
* walk (#3038): a store computed's `_child` chain holds one node per
|
|
76
|
+
* materialized leaf, so walking it unconditionally makes every update cost
|
|
77
|
+
* O(all leaves ever read). Sticky — set at companion creation, never
|
|
78
|
+
* cleared; sync-only apps never set it and never pay the walk. */ const CONFIG_CHILD_COMPANIONS = 1 << 11;
|
|
79
|
+
|
|
80
|
+
/** Set on a computed when its first firewall child signal is installed
|
|
81
|
+
* (projection machinery). Gates markNode's firewall-children walk with one
|
|
82
|
+
* masked read of the always-present _config — the walk's old `_child` read
|
|
83
|
+
* moved into the cold extension (§12), and an unconditional `_x` deref per
|
|
84
|
+
* marked node measurably taxed the propagation hot path (diamond -22%). */ const CONFIG_FW_CHILDREN = 1 << 12;
|
|
85
|
+
|
|
86
|
+
/** Authoritative-view reader (`until()`): while this node computes, reads
|
|
87
|
+
* dodge active optimistic OVERRIDES only — the predicate must observe
|
|
88
|
+
* arriving truth, never the caller's own tentative writes (which would
|
|
89
|
+
* trivially satisfy it). Everything else reads normally, INCLUDING
|
|
90
|
+
* transition-staged `_pendingValue`: staged data is authoritative (optimism
|
|
91
|
+
* lives only in override slots), and a hold that refused staged reads would
|
|
92
|
+
* deadlock on data the open transaction itself is holding (a refresh the
|
|
93
|
+
* action issued lands staged and cannot commit until the hold releases).
|
|
94
|
+
* read() checks the bit on the reading computation (`context`) directly — no
|
|
95
|
+
* ambient flag — so a shared computed the predicate pulls recomputes as
|
|
96
|
+
* itself (no bit) under the normal view, and its cache never forks. */ const CONFIG_AUTHORITATIVE_READ = 1 << 13;
|
|
97
|
+
|
|
98
|
+
/** Sticky mark: an authoritative-view reader read this node PAST an active
|
|
99
|
+
* override. The ack shape — an authoritative arrival EQUAL to the override —
|
|
100
|
+
* rides paths that are deliberately silent under A17 (every ordinary reader
|
|
101
|
+
* sees the override, so an equal landing changes nothing for them). A marked
|
|
102
|
+
* node notifies those readers on such paths anyway, so the landed truth is
|
|
103
|
+
* seen without re-firing ordinary subscribers. Never cleared — only nodes an
|
|
104
|
+
* until() predicate observed mid-override pay. */ const CONFIG_AUTHORITATIVE_OBSERVED = 1 << 14;
|
|
105
|
+
|
|
106
|
+
/** Promise-delivery effect (resolve()/until()): commits its computed value
|
|
107
|
+
* directly even when recomputing under its own held transition. These
|
|
108
|
+
* effects deliver applies on a microtask (#2930) instead of the stashed
|
|
109
|
+
* effect queues, so the value must ride the same immediate schedule — a
|
|
110
|
+
* staged value with an immediate apply delivers stale state (resolve) or
|
|
111
|
+
* deadlocks the hold (until). Safe because the node is a private leaf: no
|
|
112
|
+
* subscriber reads an effect's value, only its own apply does. */ const CONFIG_DIRECT_COMMIT = 1 << 15;
|
|
113
|
+
|
|
114
|
+
/** Fresh-pull reader (awaitable `refresh()`'s waiter effect): a read of a
|
|
115
|
+
* dirty source recomputes it inline even when the height gate defers to the
|
|
116
|
+
* flush. Closes the same-flush ordering race where a waiter created
|
|
117
|
+
* alongside a refresh() mark read the PRE-re-ask value as settled and
|
|
118
|
+
* delivered stale; with the pull, the waiter either parks on the re-ask's
|
|
119
|
+
* pending window (async — woken by the settle walk, which runs on every
|
|
120
|
+
* landing including equal-value ones) or serves its sync answer. resolve()
|
|
121
|
+
* deliberately keeps that race — its contract is "first settled value"
|
|
122
|
+
* (#2930), not "next quiescent state". */ const CONFIG_FRESH_READ = 1 << 16;
|
|
123
|
+
|
|
124
|
+
/** HELD truth (#3164): this node's staged `_pendingValue` is confirming
|
|
125
|
+
* truth riding a transaction that retains optimism, revealed only at that
|
|
126
|
+
* transaction's settle. Two arming sites, one meaning: the store fold
|
|
127
|
+
* (a landing staged into the retaining transaction) and until()'s
|
|
128
|
+
* flip-entanglement (a foreign carrier's staged write, stolen when it
|
|
129
|
+
* flipped the awaited predicate truthy). Until the reveal, ordinary
|
|
130
|
+
* readers — lane and speculative recomputes included — keep committed:
|
|
131
|
+
* the staging notified subscribers as a plain write, so without the mask
|
|
132
|
+
* a mid-hold recompute composes live optimism with the confirming truth,
|
|
133
|
+
* a frame no timeline contains (GabbeV's union tear). Authoritative
|
|
134
|
+
* readers (until()'s predicate) and latest() tunnel through — the
|
|
135
|
+
* exemption that keeps holds deadlock-free. Override-covered nodes never
|
|
136
|
+
* arm: the override is their display and its revert their notification
|
|
137
|
+
* (A17). Cleared at commit (the commit IS the reveal); subscribers masked
|
|
138
|
+
* during the hold are woken by finalizePureQueue's post-revert pass. */ const CONFIG_HELD_TRUTH = 1 << 17;
|
|
139
|
+
|
|
140
|
+
/** SLOT node (store leaf): created through `slotSignal` with `_host`/`_key`
|
|
141
|
+
* backrefs baked into the literal. The unobserved sweep dispatches these to
|
|
142
|
+
* the ONE shared hook (`setSlotUnobserved`) instead of a per-node closure
|
|
143
|
+
* held in a per-node extension — store mounts materialize one signal per
|
|
144
|
+
* touched leaf, so per-node allocations (options object, equals closure,
|
|
145
|
+
* unobserved closure, NodeExtension) were the measured create-floor bytes
|
|
146
|
+
* (warm dbmon profile: store node machinery ~36% + GC ~29%). */ const CONFIG_SLOT_NODE = 1 << 18;
|
|
147
|
+
|
|
148
|
+
/** Optimistic node whose own source arrived with a value DIFFERENT from its
|
|
149
|
+
* active override (A18 supersession, #3331). The override survives only as
|
|
150
|
+
* the displayed value — untracked reads and the applied frame keep it until
|
|
151
|
+
* the owning transaction commits — while the graph has already moved to the
|
|
152
|
+
* staged truth in `_pendingValue`: tracked readers see it and the corrected
|
|
153
|
+
* cascade is that transaction's held work. Set by the two own-source write
|
|
154
|
+
* paths (asyncWrite, transition-held recompute); cleared by a fresh optimistic
|
|
155
|
+
* write (a new override re-masks) and by the revert. */ const CONFIG_OVERRIDE_SUPERSEDED = 1 << 19;
|
|
156
|
+
|
|
157
|
+
/** HELD children (#3404): this node's `_firstChild` chain (and `_disposal`
|
|
158
|
+
* list) was built by a recompute whose result has not committed — a staged
|
|
159
|
+
* value, a pending window, or a run under a held transaction. A later
|
|
160
|
+
* recompute may tear those children down immediately: nothing observable
|
|
161
|
+
* was ever built on them. Unset, the children belong to the committed frame
|
|
162
|
+
* and a recompute defers them as zombies (`_pendingFirstChild`) until this
|
|
163
|
+
* node commits — regardless of whether the recompute runs under a
|
|
164
|
+
* transaction. A parked node (status propagation stamps `_transition`
|
|
165
|
+
* without recomputing) recomputed when its source lands otherwise disposed
|
|
166
|
+
* its committed children mid-hold, running their cleanups before the
|
|
167
|
+
* transaction's atomic reveal. Cleared by `commitPendingNode`. */ const CONFIG_HELD_CHILDREN = 1 << 20;
|
|
168
|
+
|
|
169
|
+
/** In-flight async node whose inputs were PUBLISHED while it was pending: a
|
|
170
|
+
* batch or transaction committed with the node still `STATUS_PENDING` (an
|
|
171
|
+
* unobserved flight, #3305), so the inputs are on screen and the node's
|
|
172
|
+
* committed `_value` is stale against them. Governs read()'s reveal
|
|
173
|
+
* carve-out: a stale (render) reader in some OTHER transaction may show a
|
|
174
|
+
* foreign-held pending node's committed value — parallel transactions, no
|
|
175
|
+
* entanglement — only while that value is coherent with the visible frame,
|
|
176
|
+
* i.e. while the flight's inputs are themselves held (unpublished) and not
|
|
177
|
+
* lane-revealed. Set by `commitPendingNodes`; cleared when the node next
|
|
178
|
+
* enters pending fresh (a new flight from a settled state). */ const CONFIG_INPUTS_PUBLISHED = 1 << 21;
|
|
179
|
+
|
|
180
|
+
/** A28 (4): the node was written inside a recompute that ran OUTSIDE a flush
|
|
181
|
+
* (a creation-time compute — boundary machinery, a mapArray's first run). Such
|
|
182
|
+
* a write is promoted at that recompute's end: readers in the same block see
|
|
183
|
+
* it. Cleared when the next flush begins; set only on that rare path. */ const CONFIG_PROMOTED = 1 << 22;
|
|
184
|
+
|
|
185
|
+
/** A28 for same-tick adoption: the node was staged outside a flush and then
|
|
186
|
+
* adopted by a transaction (initTransition) before any flush carried the
|
|
187
|
+
* staging — the stamp says "held", but nothing flushed is staged for it, so
|
|
188
|
+
* on no channel is the write visible yet: `latest()` answers the committed
|
|
189
|
+
* value, the verdict sees nothing pending (as the store's leaves already did
|
|
190
|
+
* through their own selection). Cleared when the carrying flush re-stamps the
|
|
191
|
+
* transaction's pending nodes (reassignPendingTransition). */ const CONFIG_ADOPTED_UNFLUSHED = 1 << 24;
|
|
192
|
+
|
|
193
|
+
/** The node's active override is a DERIVED one: a lane pass published its
|
|
194
|
+
* speculative result into the override slot instead of `_value` (lanes
|
|
195
|
+
* stage — an optimistic derivation is an override, #3479). Its truth is not
|
|
196
|
+
* `_value` but a recompute from its inputs' truth, so the body-end
|
|
197
|
+
* supersession (`endOptimism`) and the authoritative-flight blockage
|
|
198
|
+
* (`transitionBlocked`) skip it; the revert drops the override and re-derives
|
|
199
|
+
* it (`resolveOptimisticNodes`). Cleared with the override. */ const CONFIG_DERIVED_OVERRIDE = 1 << 23;
|
|
200
|
+
|
|
201
|
+
const STATUS_PENDING = 1 << 0;
|
|
202
|
+
|
|
203
|
+
const STATUS_ERROR = 1 << 1;
|
|
204
|
+
|
|
205
|
+
const STATUS_UNINITIALIZED = 1 << 2;
|
|
206
|
+
|
|
207
|
+
const EFFECT_RENDER = 1;
|
|
208
|
+
|
|
209
|
+
const EFFECT_USER = 2;
|
|
210
|
+
|
|
211
|
+
const EFFECT_TRACKED = 3;
|
|
212
|
+
|
|
213
|
+
/** OR-ed into the `type` a lane passes to its effect runners: lane runs
|
|
214
|
+
* apply ahead of their transaction and are exempt from ownership parking. */ const LANE_RUN = 4;
|
|
215
|
+
|
|
216
|
+
const NOT_PENDING = {};
|
|
217
|
+
|
|
218
|
+
const NO_SNAPSHOT = {};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Stand-in stored in `_overrideValue` for an optimistic write of literal
|
|
222
|
+
* `undefined` (#2898). The slot doubles as the optimistic-node brand
|
|
223
|
+
* (`undefined` = not optimistic, `NOT_PENDING` = at rest), so the raw value
|
|
224
|
+
* would erase the node's optimistic identity: the write turns invisible and
|
|
225
|
+
* follow-up writes route off the optimistic path and commit permanently.
|
|
226
|
+
* Same shape as NO_SNAPSHOT. Sites that surface the override VALUE unwrap
|
|
227
|
+
* via `visibleOverrideValue`; slot identity tests stay raw.
|
|
228
|
+
*/ const OVERRIDE_UNDEFINED = {};
|
|
229
|
+
|
|
230
|
+
/** Unwrap an active override's stored value for surfacing to readers (#2898). */ function unwrapOverride(E) {
|
|
231
|
+
return E === OVERRIDE_UNDEFINED ? undefined : E;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const STORE_SNAPSHOT_PROPS = "sp";
|
|
235
|
+
|
|
236
|
+
const SUPPORTS_PROXY = typeof Proxy === "function";
|
|
237
|
+
|
|
238
|
+
const defaultContext = {};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Brand symbol used by `Refreshable<T>` values (projection stores, async
|
|
242
|
+
* memos) to expose their underlying computation to `refresh()`. Not part of
|
|
243
|
+
* the user-facing API.
|
|
244
|
+
*
|
|
245
|
+
* @internal
|
|
246
|
+
*/ const $REFRESH = Symbol("refresh");
|
|
247
|
+
|
|
248
|
+
export { $REFRESH, CONFIG_ADOPTED_UNFLUSHED, CONFIG_AUTHORITATIVE_OBSERVED, CONFIG_AUTHORITATIVE_READ, CONFIG_AUTO_DISPOSE, CONFIG_CHILDREN_FORBIDDEN, CONFIG_CHILD_COMPANIONS, CONFIG_DERIVED_OVERRIDE, CONFIG_DIRECT_COMMIT, CONFIG_FRESH_READ, CONFIG_FW_CHILDREN, CONFIG_HAS_COMPANIONS, CONFIG_HAS_LANE, CONFIG_HAS_SNAPSHOT, CONFIG_HELD_CHILDREN, CONFIG_HELD_TRUTH, CONFIG_INPUTS_PUBLISHED, CONFIG_IN_SNAPSHOT_SCOPE, CONFIG_NO_SNAPSHOT, CONFIG_OPTIMISTIC, CONFIG_OVERRIDE_SUPERSEDED, CONFIG_OWNED_WRITE, CONFIG_PROMOTED, CONFIG_SLOT_NODE, CONFIG_SYNC, CONFIG_TRANSPARENT, EFFECT_RENDER, EFFECT_TRACKED, EFFECT_USER, LANE_RUN, NOT_PENDING, NO_SNAPSHOT, OVERRIDE_UNDEFINED, REACTIVE_CHECK, REACTIVE_DIRTY, REACTIVE_DISPOSED, REACTIVE_IN_HEAP, REACTIVE_IN_HEAP_HEIGHT, REACTIVE_LAZY, REACTIVE_MANUAL_WRITE, REACTIVE_MISSED_WAKE, REACTIVE_NONE, REACTIVE_OPTIMISTIC_DIRTY, REACTIVE_REASK, REACTIVE_RECOMPUTING_DEPS, REACTIVE_SNAPSHOT_STALE, REACTIVE_ZOMBIE, STATUS_ERROR, STATUS_PENDING, STATUS_UNINITIALIZED, STORE_SNAPSHOT_PROPS, SUPPORTS_PROXY, defaultContext, unwrapOverride };
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
export type ContextRecord = Record<string | symbol, unknown>;
|
|
1
|
+
import { NoOwnerError, ContextNotFoundError } from "./error.js";
|
|
2
|
+
|
|
3
|
+
import { getOwner } from "./owner.js";
|
|
4
|
+
|
|
7
5
|
/**
|
|
8
6
|
* Context provides a form of dependency injection. It is used to save from needing to pass
|
|
9
7
|
* data as props through intermediate components. This function creates a new context object
|
|
@@ -11,8 +9,13 @@ export type ContextRecord = Record<string | symbol, unknown>;
|
|
|
11
9
|
*
|
|
12
10
|
* A default value can be provided here which will be used when a specific value is not provided
|
|
13
11
|
* via a `setContext` call.
|
|
14
|
-
*/
|
|
15
|
-
|
|
12
|
+
*/ function createContext(e, t) {
|
|
13
|
+
return {
|
|
14
|
+
id: Symbol(t),
|
|
15
|
+
defaultValue: e
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* Low-level owner-targeted context read. The user-facing read API is
|
|
18
21
|
* `useContext` (in `solid-js`), which wraps this primitive. Exposed here for
|
|
@@ -22,8 +25,19 @@ export declare function createContext<T>(defaultValue?: T, description?: string)
|
|
|
22
25
|
* @throws `ContextNotFoundError` if a context value has not been set yet.
|
|
23
26
|
*
|
|
24
27
|
* @internal
|
|
25
|
-
*/
|
|
26
|
-
|
|
28
|
+
*/ function getContext(e, t = getOwner()) {
|
|
29
|
+
if (!t) {
|
|
30
|
+
throw new NoOwnerError;
|
|
31
|
+
}
|
|
32
|
+
// `undefined` alone means unset — a provided `null` is a value (no `??`).
|
|
33
|
+
let r = t.wt[e.id];
|
|
34
|
+
if (r === undefined) r = e.defaultValue;
|
|
35
|
+
if (r === undefined) {
|
|
36
|
+
throw new ContextNotFoundError;
|
|
37
|
+
}
|
|
38
|
+
return r;
|
|
39
|
+
}
|
|
40
|
+
|
|
27
41
|
/**
|
|
28
42
|
* Low-level owner-targeted context write. The user-facing API is
|
|
29
43
|
* `createContext` (in `solid-js`); its provider component wraps this
|
|
@@ -32,5 +46,16 @@ export declare function getContext<T>(context: Context<T>, owner?: Owner | null)
|
|
|
32
46
|
* @throws `NoOwnerError` if there's no owner at the time of call.
|
|
33
47
|
*
|
|
34
48
|
* @internal
|
|
35
|
-
*/
|
|
36
|
-
|
|
49
|
+
*/ function setContext(e, t, r = getOwner()) {
|
|
50
|
+
if (!r) {
|
|
51
|
+
throw new NoOwnerError;
|
|
52
|
+
}
|
|
53
|
+
// We're creating a new object to avoid child context values being exposed to parent owners. If
|
|
54
|
+
// we don't do this, everything will be a singleton and all hell will break lose.
|
|
55
|
+
r.wt = {
|
|
56
|
+
...r.wt,
|
|
57
|
+
[e.id]: t === undefined ? e.defaultValue : t
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { createContext, getContext, setContext };
|