fix(core): field unmount#2068
Conversation
🦋 Changeset detectedLatest commit: 7965967 The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Fixes the issue with field unmount in core.
|
View your CI Pipeline Execution ↗ for commit add70ff
☁️ Nx Cloud last updated this comment at |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2068 +/- ##
==========================================
- Coverage 90.35% 90.24% -0.11%
==========================================
Files 38 49 +11
Lines 1752 2041 +289
Branches 444 532 +88
==========================================
+ Hits 1583 1842 +259
- Misses 149 179 +30
Partials 20 20 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a Form option Changes
Sequence DiagramsequenceDiagram
participant App as Application
participant Form as FormApi
participant Field as FieldApi
participant Val as ValidationSystem
App->>Form: create(formOptions with cleanupFieldsOnUnmount=true)
App->>Field: mount field
Field->>Form: register field instance & metadata
Field->>Val: start validations / set timeouts / listeners
Field-->>App: return cleanup function
Note over Val: validations/timeouts/listeners in-flight
App->>Field: call cleanup() on unmount
Field->>Val: abort controllers & cancel timeouts/listeners
Val-->>Val: stop async callbacks / ignore late results
Field->>Form: reset field meta (or preserve depending on option), clear instance reference
Field-->>App: cleanup complete
Estimated Code Review Effort🎯 4 (Complex) | ⏱️ ~45 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/form-core/src/FieldApi.ts`:
- Around line 1361-1375: The abort loop currently runs before checking whether
this FieldApi instance is still the active one, which can cancel validations for
a newer remounted instance; move the instance check so it runs before touching
shared state (i.e., check fieldInfo.instance !== this and return early), or
alternatively inside the loop verify fieldInfo.instance === this before calling
validationMeta?.lastAbortController.abort() and clearing entries; update the
code paths around fieldInfo, validationMetaMap, lastAbortController, and the
instance guard to ensure only the active FieldApi instance aborts and clears the
shared validationMetaMap.
- Around line 1377-1383: The current reset in FieldApi using
this.form.baseStore.setState(...) replaces prev.fieldMetaBase[this.name] with
defaultFieldMeta and thus wipes preserved state on unmount/remount; update the
setter to merge with any existing meta for this.name instead of overwriting so
preserved flags/values survive (e.g., read existing =
prev.fieldMetaBase?.[this.name], then set fieldMetaBase[this.name] = {
...defaultFieldMeta, ...existing } or selectively preserve keys like
touched/value/defaultValueSeeded) so the logic in FieldApi that reseeds
options.defaultValue (referenced by the FieldApi methods around lines that
handle defaultValue reseeding) no longer loses user-entered values on remount.
In `@packages/react-form/tests/useField.test.tsx`:
- Around line 422-423: The test asserts onSubmit immediately after clicking
submit but form.handleSubmit() executes asynchronously; update the test to wait
for the async submit path to complete before asserting by awaiting a wait helper
that checks onSubmit (e.g., use waitFor or another async wait) so the assertion
verifies that onSubmit was called after form._handleSubmit()/form.handleSubmit()
finishes; reference the submitButton click and the onSubmit mock in the updated
assertion.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: a2c69fac-1e7b-4d00-b470-721c4ba1c718
📒 Files selected for processing (5)
.changeset/red-hats-jam.mdpackages/form-core/src/FieldApi.tspackages/form-core/src/FormApi.tspackages/form-core/tests/FieldApi.spec.tspackages/react-form/tests/useField.test.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/form-core/src/FieldApi.ts`:
- Around line 1364-1375: The teardown skips aborting async work started by the
older FieldApi instance because it only avoids touching shared controllers when
a newer instance is mounted; fix by either tracking abort controllers per
FieldApi instance or by ignoring async completions when the instance no longer
matches. Concretely: change the validation logic so each FieldApi stores its own
controllers (e.g., a per-instance map on this) instead of reusing
fieldInfo.validationMetaMap.lastAbortController, and abort only those on
teardown; or add a guard in the async validator completion path (before calling
field.setMeta(...) / inside FieldApi's async result handling) that checks
field.getInfo().instance === this and returns early if it differs. Ensure you
reference validationMetaMap, lastAbortController, FieldApi, setMeta and getInfo
when locating the relevant code to update.
- Around line 1330-1359: Currently async validation/listener
timeouts/controllers are attached to the active instance (this) even when the
async work targets a different field, so the target field cannot cancel them on
unmount; update the code that schedules linked-field async work (the
validateAsync caller that writes to getInfo().validationMetaMap and
this.timeoutIds.validations / this.timeoutIds.listeners) to store ownership on
the target field instead of this (i.e., use the target field's timeoutIds and
validationMetaMap entry keys), and update the teardown returned by the FieldApi
cleanup to clear any timeouts/controllers stored on the field itself (iterate
and clear entries on field.timeoutIds.validations/listeners/formListeners and
remove related validationMetaMap entries) so the target field’s unmount cancels
its own async work. Ensure you reference and update validateAsync,
getInfo().validationMetaMap, and timeoutIds.validations/listeners/formListeners
usage sites so ownership is moved to the field.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 39798198-5e48-4350-8160-450fd6a0e1ea
📒 Files selected for processing (3)
packages/form-core/src/FieldApi.tspackages/form-core/tests/FieldApi.spec.tspackages/react-form/tests/useField.test.tsx
|
This is a really solid PR! 🚀 |
|
@harry-whorlow would syncing this branch with |
LeCarbonator
left a comment
There was a problem hiding this comment.
Looks good! Did a quick sanity check, only noticed a small typo.
|
@Dakkers No it would not. But it'll be fixed soon. |
a49d20c to
ed6f7db
Compare
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@effect/language-service](https://github.com/Effect-TS/language-service) | [`0.84.2` → `0.84.3`](https://renovatebot.com/diffs/npm/@effect%2flanguage-service/0.84.2/0.84.3) |  |  | | [@playwright/test](https://playwright.dev) ([source](https://github.com/microsoft/playwright)) | [`1.58.2` → `1.59.1`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.58.2/1.59.1) |  |  | | [@tanstack/react-form](https://tanstack.com/form) ([source](https://github.com/TanStack/form/tree/HEAD/packages/react-form)) | [`1.28.5` → `1.28.6`](https://renovatebot.com/diffs/npm/@tanstack%2freact-form/1.28.5/1.28.6) |  |  | | [@tanstack/react-query](https://tanstack.com/query) ([source](https://github.com/TanStack/query/tree/HEAD/packages/react-query)) | [`5.95.2` → `5.96.2`](https://renovatebot.com/diffs/npm/@tanstack%2freact-query/5.95.2/5.96.2) |  |  | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`25.5.0` → `25.5.2`](https://renovatebot.com/diffs/npm/@types%2fnode/25.5.0/25.5.2) |  |  | | [dotenv](https://github.com/motdotla/dotenv) | [`17.3.1` → `17.4.1`](https://renovatebot.com/diffs/npm/dotenv/17.3.1/17.4.1) |  |  | | [nx](https://nx.dev) ([source](https://github.com/nrwl/nx/tree/HEAD/packages/nx)) | [`22.6.3` → `22.6.4`](https://renovatebot.com/diffs/npm/nx/22.6.3/22.6.4) |  |  | | [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | [`0.18.1` → `0.19.0`](https://renovatebot.com/diffs/npm/oxlint-tsgolint/0.18.1/0.19.0) |  |  | | [remeda](https://remedajs.com/) ([source](https://github.com/remeda/remeda)) | [`2.33.6` → `2.33.7`](https://renovatebot.com/diffs/npm/remeda/2.33.6/2.33.7) |  |  | | [vike](https://github.com/vikejs/vike) | [`0.4.255` → `0.4.256`](https://renovatebot.com/diffs/npm/vike/0.4.255/0.4.256) |  |  | | [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) | [`4.0.0` → `4.0.1`](https://renovatebot.com/diffs/npm/vite-plugin-static-copy/4.0.0/4.0.1) |  |  | --- ### Release Notes <details> <summary>Effect-TS/language-service (@​effect/language-service)</summary> ### [`v0.84.3`](https://github.com/Effect-TS/language-service/releases/tag/%40effect/language-service%400.84.3) [Compare Source](https://github.com/Effect-TS/language-service/compare/@effect/language-service@0.84.2...@effect/language-service@0.84.3) ##### Patch Changes - [#​711](Effect-TS/language-service#711) [`892984f`](Effect-TS/language-service@892984f) Thanks [@​mattiamanzati](https://github.com/mattiamanzati)! - Report floating `Stream` values in Effect projects by parsing `Stream` types in the diagnostic type parser and checking them in `floatingEffect` for both v3 and v4 harnesses. - [#​709](Effect-TS/language-service#709) [`0372f58`](Effect-TS/language-service@0372f58) Thanks [@​mattiamanzati](https://github.com/mattiamanzati)! - Fix the Effect v4 completion harness to cover `ServiceMap` self-in-classes examples instead of the v3-only `Context.Tag` variants. - [#​712](Effect-TS/language-service#712) [`b7554df`](Effect-TS/language-service@b7554df) Thanks [@​mattiamanzati](https://github.com/mattiamanzati)! - Align Effect diagnostic messages with the reviewed neutral wording, preserving the existing version-specific API references while updating both v3 and v4 snapshot fixtures. </details> <details> <summary>microsoft/playwright (@​playwright/test)</summary> ### [`v1.59.1`](https://github.com/microsoft/playwright/releases/tag/v1.59.1) [Compare Source](microsoft/playwright@v1.59.0...v1.59.1) ##### Bug Fixes - **\[Windows]** Reverted hiding console window when spawning browser processes, which caused regressions including broken `codegen`, `--ui` and `show` commands ([#​39990](microsoft/playwright#39990)) ### [`v1.59.0`](https://github.com/microsoft/playwright/releases/tag/v1.59.0) [Compare Source](microsoft/playwright@v1.58.2...v1.59.0) #### 🎬 Screencast New [page.screencast](https://playwright.dev/docs/api/class-page#page-screencast) API provides a unified interface for capturing page content with: - Screencast recordings - Action annotations - Visual overlays - Real-time frame capture - Agentic video receipts <center> <img src="https://raw.githubusercontent.com/microsoft/playwright/main/docs/src/images/release-notes-1.59-screencast-demo.gif" alt="Demo" width="500" height="313" /> </center> **Screencast recording** — record video with precise start/stop control, as an alternative to the [`recordVideo`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-video) option: ```js await page.screencast.start({ path: 'video.webm' }); // ... perform actions ... await page.screencast.stop(); ``` **Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording: ```js await page.screencast.showActions({ position: 'top-right' }); ``` [screencast.showActions()](https://playwright.dev/docs/api/class-screencast#screencast-show-actions) accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `fontSize` (px). Returns a disposable to stop showing actions. Action annotations can also be enabled in test fixtures via the `video` option: ```js // playwright.config.ts export default defineConfig({ use: { video: { mode: 'on', show: { actions: { position: 'top-left' }, test: { position: 'top-right' }, }, }, }, }); ``` **Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration: ```js await page.screencast.showChapter('Adding TODOs', { description: 'Type and press enter for each TODO', duration: 1000, }); await page.screencast.showOverlay('<div style="color: red">Recording</div>'); ``` **Real-time frame capture** — stream JPEG-encoded frames for custom processing like thumbnails, live previews, AI vision, and more: ```js await page.screencast.start({ onFrame: ({ data }) => sendToVisionModel(data), size: { width: 800, height: 600 }, }); ``` **Agentic video receipts** — coding agents can produce video evidence of their work. After completing a task, an agent can record a walkthrough video with rich annotations for human review: ```js await page.screencast.start({ path: 'receipt.webm' }); await page.screencast.showActions({ position: 'top-right' }); await page.screencast.showChapter('Verifying checkout flow', { description: 'Added coupon code support per ticket #​1234', }); // Agent performs the verification steps... await page.locator('#coupon').fill('SAVE20'); await page.locator('#apply-coupon').click(); await expect(page.locator('.discount')).toContainText('20%'); await page.screencast.showChapter('Done', { description: 'Coupon applied, discount reflected in total', }); await page.screencast.stop(); ``` The resulting video serves as a receipt: chapter titles provide context, action annotations highlight each interaction, and the visual walkthrough is faster to review than text logs. #### 🔗 Interoperability New [browser.bind()](https://playwright.dev/docs/api/class-browser#browser-bind) API makes a launched browser available for `playwright-cli`, `@playwright/mcp`, and other clients to connect to. **Bind a browser** — start a browser and bind it so others can connect: ```js const { endpoint } = await browser.bind('my-session', { workspaceDir: '/my/project', }); ``` **Connect from playwright-cli** — connect to the running browser from your favorite coding agent. ```bash playwright-cli attach my-session playwright-cli -s my-session snapshot ``` **Connect from [@​playwright/mcp](https://github.com/playwright/mcp)** — or point your MCP server to the running browser. ```bash @​playwright/mcp --endpoint=my-session ``` **Connect from a Playwright client** — use API to connect to the browser. Multiple clients at a time are supported! ```js const browser = await chromium.connect(endpoint); ``` Pass `host` and `port` options to bind over WebSocket instead of a named pipe: ```js const { endpoint } = await browser.bind('my-session', { host: 'localhost', port: 0, }); // endpoint is a ws:// URL ``` Call [browser.unbind()](https://playwright.dev/docs/api/class-browser#browser-unbind) to stop accepting new connections. #### 📊 Observability Run `playwright-cli show` to open the Dashboard that lists all the bound browsers, their statuses, and allows interacting with them: - See what your agent is doing on the background browsers - Click into the sessions for manual interventions - Open DevTools to inspect pages from the background browsers. <center> <img src="https://raw.githubusercontent.com/microsoft/playwright/main/docs/src/images/release-notes-1.59-dashboard.png" alt="Demo" width="1169" height="835" /> </center> - `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing. - Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard. #### 🐛 CLI debugger for agents Coding agents can now run `npx playwright test --debug=cli` to attach and debug tests over `playwright-cli` — perfect for automatically fixing tests in agentic workflows: ```bash $ npx playwright test --debug=cli ### Debugging Instructions - Run "playwright-cli attach tw-87b59e" to attach to this test $ playwright-cli attach tw-87b59e ### Session `tw-87b59e` created, attached to `tw-87b59e`. Run commands with: playwright-cli --session=tw-87b59e <command> ### Paused - Navigate to "/" at output/tests/example.spec.ts:4 $ playwright-cli --session tw-87b59e step-over ### Page - Page URL: https://playwright.dev/ - Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright ### Paused - Expect "toHaveTitle" at output/tests/example.spec.ts:7 ``` #### 📋 CLI trace analysis for agents Coding agents can run `npx playwright trace` to explore [Playwright Trace](https://playwright.dev/docs/trace-viewer) and understand failing or flaky tests from the command line: ```bash $ npx playwright trace open test-results/example-has-title-chromium/trace.zip Title: example.spec.ts:3 › has title $ npx playwright trace actions --grep="expect" # Time Action Duration ──── ───────── ─────────────────────────────────────────────────────── ──────── 9. 0:00.859 Expect "toHaveTitle" 5.1s ✗ $ npx playwright trace action 9 Expect "toHaveTitle" Error: expect(page).toHaveTitle(expected) failed Expected pattern: /Wrong Title/ Received string: "Fast and reliable end-to-end testing for modern web apps | Playwright" Timeout: 5000ms Snapshots available: before, after usage: npx playwright trace snapshot 9 --name <before|after> $ npx playwright trace snapshot 9 --name after ### Page - Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright $ npx playwright trace close ``` #### ♻️ `await using` Many APIs now return [async disposables](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncDispose), enabling the `await using` syntax for automatic cleanup: ```js await using page = await context.newPage(); { await using route = await page.route('**/*', route => route.continue()); await using script = await page.addInitScript('console.log("init script here")'); await page.goto('https://playwright.dev'); // do something } // route and init script have been removed at this point ``` #### 🔍 Snapshots and Locators - Method [page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot) to capture the aria snapshot of the page — equivalent to `page.locator('body').ariaSnapshot()`. - Options `depth` and `mode` in [locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot). - Method [locator.normalize()](https://playwright.dev/docs/api/class-locator#locator-normalize) converts a locator to follow best practices like test ids and aria roles. - Method [page.pickLocator()](https://playwright.dev/docs/api/class-page#page-pick-locator) enters an interactive mode where hovering over elements highlights them and shows the corresponding locator. Click an element to get its [Locator](https://playwright.dev/docs/api/class-locator) back. Use [page.cancelPickLocator()](https://playwright.dev/docs/api/class-page#page-cancel-pick-locator) to cancel. #### New APIs ##### Screencast - [page.screencast](https://playwright.dev/docs/api/class-page#page-screencast) provides video recording, real-time frame streaming, and overlay management. - Methods [screencast.start()](https://playwright.dev/docs/api/class-screencast#screencast-start) and [screencast.stop()](https://playwright.dev/docs/api/class-screencast#screencast-stop) for recording and frame capture. - Methods [screencast.showActions()](https://playwright.dev/docs/api/class-screencast#screencast-show-actions) and [screencast.hideActions()](https://playwright.dev/docs/api/class-screencast#screencast-hide-actions) for action annotations. - Methods [screencast.showChapter()](https://playwright.dev/docs/api/class-screencast#screencast-show-chapter) and [screencast.showOverlay()](https://playwright.dev/docs/api/class-screencast#screencast-show-overlay) for visual overlays. - Methods [screencast.showOverlays()](https://playwright.dev/docs/api/class-screencast#screencast-show-overlays) and [screencast.hideOverlays()](https://playwright.dev/docs/api/class-screencast#screencast-hide-overlays) for overlay visibility control. ##### Storage, Console and Errors - Method [browserContext.setStorageState()](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-storage-state) clears existing cookies, local storage, and IndexedDB for all origins and sets a new storage state — no need to create a new context. - Methods [page.clearConsoleMessages()](https://playwright.dev/docs/api/class-page#page-clear-console-messages) and [page.clearPageErrors()](https://playwright.dev/docs/api/class-page#page-clear-page-errors) to clear stored messages and errors. - Option `filter` in [page.consoleMessages()](https://playwright.dev/docs/api/class-page#page-console-messages) and [page.pageErrors()](https://playwright.dev/docs/api/class-page#page-page-errors) controls which messages are returned. - Method [consoleMessage.timestamp()](https://playwright.dev/docs/api/class-consolemessage#console-message-timestamp). ##### Miscellaneous - [browserContext.debugger](https://playwright.dev/docs/api/class-browsercontext#browser-context-debugger) provides programmatic control over the Playwright debugger. - Method [browserContext.isClosed()](https://playwright.dev/docs/api/class-browsercontext#browser-context-is-closed). - Method [request.existingResponse()](https://playwright.dev/docs/api/class-request#request-existing-response) returns the response without waiting. - Method [response.httpVersion()](https://playwright.dev/docs/api/class-response#response-http-version) returns the HTTP version used by the response. - Events [cdpSession.on('event')](https://playwright.dev/docs/api/class-cdpsession#cdp-session-event-event) and [cdpSession.on('close')](https://playwright.dev/docs/api/class-cdpsession#cdp-session-event-close) for CDP sessions. - Option `live` in [tracing.start()](https://playwright.dev/docs/api/class-tracing#tracing-start) for real-time trace updates. - Option `artifactsDir` in [browserType.launch()](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) to configure the artifacts directory. #### 🛠️ Other improvements - UI Mode has an option to only show tests affected by source changes. - UI Mode and Trace Viewer have improved action filtering. - HTML Reporter shows the list of runs from the same worker. - HTML Reporter allows filtering test steps for quick search. - New trace mode `'retain-on-failure-and-retries'` records a trace for each test run and retains all traces when an attempt fails — great for comparing a passing trace with a failing one from a flaky test. #### Known Issues⚠️ ⚠️ - `navigator.platform` emulation can cause Ctrl or Meta dispatching errors ([#​40009](microsoft/playwright#40009)). Pass `PLAYWRIGHT_NO_UA_PLATFORM = '1'` environment variable while we are issuing a patch release. Let us know in the issue how it affected you. #### Breaking Changes⚠️ - Removed macOS 14 support for WebKit. We recommend upgrading your macOS version, or keeping an older Playwright version. - Removed `@playwright/experimental-ct-svelte` package. #### Browser Versions - Chromium 147.0.7727.15 - Mozilla Firefox 148.0.2 - WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 146 - Microsoft Edge 146 </details> <details> <summary>TanStack/form (@​tanstack/react-form)</summary> ### [`v1.28.6`](https://github.com/TanStack/form/blob/HEAD/packages/react-form/CHANGELOG.md#1286) [Compare Source](https://github.com/TanStack/form/compare/@tanstack/react-form@1.28.5...@tanstack/react-form@1.28.6) ##### Patch Changes - fix(core): field unmount ([#​2068](TanStack/form#2068)) - Updated dependencies \[[`7a1428d`](TanStack/form@7a1428d)]: - [@​tanstack/form-core](https://github.com/tanstack/form-core)@​1.28.6 </details> <details> <summary>TanStack/query (@​tanstack/react-query)</summary> ### [`v5.96.2`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5962) [Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.96.1...@tanstack/react-query@5.96.2) ##### Patch Changes - Updated dependencies \[]: - [@​tanstack/query-core](https://github.com/tanstack/query-core)@​5.96.2 ### [`v5.96.1`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5961) [Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.96.0...@tanstack/react-query@5.96.1) ##### Patch Changes - Updated dependencies \[]: - [@​tanstack/query-core](https://github.com/tanstack/query-core)@​5.96.1 ### [`v5.96.0`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5960) [Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.95.2...@tanstack/react-query@5.96.0) ##### Patch Changes - Updated dependencies \[]: - [@​tanstack/query-core](https://github.com/tanstack/query-core)@​5.96.0 </details> <details> <summary>motdotla/dotenv (dotenv)</summary> ### [`v17.4.1`](https://github.com/motdotla/dotenv/blob/HEAD/CHANGELOG.md#1741-2026-04-05) [Compare Source](motdotla/dotenv@v17.4.0...v17.4.1) ##### Changed - Change text `injecting` to `injected` ([#​1005](motdotla/dotenv#1005)) ### [`v17.4.0`](https://github.com/motdotla/dotenv/blob/HEAD/CHANGELOG.md#1740-2026-04-01) [Compare Source](motdotla/dotenv@v17.3.1...v17.4.0) ##### Added - Add `skills/` folder with focused agent skills: `skills/dotenv/SKILL.md` (core usage) and `skills/dotenvx/SKILL.md` (encryption, multiple environments, variable expansion) for AI coding agent discovery via the skills.sh ecosystem (`npx skills add motdotla/dotenv`) ##### Changed - Tighten up logs: `◇ injecting env (14) from .env` ([#​1003](motdotla/dotenv#1003)) </details> <details> <summary>nrwl/nx (nx)</summary> ### [`v22.6.4`](https://github.com/nrwl/nx/releases/tag/22.6.4) [Compare Source](nrwl/nx@22.6.3...22.6.4) #### 22.6.4 (2026-04-01) ##### 🚀 Features - **misc:** update nx init telemetry meta from CSV to JSON format ([#​35076](nrwl/nx#35076)) - **nx-dev:** add conditional blog/changelog proxy in edge function ([#​35043](nrwl/nx#35043)) ##### 🩹 Fixes - **core:** validate bundler option for Angular presets in create-nx-workspace ([#​35074](nrwl/nx#35074)) - **core:** handle "." and absolute paths as workspace name in CNW ([#​35083](nrwl/nx#35083), [#​1](nrwl/nx#1)) - **core:** pin version of axios ([#​35093](nrwl/nx#35093)) - **core:** preserve sibling dependency inputs in native hashing ([#​35071](nrwl/nx#35071)) - **core:** sandbox exclusions, multi-line typeof import detection, global ensurePackage mock ([#​35056](nrwl/nx#35056)) - **core:** no-interactive should disable prompts during migrate ([#​35106](nrwl/nx#35106)) - **gradle:** increase project graph timeout defaults ([#​35058](nrwl/nx#35058)) - **js:** recognize tsgo in dependency-checks lint rule ([#​35048](nrwl/nx#35048)) - **js:** narrow tsc build-base outputs to only tsc-produced file types ([#​35041](nrwl/nx#35041)) - **js:** include tsbuildinfo in narrowed tsc build-base outputs ([#​35086](nrwl/nx#35086), [#​35041](nrwl/nx#35041)) - **js:** use explicit nx/bin/nx path in start-local-registry ([#​35127](nrwl/nx#35127)) - **misc:** handle non-interactive mode and add template shorthand names for CNW ([#​35045](nrwl/nx#35045)) - **react:** force Vite 7 when using React Router in framework mode ([#​35101](nrwl/nx#35101)) - **react-native:** use vite's transformWithEsbuild instead of direct esbuild import ([5771eb3346](nrwl/nx@5771eb3346)) - **repo:** pass env vars into docker builds in publish workflow ([#​35060](nrwl/nx#35060)) - **repo:** bump picomatch from 4.0.2 to 4.0.4 ([#​35081](nrwl/nx#35081), [#​35068](nrwl/nx#35068)) - **repo:** fixup lock-threads failing with resource inaccessible message ([#​35005](nrwl/nx#35005)) - **repo:** fix lockfile ([b070e23445](nrwl/nx@b070e23445)) - **repo:** re-enable Cypress HMR e2e tests after upstream tapable fix ([#​35105](nrwl/nx#35105), [#​34969](nrwl/nx#34969), [#​20693](nrwl/nx#20693)) - **repo:** disable ts-jest diagnostics for workspace-plugin tests ([b013f93dca](nrwl/nx@b013f93dca)) - **vite:** update vitest and plugin-react-swc versions for vite 8 compat ([#​35062](nrwl/nx#35062)) - **vite:** bump sass version for vue/nuxt presets for Vite 8 compat ([#​35073](nrwl/nx#35073)) - **webpack:** bump postcss-loader to ^8.2.1 to eliminate transitive <yaml@1.x> CVE ([#​35028](nrwl/nx#35028), [#​35025](nrwl/nx#35025)) ##### ❤️ Thank You - Colum Ferry [@​Coly010](https://github.com/Coly010) - Craigory Coppola [@​AgentEnder](https://github.com/AgentEnder) - FrozenPandaz [@​FrozenPandaz](https://github.com/FrozenPandaz) - Jack Hsu [@​jaysoo](https://github.com/jaysoo) - Jason Jean [@​FrozenPandaz](https://github.com/FrozenPandaz) - Leosvel Pérez Espinosa [@​leosvelperez](https://github.com/leosvelperez) - Miroslav Jonaš [@​meeroslav](https://github.com/meeroslav) - Robert Sidzinka </details> <details> <summary>oxc-project/tsgolint (oxlint-tsgolint)</summary> ### [`v0.19.0`](https://github.com/oxc-project/tsgolint/releases/tag/v0.19.0) [Compare Source](oxc-project/tsgolint@v0.18.1...v0.19.0) #### What's Changed - chore(deps): update npm packages by [@​renovate](https://github.com/renovate)\[bot] in [#​846](oxc-project/tsgolint#846) - chore(deps): update github-actions by [@​renovate](https://github.com/renovate)\[bot] in [#​847](oxc-project/tsgolint#847) - chore(deps): update dependency typescript to v6 by [@​renovate](https://github.com/renovate)\[bot] in [#​848](oxc-project/tsgolint#848) - chore: fix schema generator drift by [@​camc314](https://github.com/camc314) in [#​850](oxc-project/tsgolint#850) - feat(await-thenable): port promise aggregator checks and upstream tests by [@​camc314](https://github.com/camc314) in [#​851](oxc-project/tsgolint#851) - test(e2e): make fixtures modules so they are processed in isolation by [@​camc314](https://github.com/camc314) in [#​854](oxc-project/tsgolint#854) - chore(deps): update pnpm to v10.33.0 by [@​renovate](https://github.com/renovate)\[bot] in [#​855](oxc-project/tsgolint#855) - feat(no-unnecessary-type-arguments): port upstream inference reporting by [@​camc314](https://github.com/camc314) in [#​853](oxc-project/tsgolint#853) - feat(strict-void-return): sync overload-safe callback typing with upstream by [@​camc314](https://github.com/camc314) in [#​856](oxc-project/tsgolint#856) - feat(prefer-promise-reject-errors): add allow specifiers and upstream test parity by [@​camc314](https://github.com/camc314) in [#​857](oxc-project/tsgolint#857) - fix(prefer-readonly-parameter-types): preserve alias-aware parameter types by [@​camc314](https://github.com/camc314) in [#​858](oxc-project/tsgolint#858) - feat(no-useless-default-assignment): skip unresolved type parameters by [@​camc314](https://github.com/camc314) in [#​859](oxc-project/tsgolint#859) **Full Changelog**: <oxc-project/tsgolint@v0.18.1...v0.19.0> </details> <details> <summary>remeda/remeda (remeda)</summary> ### [`v2.33.7`](https://github.com/remeda/remeda/releases/tag/v2.33.7) [Compare Source](remeda/remeda@v2.33.6...v2.33.7) ##### Bug Fixes - **range:** add step parameter to range function ([#​1257](remeda/remeda#1257)) ([cf2dee0](remeda/remeda@cf2dee0)) </details> <details> <summary>vikejs/vike (vike)</summary> ### [`v0.4.256`](https://github.com/vikejs/vike/blob/HEAD/CHANGELOG.md#04256-2026-03-31) [Compare Source](vikejs/vike@v0.4.255...v0.4.256) ##### Bug Fixes - duplicate URL verification on pre-rendering ([#​3156](vikejs/vike#3156)) ([7723d45](vikejs/vike@7723d45)) - polish node unsupported version error ([#​3148](vikejs/vike#3148)) ([279f79c](vikejs/vike@279f79c)) ##### Performance Improvements - remove slow plugin when not needed (fix [#​3086](vikejs/vike#3086)) ([#​3187](vikejs/vike#3187)) ([567fe61](vikejs/vike@567fe61)) </details> <details> <summary>sapphi-red/vite-plugin-static-copy (vite-plugin-static-copy)</summary> ### [`v4.0.1`](https://github.com/sapphi-red/vite-plugin-static-copy/blob/HEAD/CHANGELOG.md#401) [Compare Source](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@4.0.0...vite-plugin-static-copy@4.0.1) ##### Patch Changes - [#​249](sapphi-red/vite-plugin-static-copy#249) [`c6bf44c`](sapphi-red/vite-plugin-static-copy@c6bf44c) Thanks [@​sapphi-red](https://github.com/sapphi-red)! - Fix absolute `dest` paths being nested under the output directory When `dest` was an absolute path and the source file had a directory component (structured output), the path was incorrectly converted to a relative path, causing files to be nested under the build output directory instead of being copied to the specified absolute path. ```js { src: 'foo/foo.txt', dest: '/home/user/my-repo/bar' } ``` **Before**: `/home/user/my-repo/dist/home/user/my-repo/bar/foo/foo.txt` **After**: `/home/user/my-repo/bar/foo/foo.txt` - [#​247](sapphi-red/vite-plugin-static-copy#247) [`d3af79e`](sapphi-red/vite-plugin-static-copy@d3af79e) Thanks [@​sapphi-red](https://github.com/sapphi-red)! - Fix `rename.stripBase` to work correctly with `../` paths Previously, `stripBase` counted `..` as directory segments, causing incorrect output paths when copying from parent directories. ```js { src: '../../src/pages/**/*.html', dest: 'dist/', rename: { stripBase: 2 } } ``` **Before**: `dist/src/pages/events/test.html` **After**: `dist/events/test.html` ```js { src: '../../src/pages/**/*.html', dest: 'dist/', rename: { stripBase: true } } ``` **Before**: `dist/src/pages/events/test.html` **After**: `dist/test.html` </details> --- ### Configuration 📅 **Schedule**: (in timezone UTC) - Branch creation - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDguMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwOC4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=--> Reviewed-on: https://git.bitcart.ai/bitcart/bitcart-frontend/pulls/191
Add unmounting to fields.
field.mountnow returns a cleanup function for unmounting.Without unmounting, conditionally rendered fields will keep their field-level validations running even though the field isn’t rendered anymore.
Summary by CodeRabbit
New Features
Bug Fixes
Tests