Skip to content

perf(spy): reset only mocks that were called or reconfigured - #11197

Merged
sheremet-va merged 4 commits into
vitest-dev:mainfrom
johan-gorter:perf/spy-reset-dirty-mocks
Oct 5, 2026
Merged

sheremet-va merged 4 commits into
vitest-dev:mainfrom
johan-gorter:perf/spy-reset-dirty-mocks

Conversation

@johan-gorter

@johan-gorter johan-gorter commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Description

vi.resetAllMocks() iterates REGISTERED_MOCKS, which holds a WeakRef to every mock ever created in the worker, and calls mockReset() on each one that is still alive. Its cost therefore grows with the number of live mocks, not with the number of mocks a test actually touched.

With isolate: false this becomes the dominant cost of a run. One worker executes many test files, so module-level mocks and every vi.fn() that is still reachable keep accumulating. deref() also adds each mock to the WeakRef "keep during job" list, so the mocks a test created cannot be collected until the runner yields to the event loop, which rarely happens inside a file. With mockReset: true every test then pays for every mock in the worker.

Measured on a large suite (364 files, 6733 tests, pool: 'forks', isolate: false, mockReset: true, coverage off, 4 workers):

Vitest wall time resetAllMocks() CPU across workers max mocks visited per reset
4.1.11 (Set of strong refs) 671 s 1838 s ~110,000
5.0.0 (WeakRef registry, #11092) 189 s 465 s ~66,000
5.0.0 + this change 26 s 0.4 s 5 to 50

The last row was measured with the first commit (strong Sets). With the weak-ref version the same suite takes 22.5 s wall time against 24.9 s for the first commit, measured back to back; see the comments below.

This PR applies the approach #11092 introduced for clearAllMocks() to resetAllMocks():

  • DIRTY_MOCK_STATES already tracks mocks that were called since their last mockClear().
  • A new DIRTY_MOCK_CONFIGS set tracks mocks whose config changed since their last mockReset(): mockImplementation, mockImplementationOnce, withImplementation, and mockName add the mock, mockReset() removes it. Every mockReturnValue*, mockResolvedValue*, mockRejectedValue*, and mockThrow* helper goes through one of these.
  • resetAllMocks() iterates the two sets. mockReset() removes the mock from both, so a mock present in both is visited once.

A mock that is in neither set is already in its reset state, so behavior is unchanged. clearAllMocks() is unaffected: it still only touches DIRTY_MOCK_STATES, and a mock that was reconfigured but never called stays in DIRTY_MOCK_CONFIGS until resetAllMocks() sees it (covered by the new tests).

With this change nothing reads REGISTERED_MOCKS anymore, so the WeakRef registry and the FinalizationRegistry are removed. That also removes the per-mock WeakRef allocation and the deref() pass that pinned every live mock for the rest of the job. If you prefer to keep the registry for future use, that part of the diff can be dropped; the perf gain comes from the two loops in resetAllMocks(). The Firefox 79 note in docs/guide/browser/index.md that #11092 added for WeakRef support may no longer be needed after this; I left the docs untouched.

Update (second commit, see the comments below): the paragraph above no longer applies. Both dirty sets hold WeakRefs, and the FinalizationRegistry from #11092 stays and removes collected mocks from both sets. A mock gets its WeakRef the first time it is called or configured instead of at creation, so mocks that are never touched no longer get one; the REGISTERED_MOCKS set that held a ref to every mock is gone. Collectability of unused mocks is unchanged from #11092; this PR is about the iteration cost of resetAllMocks(), see #11197 (comment) by @hi-ogawa. The docs note on WeakRef support stays. The third commit merges main and adopts the Set.prototype.add guard from #11299 in the shared markDirty helper.

Related: #9492, #11092.

AI disclosure: Claude (Claude Code) assisted with drafting the change, the tests and this description; the diff was reviewed and measured by me.

Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. If the feature is substantial or introduces breaking changes without a discussion, PR might be closed.
  • Ideally, include a test that fails without this PR but passes with it.
  • Please, don't make changes to pnpm-lock.yaml unless you introduce a new test example.
  • Please check Allow edits by maintainers to make review process faster. Note that this option is not available for repositories that are owned by Github organizations.

Tests

  • Run the tests with pnpm test:ci.

Documentation

  • If you introduce new functionality, document it. You can run documentation with pnpm run docs command.

Changesets

  • Changes in changelog are generated from PR name. Please, make sure that it explains your changes in an understandable manner. Please, prefix changeset messages with feat:, fix:, perf:, docs:, or chore:.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@netlify

netlify Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for vitest-dev ready!

Built without sensitive environment variables

Name Link
🔨 Latest commit 77806c5
🔍 Latest deploy log https://app.netlify.com/projects/vitest-dev/deploys/6ac152d393bad200088695d4
😎 Deploy Preview https://deploy-preview-11197--vitest-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@johan-gorter
johan-gorter marked this pull request as ready for review September 8, 2026 14:15
Comment thread packages/spy/src/index.ts Outdated
}
// `mockReset()` removes the mock from both sets, so a mock present in both
// is visited once.
for (const mock of DIRTY_MOCK_STATES) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mocks are never removed from the global state now. Doesn't it reintroduce the issue that was fixed by the previous PR? CC @scttcper

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, with only clearMocks enabled the new config set keeps a strong reference to every vi.fn(implementation), so it brings back the retention issue

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in the second commit: both sets now hold WeakRefs with the #11092 finalizer, and the third commit merges main with the #11299 guard. Retention test in vi-fn-retention.test.ts covers the clearMocks-only case you and @scttcper raised. Could you take another look when you have a moment?

@scttcper

scttcper commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

could we use weak refs for the config set? also found that calling mockReset() inside withImplementation leaves the restored implementation around after resetAllMocks().

@johan-gorter

Copy link
Copy Markdown
Contributor Author

You're both right. The config set holds strong references and only mockReset() removes a mock, so with clearMocks alone every mock that had mockImplementation / mockReturnValue / mockName called on it stays alive for the lifetime of the worker. That's the leak #11092 fixed. DIRTY_MOCK_STATES has the same property when nothing ever clears, so both sets need the same treatment. And withImplementation is a real bug in this PR: if the callback calls mockReset() the mock leaves the set, the previous implementation is restored, and resetAllMocks() never sees it again. Reproduced with mockImplementation and with a pending mockImplementationOnce.

I'd fix it in this PR as follows:

  • Both dirty sets hold WeakRefs. One WeakRef per mock, created lazily the first time a mock is called or configured and kept in a WeakMap, registered once with a FinalizationRegistry that removes it from both sets when the mock is collected.
  • mockClear() / mockReset() delete the ref from their set. clearAllMocks() / resetAllMocks() deref only the dirty refs and drop dead ones as they go.
  • The restore step of withImplementation adds the mock back to the config set.
  • Compared to main this allocates a WeakRef only for mocks that were called or configured, and deref() only touches the dirty ones, so the numbers in the description should hold. I'll update the description, since the paragraph about removing the registry no longer applies.

@johan-gorter

Copy link
Copy Markdown
Contributor Author

@scttcper @sheremet-va, shall I improve the PR with this approach or do you have a different insight?

@scttcper

Copy link
Copy Markdown
Contributor

yeah, that sounds good to me. would be good to add tests for both cases and rerun the benchmark with the weak refs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@johan-gorter

Copy link
Copy Markdown
Contributor Author

Pushed the weak-ref version as a second commit on top of the one you reviewed.

What the second commit changes:

  • Both dirty sets hold WeakRefs. A mock gets one ref the first time it is called or configured, kept in a WeakMap and registered once with the FinalizationRegistry from perf(spy): avoid scanning cleared mocks #11092, which drops it from both sets when the mock is collected. Iteration prunes dead refs as well. So the registry stays and the paragraph in the description about removing it no longer applies; the Firefox note in the docs stays too.
  • The restore step of withImplementation marks the mock dirty again, so mockReset() inside the callback no longer hides the restored implementation from resetAllMocks().
  • Tests: the two withImplementation + mockReset() cases, and test/unit/test/mocking/vi-fn-retention.test.ts with five scenarios (called, configured, vi.fn(impl) with clearMocks only, configured with clearMocks only, called and configured with clearMocks only) asserting that 100 dropped mocks are collected. It uses the --expose-gc flag flip from the leak-probe fixture and passes on threads, forks and vmThreads. All seven new tests fail on the first commit.

Two things worth knowing:

  • vi.fn(impl) applies its implementation through mockImplementation, so it counts as configured: it gets its ref at creation and is visited once by the next resetAllMocks(), which restores the same implementation. I left that as is rather than special-casing it.
  • Creating a WeakRef pins the target until the current job ends, so a mock's first call or configuration still pins it, the same way creation did on main. Only untouched mocks are now never pinned.

Benchmark rerun at the spy level (Node 24, built @vitest/spy, base 09bc9ad6 vs this PR). Each "test" calls 20 mocks, configures 20 others, then runs resetAllMocks():

live mocks in the worker main this PR
10,000 4.5 ms 0.13 ms
50,000 46 ms 0.19 ms
100,000 128 ms 0.18 ms

Per-call overhead is within noise (one mock called 1M times: 173 ms main, 169 ms PR; 1000 mocks x 1000 calls: 271 vs 259 ms). Retention with 20,000 dropped mocks per scenario and forced GC: main retains every called mock when nothing clears; this PR collects all of them in every scenario, including clearMocks only.

On the suite from the description (364 files, 6764 tests, isolate: false, mockReset: true, 4 forks, coverage off), measured back to back on one machine: 5.0.0 with the strong-Set commit b62516fc 24.9 s wall time, with this weak-ref commit 22.5 s. Unpatched 5.0.0 was 189 s in the earlier measurement from the description. @scttcper

@scttcper

Copy link
Copy Markdown
Contributor

looks good on my end

@hi-ogawa

Copy link
Copy Markdown
Collaborator

There was a fix for guarding against Set.prototype.add mocking #11299. Can you fix conflict please?

@hi-ogawa

Copy link
Copy Markdown
Collaborator

I think it's worth calling out this is technically different nature from #11092 and #9492 where the main idea was to make unused mocks as garbage-collectable with enumerable weak set trick of const REGISTERED_MOCKS = new Set<WeakRef<Mock>>.

Compared to that, this PR is not about garbage-collctability but about reducing the iteration with more book-keeping. That's what I understood so far, but please let me know if I misread the idea.

Adopts the Set.prototype.add guard from vitest-dev#11299 in markDirty.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@johan-gorter

Copy link
Copy Markdown
Contributor Author

@hi-ogawa thanks, both points are right.

Conflict: merged main and carried the #11299 guard into this branch. Both dirty sets are filled through one markDirty helper, so it captures Set.prototype.add once and calls that; the two tests from #11299 pass on the branch. The same recursion would exist for a spy on WeakMap.prototype.get/set, which markDirty uses for the per-mock WeakRef and main does not touch on the call path. I left that unguarded, matching the scope of #11299; say so if you want those covered too.

