Repository navigation
perf(react-router): reduce Link runtime allocations - #8324
schiller-manuel merged 2 commits into
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 10 included reviews per hour; 1 remains after this review. 📝 WalkthroughWalkthroughThe PR stabilizes ChangesReact Router rendering behavior
Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~15 minutes Suggested reviewers: Merge Risk: ⚪ Minimal · up to The hydration and Link performance changes preserve existing rendering, accessibility, ref, and hook behavior while reducing avoidable runtime work. The change is ready to merge. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 4 files. (2 skipped: 2 unsupported.) ✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
a30746b to
0803e7a
Compare
|
View your CI Pipeline Execution ↗ for commit d249878
☁️ Nx Cloud last updated this comment at |
🚀 Changeset Version Preview7 package(s) bumped directly, 22 bumped as dependents. 🟩 Patch bumps
|
Bundle Size Benchmarks
The following scenarios have bundle-size changes compared with the baseline:
Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better. |
0803e7a to
f19c091
Compare
f19c091 to
0347a36
Compare
0347a36 to
cdc8878
Compare
cdc8878 to
bbf2222
Compare
bbf2222 to
e22657a
Compare
There was a problem hiding this comment.
Important
At least one additional CI pipeline execution has run since the conclusion below was written and it may no longer be applicable.
Nx Cloud has identified a possible root cause for your failed CI:
We classified this failure as an environment issue rather than a code regression. The failing test (tanstack-vue-start-e2e-basic — client-side script loading) is completely unrelated to our react-router Link performance changes, and the project was not touched by this PR. With a 0% flakiness rate and no similar failures on other branches, this appears to be a pre-existing infrastructure issue.
No code changes were suggested for this issue.
Trigger a rerun:
🎓 Learn more about Self-Healing CI on nx.dev
Omit type and disabled in one rest copy for native anchors instead of copying the hook result twice. Custom components still receive disabled, and useLinkProps still returns supported type/disabled values. Add client/SSR coverage for those distinctions, refs and render-function children. Against 6e4584e0d8, four balanced fresh-process pairs with one implementation per process reduced client parameter-updater CPU from 15.61515 to 15.14615 ms per eight-navigation batch (-3.00%, 95% CI -4.19% to -1.80%); wall -3.04% (-4.29% to -1.78%). SSR shared-param CPU fell from 1.45208 to 1.41006 ms per four-request batch (-2.89%, CI -3.80% to -1.98%); wall -2.85% (-3.84% to -1.84%). Earlier co-loaded comparisons were inconclusive. React Router minimal gzip -5 bytes to 85773; full +1 to 89358. Other React fixtures vary -3 to +4 bytes, raw +14; Solid/Vue remain byte-identical. No public API or prop functionality removed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Reuse the existing true/false snapshot functions instead of allocating them on every useHydrated render. This lets React skip unnecessary store-instance passive bookkeeping without changing hydration values or adding hooks. Cover stable identities and an actual server-render/hydrateRoot transition. Against b6971a434a, four balanced fresh-process pairs per case (200 warmup and 500 measured eight-navigation batches) reduced parameter-updater CPU from 15.16880 to 14.99436 ms (-1.15%, 95% CI -1.84% to -0.46%); wall -1.05% (-1.62% to -0.47%). Middleware CPU fell from 15.23708 to 14.81729 ms (-2.75%, CI -4.46% to -1.01%); wall -2.79% (-4.53% to -1.01%). React Router minimal/full gzip increases 14/15 bytes for this isolated fix, remaining below the initial branch baseline. All Solid/Vue bundle output is unchanged. Public APIs, server snapshots and client hydration transitions are preserved. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
e22657a to
d249878
Compare
* perf(react-router): filter native Link props once Omit type and disabled in one rest copy for native anchors instead of copying the hook result twice. Custom components still receive disabled, and useLinkProps still returns supported type/disabled values. Add client/SSR coverage for those distinctions, refs and render-function children. Against 6e4584e0d8, four balanced fresh-process pairs with one implementation per process reduced client parameter-updater CPU from 15.61515 to 15.14615 ms per eight-navigation batch (-3.00%, 95% CI -4.19% to -1.80%); wall -3.04% (-4.29% to -1.78%). SSR shared-param CPU fell from 1.45208 to 1.41006 ms per four-request batch (-2.89%, CI -3.80% to -1.98%); wall -2.85% (-3.84% to -1.84%). Earlier co-loaded comparisons were inconclusive. React Router minimal gzip -5 bytes to 85773; full +1 to 89358. Other React fixtures vary -3 to +4 bytes, raw +14; Solid/Vue remain byte-identical. No public API or prop functionality removed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * perf(react-router): stabilize hydration snapshot getters Reuse the existing true/false snapshot functions instead of allocating them on every useHydrated render. This lets React skip unnecessary store-instance passive bookkeeping without changing hydration values or adding hooks. Cover stable identities and an actual server-render/hydrateRoot transition. Against b6971a434a, four balanced fresh-process pairs per case (200 warmup and 500 measured eight-navigation batches) reduced parameter-updater CPU from 15.16880 to 14.99436 ms (-1.15%, 95% CI -1.84% to -0.46%); wall -1.05% (-1.62% to -0.47%). Middleware CPU fell from 15.23708 to 14.81729 ms (-2.75%, CI -4.46% to -1.01%); wall -2.79% (-4.53% to -1.01%). React Router minimal/full gzip increases 14/15 bytes for this isolated fix, remaining below the initial branch baseline. All Solid/Vue bundle output is unchanged. Public APIs, server snapshots and client hydration transitions are preserved. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
## Dependency Updates | Package | From | To | Type | | --- | --- | --- | --- | | `@babel/core` | 8.0.1 | 8.0.5 | patch | | `@effect/platform-node` | 4.0.0-rc.112 | 4.0.0-rc.115 | prerelease | | `@effect/sql-d1` | 4.0.0-rc.112 | 4.0.0-rc.115 | prerelease | | `@effect/vitest` | 4.0.0-rc.112 | 4.0.0-rc.115 | prerelease | | `@inlang/paraglide-js` | 2.25.0 | 2.25.4 | patch | | `@react-email/ui` | 6.9.3 | 6.9.5 | patch | | `@rolldown/plugin-babel` | 0.2.3 | 0.2.4 | patch | | `@tanstack/react-query` | 5.103.0 | 5.103.1 | patch | | `@tanstack/react-router` | 1.170.32 | 1.170.38 | patch | | `@tanstack/react-router-devtools` | 1.167.1 | 1.167.2 | patch | | `@tanstack/react-router-ssr-query` | 1.167.2 | 1.167.3 | patch | | `@tanstack/react-start` | 1.168.49 | 1.168.56 | patch | | `@testing-library/dom` | 10.4.1 | 10.4.2 | patch | | `ai` | 7.0.101 | 7.0.106 | patch | | `effect` | 4.0.0-rc.112 | 4.0.0-rc.115 | prerelease | | `effectful-better-auth` | 1.0.0 | 1.0.2 | patch | | `jose` | 6.2.10 | 6.2.12 | patch | | `posthog-node` | 5.52.1 | 5.52.4 | patch | | `react-email` | 6.9.3 | 6.9.5 | patch | | `ws` | 8.21.0 | 8.21.3 | patch | ## Release Notes <details> <summary><b>@<!---->babel/core</b> (8.0.1 → 8.0.5)</summary> ## v8.0.5 (2026-09-10) Thanks @<!---->drubetti, @<!---->jibin7jose, @<!---->joelle-a-dev, @<!---->journey-ad, @<!---->Kjubikstronk, @<!---->MatteoGabriele, and @<!---->zhangli091011 for your first PRs! #### 👓 Spec Compliance * `babel-parser` * [#18218](babel/babel#18218) fix(parser): do not form html entity for invalid codepoint ([@<!---->JLHwung](https://github.com/JLHwung)) #### 🐛 Bug Fix * `babel-parser` * [#18215](babel/babel#18215) fix(parser): remove non-decimal prefix from bigint ([@<!---->JLHwung](https://github.com/JLHwung)) * [#18063](babel/babel#18063) Disallow new import prop access ([@<!---->JLHwung](https://github.com/JLHwung)) * `babel-plugin-transform-destructuring` * [#18214](babel/babel#18214) fix: only collapse the empty-object check when it targets the declared binding ([@<!---->Kjubikstronk](https://github.com/Kjubikstronk)) * `babel-plugin-transform-typescript` * [#18190](babel/babel#18190) fix(ts): improve variable handling in namespace ([@<!---->JLHwung](https://github.com/JLHwung)) * [#18207](babel/babel#18207) [ts] Allow merging `enum` into a `namespace` ([@<!---->nicolo-ribaudo](https://github.com/nicolo-ribaudo)) * `babel-node` * [#18217](babel/babel#18217) Fix import path for babel-node.js ([@<!---->drubetti](https://github.com/drubetti)) * `babel-plugin-bugfix-safari-rest-destructuring-rhs-array` * [#18213](babel/babel#18213) fix(bugfix): bound check before array access ([@<!---->JLHwung](https://github.com/JLHwung)) * `babel-traverse` * [#18183](babel/babel#18183) fix(remove): unwrap single sequence expression ([@<!---->JLHwung](https://github.com/JLHwung)) * [#18153](babel/babel#18153) Handle null in `getAll{Prev,Next}Siblings` ([@<!---->JLHwung](https://github.com/JLHwung)) * `babel-plugin-transform-block-scoping` * [#18194](https://github.com/babel/b …[full notes](https://github.com/babel/babel/releases/tag/v8.0.5) </details> <details> <summary><b>@<!---->effect/platform-node</b> (4.0.0-rc.112 → 4.0.0-rc.115) — 2 releases</summary> <details> <summary><b>4.0.0-rc.115</b></summary> ### Patch Changes - Updated dependencies [[`657254b`](Effect-TS/effect@657254b), [`f9ef0e9`](Effect-TS/effect@f9ef0e9), [`4f73f9e`](Effect-TS/effect@4f73f9e)]: - effect@4.0.0-rc.115 - @<!---->effect/platform-node-shared@4.0.0-rc.115 </details> <details> <summary><b>4.0.0-rc.114</b></summary> ### Patch Changes - Updated dependencies [[`3ff4952`](Effect-TS/effect@3ff4952), [`6d55555`](Effect-TS/effect@6d55555), [`716e0c0`](Effect-TS/effect@716e0c0), [`d4e4ad5`](Effect-TS/effect@d4e4ad5), [`b1988f4`](Effect-TS/effect@b1988f4), [`482b7d7`](Effect-TS/effect@482b7d7), [`716e0c0`](Effect-TS/effect@716e0c0), [`9941e6d`](Effect-TS/effect@9941e6d)]: - effect@4.0.0-rc.114 - @<!---->effect/platform-node-shared@4.0.0-rc.114 </details> </details> <details> <summary><b>@<!---->effect/sql-d1</b> (4.0.0-rc.112 → 4.0.0-rc.115) — 2 releases</summary> <details> <summary><b>4.0.0-rc.115</b></summary> ### Patch Changes - Updated dependencies [[`657254b`](Effect-TS/effect@657254b), [`f9ef0e9`](Effect-TS/effect@f9ef0e9), [`4f73f9e`](Effect-TS/effect@4f73f9e)]: - effect@4.0.0-rc.115 </details> <details> <summary><b>4.0.0-rc.114</b></summary> ### Patch Changes - Updated dependencies [[`3ff4952`](Effect-TS/effect@3ff4952), [`6d55555`](Effect-TS/effect@6d55555), [`716e0c0`](Effect-TS/effect@716e0c0), [`d4e4ad5`](Effect-TS/effect@d4e4ad5), [`b1988f4`](Effect-TS/effect@b1988f4), [`482b7d7`](Effect-TS/effect@482b7d7), [`716e0c0`](Effect-TS/effect@716e0c0), [`9941e6d`](Effect-TS/effect@9941e6d)]: - effect@4.0.0-rc.114 </details> </details> <details> <summary><b>@<!---->effect/vitest</b> (4.0.0-rc.112 → 4.0.0-rc.115) — 2 releases</summary> <details> <summary><b>4.0.0-rc.115</b></summary> ### Patch Changes - Updated dependencies [[`657254b`](Effect-TS/effect@657254b), [`f9ef0e9`](Effect-TS/effect@f9ef0e9), [`4f73f9e`](Effect-TS/effect@4f73f9e)]: - effect@4.0.0-rc.115 </details> <details> <summary><b>4.0.0-rc.114</b></summary> ### Patch Changes - Updated dependencies [[`3ff4952`](Effect-TS/effect@3ff4952), [`6d55555`](Effect-TS/effect@6d55555), [`716e0c0`](Effect-TS/effect@716e0c0), [`d4e4ad5`](Effect-TS/effect@d4e4ad5), [`b1988f4`](Effect-TS/effect@b1988f4), [`482b7d7`](Effect-TS/effect@482b7d7), [`716e0c0`](Effect-TS/effect@716e0c0), [`9941e6d`](Effect-TS/effect@9941e6d)]: - effect@4.0.0-rc.114 </details> </details> <details> <summary><b>@<!---->tanstack/react-query</b> (5.103.0 → 5.103.1)</summary> ### Patch Changes - Updated dependencies \[[`8330b2f`](TanStack/query@8330b2f), [`3212966`](TanStack/query@3212966)]: - @<!---->tanstack/query-core@5.103.1 </details> <details> <summary><b>@<!---->tanstack/react-router</b> (1.170.32 → 1.170.38) — 3 releases</summary> <details> <summary><b>1.170.38</b></summary> ### Patch Changes - Updated dependencies \[[`cecae54`](TanStack/router@cecae54), [`0103578`](TanStack/router@0103578), [`ce10dcd`](TanStack/router@ce10dcd), [`84936cc`](TanStack/router@84936cc), [`bbd2336`](TanStack/router@bbd2336)]: - @<!---->tanstack/router-core@1.171.32 </details> <details> <summary><b>1.170.37</b></summary> ### Patch Changes - [#8418](TanStack/router#8418) [`e561fa1`](TanStack/router@e561fa1) - `deepEqual` now takes its flags as positional arguments — `deepEqual(a, b, partial?, explicitUndefined?)` — instead of an options object. The router's hot callers (Link option stabilization and active-state checks, `matchRoute`) no longer allocate an options object per comparison, and the comparator reads two booleans instead of a polymorphic object. `explicitUndefined` replaces `ignoreUndefined: false`. `deepEqual` is an internal helper; it stays exported for compatibility of two-argument calls. - [#8419](TanStack/router#8419) [`a1c8d1a`](TanStack/router@a1c8d1a) - `resolvePath` (internal helper) now takes positional arguments — `resolvePath(base, to, trailingSlash?, cache?)` — so `buildLocation` and `matchRoute` no longer allocate an options object per path resolution. - [#8204](TanStack/router#8204) [`cbbfbe3`](TanStack/router@cbbfbe3) - Stream large deferred SSR hydration payloads through a backpressure-aware router transport, fail known setup errors before response creation, and close cancelled or expired transforms safely. Start now cancels discarded middleware and HEAD response bodies, including plain streams and derived branches. Server-function raw streams share one ordered response. Arbitrary or sequential consumption can require potentially unbounded buffering of unread data on the client. Cancelling one raw stream discards it locally, while aborting the whole call cancels the response and server work. Consume streams concurrently, cancel unused streams promptly, or use separate calls when independent backpressure is required. A raw stream that exceeds its unread-byte limit now fails alone; sibling stream …[full notes](https://github.com/TanStack/router/releases/tag/%40tanstack/react-router%401.170.37) </details> <details> <summary><b>1.170.36</b></summary> ### Patch Changes - [#8390](TanStack/router#8390) [`b747fb8`](TanStack/router@b747fb8) - Keep the Link location cache out of server bundles: `buildLocation` only creates, reads and writes it when `isServer` is false. Render React Links on the server without the extra prop copies and the forwarded-ref hook. Link SSR rendering is 20-40% faster in the Link benchmarks and the React Start SSR request loop about 7% faster. React `activeProps` and `inactiveProps` now follow one precedence rule on every link, including links whose destination is blocked for using a disallowed scheme: state props override element props, `ref` and event handlers, while `href`, `disabled` and `target` stay controlled by the router. Previously a blocked link ignored a `ref` or handler from its inactive props. React `Link` and `useLinkProps` split router options from element props with one key set on the client and the server. Element props pass through as given: external links forward them verbatim, falsy values included, and `useLinkProps` now returns `children` for router-controlled links as it already did for external ones. - [#8324](TanStack/router#8324) [`6387d58`](TanStack/router@6387d58) - Reuse hydration snapshot getters to avoid unnecessary store-instance effect updates when Links and other hydration-aware components rerender. - [#8318](TanStack/router#8318) [`9b2adaf`](TanStack/router@9b2adaf) - Allow active and inactive Link props to override base element props in React and Solid while preserving class/style merging. Keep React's `href`, `target`, and `disabled` values controlled by routing options. Preserve Vue object and nested-array class bindings, including reactive updates and server rendering, without mutating cach …[full notes](https://github.com/TanStack/router/releases/tag/%40tanstack/react-router%401.170.36) </details> </details> <details> <summary><b>@<!---->tanstack/react-router-devtools</b> (1.167.1 → 1.167.2)</summary> ### Patch Changes - Updated dependencies \[[`d76a332`](TanStack/router@d76a332), [`b747fb8`](TanStack/router@b747fb8), [`6cfb1e8`](TanStack/router@6cfb1e8), [`700a714`](TanStack/router@700a714), [`700a714`](TanStack/router@700a714), [`6387d58`](TanStack/router@6387d58), [`7e349c3`](TanStack/router@7e349c3), [`9b2adaf`](TanStack/router@9b2adaf), [`873c830`](TanStack/router@873c830), [`7e349c3`](TanStack/router@7e349c3), [`634da91`](TanStack/router@634da91), [`e9396c9`](TanStack/router@e9396c9), [`634da91`](TanStack/router@634da91), [`f151ab0`](TanStack/router@f151ab0), [`bc57fa3`](TanStack/router@bc57fa3), [`6387d58`](TanStack/router@6387d58), [`9872d2a`](TanStack/router@9872d2a), [`d76a332`](TanStack/router@d76a332), [`634da91`](TanStack/router@634da91), [`634da91`](TanStack/router@634da91), [`7e349c3`](ht …[full notes](https://github.com/TanStack/router/releases/tag/%40tanstack/react-router-devtools%401.167.2) </details> <details> <summary><b>@<!---->tanstack/react-router-ssr-query</b> (1.167.2 → 1.167.3)</summary> ### Patch Changes - [#8204](TanStack/router#8204) [`cbbfbe3`](TanStack/router@cbbfbe3) - Stream large deferred SSR hydration payloads through a backpressure-aware router transport, fail known setup errors before response creation, and close cancelled or expired transforms safely. Start now cancels discarded middleware and HEAD response bodies, including plain streams and derived branches. Server-function raw streams share one ordered response. Arbitrary or sequential consumption can require potentially unbounded buffering of unread data on the client. Cancelling one raw stream discards it locally, while aborting the whole call cancels the response and server work. Consume streams concurrently, cancel unused streams promptly, or use separate calls when independent backpressure is required. A raw stream that exceeds its unread-byte limit now fails alone; sibling streams and the JSON result keep flowing. The JSON wire shape of a `RawStream` server-function argument changed. Clients and servers must run matching versions for requests that pass a `RawStream`. The frame-protocol constants (`FRAME_TYPE_*`, `MAX_FRAME_PAYLOAD_SIZE`, `MAX_FRAMED_STREAMS`) moved from the `@tanstack/start-client-core` root to the `@tanstack/start-client-core/client-rpc` subpath. Router requests whose `Accept` header allows neither `text/html` nor `*/*` now receive `406 Not Acceptable` instead of `500`. Framework adapters share the body `<Scripts>` composition (`getSsrBodyScriptParts`, `composeSsrBodyScripts`) and the eager HTML response wrapper (`renderSsrHtmlResponse`) from `@tanstack/router-core`. Solid SSR now emits one document type and renders late lazy errors through route boundaries. A Solid `<Await>` without a `fallback` no longer holds the streamed shell; it renders inside the nearest `<Suspense>` boundary like React and Vue, and now renders falsy resolved values. …[full notes](https://github.com/TanStack/router/releases/tag/%40tanstack/react-router-ssr-query%401.167.3) </details> <details> <summary><b>@<!---->tanstack/react-start</b> (1.168.49 → 1.168.56) — 4 releases</summary> <details> <summary><b>1.168.56</b></summary> ### Patch Changes - Updated dependencies \[]: - @<!---->tanstack/react-router@1.170.38 - @<!---->tanstack/react-start-client@1.168.36 - @<!---->tanstack/react-start-rsc@0.1.55 - @<!---->tanstack/react-start-server@1.167.43 - @<!---->tanstack/start-client-core@1.170.32 - @<!---->tanstack/start-plugin-core@1.171.46 - @<!---->tanstack/start-server-core@1.169.37 </details> <details> <summary><b>1.168.55</b></summary> ### Patch Changes - Updated dependencies \[[`e561fa1`](TanStack/router@e561fa1), [`cbbfbe3`](TanStack/router@cbbfbe3), [`a1c8d1a`](TanStack/router@a1c8d1a), [`cbbfbe3`](TanStack/router@cbbfbe3), [`8e164d2`](TanStack/router@8e164d2)]: - @<!---->tanstack/react-router@1.170.37 - @<!---->tanstack/start-plugin-core@1.171.45 - @<!---->tanstack/start-client-core@1.170.31 - @<!---->tanstack/start-server-core@1.169.36 - @<!---->tanstack/react-start-client@1.168.35 - @<!---->tanstack/react-start-rsc@0.1.54 - @<!---->tanstack/react-start-server@1.167.42 </details> <details> <summary><b>1.168.54</b></summary> ### Patch Changes - Updated dependencies \[[`ab99818`](TanStack/router@ab99818)]: - @<!---->tanstack/start-plugin-core@1.171.44 - @<!---->tanstack/react-start-rsc@0.1.53 </details> <details> <summary><b>1.168.53</b></summary> ### Patch Changes - Updated dependencies \[[`b747fb8`](TanStack/router@b747fb8), [`6387d58`](TanStack/router@6387d58), [`9b2adaf`](TanStack/router@9b2adaf), [`634da91`](TanStack/router@634da91), [`e9396c9`](TanStack/router@e9396c9), [`6387d58`](TanStack/router@6387d58), [`9872d2a`](TanStack/router@9872d2a), [`7e349c3`](TanStack/router@7e349c3), [`e9396c9`](TanStack/router@e9396c9)]: - @<!---->tanstack/react-router@1.170.36 - @<!---->tanstack/start-server-core@1.169.35 - @<!---->tanstack/react-start-client@1.168.34 - @<!---->tanstack/react-start-rsc@0.1.52 - @<!---->tanstack/react-start-server@1.167.41 - @<!---->tanstack/start-client-core@1.170.30 - @<!---->tanstack/start-plugin-core@1.171.43 </details> </details> <details> <summary><b>@<!---->testing-library/dom</b> (10.4.1 → 10.4.2)</summary> ## [10.4.2](testing-library/dom-testing-library@v10.4.1...v10.4.2) (2026-09-13) ### Bug Fixes * **deps:** pin @<!---->types/node to a TypeScript 4-compatible version ([#1386](testing-library/dom-testing-library#1386)) ([6049cc0](testing-library/dom-testing-library@6049cc0)) </details> <details> <summary><b>ai</b> (7.0.101 → 7.0.106)</summary> ### Patch Changes - 4775577: fix(ai): preserve provider metadata when simulating text streams - 6696728: fix(ai): report the prepareStep model in streamed step results - 09516a1: fix(ai): prevent unhandled rejections when UI message stream reading stops early - 1aef01e: fix(ai): preserve prototype-named properties in serialized tool outputs - 9c1ea74: fix(ai): close telemetry spans when provider response streams fail - 107343a: fix(ai): use the prepareStep-selected model for streamed response metadata fallbacks - 03c3e33: fix(ai): preserve tool calls required by retained pending approvals - 5d42ebd: fix(ai): skip input available callbacks for invalid streamed tool calls - 4a67783: fix(ai): cancel prompt attachment downloads when model calls are aborted or time out - 1058ed5: fix(ai): strip streamed JSON fences before arbitrary trailing whitespace - 84f5d1b: fix(ai): stream null and empty string JSON partial outputs - 2d53a5d: fix(ai): prevent onEnd after aborting a multi-step text stream - 2a5ed55: fix(ai): stream structured output from the final tool-loop step - Updated dependencies [4fdf51e] - Updated dependencies [0455398] - @<!---->ai-sdk/gateway@4.0.86 - @<!---->ai-sdk/provider-utils@5.0.44 </details> <details> <summary><b>effect</b> (4.0.0-rc.112 → 4.0.0-rc.115) — 2 releases</summary> <details> <summary><b>4.0.0-rc.115</b></summary> ### Patch Changes - [#8196](Effect-TS/effect#8196) [`657254b`](Effect-TS/effect@657254b) Thanks @<!---->gcanti! - Optimize schema initialization while preserving custom constructor options. - [#8190](Effect-TS/effect#8190) [`f9ef0e9`](Effect-TS/effect@f9ef0e9) Thanks @<!---->javascript-unsafe! - Omit response bodies for statuses 204, 205, and 304 in `HttpServerResponse.toWeb` and the Bun/Deno HTTP adapters, preventing invalid Web responses and hung requests. Cancel omitted raw `ReadableStream` bodies, and finalize request resources without starting omitted Effect streams. - [#8187](Effect-TS/effect#8187) [`4f73f9e`](Effect-TS/effect@4f73f9e) Thanks @<!---->tim-smart! - Parameterize persistence lookup keys in both SQL backing stores' `getMany` queries. </details> <details> <summary><b>4.0.0-rc.114</b></summary> ### Patch Changes - [#8177](Effect-TS/effect#8177) [`3ff4952`](Effect-TS/effect@3ff4952) Thanks @<!---->tim-smart! - Allow `Effect.cachedWithTTL` to compute the TTL from each completed `Exit`, so successes and failures can use different cache durations. - [#8164](Effect-TS/effect#8164) [`6d55555`](Effect-TS/effect@6d55555) Thanks @<!---->sam-goodwin! - Keep Node and Bun file stats usable when optional numeric metadata exceeds the safe integer range by returning `Option.none()` for those fields. - [#8162](Effect-TS/effect#8162) [`716e0c0`](Effect-TS/effect@716e0c0) Thanks @<!---->tim-smart! - Fix published declarations referencing symbols stripped as `@internal`, which broke consumers compiling with `skipLibCheck: false`. `Effectable.d.ts` now uses the public `Effect.TypeId`, `Match.d.ts` no longer aliases an internal `Contextual` type, `Schema.d.ts` ships the `AnnotationSchemaConstraint` alias it references, and the CLI's `toFlagDoc` helper is marked internal so it no longer leaks `Param.getParamMetadata`. - [#8160](Effect-TS/effect#8160) [`d4e4ad5`](Effect-TS/effect@d4e4ad5) Thanks @<!---->gcanti! - Fix `SchemaRepresentation.toCodeDocument` generating invalid TypeScript for optional tuple elements containing unions or nested readonly tuples. Optional element types are now parenthesized, for example `readonly [(string | number)?]` instead of `readonly [string | number?]`. Generated runtime schemas are unchanged. - [#8158](Effect-TS/effect#8158) [`b1988f4`](Effect-TS/effect@b1988f4) Thanks @<!---->gcanti! - Fix `SchemaRepresentation.toCodeDocument` dropping Struct fields named `__proto__` …[full notes](https://github.com/Effect-TS/effect/releases/tag/effect%404.0.0-rc.114) </details> </details> <details> <summary><b>jose</b> (6.2.10 → 6.2.12) — 2 releases</summary> <details> <summary><b>6.2.12</b></summary> ### Documentation * clarify and shorten public API guidance ([be62530](panva/jose@be62530)) ### Refactor * simplify JWS and JWE operation cores ([92e9640](panva/jose@92e9640)) ### Performance * avoid copying AES-GCM output ([6925d43](panva/jose@6925d43)) * deduplicate pending jwks key imports ([bf5138b](panva/jose@bf5138b)) * encode single-signature JWS input once ([7bc9a33](panva/jose@7bc9a33)) * normalize General JWE shared headers once ([78637bd](panva/jose@78637bd)) * normalize jwks selection metadata once ([fd3ae3f](panva/jose@fd3ae3f)) * use native encoding for larger ASCII strings ([b23a6f3](panva/jose@b23a6f3)) </details> <details> <summary><b>6.2.11</b></summary> ### Documentation * render subpath indexes as tables ([94589ee](panva/jose@94589ee)) * shorten API index descriptions ([681482f](panva/jose@681482f)) ### Refactor * model JWE key management modes ([e01dda6](panva/jose@e01dda6)) * **types:** reduce declaration repetition ([55b970f](panva/jose@55b970f)) </details> </details> <details> <summary><b>posthog-node</b> (5.52.1 → 5.52.4) — 3 releases</summary> <details> <summary><b>5.52.4</b></summary> ## 5.52.4 ### Patch Changes - [#4885](PostHog/posthog-js#4885) [`39a8980`](PostHog/posthog-js@39a8980) Thanks [@<!---->decknamec](https://github.com/decknamec)! - Server-side feature flags now resolve in posthog-node and posthog-edge even when a proxy rewrites the request's `User-Agent`. Flags restricted to the `client` runtime now resolve to `undefined` in these SDKs, where a rewritten `User-Agent` previously let them through. (2026-09-15) - Updated dependencies [[`39a8980`](PostHog/posthog-js@39a8980)]: - @<!---->posthog/core@1.54.2 </details> <details> <summary><b>5.52.3</b></summary> ## 5.52.3 ### Patch Changes - [#4941](PostHog/posthog-js#4941) [`07c1045`](PostHog/posthog-js@07c1045) Thanks [@<!---->marandaneto](https://github.com/marandaneto)! - Capture causes and AggregateError members with relationship metadata and individual stacks, limiting output to 50 entries and 1,000 member inspections. (2026-09-15) - Updated dependencies [[`07c1045`](PostHog/posthog-js@07c1045)]: - @<!---->posthog/core@1.54.1 </details> <details> <summary><b>5.52.2</b></summary> ## 5.52.2 ### Patch Changes - [#4951](PostHog/posthog-js#4951) [`55c5142`](PostHog/posthog-js@55c5142) Thanks [@<!---->marandaneto](https://github.com/marandaneto)! - Fix Express exception events reporting the initial response status instead of the final HTTP status. (2026-09-14) </details> </details> <details> <summary><b>react-email</b> (6.9.3 → 6.9.5)</summary> ### Patch Changes * 0250981: fix responsive padding not applying to inner td for Container and Section </details> <details> <summary><b>ws</b> (8.21.0 → 8.21.3) — 3 releases</summary> <details> <summary><b>8.21.3</b></summary> # Bug fixes - The server now correctly rejects permessage-deflate offers if the incoming `client_max_window_bits` parameter value is smaller than its configured `clientMaxWindowBits` (e97a20ea). </details> <details> <summary><b>8.21.2</b></summary> # Bug fixes - Fixed a test for [CITGM][] (2eb3be0b). [CITGM]: https://github.com/nodejs/citgm </details> <details> <summary><b>8.21.1</b></summary> # Bug fixes - Empty fragments are now counted toward the limit (a2f4e7c0). - The default values of the `maxBufferedChunks` and `maxFragments` options have been reduced (f197ac65). </details> </details> --- *This PR was auto-generated by [catalog-update-action](https://github.com/brandhaug/catalog-update-action).* --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
🎯 Changes
Filter native Link props once and reuse hydration snapshot getters.
This is PR 9 of a stacked series and is based on
optimize-link-benchmark-staging.✅ Checklist
🚀 Release Impact
Summary by CodeRabbit
Bug Fixes
Tests