chore: release packages - #210
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
github-actions
Bot
force-pushed
the
changeset-release/master
branch
10 times, most recently
from
August 31, 2026 16:28
ab3eb43 to
e32c9bb
Compare
2 tasks
github-actions
Bot
force-pushed
the
changeset-release/master
branch
from
September 1, 2026 04:13
e32c9bb to
8eb4fd3
Compare
github-actions
Bot
force-pushed
the
changeset-release/master
branch
from
September 1, 2026 05:22
8eb4fd3 to
f84f93d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to master, this PR will be updated.
Releases
@rabjs/observer@9.4.0
Minor Changes
map.set(k, v)for an existing key) now notify value-side iteration dependencies (forEach/values/entries/for...of/size), which previously never re-ran and kept reading stale data.Map.keys()iterations moved to a separate key-side bucket (Vue'sMAP_KEY_ITERATE_KEYdesign) so they are still only triggered by add/delete/clear, not by value overwrites (observer: Map 已有 key 的值覆盖不通知迭代依赖,forEach/values 永久读到脏数据 #211). Forged[object Map]plain objects still use the object set path and do not re-runownKeysobservers.Patch Changes
TypeError: 'get' on proxywhen reading a frozen (non-configurable + non-writable) own array mutator property on an observable array. The batch-wrapping introduced for array mutators (observer: 数组方法无批处理, pop/fill/splice 触发多次通知 (NEW-D) #93) ran before the Proxy get invariant check and returned a different function object; the invariant check now runs first in both base and shadow get traps (observer: 数组变异方法的 batch 包装先于 Proxy get 不变式检查,冻结自有属性抛 TypeError #251).batch()flush-error handling hardening: attaching the flush error ascauseis skipped when the callback and a reaction threw the identicalErrorinstance (a self-referentialcauseloops naive cause-chain walkers), and theconsole.warnfallback for unattached flush errors is itself isolated so throwing console shims cannot replace the in-flight exception. Also, reviving an unobserved reaction viaobserve(r)no longer overwrites its customscheduler/debuggerwith global defaults.batch(fn)no longer lets a flush-time reaction error replace the callback's own in-flight exception. Previouslytry { batch(mutate) } catchcaught the reaction's error while the callback's original error was silently dropped; the flush error is now attached ascauseon the original error when possible (observer: batch() 的 flush 错误会吞掉回调自身的异常 #212).notify(target, key)now unwraps a proxy-form key the same way collection traps do. Passing an observable object as a Map/Set key tonotifypreviously looked up a fresh WeakRef that never matched the registered (raw-identity) dependencies, silently notifying no one (observer: notify() 不解包 proxy 形式的 key,静默漏通知 #214).observe(r)on a previously unobserved reaction now resets theunobservedflag, restoring it as a live reaction that collects dependencies and reacts to changes. Previously the reuse path returned a reaction that executed once (appearing revived) but never tracked dependencies again, silently ignoring all subsequent changes (observer: observe() 复用已 unobserve 的 reaction 时不重置状态,返回静默失效的 reaction #215).runAsReactionreleased all connections up front and a throw left only keys read before the throw point, so later keys went silent until the next successful run (observer: reaction 重跑抛错后只保留抛错点之前的部分依赖,后续变更漏通知 #213).@rabjs/react@9.4.0
Minor Changes
useReactiongains a two-function (MobXreaction-style) overloaduseReaction(dataFn, effect, { fireImmediately }): the data function collects dependencies on mount without running the effect, and the effect runs with(current, previous)only after dependencies change. This provides the "don't run on mount" semantics that the single-function form'simmediate: falsecannot express, since the effect and dependency collection share one function there (react: useReaction({ immediate: false }) 仍在挂载时执行副作用,选项实际是空操作 #200). The single-function form'simmediateJSDoc now documents this honestly.Patch Changes
946f148:
bindServicescontainer teardown scheduling now falls backqueueMicrotask→Promise→setTimeout, so cleanup still happens in legacy JS engines withoutqueueMicrotask(old React Native JSC/Hermes). Also extracts an internalcreateContainerfactory used by both creation and the hidden-tree rebuild path.cd8ec15:
bindServicesnow destroys its container on unmount instead of waiting for the FinalizationRegistry/GC fallback. Service cleanup (event listeners, debounce/throttle timers) previously stayed pending for an unbounded window. Destroy is scheduled on a microtask so React StrictMode's fake unmount/remount does not tear down a live container; the GC fallback is kept for concurrent renders that never commit (react: bindServices 卸载时不销毁容器,Service destroy 延迟到 GC 之后 #218).Behavior change: the container is private to the bound subtree by design. Service instances held outside the subtree (stored in refs, injected into parent/global containers, kept in external caches) become destroyed objects after unmount — do not let subtree services escape; if an instance's lifetime must outlive the component, register it in a parent container instead (react: bindServices 卸载即销毁容器,逃逸到组件外的 service 引用变成死对象 #252).
3c2fee7:
useDomainContextnow syncs its internal ref on every render, so consumers (useService/useContainer/useContainerEvents) followDomainContext.Providervalue changes instead of permanently resolving against the first-render container (react: useDomainContext 的 ref 永不更新,Provider 值切换后解析到旧容器 #217).a150846: The domain README now documents the real API (
bindServiceswith tuple-style service registrations,RSRoot/RSStrict) instead of the non-existentcreateDomain/Provider/createNestedDomainfunctions and the object-form{ identifier, factory }registrations that throw at runtime. The deadProviderOptions/ProviderResult/DomainComponenttypes and the brokentypes/window.d.tsare removed (react: domain README 记载的 createDomain API 不存在,bindServices 参数格式文档错误 #223).8bd3a16:
useAsObservableSourcenow wraps a shallow copy of the input instead of the original object, so passing React component props no longer throwsTypeError: 'set' on proxy: trap returned falsishin dev mode (React freezes props) (react: useAsObservableSource(props) 在 React dev 模式下直接崩溃(frozen props) #216). The caller's original object is never mutated.946f148:
useReaction(dataFn, effectFn): reads inside the effect are no longer collected as dependencies — the effect now runs untracked (MobXreactionsemantics), so mutating observables only touched by the effect no longer spuriously re-fires it (react: useReaction 双函数形式的 effect 内读取泄漏进依赖集合 #249). Also, passing the ignoredlazyoption to the single-function form now emits a development-mode warning instead of being silently dropped (react: useReaction 默认行为翻转为挂载即执行、用户 lazy 选项被静默丢弃(semver 违规) #253).946f148: Class components wrapped by
view()now start dependency tracking only after the first commit (componentDidMountcreates the reaction and forces one re-render to collect deps; pre-commit renders run raw). A discarded render pass can no longer leak a live reaction that keeps callingforceUpdateon a dead instance — class components cannot use theuseObserverFinalizationRegistry backstop because the leaked subgraph is self-sustaining. This also moves the static-rendering check from constructor-time to render-time, matching the function-component path (react: 类组件 view() 在构造期锁死 static rendering 标志,与函数组件检查时机不一致 #254). Additionally, lifecycle methods declared as arrow-function class fields (componentDidMount = () => {...}) no longer shadow the wrapper's revival/cleanup logic: they are rebound in the constructor to run both the user's field and the wrapper logic.Updated dependencies [946f148]
Updated dependencies [946f148]
Updated dependencies [6c0aa33]
Updated dependencies [946f148]
Updated dependencies [cf93d8d]
Updated dependencies [946f148]
Updated dependencies [358f357]
Updated dependencies [5095f54]
Updated dependencies [46f2e01]
Updated dependencies [946f148]
Updated dependencies [946f148]
Updated dependencies [cf0c308]
Updated dependencies [dd17bbd]
Updated dependencies [1978dba]
Updated dependencies [05d2d2a]
@rabjs/devtools@9.4.0
Patch Changes
@rabjs/rn-debug@9.4.0
Patch Changes
@rabjs/service@9.4.0
Patch Changes
cleanupAllMemosnow notifies outer observers per cleaned memo key (batched into a single flush), matchinginvalidateMemosemantics — mountedobserve/observerconsumers no longer stay stale after a cache reset.Service.destroypasses{ notify: false }to keep its deliberate silence (service: cleanupAllMemos 不 notify 外层观察者,与 invalidateMemo/依赖变化路径不一致 #255).cleanupAllMemos/cleanupAllDebounces/cleanupAllThrottlesnow walk the full prototype chain instead of only the direct prototype. Decorated members defined on a base class are cleaned up when a subclass instance is destroyed; previously their memo reactions kept running and debounce/throttle timers kept firing on destroyed instances (service: cleanupAllMemos/Debounces/Throttles 只扫直接原型,继承的装饰器成员 destroy 后泄漏 #221).@Debounce/@Throttleno longer throwTypeError: Invalid value used as weak map keyon detached calls (thisnull/undefined, e.g.arr.map(service.save)or destructured methods). Detached calls share one module-level sentinel state, matching the pre-WeakMap closure behavior (service: @Debounce/@Throttle 分离调用(this 为空)抛 WeakMap key TypeError #250).@Debounce/@Throttlestate (timers, pending args,this, results) is now stored per instance instead of in the decorator closure shared by every instance of the class. Previously one instance's pending call was silently dropped when another instance invoked the same method, and destroying one instance cancelled every other instance's pending calls (service: @Debounce/@Throttle 状态闭包跨实例共享,destroy 互相取消 pending 调用 #220).@Injectcaches are now per-instance instead of shared across every instance of the class. Previously the first instance's resolved dependency (from whatever container it belonged to) leaked into all other instances, including cross-container and re-bound scenarios, and a manualseton one instance overwrote every other instance's injection (service: @Inject 的缓存闭包在所有实例间共享,跨实例/跨容器依赖污染 #219).@Memogetters returning stale cached values when read insidebatch()(including the implicit batch around array mutators). Cache invalidation bookkeeping (computed = false) now happens synchronously on the trigger path via the reaction'sdebuggerhook (filtered to write operations); only the outernotifystays deferred to flush. The memo's inner reaction is also reused across recomputations instead of being recreated, so a notify queued mid-batch can no longer be dropped (service: batch() 内读取 @Memo getter 返回过期缓存值 #248).observe/observerconsumers of a@Memogetter going permanently silent after the getter throws once. The proxy get trap registers the dependency only after the getter returns, so a throwing getter left the outer reaction with zero dependencies and no later change could wake it. The memo accessor now pre-registers the(instance, key)dependency through thehastrap before computing, so recovery works once the underlying data is fixed (service: @Memo getter 抛错一次后,读它的外层 observe/observer 永久失效 #247).$model.method.loadingis a boolean last-write flag (not a pending count) and$model.method.errorcannot be attributed under overlapping same-method calls.@rabjs/web-mcp@9.4.0
Patch Changes
@rabjs/rn-debug-server@9.4.0
@rabjs/shared@9.4.0
reactive-state@0.0.6
Patch Changes
@rabjs/website@9.0.6
Patch Changes