Nature of the change: you read it correctly. #11092 and #9492 were about making unused mocks collectable. This PR is about the iteration cost of resetAllMocks(): with isolate: false and mockReset: true every test visited every live mock in the worker, and module-level mocks accumulate across files, so a single reset walked tens of thousands of mocks. The change keeps two sets of the mocks that actually need work (called since the last clear, configured since the last reset) and only visits those. The WeakRefs in those sets are there to keep the collectability #11092 introduced, not the goal of the PR. Two side effects, neither the point: a mock that is never called or configured no longer gets a WeakRef at all, and a called mock that nothing ever clears is now collectable, where main keeps it in DIRTY_MOCK_STATES for the lifetime of the worker.

What it costs: one WeakMap lookup plus the original Set.prototype.add per mock call, a WeakRef allocated on a mock's first call or configuration (which pins it until the current job ends, as creation did on main), and vi.fn(impl) counts as configured, so it is visited once by the next reset. Within noise in a microbenchmark and on our suite.

What it fixes in practice: our 364-file suite with isolate: false and mockReset: true went from 189 s on 5.0.0 to 22 s. Any project with that config and many module-level mocks pays the same per-test cost today. I struck the outdated paragraph in the description and added a note pointing here.

sheremet-va
sheremet-va previously approved these changes Sep 29, 2026

@sheremet-va sheremet-va left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, could you please resolve the conflict?

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@johan-gorter

Copy link
Copy Markdown
Contributor Author

Conflict resolved; the Node 26 failure is the ui.spec module-graph click timeout, unit tests passed. @sheremet-va

@sheremet-va
sheremet-va merged commit 28ef93d into vitest-dev:main Oct 5, 2026
28 of 29 checks passed
renovate Bot added a commit to cigaleapp/cigale that referenced this pull request Oct 19, 2026
##### [v5.0.4](https://github.com/vitest-dev/vitest/releases/tag/v5.0.4)

#####    🚀 Features

