Skip to content

@solidjs/signals@2.0.0-rc.6

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 19:56
· 31 commits to main since this release

Patch Changes

  • e13ca05: Attribution: async waterfall detection. A new flightStart dev 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 (cooperative DEV.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()); the ASYNC_WATERFALL diagnostic is the duration-gated verdict (each link ≥ waterfalls.minFlightMs, default 50ms): depth-2 chains emit at the new info severity on the structured channel only, depth-3+ escalate to a console warn, once per node with re-warn on growth. DiagnosticSeverity gains 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 _optimisticStores membership.
  • 6b743c6: Fix a one-frame isPending === true pulse leaking to direct render effects when a quiet refresh() 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 createEffect overload 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 _pendingValue with 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).