@solidjs/signals@2.0.0-rc.6
Pre-release
Pre-release
·
31 commits
to main
since this release
Patch Changes
- e13ca05: Attribution: async waterfall detection. A new
flightStartdev hook announces every async flight as it registers; the engine chains flights whose recompute was caused by an upstream flight's landing AND whose origin post-dates that landing — origin being the earliest provable start (cooperativeDEV.attribution.markFlight(promise, startedAt)stamps from preloaders/caches, first-seen object identity, else registration time), so preloaded work in the air alongside its upstream is parallel, never a waterfall link. Chains are recorded as queryable facts (DEV.attribution.waterfalls()); theASYNC_WATERFALLdiagnostic is the duration-gated verdict (each link ≥waterfalls.minFlightMs, default 50ms): depth-2 chains emit at the newinfoseverity on the structured channel only, depth-3+ escalate to a consolewarn, once per node with re-warn on growth.DiagnosticSeveritygains the"info"advisory tier. Zero production bytes (dev-hook site folds out; tree-shake guard covers it). - 432b089: Remove a duplicated SETTLE_WALK_UNINITIALIZED_SOURCE entry in the DiagnosticCode union (registered twice by parallel fixes; type-only, no behavior change).
- aa03f76: Share the pending-backing visibility decision between per-key store reads and deep()/snapshot composition (#3147). deep()/snapshot remain the speculative peek channel (they see ordinary pending staging synchronously), but a transition-HELD landing (#3164 fold) is now masked to the committed view for them exactly as it is for per-key readers, so the two reader families can no longer disagree while a transaction holds store landings.
- fb5061c: Optimistic store truth-flights now own their transaction (#3146): the flight declares it on the family at the ask (recording the causal transaction, or opening one when a stale stamp bare-returned the pre-throw entry), registers itself as its own async reporter so the transaction lives exactly as long as the question is unanswered — observed or not — and renews it per settle event. Bare optimistic writes (#2951) and landings route into the declared transaction instead of whatever stamp last brushed the firewall, and the transitionBlocked store-half checks declared ownership instead of reconstructing it from
_optimisticStoresmembership. - 6b743c6: Fix a one-frame
isPending === truepulse leaking to direct render effects when a quietrefresh()landing is transition-held (#3178). The quiet re-ask classification now survives the landing until the hold commits (the reveal), mirroring the #2990 loading-window treatment, so companion synchronization never classifies the held old value as pending. - 989579e: Retire stale pending-source ownership when an async computation is superseded and re-parks.
- 1012859: Attribution: fold hot-scope spam into a culprit-keyed aggregate. HOT_SCOPE_RERUNS blames the victim scope, so one hot cause fanning out over many scopes (a selection write re-running every row, a timer leaking into a list) produced N warnings for one culprit. Now the first scope to go hot for a given root-cause key warns as before (single hot scopes keep exact current behavior), subsequent scopes in the same window are counted silently, and scope-count milestones (5, then 10x) emit one escalating HOT_SCOPE_FANOUT diagnostic naming the shared cause.
- bf97b8a: Keep uninitialized settle diagnostics silent for pending-source ownership transfers.
- 71acf62: Register the SETTLE_WALK_UNINITIALIZED_SOURCE diagnostic code in the DiagnosticCode union (completes the settlePendingSource dev invariant).
- 32bc013: Remove the unsupported single-argument
createEffectoverload so TypeScript requires a separate effect callback while preserving the development runtime diagnostic. - 3e36d6d: Dev-only invariant diagnostic in settlePendingSource: walking a settle implies truth exists. A future call site that reaches the walk with an uninitialized source now fails loudly in development (SETTLE_WALK_UNINITIALIZED_SOURCE) instead of waking parked readers into a value that was never produced.
- 202ee53: Complete the SETTLE_WALK_UNINITIALIZED_SOURCE dev invariant: register the diagnostic code in the DiagnosticCode union (the emit site referenced an unregistered code, failing typecheck), and exempt uninitialized sources that still have truth to reveal — a transition-held first landing (streamed hydration) parks its value in
_pendingValuewith the flag still set, and a comparator throw on that landing leaves the node errored; both were false positives. - e767ebd: Require initialization for the recompute-side settle walk (#3181 follow-up). The walk compensates for a preempted landing, and a landing means truth exists — a node that leaves STATUS_PENDING while still STATUS_UNINITIALIZED (a projection driver whose first flight was superseded before any commit reached the observable store) has nothing to reveal. Waking parked readers there served them the projection's initial face: undefined data a read layer had promised was settled, which threw in unguarded reads and halted the reactive system (observed as the TanStack Query adapter's first loads wedging at their loading boundary on rc.5).