- **experimental**:
  - Tag cache directories with CACHEDIR.TAG  -  by [@lifeiscontent](https://github.com/lifeiscontent) in [#11461](vitest-dev/vitest#11461) [<samp>(a8ea3)</samp>](vitest-dev/vitest@a8ea3c8fd)
  - Support `test.ui.theme` option  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11499](vitest-dev/vitest#11499) [<samp>(1da66)</samp>](vitest-dev/vitest@1da66405d)
  - Highlight selector multiple matches in trace view  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11489](vitest-dev/vitest#11489) [<samp>(5abba)</samp>](vitest-dev/vitest@5abba1e1b)
  - Print how many tests were affected and a total when running `--changed`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11424](vitest-dev/vitest#11424) [<samp>(a2336)</samp>](vitest-dev/vitest@a23368585)
  - Add an option to cache dependencies instead of statically parsing them  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11515](vitest-dev/vitest#11515) [<samp>(c0601)</samp>](vitest-dev/vitest@c06012ac8)
  - Add fit and zoom controls to trace viewer  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11490](vitest-dev/vitest#11490) [<samp>(f5dd9)</samp>](vitest-dev/vitest@f5dd99ed0)

#####    🐞 Bug Fixes

- Fail the run on git and location filter errors  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11430](vitest-dev/vitest#11430) [<samp>(30d03)</samp>](vitest-dev/vitest@30d0304d2)
- Enable fsModuleCache by default  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11435](vitest-dev/vitest#11435) [<samp>(ad208)</samp>](vitest-dev/vitest@ad208cc29)
- Track project files and mocks with --changed  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11432](vitest-dev/vitest#11432) [<samp>(b0f2b)</samp>](vitest-dev/vitest@b0f2b3bb9)
- Refactor caching, fix `:` in project and change the shape of `results` cache  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11453](vitest-dev/vitest#11453) [<samp>(9673c)</samp>](vitest-dev/vitest@9673c49a4)
- Keep full `$` string values when `taskTitleValueFormatTruncate` is 0  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11485](vitest-dev/vitest#11485) [<samp>(4f7e1)</samp>](vitest-dev/vitest@4f7e1799b)
- Resolve node builtins in client environments  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11417](vitest-dev/vitest#11417) [<samp>(56b31)</samp>](vitest-dev/vitest@56b319ac6)
- Fix module graph builtin externals after [#11421](vitest-dev/vitest#11421)  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11491](vitest-dev/vitest#11491) and [#11421](vitest-dev/vitest#11421) [<samp>(008e1)</samp>](vitest-dev/vitest@008e184cb)
- Wrap module mocks during in-source testing  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11505](vitest-dev/vitest#11505) [<samp>(36d19)</samp>](vitest-dev/vitest@36d19cb00)
- Handle line endings in snapshot  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11522](vitest-dev/vitest#11522) [<samp>(4c468)</samp>](vitest-dev/vitest@4c468aa40)
- Respect root in projects  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11521](vitest-dev/vitest#11521) [<samp>(26642)</samp>](vitest-dev/vitest@26642f793)
- Resolve mocks in directories with spaces  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11539](vitest-dev/vitest#11539) [<samp>(caaef)</samp>](vitest-dev/vitest@caaef9416)
- **api**:
  - Publish the api token atomically  -  by [@umairnawaz333](https://github.com/umairnawaz333) in [#11323](vitest-dev/vitest#11323) [<samp>(6f990)</samp>](vitest-dev/vitest@6f990fef1)
- **browser**:
  - Close the mock route interception race  -  by [@cplieger](https://github.com/cplieger) and [@sheremet-va](https://github.com/sheremet-va) in [#8339](vitest-dev/vitest#8339) and [#11083](vitest-dev/vitest#11083) [<samp>(d6620)</samp>](vitest-dev/vitest@d6620fae6)
  - Allow toHaveTextContent without arguments  -  by [@nomadical](https://github.com/nomadical) in [#11425](vitest-dev/vitest#11425) [<samp>(8ebcf)</samp>](vitest-dev/vitest@8ebcf5f8a)
  - Apply API options without browser config  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10852](vitest-dev/vitest#10852) [<samp>(ad055)</samp>](vitest-dev/vitest@ad055837b)
  - Preserve undefined command arguments  -  by [@sheremet-va](https://github.com/sheremet-va) and [@AriPerkkio](https://github.com/AriPerkkio) in [#11497](vitest-dev/vitest#11497) [<samp>(1576d)</samp>](vitest-dev/vitest@1576d3d89)
  - Wait for setup mocks before importing a test file  -  by [@kasperpeulen](https://github.com/kasperpeulen) in [#11520](vitest-dev/vitest#11520) [<samp>(b61d1)</samp>](vitest-dev/vitest@b61d1ced3)
  - Avoid extra scroll outside the iframe  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11523](vitest-dev/vitest#11523) [<samp>(662e8)</samp>](vitest-dev/vitest@662e8a363)
  - Run browser instances as workers  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11525](vitest-dev/vitest#11525) [<samp>(bf04b)</samp>](vitest-dev/vitest@bf04b9ccc)
    - ⚠️ This can degrade performance if you have a custom `maxWorkers` setting. Previously, it was applied incorrectly and could lead to Vitest using too many resources. For example, a lower number would still open too many browsers. Fixing it means Vitest opens less instances by default now.
  - Open one cdp session per tester  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11542](vitest-dev/vitest#11542) [<samp>(69e63)</samp>](vitest-dev/vitest@69e6369f6)
  - Clean up unmocked and pending mocks  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11537](vitest-dev/vitest#11537) [<samp>(5c955)</samp>](vitest-dev/vitest@5c9552173)
- **coverage**:
  - V8 browser memory leak between test files  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11466](vitest-dev/vitest#11466) [<samp>(2297d)</samp>](vitest-dev/vitest@2297d93a8)
  - `allowExternal` fails to include uncovered files  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11513](vitest-dev/vitest#11513) [<samp>(4ef00)</samp>](vitest-dev/vitest@4ef000a93)
  - Filenames containing brackets incorrectly showing as uncovered  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11531](vitest-dev/vitest#11531) [<samp>(0fa80)</samp>](vitest-dev/vitest@0fa80f53c)
  - Istanbul coverage wrong when module transform warmups  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11529](vitest-dev/vitest#11529) [<samp>(9f61d)</samp>](vitest-dev/vitest@9f61dcca2)
- **deps**:
  - Update all non-major dependencies  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11167](vitest-dev/vitest#11167) [<samp>(c74e0)</samp>](vitest-dev/vitest@c74e099a9)
- **expect**:
  - Fix `Map` and `Set` deep equality in some assertions  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11402](vitest-dev/vitest#11402) [<samp>(b4e79)</samp>](vitest-dev/vitest@b4e79fd7a)
  - Check value in chai-style returned  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11500](vitest-dev/vitest#11500) [<samp>(1aca0)</samp>](vitest-dev/vitest@1aca02a21)
- **mocker**:
  - Fix native loader mocking edge cases  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11540](vitest-dev/vitest#11540) [<samp>(cd423)</samp>](vitest-dev/vitest@cd423ba04)
- **pretty-format**:
  - Support boxed symbols  -  by [@lehni](https://github.com/lehni) in [#11445](vitest-dev/vitest#11445) and [#11446](vitest-dev/vitest#11446) [<samp>(eba44)</samp>](vitest-dev/vitest@eba44926e)
- **reporters**:
  - Junit to strip ANSI sequences from all XML attributes  -  by [@meganemura](https://github.com/meganemura) and **Claude Opus 5.5** in [#11407](vitest-dev/vitest#11407) [<samp>(e1a73)</samp>](vitest-dev/vitest@e1a731470)
- **runner**:
  - Don't cache failed fixture setups  -  by [@hamed-bavar](https://github.com/hamed-bavar) in [#11237](vitest-dev/vitest#11237) and [#11238](vitest-dev/vitest#11238) [<samp>(4ee66)</samp>](vitest-dev/vitest@4ee66c021)
- **typecheck**:
  - Use typescript pool in toTestSpecification  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11451](vitest-dev/vitest#11451) [<samp>(5f273)</samp>](vitest-dev/vitest@5f2739e74)
- **ui**:
  - Remove duplicate browser-open call opening two tabs  -  by [@feastyr69](https://github.com/feastyr69) in [#11356](vitest-dev/vitest#11356) and [#11358](vitest-dev/vitest#11358) [<samp>(d7e13)</samp>](vitest-dev/vitest@d7e1315c1)
  - Simplify explorer filtering + fix nested tests when search matches a suite  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **Codex** and **Claude Opus 5.5** in [#11262](vitest-dev/vitest#11262) [<samp>(a627b)</samp>](vitest-dev/vitest@a627be498)
  - Store module graph once per environment  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11421](vitest-dev/vitest#11421) [<samp>(af903)</samp>](vitest-dev/vitest@af903c65e)
  - Mount index.html handler on the ui base path  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11517](vitest-dev/vitest#11517) [<samp>(1bc24)</samp>](vitest-dev/vitest@1bc2495c7)
  - Center split pane resize handle  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11506](vitest-dev/vitest#11506) [<samp>(e658b)</samp>](vitest-dev/vitest@e658b9b6a)
- **vm**:
  - Bind `this` to `module.exports`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11504](vitest-dev/vitest#11504) [<samp>(b618a)</samp>](vitest-dev/vitest@b618afd5c)

#####    🏎 Performance

- Reuse fsModuleCache when filtering by source  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11428](vitest-dev/vitest#11428) [<samp>(7ebd9)</samp>](vitest-dev/vitest@7ebd95fdd)
- **spy**: Reset only mocks that were called or reconfigured  -  by [@johan-gorter](https://github.com/johan-gorter) and **Claude Opus 5.5** in [#11197](vitest-dev/vitest#11197) [<samp>(28ef9)</samp>](vitest-dev/vitest@28ef93df2)

#####     [View changes on GitHub](vitest-dev/vitest@v5.0.3...v5.0.4)
renovate Bot added a commit to cigaleapp/cigale that referenced this pull request Oct 19, 2026
##### [v5.0.4](https://github.com/vitest-dev/vitest/releases/tag/v5.0.4)

#####    🚀 Features

- **experimental**:
  - Tag cache directories with CACHEDIR.TAG  -  by [@lifeiscontent](https://github.com/lifeiscontent) in [#11461](https://github.com/vitest-dev/vitest/issues/11461) [<samp>(a8ea3)</samp>](https://github.com/vitest-dev/vitest/commit/a8ea3c8fd)
  - Support `test.ui.theme` option  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11499](https://github.com/vitest-dev/vitest/issues/11499) [<samp>(1da66)</samp>](https://github.com/vitest-dev/vitest/commit/1da66405d)
  - Highlight selector multiple matches in trace view  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11489](https://github.com/vitest-dev/vitest/issues/11489) [<samp>(5abba)</samp>](https://github.com/vitest-dev/vitest/commit/5abba1e1b)
  - Print how many tests were affected and a total when running `--changed`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11424](https://github.com/vitest-dev/vitest/issues/11424) [<samp>(a2336)</samp>](https://github.com/vitest-dev/vitest/commit/a23368585)
  - Add an option to cache dependencies instead of statically parsing them  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11515](https://github.com/vitest-dev/vitest/issues/11515) [<samp>(c0601)</samp>](https://github.com/vitest-dev/vitest/commit/c06012ac8)
  - Add fit and zoom controls to trace viewer  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11490](https://github.com/vitest-dev/vitest/issues/11490) [<samp>(f5dd9)</samp>](https://github.com/vitest-dev/vitest/commit/f5dd99ed0)

#####    🐞 Bug Fixes

- Fail the run on git and location filter errors  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11430](https://github.com/vitest-dev/vitest/issues/11430) [<samp>(30d03)</samp>](https://github.com/vitest-dev/vitest/commit/30d0304d2)
- Enable fsModuleCache by default  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11435](https://github.com/vitest-dev/vitest/issues/11435) [<samp>(ad208)</samp>](https://github.com/vitest-dev/vitest/commit/ad208cc29)
- Track project files and mocks with --changed  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11432](https://github.com/vitest-dev/vitest/issues/11432) [<samp>(b0f2b)</samp>](https://github.com/vitest-dev/vitest/commit/b0f2b3bb9)
- Refactor caching, fix `:` in project and change the shape of `results` cache  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11453](https://github.com/vitest-dev/vitest/issues/11453) [<samp>(9673c)</samp>](https://github.com/vitest-dev/vitest/commit/9673c49a4)
- Keep full `$` string values when `taskTitleValueFormatTruncate` is 0  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11485](https://github.com/vitest-dev/vitest/issues/11485) [<samp>(4f7e1)</samp>](https://github.com/vitest-dev/vitest/commit/4f7e1799b)
- Resolve node builtins in client environments  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11417](https://github.com/vitest-dev/vitest/issues/11417) [<samp>(56b31)</samp>](https://github.com/vitest-dev/vitest/commit/56b319ac6)
- Fix module graph builtin externals after [#11421](https://github.com/vitest-dev/vitest/issues/11421)  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11491](https://github.com/vitest-dev/vitest/issues/11491) and [#11421](https://github.com/vitest-dev/vitest/issues/11421) [<samp>(008e1)</samp>](https://github.com/vitest-dev/vitest/commit/008e184cb)
- Wrap module mocks during in-source testing  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11505](https://github.com/vitest-dev/vitest/issues/11505) [<samp>(36d19)</samp>](https://github.com/vitest-dev/vitest/commit/36d19cb00)
- Handle line endings in snapshot  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11522](https://github.com/vitest-dev/vitest/issues/11522) [<samp>(4c468)</samp>](https://github.com/vitest-dev/vitest/commit/4c468aa40)
- Respect root in projects  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11521](https://github.com/vitest-dev/vitest/issues/11521) [<samp>(26642)</samp>](https://github.com/vitest-dev/vitest/commit/26642f793)
- Resolve mocks in directories with spaces  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11539](https://github.com/vitest-dev/vitest/issues/11539) [<samp>(caaef)</samp>](https://github.com/vitest-dev/vitest/commit/caaef9416)
- **api**:
  - Publish the api token atomically  -  by [@umairnawaz333](https://github.com/umairnawaz333) in [#11323](https://github.com/vitest-dev/vitest/issues/11323) [<samp>(6f990)</samp>](https://github.com/vitest-dev/vitest/commit/6f990fef1)
- **browser**:
  - Close the mock route interception race  -  by [@cplieger](https://github.com/cplieger) and [@sheremet-va](https://github.com/sheremet-va) in [#8339](https://github.com/vitest-dev/vitest/issues/8339) and [#11083](https://github.com/vitest-dev/vitest/issues/11083) [<samp>(d6620)</samp>](https://github.com/vitest-dev/vitest/commit/d6620fae6)
  - Allow toHaveTextContent without arguments  -  by [@nomadical](https://github.com/nomadical) in [#11425](https://github.com/vitest-dev/vitest/issues/11425) [<samp>(8ebcf)</samp>](https://github.com/vitest-dev/vitest/commit/8ebcf5f8a)
  - Apply API options without browser config  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10852](https://github.com/vitest-dev/vitest/issues/10852) [<samp>(ad055)</samp>](https://github.com/vitest-dev/vitest/commit/ad055837b)
  - Preserve undefined command arguments  -  by [@sheremet-va](https://github.com/sheremet-va) and [@AriPerkkio](https://github.com/AriPerkkio) in [#11497](https://github.com/vitest-dev/vitest/issues/11497) [<samp>(1576d)</samp>](https://github.com/vitest-dev/vitest/commit/1576d3d89)
  - Wait for setup mocks before importing a test file  -  by [@kasperpeulen](https://github.com/kasperpeulen) in [#11520](https://github.com/vitest-dev/vitest/issues/11520) [<samp>(b61d1)</samp>](https://github.com/vitest-dev/vitest/commit/b61d1ced3)
  - Avoid extra scroll outside the iframe  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11523](https://github.com/vitest-dev/vitest/issues/11523) [<samp>(662e8)</samp>](https://github.com/vitest-dev/vitest/commit/662e8a363)
  - Run browser instances as workers  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11525](https://github.com/vitest-dev/vitest/issues/11525) [<samp>(bf04b)</samp>](https://github.com/vitest-dev/vitest/commit/bf04b9ccc)
    - ⚠️ This can degrade performance if you have a custom `maxWorkers` setting. Previously, it was applied incorrectly and could lead to Vitest using too many resources. For example, a lower number would still open too many browsers. Fixing it means Vitest opens less instances by default now.
  - Open one cdp session per tester  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11542](https://github.com/vitest-dev/vitest/issues/11542) [<samp>(69e63)</samp>](https://github.com/vitest-dev/vitest/commit/69e6369f6)
  - Clean up unmocked and pending mocks  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11537](https://github.com/vitest-dev/vitest/issues/11537) [<samp>(5c955)</samp>](https://github.com/vitest-dev/vitest/commit/5c9552173)
- **coverage**:
  - V8 browser memory leak between test files  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11466](https://github.com/vitest-dev/vitest/issues/11466) [<samp>(2297d)</samp>](https://github.com/vitest-dev/vitest/commit/2297d93a8)
  - `allowExternal` fails to include uncovered files  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11513](https://github.com/vitest-dev/vitest/issues/11513) [<samp>(4ef00)</samp>](https://github.com/vitest-dev/vitest/commit/4ef000a93)
  - Filenames containing brackets incorrectly showing as uncovered  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11531](https://github.com/vitest-dev/vitest/issues/11531) [<samp>(0fa80)</samp>](https://github.com/vitest-dev/vitest/commit/0fa80f53c)
  - Istanbul coverage wrong when module transform warmups  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11529](https://github.com/vitest-dev/vitest/issues/11529) [<samp>(9f61d)</samp>](https://github.com/vitest-dev/vitest/commit/9f61dcca2)
- **deps**:
  - Update all non-major dependencies  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11167](https://github.com/vitest-dev/vitest/issues/11167) [<samp>(c74e0)</samp>](https://github.com/vitest-dev/vitest/commit/c74e099a9)
- **expect**:
  - Fix `Map` and `Set` deep equality in some assertions  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11402](https://github.com/vitest-dev/vitest/issues/11402) [<samp>(b4e79)</samp>](https://github.com/vitest-dev/vitest/commit/b4e79fd7a)
  - Check value in chai-style returned  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11500](https://github.com/vitest-dev/vitest/issues/11500) [<samp>(1aca0)</samp>](https://github.com/vitest-dev/vitest/commit/1aca02a21)
- **mocker**:
  - Fix native loader mocking edge cases  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11540](https://github.com/vitest-dev/vitest/issues/11540) [<samp>(cd423)</samp>](https://github.com/vitest-dev/vitest/commit/cd423ba04)
- **pretty-format**:
  - Support boxed symbols  -  by [@lehni](https://github.com/lehni) in [#11445](https://github.com/vitest-dev/vitest/issues/11445) and [#11446](https://github.com/vitest-dev/vitest/issues/11446) [<samp>(eba44)</samp>](https://github.com/vitest-dev/vitest/commit/eba44926e)
- **reporters**:
  - Junit to strip ANSI sequences from all XML attributes  -  by [@meganemura](https://github.com/meganemura) and **Claude Opus 5.5** in [#11407](https://github.com/vitest-dev/vitest/issues/11407) [<samp>(e1a73)</samp>](https://github.com/vitest-dev/vitest/commit/e1a731470)
- **runner**:
  - Don't cache failed fixture setups  -  by [@hamed-bavar](https://github.com/hamed-bavar) in [#11237](https://github.com/vitest-dev/vitest/issues/11237) and [#11238](https://github.com/vitest-dev/vitest/issues/11238) [<samp>(4ee66)</samp>](https://github.com/vitest-dev/vitest/commit/4ee66c021)
- **typecheck**:
  - Use typescript pool in toTestSpecification  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11451](https://github.com/vitest-dev/vitest/issues/11451) [<samp>(5f273)</samp>](https://github.com/vitest-dev/vitest/commit/5f2739e74)
- **ui**:
  - Remove duplicate browser-open call opening two tabs  -  by [@feastyr69](https://github.com/feastyr69) in [#11356](https://github.com/vitest-dev/vitest/issues/11356) and [#11358](https://github.com/vitest-dev/vitest/issues/11358) [<samp>(d7e13)</samp>](https://github.com/vitest-dev/vitest/commit/d7e1315c1)
  - Simplify explorer filtering + fix nested tests when search matches a suite  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **Codex** and **Claude Opus 5.5** in [#11262](https://github.com/vitest-dev/vitest/issues/11262) [<samp>(a627b)</samp>](https://github.com/vitest-dev/vitest/commit/a627be498)
  - Store module graph once per environment  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11421](https://github.com/vitest-dev/vitest/issues/11421) [<samp>(af903)</samp>](https://github.com/vitest-dev/vitest/commit/af903c65e)
  - Mount index.html handler on the ui base path  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11517](https://github.com/vitest-dev/vitest/issues/11517) [<samp>(1bc24)</samp>](https://github.com/vitest-dev/vitest/commit/1bc2495c7)
  - Center split pane resize handle  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude Opus 5.5** in [#11506](https://github.com/vitest-dev/vitest/issues/11506) [<samp>(e658b)</samp>](https://github.com/vitest-dev/vitest/commit/e658b9b6a)
- **vm**:
  - Bind `this` to `module.exports`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11504](https://github.com/vitest-dev/vitest/issues/11504) [<samp>(b618a)</samp>](https://github.com/vitest-dev/vitest/commit/b618afd5c)

#####    🏎 Performance

- Reuse fsModuleCache when filtering by source  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11428](https://github.com/vitest-dev/vitest/issues/11428) [<samp>(7ebd9)</samp>](https://github.com/vitest-dev/vitest/commit/7ebd95fdd)
- **spy**: Reset only mocks that were called or reconfigured  -  by [@johan-gorter](https://github.com/johan-gorter) and **Claude Opus 5.5** in [#11197](https://github.com/vitest-dev/vitest/issues/11197) [<samp>(28ef9)</samp>](https://github.com/vitest-dev/vitest/commit/28ef93df2)

#####     [View changes on GitHub](https://github.com/vitest-dev/vitest/compare/v5.0.3...v5.0.4)
##### [v5.0.3](https://github.com/vitest-dev/vitest/releases/tag/v5.0.3)

#####    🐞 Bug Fixes

- Isolate `result.status` between `repeats` runs  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex (GPT-6)** in [#11218](https://github.com/vitest-dev/vitest/issues/11218) [<samp>(5dbeb)</samp>](https://github.com/vitest-dev/vitest/commit/5dbebe9e3)
- Don't print an interceptor warning in browser mode  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11377](https://github.com/vitest-dev/vitest/issues/11377) [<samp>(15cc0)</samp>](https://github.com/vitest-dev/vitest/commit/15cc006aa)
- Don't retry when `test.fails` expectedly failed  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex (GPT-6)** in [#11219](https://github.com/vitest-dev/vitest/issues/11219) [<samp>(b2458)</samp>](https://github.com/vitest-dev/vitest/commit/b24585f08)
- Scope cache key generators to projects  -  by [@ecoyoung](https://github.com/ecoyoung) in [#11281](https://github.com/vitest-dev/vitest/issues/11281) and [#11301](https://github.com/vitest-dev/vitest/issues/11301) [<samp>(92ba7)</samp>](https://github.com/vitest-dev/vitest/commit/92ba7fc1d)
- **browser**:
  - Delay server `listen` until tests start running  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11366](https://github.com/vitest-dev/vitest/issues/11366) [<samp>(7d8ed)</samp>](https://github.com/vitest-dev/vitest/commit/7d8ed3e9b)
  - Check mock path boundaries  -  by [@saryn17](https://github.com/saryn17), **Ryosei Sato** and [@sheremet-va](https://github.com/sheremet-va) in [#11361](https://github.com/vitest-dev/vitest/issues/11361) and [#11362](https://github.com/vitest-dev/vitest/issues/11362) [<samp>(1c388)</samp>](https://github.com/vitest-dev/vitest/commit/1c3888bce)
  - Keep config of browser-consumed environments  -  by [@kasperpeulen](https://github.com/kasperpeulen) and **Claude** in [#11378](https://github.com/vitest-dev/vitest/issues/11378) [<samp>(aafc0)</samp>](https://github.com/vitest-dev/vitest/commit/aafc0996f)
  - Ignore page crash while cancelling  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11386](https://github.com/vitest-dev/vitest/issues/11386) [<samp>(7c367)</samp>](https://github.com/vitest-dev/vitest/commit/7c36748fa)
  - `toMatchScreenshot` uses wrong reference on retried tests  -  by [@macarie](https://github.com/macarie) in [#11393](https://github.com/vitest-dev/vitest/issues/11393) [<samp>(c22ab)</samp>](https://github.com/vitest-dev/vitest/commit/c22aba992)
- **cache**:
  - Revalidate imports of cached modules  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11381](https://github.com/vitest-dev/vitest/issues/11381) [<samp>(38f98)</samp>](https://github.com/vitest-dev/vitest/commit/38f98855f)
- **deps**:
  - Pin `why-is-node-running` to `3.2.1` to avoid users running into `ERR_PNPM_TRUST_DOWNGRADE`  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11403](https://github.com/vitest-dev/vitest/issues/11403) [<samp>(f6c9a)</samp>](https://github.com/vitest-dev/vitest/commit/f6c9a4977)
- **expect**:
  - Pass current equality testers to `expect.extend` asymmetric matchers  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Claude** in [#11401](https://github.com/vitest-dev/vitest/issues/11401) [<samp>(3e794)</samp>](https://github.com/vitest-dev/vitest/commit/3e794a96b)
- **jsdom**:
  - Support Blob on jsdom 30.1  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11379](https://github.com/vitest-dev/vitest/issues/11379) [<samp>(6c49b)</samp>](https://github.com/vitest-dev/vitest/commit/6c49b7197)
- **pool**:
  - Preserve unique pool ids when `groupOrder` is set  -  by [@mtorp](https://github.com/mtorp) in [#11392](https://github.com/vitest-dev/vitest/issues/11392) [<samp>(50312)</samp>](https://github.com/vitest-dev/vitest/commit/50312ebb4)
- **ui**:
  - Split-pane handle overlapping iframe  -  by [@macarie](https://github.com/macarie) in [#11221](https://github.com/vitest-dev/vitest/issues/11221) [<samp>(f91db)</samp>](https://github.com/vitest-dev/vitest/commit/f91db0dfd)
- **vitest**:
  - Remove root temp dir on close  -  by [@abhinav-phi](https://github.com/abhinav-phi) in [#11248](https://github.com/vitest-dev/vitest/issues/11248) [<samp>(7c711)</samp>](https://github.com/vitest-dev/vitest/commit/7c7119cf7)
- **vm**:
  - Do not optimize deps from index.html  -  by [@ezefernandezyf](https://github.com/ezefernandezyf), **Hiroshi Ogawa** and **Codex (GPT-6)** in [#11329](https://github.com/vitest-dev/vitest/issues/11329) and [#11360](https://github.com/vitest-dev/vitest/issues/11360) [<samp>(caf28)</samp>](https://github.com/vitest-dev/vitest/commit/caf2887de)
  - Don't reuse scripts across vite environments  -  by [@MO2k4](https://github.com/MO2k4), **Martin Oehlert** and **Claude** in [#11395](https://github.com/vitest-dev/vitest/issues/11395) [<samp>(346d3)</samp>](https://github.com/vitest-dev/vitest/commit/346d3896b)

#####     [View changes on GitHub](https://github.com/vitest-dev/vitest/compare/v5.0.2...v5.0.3)
##### [v5.0.2](https://github.com/vitest-dev/vitest/releases/tag/v5.0.2)

#####    🐞 Bug Fixes

- Bind `process` in case global is overwritten  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11343](https://github.com/vitest-dev/vitest/issues/11343) [<samp>(0b792)</samp>](https://github.com/vitest-dev/vitest/commit/0b79231ad)
- **detect-async-leaks**:
  - Ignore `process.stdio` handles  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11333](https://github.com/vitest-dev/vitest/issues/11333) [<samp>(0fd6b)</samp>](https://github.com/vitest-dev/vitest/commit/0fd6b9790)
- **expect**:
  - Fix `toMatchObject` with asymmetric matchers  -  by [@ShreeBohara](https://github.com/ShreeBohara), **Claude Opus 5**, [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex (GPT-5)** in [#11100](https://github.com/vitest-dev/vitest/issues/11100) [<samp>(42523)</samp>](https://github.com/vitest-dev/vitest/commit/42523289e)
- **jsdom**:
  - Fix `Request` with `Blob` body on jsdom 28+  -  by [@harshit-d3v](https://github.com/harshit-d3v) in [#11295](https://github.com/vitest-dev/vitest/issues/11295) [<samp>(d1c3e)</samp>](https://github.com/vitest-dev/vitest/commit/d1c3ecc93)
- **reporter**:
  - `agent` to respect `--silent`  -  by [@Raj4478](https://github.com/Raj4478) and [@AriPerkkio](https://github.com/AriPerkkio) in [#11271](https://github.com/vitest-dev/vitest/issues/11271) [<samp>(5b95e)</samp>](https://github.com/vitest-dev/vitest/commit/5b95efb6d)
- **reporters**:
  - Handle concurrent `createReport` calls  -  by [@7rulnik](https://github.com/7rulnik) in [#11278](https://github.com/vitest-dev/vitest/issues/11278) [<samp>(e8e55)</samp>](https://github.com/vitest-dev/vitest/commit/e8e556ff7)
  - `hanging-process` to use ESM entrypoint  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11316](https://github.com/vitest-dev/vitest/issues/11316) [<samp>(4e91e)</samp>](https://github.com/vitest-dev/vitest/commit/4e91e5668)
- **spy**:
  - Fix stack overflow when spying `Set.prototype.add`  -  by [@fengmk2](https://github.com/fengmk2) in [#11299](https://github.com/vitest-dev/vitest/issues/11299) [<samp>(a0a93)</samp>](https://github.com/vitest-dev/vitest/commit/a0a939653)
- **ui**:
  - Persist authentication cookie beyond current browser session  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11066](https://github.com/vitest-dev/vitest/issues/11066) [<samp>(f8819)</samp>](https://github.com/vitest-dev/vitest/commit/f88195e16)

#####     [View changes on GitHub](https://github.com/vitest-dev/vitest/compare/v5.0.1...v5.0.2)
##### [v5.0.1](https://github.com/vitest-dev/vitest/releases/tag/v5.0.1)

#####    🚀 Features

- **ui**:
  - Move trace attempts selector to viewer header  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex** in [#11189](https://github.com/vitest-dev/vitest/issues/11189) [<samp>(5dc4b)</samp>](https://github.com/vitest-dev/vitest/commit/5dc4b5c92)
  - Add focused trace view layout mode  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **OpenCode (gpt-5.6-sol)** and **Codex** in [#11190](https://github.com/vitest-dev/vitest/issues/11190) [<samp>(376dc)</samp>](https://github.com/vitest-dev/vitest/commit/376dc3bc1)

#####    🐞 Bug Fixes

- Exit 1 when vitest list fails collection  -  by [@hamed-bavar](https://github.com/hamed-bavar) in [#11145](https://github.com/vitest-dev/vitest/issues/11145) and [#11146](https://github.com/vitest-dev/vitest/issues/11146) [<samp>(6108b)</samp>](https://github.com/vitest-dev/vitest/commit/6108b8197)
- Keep parse error details in static collection  -  by [@hamed-bavar](https://github.com/hamed-bavar) in [#11150](https://github.com/vitest-dev/vitest/issues/11150) and [#11151](https://github.com/vitest-dev/vitest/issues/11151) [<samp>(7c818)</samp>](https://github.com/vitest-dev/vitest/commit/7c818153a)
- Avoid recursive prototype in automocking  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11195](https://github.com/vitest-dev/vitest/issues/11195) [<samp>(99fc5)</samp>](https://github.com/vitest-dev/vitest/commit/99fc52591)
- Prevent false Vitest import resolution  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11196](https://github.com/vitest-dev/vitest/issues/11196) [<samp>(b426c)</samp>](https://github.com/vitest-dev/vitest/commit/b426c1976)
- Keep metadata file when clearing the cache  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11199](https://github.com/vitest-dev/vitest/issues/11199) [<samp>(73614)</samp>](https://github.com/vitest-dev/vitest/commit/73614654a)
- Correct typos in error message and comments  -  by [@shinji00222](https://github.com/shinji00222) and **Shinji** in [#11187](https://github.com/vitest-dev/vitest/issues/11187) [<samp>(115c3)</samp>](https://github.com/vitest-dev/vitest/commit/115c3f6d2)
- Resolve ResolvedConfig exactOptionalPropertyTypes errors  -  by [@LukeAbby](https://github.com/LukeAbby) in [#11175](https://github.com/vitest-dev/vitest/issues/11175) [<samp>(498fb)</samp>](https://github.com/vitest-dev/vitest/commit/498fbe922)
- Share the server on self-referencing `extends`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11034](https://github.com/vitest-dev/vitest/issues/11034) [<samp>(23dda)</samp>](https://github.com/vitest-dev/vitest/commit/23dda738c)
- Warn when deprecated `deps.optimizer.web` is used  -  by [@im10furry](https://github.com/im10furry) in [#11214](https://github.com/vitest-dev/vitest/issues/11214) [<samp>(2ce29)</samp>](https://github.com/vitest-dev/vitest/commit/2ce29d5fa)
- **browser**:
  - Avoid double quotes in `config.define`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11198](https://github.com/vitest-dev/vitest/issues/11198) [<samp>(972e2)</samp>](https://github.com/vitest-dev/vitest/commit/972e24bab)
- **doctor**:
  - Measure vm pools for custom environments  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11212](https://github.com/vitest-dev/vitest/issues/11212) [<samp>(91ab1)</samp>](https://github.com/vitest-dev/vitest/commit/91ab1588c)
- **expect**:
  - Correct return value in `toMatchAriaSnapshot`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11208](https://github.com/vitest-dev/vitest/issues/11208) [<samp>(c119b)</samp>](https://github.com/vitest-dev/vitest/commit/c119be016)
- **fakeTimers**:
  - Force `queueMicrotask` and `nextTick` in `toNotFake`  -  by [@kingmakeruix](https://github.com/kingmakeruix), **kingmakeruix**, **Hiroshi Ogawa**, **Codex** and [@hi-ogawa](https://github.com/hi-ogawa) in [#11261](https://github.com/vitest-dev/vitest/issues/11261) [<samp>(a47d7)</samp>](https://github.com/vitest-dev/vitest/commit/a47d7908f)
- **snapshot**:
  - Report obsolete keys next to skipped tests  -  by [@hamed-bavar](https://github.com/hamed-bavar), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11157](https://github.com/vitest-dev/vitest/issues/11157) and [#11158](https://github.com/vitest-dev/vitest/issues/11158) [<samp>(17e2b)</samp>](https://github.com/vitest-dev/vitest/commit/17e2b22dd)
- **types**:
  - Make public declarations self-contained  -  by [@ZoeySigel](https://github.com/ZoeySigel) in [#11141](https://github.com/vitest-dev/vitest/issues/11141) [<samp>(45546)</samp>](https://github.com/vitest-dev/vitest/commit/455466c16)
- **ui**:
  - Fix collapse/expand suite with file name search  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex** in [#11260](https://github.com/vitest-dev/vitest/issues/11260) [<samp>(0a712)</samp>](https://github.com/vitest-dev/vitest/commit/0a7122daa)
  - Fix explorer file summary count  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **OpenCode (gpt-5.6-sol)** and **Codex** in [#11125](https://github.com/vitest-dev/vitest/issues/11125) [<samp>(05982)</samp>](https://github.com/vitest-dev/vitest/commit/05982297d)
- **utils**:
  - Fix `deepMerge` to handle prototype  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **Codex** in [#11215](https://github.com/vitest-dev/vitest/issues/11215) [<samp>(4944c)</samp>](https://github.com/vitest-dev/vitest/commit/4944cf498)

#####     [View changes on GitHub](https://github.com/vitest-dev/vitest/compare/v5.0.0...v5.0.1)
##### [v5.0.0](https://github.com/vitest-dev/vitest/releases/tag/v5.0.0)

Vitest 5 is officially out! This release focuses on performance and brings a lot of new features while fixing long-standing bugs. See our [blog post](https://vitest.dev/blog/vitest-5.html) for the official announcement.

#####    🚨 Breaking Changes

- Replace `loupe.inspect` with pretty-format  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Claude Opus 5 (1M context)** and **OpenAI Codex** in [#9609](https://github.com/vitest-dev/vitest/issues/9609) [<samp>(3f802)</samp>](https://github.com/vitest-dev/vitest/commit/3f802da4b)
- Remove quotes from string values in `test.for/each` title `$` variable (take 2)  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10170](https://github.com/vitest-dev/vitest/issues/10170) [<samp>(04d37)</samp>](https://github.com/vitest-dev/vitest/commit/04d37e9d7)
- Default `attachmentsDir` from `.vitest-attachements/` to `.vitest/attachments/`  -  by [@MdSadiqMd](https://github.com/MdSadiqMd) in [#10186](https://github.com/vitest-dev/vitest/issues/10186) [<samp>(1ba73)</samp>](https://github.com/vitest-dev/vitest/commit/1ba7338c3)
- Remove `sequential` test/suite options in favor of `concurrent`  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10198](https://github.com/vitest-dev/vitest/issues/10198) [<samp>(9229f)</samp>](https://github.com/vitest-dev/vitest/commit/9229f2edc)
- Represent locator as an object instead of a string  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10212](https://github.com/vitest-dev/vitest/issues/10212) [<samp>(80f07)</samp>](https://github.com/vitest-dev/vitest/commit/80f07edf6)
- Inline `expect` package  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10221](https://github.com/vitest-dev/vitest/issues/10221) [<samp>(ad162)</samp>](https://github.com/vitest-dev/vitest/commit/ad16223e7)
- Remove deprecated entry points  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10222](https://github.com/vitest-dev/vitest/issues/10222) [<samp>(994c6)</samp>](https://github.com/vitest-dev/vitest/commit/994c6ddb9)
- Require Node.js 22 and Vite 6.4  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10178](https://github.com/vitest-dev/vitest/issues/10178) [<samp>(38762)</samp>](https://github.com/vitest-dev/vitest/commit/3876283e8)
- Fail `expect.poll` when function didn't resolve in time  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10233](https://github.com/vitest-dev/vitest/issues/10233) [<samp>(4df04)</samp>](https://github.com/vitest-dev/vitest/commit/4df048c11)
- Throw an error if hoistable methods are outside the top level scope  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10460](https://github.com/vitest-dev/vitest/issues/10460) [<samp>(d0b4f)</samp>](https://github.com/vitest-dev/vitest/commit/d0b4fddcb)
- `toHaveTextContent` is strict, add `toMatchTextContent` as alternative  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10473](https://github.com/vitest-dev/vitest/issues/10473) [<samp>(18f30)</samp>](https://github.com/vitest-dev/vitest/commit/18f303079)
- Don't lookup config file from ancestor directories  -  by [@hi-ogawa](https://github.com/hi-ogawa), **OpenAI Codex** and **Hiroshi Ogawa** in [#10428](https://github.com/vitest-dev/vitest/issues/10428) [<samp>(945d9)</samp>](https://github.com/vitest-dev/vitest/commit/945d9090e)
- Inline `@vitest/runner` package, do not publish it anymore  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10511](https://github.com/vitest-dev/vitest/issues/10511) [<samp>(6d6e4)</samp>](https://github.com/vitest-dev/vitest/commit/6d6e46b1e)
- Allow mutating happy-dom/jsdom window object  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenAI Codex** in [#10373](https://github.com/vitest-dev/vitest/issues/10373) [<samp>(206e8)</samp>](https://github.com/vitest-dev/vitest/commit/206e8cff8)
- Expose `concurrencyId`/`workerId` on TestModule's diagnostics, make id 1-based  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10516](https://github.com/vitest-dev/vitest/issues/10516) [<samp>(bdd98)</samp>](https://github.com/vitest-dev/vitest/commit/bdd985433)
- Add `screenshotDirectory` config to `browser.expect.toMatchScreenshot`  -  by [@macarie](https://github.com/macarie) in [#10592](https://github.com/vitest-dev/vitest/issues/10592) [<samp>(a60de)</samp>](https://github.com/vitest-dev/vitest/commit/a60ded0fb)
- Update `@sinonjs/fake-timers` and support mocking `Temporal`  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10654](https://github.com/vitest-dev/vitest/issues/10654) [<samp>(f8b15)</samp>](https://github.com/vitest-dev/vitest/commit/f8b1532fe)
- Remove webdriverio package  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10675](https://github.com/vitest-dev/vitest/issues/10675) [<samp>(5fed6)</samp>](https://github.com/vitest-dev/vitest/commit/5fed68f72)
- Clear mocks by default before each test  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10613](https://github.com/vitest-dev/vitest/issues/10613) [<samp>(0f646)</samp>](https://github.com/vitest-dev/vitest/commit/0f6463bf2)
- Don't emit localStorage warnings on Node 26, fail gracefully when worker fails to start  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10293](https://github.com/vitest-dev/vitest/issues/10293) [<samp>(334ed)</samp>](https://github.com/vitest-dev/vitest/commit/334edef92)
- Separate config resolution from the server creation  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10554](https://github.com/vitest-dev/vitest/issues/10554) [<samp>(1c0ec)</samp>](https://github.com/vitest-dev/vitest/commit/1c0ec3444)
- Inline projects extend the root config by default  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10750](https://github.com/vitest-dev/vitest/issues/10750) [<samp>(fec00)</samp>](https://github.com/vitest-dev/vitest/commit/fec001ad3)
- Enable mocking Temporal without fake timers  -  by [@fabon-f](https://github.com/fabon-f), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10757](https://github.com/vitest-dev/vitest/issues/10757) [<samp>(ac2d4)</samp>](https://github.com/vitest-dev/vitest/commit/ac2d46b42)
- Support nested projects  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10846](https://github.com/vitest-dev/vitest/issues/10846) [<samp>(ec367)</samp>](https://github.com/vitest-dev/vitest/commit/ec367cf2a)
- Use `>` as separator in `-t`, calculate `only` once  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10686](https://github.com/vitest-dev/vitest/issues/10686) [<samp>(a0b20)</samp>](https://github.com/vitest-dev/vitest/commit/a0b20bc86)
- Fail the test when an asynchronous assertion is not awaited  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10868](https://github.com/vitest-dev/vitest/issues/10868) [<samp>(86d4a)</samp>](https://github.com/vitest-dev/vitest/commit/86d4a9da9)
- Share the Vite server between inline projects  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10848](https://github.com/vitest-dev/vitest/issues/10848) [<samp>(d87c9)</samp>](https://github.com/vitest-dev/vitest/commit/d87c96ee4)
- Parse files statically in vitest list by default  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11088](https://github.com/vitest-dev/vitest/issues/11088) [<samp>(51e94)</samp>](https://github.com/vitest-dev/vitest/commit/51e949416)
- **benchmark**:
  - Rewrite the public API  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10113](https://github.com/vitest-dev/vitest/issues/10113) [<samp>(19f6e)</samp>](https://github.com/vitest-dev/vitest/commit/19f6e8947)
- **browser**:
  - Iframe scale  -  by [@macarie](https://github.com/macarie) in [#9745](https://github.com/vitest-dev/vitest/issues/9745) [<samp>(b6398)</samp>](https://github.com/vitest-dev/vitest/commit/b639852cc)
  - Enable `locators.exact` by default  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10430](https://github.com/vitest-dev/vitest/issues/10430) [<samp>(e2032)</samp>](https://github.com/vitest-dev/vitest/commit/e203202f9)
  - Require `sessionId` for orchestrator html request  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenAI Codex** in [#10522](https://github.com/vitest-dev/vitest/issues/10522) [<samp>(79b7d)</samp>](https://github.com/vitest-dev/vitest/commit/79b7d8fcc)
  - Save failure screenshots in `attachmentsDir`  -  by [@macarie](https://github.com/macarie) in [#10917](https://github.com/vitest-dev/vitest/issues/10917) [<samp>(3b5bb)</samp>](https://github.com/vitest-dev/vitest/commit/3b5bbd8b4)
- **coverage**:
  - `include/exclude` globs too eager  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#9818](https://github.com/vitest-dev/vitest/issues/9818) [<samp>(edacb)</samp>](https://github.com/vitest-dev/vitest/commit/edacb0fd4)
  - Allow `thresholds.perFile` to accept an object  -  by [@vladlenskiy](https://github.com/vladlenskiy) and [@AriPerkkio](https://github.com/AriPerkkio) in [#10190](https://github.com/vitest-dev/vitest/issues/10190) [<samp>(13b78)</samp>](https://github.com/vitest-dev/vitest/commit/13b78d98b)
- **expect**:
  - Fix `toThrow("")` behavior by reverting [#6710](https://github.com/vitest-dev/vitest/issues/6710)  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#9643](https://github.com/vitest-dev/vitest/issues/9643) and [#6710](https://github.com/vitest-dev/vitest/issues/6710) [<samp>(6c3e4)</samp>](https://github.com/vitest-dev/vitest/commit/6c3e4bdbf)
- **mocker**:
  - Deserialize automock as automock  -  by [@nami8824](https://github.com/nami8824) in [#10192](https://github.com/vitest-dev/vitest/issues/10192) [<samp>(2f892)</samp>](https://github.com/vitest-dev/vitest/commit/2f892712d)
- **reporters**:
  - `blob` reporter and `--merge-reports` default to `.vitest/blob/`  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#10232](https://github.com/vitest-dev/vitest/issues/10232) [<samp>(d22b0)</samp>](https://github.com/vitest-dev/vitest/commit/d22b029ae)
  - Write json and junit reporter output files to `.vitest` by default  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **OpenCode (gpt-5.6-sol)** and [@AriPerkkio](https://github.com/AriPerkkio) in [#10621](https://github.com/vitest-dev/vitest/issues/10621) [<samp>(58577)</samp>](https://github.com/vitest-dev/vitest/commit/58577290a)
- **spy**:
  - Preserve class mock prototype methods on instances  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10910](https://github.com/vitest-dev/vitest/issues/10910) [<samp>(6093d)</samp>](https://github.com/vitest-dev/vitest/commit/6093d764a)
- **types**:
  - Add better promise support in expects and matchers  -  by [@samchungy](https://github.com/samchungy) and [@sheremet-va](https://github.com/sheremet-va) in [#8266](https://github.com/vitest-dev/vitest/issues/8266) [<samp>(41f55)</samp>](https://github.com/vitest-dev/vitest/commit/41f551bce)
- **ui**:
  - Harden UI API access  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenAI Codex** in [#10583](https://github.com/vitest-dev/vitest/issues/10583) [<samp>(4c26d)</samp>](https://github.com/vitest-dev/vitest/commit/4c26d7675)
  - Change html reporter default output to `.vitest`  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **Hiroshi Ogawa** in [#10620](https://github.com/vitest-dev/vitest/issues/10620) [<samp>(29c36)</samp>](https://github.com/vitest-dev/vitest/commit/29c364d50)

#####    🚀 Features

- Add `createReport` and `.vitest` report directory convention  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#9993](https://github.com/vitest-dev/vitest/issues/9993) [<samp>(72a6d)</samp>](https://github.com/vitest-dev/vitest/commit/72a6dc257)
- Expose default reporters through `configDefaults.reporters`  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **Claude Opus 5 (1M context)** in [#10219](https://github.com/vitest-dev/vitest/issues/10219) [<samp>(083f6)</samp>](https://github.com/vitest-dev/vitest/commit/083f6bdd6)
- Support merge reports for non-sharded multi-environment runs (take 2)  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Claude Opus 5 (1M context)**, **OpenAI Codex** and [@AriPerkkio](https://github.com/AriPerkkio) in [#10031](https://github.com/vitest-dev/vitest/issues/10031) [<samp>(e60b2)</samp>](https://github.com/vitest-dev/vitest/commit/e60b2f49e)
- Add `logger.formatError`  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10268](https://github.com/vitest-dev/vitest/issues/10268) [<samp>(2c5f3)</samp>](https://github.com/vitest-dev/vitest/commit/2c5f3ee2f)
- Support typescript build mode  -  by [@lishaduck](https://github.com/lishaduck) in [#9870](https://github.com/vitest-dev/vitest/issues/9870) [<samp>(106da)</samp>](https://github.com/vitest-dev/vitest/commit/106da5896)
- Add toggable `injectCjsGlobals` option  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10709](https://github.com/vitest-dev/vitest/issues/10709) [<samp>(82671)</samp>](https://github.com/vitest-dev/vitest/commit/826714ece)
- Promote fsModuleCache to a top-level option  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10734](https://github.com/vitest-dev/vitest/issues/10734) [<samp>(78ed7)</samp>](https://github.com/vitest-dev/vitest/commit/78ed73afd)
- Support non-ascii characters in `for/each` title placeholders  -  by [@k-yle](https://github.com/k-yle) in [#10773](https://github.com/vitest-dev/vitest/issues/10773) [<samp>(15e0a)</samp>](https://github.com/vitest-dev/vitest/commit/15e0af953)
- Report the duration breakdown as percentages  -  by [@sheremet-va](https://github.com/sheremet-va) and [@AriPerkkio](https://github.com/AriPerkkio) in [#10820](https://github.com/vitest-dev/vitest/issues/10820) [<samp>(c67d2)</samp>](https://github.com/vitest-dev/vitest/commit/c67d296f4)
- Promote parseSpecifications out of experimental  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11087](https://github.com/vitest-dev/vitest/issues/11087) [<samp>(b628c)</samp>](https://github.com/vitest-dev/vitest/commit/b628cb680)
- Promote clearCache out of experimental  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11086](https://github.com/vitest-dev/vitest/issues/11086) [<samp>(d4fe1)</samp>](https://github.com/vitest-dev/vitest/commit/d4fe1986f)
- **api**:
  - Expose logs recorded during the test  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10277](https://github.com/vitest-dev/vitest/issues/10277) [<samp>(cba20)</samp>](https://github.com/vitest-dev/vitest/commit/cba2036a1)
- **benchmark**:
  - Add pluggable benchmark provider API  -  by [@GuillaumeLagrange](https://github.com/GuillaumeLagrange) and [@sheremet-va](https://github.com/sheremet-va) in [#10799](https://github.com/vitest-dev/vitest/issues/10799) [<samp>(86c70)</samp>](https://github.com/vitest-dev/vitest/commit/86c700ed8)
- **browser**:
  - Export aria tree utils  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10171](https://github.com/vitest-dev/vitest/issues/10171) [<samp>(c3423)</samp>](https://github.com/vitest-dev/vitest/commit/c3423014c)
  - Support dom snapshot trace view  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Claude Opus 5 (1M context)** and **OpenAI Codex** in [#10102](https://github.com/vitest-dev/vitest/issues/10102) [<samp>(7eddd)</samp>](https://github.com/vitest-dev/vitest/commit/7eddd273d)
  - Provide project reference in `ToMatchScreenshotResolvePath`  -  by [@macarie](https://github.com/macarie) and [@sheremet-va](https://github.com/sheremet-va) in [#10138](https://github.com/vitest-dev/vitest/issues/10138) [<samp>(16654)</samp>](https://github.com/vitest-dev/vitest/commit/166544e39)
  - Show aria tree on locator element error  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10257](https://github.com/vitest-dev/vitest/issues/10257) [<samp>(04f04)</samp>](https://github.com/vitest-dev/vitest/commit/04f04cdd1)
  - Support custom `kind` in `page.mark`  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#10302](https://github.com/vitest-dev/vitest/issues/10302) [<samp>(053e8)</samp>](https://github.com/vitest-dev/vitest/commit/053e8b0d1)
  - Live update trace view on watch UI  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10296](https://github.com/vitest-dev/vitest/issues/10296) [<samp>(78c11)</samp>](https://github.com/vitest-dev/vitest/commit/78c1169cf)
  - Add `context.mark` for custom command tracing  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#10329](https://github.com/vitest-dev/vitest/issues/10329) [<samp>(aa514)</samp>](https://github.com/vitest-dev/vitest/commit/aa5140e76)
  - Show trace view steps in editor panel  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10404](https://github.com/vitest-dev/vitest/issues/10404) [<samp>(8c4b6)</samp>](https://github.com/vitest-dev/vitest/commit/8c4b6da02)
  - Display nested mark trace in UI  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenAI Codex** in [#10437](https://github.com/vitest-dev/vitest/issues/10437) [<samp>(86ffc)</samp>](https://github.com/vitest-dev/vitest/commit/86ffc8ac6)
- **cli**:
  - Add `--repeats` CLI option  -  by [@todor-a](https://github.com/todor-a) in [#10504](https://github.com/vitest-dev/vitest/issues/10504) [<samp>(ee48b)</samp>](https://github.com/vitest-dev/vitest/commit/ee48b959e)
  - Support -p shorthand for --project  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10826](https://github.com/vitest-dev/vitest/issues/10826) [<samp>(1addd)</samp>](https://github.com/vitest-dev/vitest/commit/1adddde12)
- **coverage**:
  - V8 to track `node:child_process` and `node:worker_threads` contexts  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#9976](https://github.com/vitest-dev/vitest/issues/9976) [<samp>(9baa5)</samp>](https://github.com/vitest-dev/vitest/commit/9baa5faba)
  - `thresholds.autoUpdate` to receive previous threshold as argument  -  by [@wouterkroes](https://github.com/wouterkroes) in [#10495](https://github.com/vitest-dev/vitest/issues/10495) [<samp>(04f81)</samp>](https://github.com/vitest-dev/vitest/commit/04f81854f)
  - Switch to `@vitest/istanbuljs` packages  -  by [@AriPerkkio](https://github.com/AriPerkkio) in [#11053](https://github.com/vitest-dev/vitest/issues/11053) [<samp>(5f6a5)</samp>](https://github.com/vitest-dev/vitest/commit/5f6a5e84a)
- **junit-reporter**:
  - Add jest-junit-compatible naming options  -  by [@neumaennl](https://github.com/neumaennl), **neumaennl**, **Martin Neumann** and **Copilot** in [#10189](https://github.com/vitest-dev/vitest/issues/10189) [<samp>(27393)</samp>](https://github.com/vitest-dev/vitest/commit/273933440)
- **reporter**:
  - Support html reporter single file output  -  by [@hi-ogawa](https://github.com/hi-ogawa), **OpenAI Codex** and **Claude Opus 5 (1M context)** in [#10235](https://github.com/vitest-dev/vitest/issues/10235) [<samp>(f757e)</samp>](https://github.com/vitest-dev/vitest/commit/f757ec5e6)
  - Add custom GitHub Actions summary title  -  by [@heyJonBray](https://github.com/heyJonBray) and [@macarie](https://github.com/macarie) in [#10891](https://github.com/vitest-dev/vitest/issues/10891) [<samp>(4363c)</samp>](https://github.com/vitest-dev/vitest/commit/4363cdb49)
- **ui**:
  - Highlight editor source locations  -  by [@sheremet-va](https://github.com/sheremet-va), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11004](https://github.com/vitest-dev/vitest/issues/11004) [<samp>(bce2d)</samp>](https://github.com/vitest-dev/vitest/commit/bce2d3c2f)
  - Navigate trace steps with keyboard and remove indirect editor focus  -  by [@sheremet-va](https://github.com/sheremet-va), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11005](https://github.com/vitest-dev/vitest/issues/11005) [<samp>(6816f)</samp>](https://github.com/vitest-dev/vitest/commit/6816f3b17)
  - Persist trace view selection in URL  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10981](https://github.com/vitest-dev/vitest/issues/10981) [<samp>(3069e)</samp>](https://github.com/vitest-dev/vitest/commit/3069e5927)
  - Toggle trace target highlight  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11049](https://github.com/vitest-dev/vitest/issues/11049) [<samp>(cd63e)</samp>](https://github.com/vitest-dev/vitest/commit/cd63e9e43)
  - Add link to open playwright trace  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11059](https://github.com/vitest-dev/vitest/issues/11059) [<samp>(58f02)</samp>](https://github.com/vitest-dev/vitest/commit/58f02ae36)
- **vitest**:
  - Create `vi.when()`  -  by [@macarie](https://github.com/macarie) in [#10174](https://github.com/vitest-dev/vitest/issues/10174) [<samp>(3900e)</samp>](https://github.com/vitest-dev/vitest/commit/3900e6349)
- **vm**:
  - Support `require(esm)` in vm pools  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10829](https://github.com/vitest-dev/vitest/issues/10829) [<samp>(01298)</samp>](https://github.com/vitest-dev/vitest/commit/01298e5b3)

#####    🐞 Bug Fixes

- Global `sequence.concurrent: true` with top-level `test(..., { concurrent: false })` + depreacte `sequential` test API and options  -  by [@hi-ogawa](https://github.com/hi-ogawa), **OpenAI Codex** and [@sheremet-va](https://github.com/sheremet-va) in [#10194](https://github.com/vitest-dev/vitest/issues/10194) [<samp>(9387f)</samp>](https://github.com/vitest-dev/vitest/commit/9387f57cf)
- Test `tags` options should overwrite inherited suite options + inherit suite options in `task` API  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10216](https://github.com/vitest-dev/vitest/issues/10216) [<samp>(457db)</samp>](https://github.com/vitest-dev/vitest/commit/457db297b)
- Udpate optimize deps config  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10223](https://github.com/vitest-dev/vitest/issues/10223) [<samp>(95dc6)</samp>](https://github.com/vitest-dev/vitest/commit/95dc6e3f1)
- Shell injection safety via github.ref_name in publish workflow  -  by [@lloyd-c137](https://github.com/lloyd-c137) and **lloyd-c137** in [#10327](https://github.com/vitest-dev/vitest/issues/10327) [<samp>(dd020)</samp>](https://github.com/vitest-dev/vitest/commit/dd0207f4d)
- Make `attachmentsDir` root only config  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10334](https://github.com/vitest-dev/vitest/issues/10334) [<samp>(fab1b)</samp>](https://github.com/vitest-dev/vitest/commit/fab1b6020)
- Apply cjs interop for truthy `__esModule`  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10363](https://github.com/vitest-dev/vitest/issues/10363) [<samp>(2b135)</samp>](https://github.com/vitest-dev/vitest/commit/2b13547a5)
- Preserve `vi.defineHelper` callsite for async error stack  -  by [@macayu17](https://github.com/macayu17) and [@hi-ogawa](https://github.com/hi-ogawa) in [#10415](https://github.com/vitest-dev/vitest/issues/10415) [<samp>(ac697)</samp>](https://github.com/vitest-dev/vitest/commit/ac6971ca2)
- Respect `disableConsoleIntercept` in browser mode  -  by [@Copilot](https://github.com/Copilot), **Hiroshi Ogawa**, [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10391](https://github.com/vitest-dev/vitest/issues/10391) [<samp>(66110)</samp>](https://github.com/vitest-dev/vitest/commit/66110d271)
- ForceRerunTriggers uses directory globs against files  -  by [@Patrick-Clausen](https://github.com/Patrick-Clausen) and **Patrick Clausen** in [#10421](https://github.com/vitest-dev/vitest/issues/10421) and [#10420](https://github.com/vitest-dev/vitest/issues/10420) [<samp>(4fee2)</samp>](https://github.com/vitest-dev/vitest/commit/4fee2e303)
- Unify typechecking and ast collection  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10449](https://github.com/vitest-dev/vitest/issues/10449) [<samp>(af993)</samp>](https://github.com/vitest-dev/vitest/commit/af993b66b)
- Don't print typecheck warning more than once  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10461](https://github.com/vitest-dev/vitest/issues/10461) [<samp>(15275)</samp>](https://github.com/vitest-dev/vitest/commit/152750ec0)
- Correct collumn when parsing tests  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10467](https://github.com/vitest-dev/vitest/issues/10467) [<samp>(7c2fc)</samp>](https://github.com/vitest-dev/vitest/commit/7c2fc133e)
- Fix mixed stdout/stderr log timestamps in `onUserConsoleLog`  -  by [@Copilot](https://github.com/Copilot), **Hiroshi Ogawa**, [@hi-ogawa](https://github.com/hi-ogawa) and [@sheremet-va](https://github.com/sheremet-va) in [#10308](https://github.com/vitest-dev/vitest/issues/10308) [<samp>(62756)</samp>](https://github.com/vitest-dev/vitest/commit/627565475)
- Fix `importOriginal` with optimizer and query import  -  by [@davidxharris](https://github.com/davidxharris), **David Harris**, [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenAI Codex** in [#10469](https://github.com/vitest-dev/vitest/issues/10469) [<samp>(6a3bb)</samp>](https://github.com/vitest-dev/vitest/commit/6a3bb02e0)
- Correct transform time calculation in merged report  -  by [@potatomatoooo](https://github.com/potatomatoooo) and [@hi-ogawa](https://github.com/hi-ogawa) in [#10570](https://github.com/vitest-dev/vitest/issues/10570) and [#10578](https://github.com/vitest-dev/vitest/issues/10578) [<samp>(b7897)</samp>](https://github.com/vitest-dev/vitest/commit/b78972892)
- Fix `setImmediate` await in detect-async-leak  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **Hiroshi Ogawa** in [#10608](https://github.com/vitest-dev/vitest/issues/10608) [<samp>(dd62b)</samp>](https://github.com/vitest-dev/vitest/commit/dd62b84e0)
- Fix per-project `sequence` config  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10659](https://github.com/vitest-dev/vitest/issues/10659) [<samp>(40cdc)</samp>](https://github.com/vitest-dev/vitest/commit/40cdc7fd6)
- Add handshake timeout to iframe communication  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10656](https://github.com/vitest-dev/vitest/issues/10656) [<samp>(3545f)</samp>](https://github.com/vitest-dev/vitest/commit/3545fe78f)
- Don't print column in test names when `includeTaskLocation` is enabled  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10681](https://github.com/vitest-dev/vitest/issues/10681) [<samp>(bd9cc)</samp>](https://github.com/vitest-dev/vitest/commit/bd9cc9d8d)
- Disable server HMR before plugins read it in their config hook  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10731](https://github.com/vitest-dev/vitest/issues/10731) [<samp>(e060b)</samp>](https://github.com/vitest-dev/vitest/commit/e060b8fa9)
- Close the pool before the Vite servers  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10725](https://github.com/vitest-dev/vitest/issues/10725) [<samp>(96fa6)</samp>](https://github.com/vitest-dev/vitest/commit/96fa6d73d)
- Remove listeners in the typecheck worker's `off`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10741](https://github.com/vitest-dev/vitest/issues/10741) [<samp>(d758b)</samp>](https://github.com/vitest-dev/vitest/commit/d758b4755)
- Keep per-file isolation in vm pools when maxWorkers is 1  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10743](https://github.com/vitest-dev/vitest/issues/10743) [<samp>(83ab9)</samp>](https://github.com/vitest-dev/vitest/commit/83ab9a44f)
- Node.js 20 deprecation warning for `ci.yml`  -  by [@hirehamir](https://github.com/hirehamir) in [#10759](https://github.com/vitest-dev/vitest/issues/10759) [<samp>(2127f)</samp>](https://github.com/vitest-dev/vitest/commit/2127fa6ce)
- Prevent node builtins double prefix  -  by [@malobre](https://github.com/malobre) in [#10630](https://github.com/vitest-dev/vitest/issues/10630) and [#10767](https://github.com/vitest-dev/vitest/issues/10767) [<samp>(22d35)</samp>](https://github.com/vitest-dev/vitest/commit/22d353a80)
- Set non-zero exit code when teardown throws during close  -  by [@zakcutner](https://github.com/zakcutner) and [@AriPerkkio](https://github.com/AriPerkkio) in [#10794](https://github.com/vitest-dev/vitest/issues/10794) [<samp>(22116)</samp>](https://github.com/vitest-dev/vitest/commit/22116feb7)
- Don't race the typechecker spawn grace period on windows  -  by [@xevrion](https://github.com/xevrion) in [#10814](https://github.com/vitest-dev/vitest/issues/10814) [<samp>(b19e5)</samp>](https://github.com/vitest-dev/vitest/commit/b19e5ece9)
- Coalesce concurrent watch-mode restarts, deflake the pool stderr fixture  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10822](https://github.com/vitest-dev/vitest/issues/10822) [<samp>(a31f8)</samp>](https://github.com/vitest-dev/vitest/commit/a31f86af7)
- Prevent `vitest --typecheck` from reporting a false success when the `tsc` process crashes  -  by [@hitenkalda](https://github.com/hitenkalda) and **Hiten Kalda** in [#10705](https://github.com/vitest-dev/vitest/issues/10705) [<samp>(a1b05)</samp>](https://github.com/vitest-dev/vitest/commit/a1b0565c9)
- Collect in-source tests when the module is cached  -  by [@koutaro-masaki](https://github.com/koutaro-masaki) in [#10577](https://github.com/vitest-dev/vitest/issues/10577) and [#10589](https://github.com/vitest-dev/vitest/issues/10589) [<samp>(a7bf2)</samp>](https://github.com/vitest-dev/vitest/commit/a7bf2b2c8)
- Swap replace() arguments so timeout error stack shows the real message  -  by [@lazerg](https://github.com/lazerg) in [#10875](https://github.com/vitest-dev/vitest/issues/10875) [<samp>(aba0f)</samp>](https://github.com/vitest-dev/vitest/commit/aba0f9b7b)
- Stale mock metadata breaks automocking with isolate:false  -  by [@kade-robertson](https://github.com/kade-robertson) in [#10145](https://github.com/vitest-dev/vitest/issues/10145) and [#10541](https://github.com/vitest-dev/vitest/issues/10541) [<samp>(8e210)</samp>](https://github.com/vitest-dev/vitest/commit/8e2108dda)
- Don't lose worker output on teardown, deflake timing-sensitive tests  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10842](https://github.com/vitest-dev/vitest/issues/10842) [<samp>(1216b)</samp>](https://github.com/vitest-dev/vitest/commit/1216b5af9)
- Revive global concurrency limit for test lifecycle  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa**, **OpenCode (gpt-5.6-sol)** and [@sheremet-va](https://github.com/sheremet-va) in [#10928](https://github.com/vitest-dev/vitest/issues/10928) [<samp>(cf917)</samp>](https://github.com/vitest-dev/vitest/commit/cf9176bfc)
- Own the post-restart rerun, keep `process.exit` disabled in workers  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10963](https://github.com/vitest-dev/vitest/issues/10963) [<samp>(5e69a)</samp>](https://github.com/vitest-dev/vitest/commit/5e69aba65)
- Preserve correct root during resolve config  -  by [@AriPerkkio](https://github.com/AriPerkkio) and [@sheremet-va](https://github.com/sheremet-va) in [#10909](https://github.com/vitest-dev/vitest/issues/10909) [<samp>(210ba)</samp>](https://github.com/vitest-dev/vitest/commit/210ba00cb)
- Combine multiple --project filters correctly  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10988](https://github.com/vitest-dev/vitest/issues/10988) [<samp>(66c1c)</samp>](https://github.com/vitest-dev/vitest/commit/66c1cbb53)
- Fix `recordArtifact` location with `vi.defineHelper`  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#11047](https://github.com/vitest-dev/vitest/issues/11047) [<samp>(c2186)</samp>](https://github.com/vitest-dev/vitest/commit/c21865dfd)
- Invalidate resolved setup files  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11073](https://github.com/vitest-dev/vitest/issues/11073) and [#11081](https://github.com/vitest-dev/vitest/issues/11081) [<samp>(488c0)</samp>](https://github.com/vitest-dev/vitest/commit/488c04680)
- Accept awaited value in vi.when thenResolve  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11084](https://github.com/vitest-dev/vitest/issues/11084) [<samp>(c10a1)</samp>](https://github.com/vitest-dev/vitest/commit/c10a12900)
- Ignore computed member calls in static collection  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11085](https://github.com/vitest-dev/vitest/issues/11085) [<samp>(130f7)</samp>](https://github.com/vitest-dev/vitest/commit/130f79b8b)
- Don't duplicte `oxc.target` if user provides a custom array  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11095](https://github.com/vitest-dev/vitest/issues/11095) [<samp>(848d7)</samp>](https://github.com/vitest-dev/vitest/commit/848d7243e)
- Propagate --maxWorkers to projects  -  by [@Gaurav1112](https://github.com/Gaurav1112) in [#11102](https://github.com/vitest-dev/vitest/issues/11102) [<samp>(2122f)</samp>](https://github.com/vitest-dev/vitest/commit/2122ffdfb)
- Apply queued mocks from doMock() in queue order  -  by [@juliandescottes](https://github.com/juliandescottes) and **Claude Opus 5 (1M context)** in [#10706](https://github.com/vitest-dev/vitest/issues/10706) and [#11127](https://github.com/vitest-dev/vitest/issues/11127) [<samp>(f08ce)</samp>](https://github.com/vitest-dev/vitest/commit/f08ce4b71)
- Add a warning if inline project has duplicate plugins due to unexpected `extends: true`  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11120](https://github.com/vitest-dev/vitest/issues/11120) [<samp>(584cf)</samp>](https://github.com/vitest-dev/vitest/commit/584cf3084)
- Treat test.describe as a suite during static collection  -  by [@sheremet-va](https://github.com/sheremet-va) in [#11128](https://github.com/vitest-dev/vitest/issues/11128) [<samp>(d46a7)</samp>](https://github.com/vitest-dev/vitest/commit/d46a74722)
- **browser**:
  - Fix trace highlight of shadow dom on webdriverio  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10227](https://github.com/vitest-dev/vitest/issues/10227) [<samp>(b01af)</samp>](https://github.com/vitest-dev/vitest/commit/b01afd26c)
  - Simplify orchestrator otel carrier  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10283](https://github.com/vitest-dev/vitest/issues/10283) [<samp>(3514f)</samp>](https://github.com/vitest-dev/vitest/commit/3514f9fa1)
  - Remove orphaned Playwright route when same module is mocked via multiple ids  -  by [@Zelys-DFKH](https://github.com/Zelys-DFKH) in [#9957](https://github.com/vitest-dev/vitest/issues/9957) and [#10267](https://github.com/vitest-dev/vitest/issues/10267) [<samp>(41db6)</samp>](https://github.com/vitest-dev/vitest/commit/41db6ce28)
  - Skip `wrapDynamicImport` transform on ssr environment  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10355](https://github.com/vitest-dev/vitest/issues/10355) [<samp>(d3c96)</samp>](https://github.com/vitest-dev/vitest/commit/d3c964bfc)
  - Fix stale source map on watch mode  -  by [@hi-ogawa](https://github.com/hi-ogawa) in [#10389](https://github.com/vitest-dev/vitest/issues/10389) [<samp>(6d772)</samp>](https://github.com/vitest-dev/vitest/commit/6d772c800)
  - Escape inline orchestrator scripts  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10412](https://github.com/vitest-dev/vitest/issues/10412) [<samp>(c22cf)</samp>](https://github.com/vitest-dev/vitest/commit/c22cfb656)
  - Disable client `cdp` API when `allowWrite/allowExec: false`  -  by [@hi-ogawa](https://github.com/hi-ogawa) and **OpenAI Codex** in [#10444](https://github.com/vitest-dev/vitest/issues/10444) [<samp>(63e3b)</samp>](https://github.com/vitest-dev/vitest/commit/63e3b2eee)
  - Wait for orchestrator readiness before resolving browser sessions  -  by [@soconnor-seeq](https://github.com/soconnor-seeq) in [#10397](https://github.com/vitest-dev/vitest/issues/10397) [<samp>(fe5ed)</samp>](https://github.com/vitest-dev/vitest/commit/fe5ed6bc7)
  - Wait for iframe tester readiness before preparing  -  by [@soconnor-seeq](https://github.com/soconnor-seeq) in [#10497](https://github.com/vitest-dev/vitest/issues/10497) [<samp>(f2655)</samp>](https://github.com/vitest-dev/vitest/commit/f26552c63)
  - Encode iframeId in tester iframe URL  -  by [@Pduhard](https://github.com/Pduhard), **Pduhard** and **Claude Opus 5 (1M context)** in [#10520](https://github.com/vitest-dev/vitest/issues/10520) and [#10521](https://github.com/vitest-dev/vitest/issues/10521) [<samp>(c8bf1)</samp>](https://github.com/vitest-dev/vitest/commit/c8bf19f66)
  - Always derive a positive locator action timeout  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10626](https://github.com/vitest-dev/vitest/issues/10626) [<samp>(5b864)</samp>](https://github.com/vitest-dev/vitest/commit/5b8642120)
  - Resize the browser ui only if it's not headless  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10662](https://github.com/vitest-dev/vitest/issues/10662) [<samp>(b5c61)</samp>](https://github.com/vitest-dev/vitest/commit/b5c613051)
  - Check fs access in builtin commands  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10674](https://github.com/vitest-dev/vitest/issues/10674) [<samp>(33f96)</samp>](https://github.com/vitest-dev/vitest/commit/33f96a145)
  - Preserve pre-transform request defaults  -  by [@sheremet-va](https://github.com/sheremet-va) in [#10748](https://github.com/vitest-dev/vitest/issues/10748) [<samp>(b6060)</samp>](https://github.com/vitest-dev/vitest/commit/b60605ca7)
  - Fix error stacktrace location off-by-one  -  by [@hi-ogawa](https://github.com/hi-ogawa), **Hiroshi Ogawa** and **OpenCode (gpt-5.6-sol)** in [#10724](https://github.com/vitest-dev/vitest/issues/10724) [<samp>(62b8d)</samp>](https://github.com/vitest-dev/vitest/commit/62b8d3b36)
  - Inlined awaited import should not trigger syntax error after transform  -  by [@smeng9](https://github.com/smeng9), **Shaoyu Meng** and **Claude Opus 5 (1M context)** in [#10784](https://github.com/vitest-dev/vite…
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants