Skip to content

1.0.2

Choose a tag to compare

@github-actions github-actions released this 29 Oct 00:57

Fixed

  • A computation that disposed its own owner while running no longer leaves graph edges for the signals it read afterward.
  • resource.refetch() on a disposed resource starts no fetch, and a Suspense boundary is released even when the flush after a resource settles (or after mutate()) throws.
  • The updater of resource.mutate(), the equals of useSelector, the function behind cache() and the subscribe function of useExternalStore run untracked.
  • useExternalStore unsubscribes when its first getSnapshot() after subscribing throws, useReaction's track() does nothing once its owner is disposed, and a throwing cleanup of a createRoot no longer replaces the error its body threw (both are thrown in an AggregateError).
  • A store no longer keeps one tracking signal per key it ever read in a tracked context: once an object has collected a few hundred of them, the ones nothing observes are dropped, and a key read again gets a fresh one that reflects the current value (store.byId[id] with churning ids no longer grows without bound).
  • Transitions started while a Suspense hold is engaged share one promise instead of adding a waiter each, and the list of suspended memos and effects lists a node once and drops the disposed ones.
  • The equals of a memo and of a signal runs untracked, so what it reads is not a dependency of the reader that pulled the memo or of the computation that writes.
  • DUPLICATE_CORE is raised now: in development builds createRoot lists its copy of core in a registry at globalThis[Symbol.for("shadow-js.core.instances")] (at most 8 copies, each with its number of live roots, removed with its last root) and warns once when a root is created while another copy of the same build (client or server) has live roots. Copies that never overlap, such as separate test files, do not warn.