npm / vitest
vitest
What changed in vitest 4 to 5, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.
67 breaking4 security10 deprecations119 new APIs and options8 performance87 behavior and defaults22 tooling219 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initvitest 5200 changes
Breaking changes 35
Browser instances now run as workers, changing resource usage and maxWorkers behavior.
Runs now fail when git or location filters report errors.
Reset operations now affect only spies that were called or reconfigured.
vitest list now exits with status 1 when collection fails.
Tests fail when asynchronous assertions are not awaited.
The default attachments directory changes to .vitest/attachments/.
attachmentsDir is now restricted to root configuration.
The public benchmark API is rewritten.
The client cdp API is disabled when allowWrite or allowExec is false.
Mocks are cleared before each test by default.
Vitest no longer searches ancestor directories for a configuration file.
Coverage reports and all UI subtree requests now require authentication.
coverage.exclude no longer inherits negation globs from test.include.
Concurrent runs now fail fast when reportsDirectory conflicts.
Deprecated package entry points are no longer available.
expect.poll now fails when its function does not resolve within the allowed time.
Filter-only options are no longer allowed in getBy* locators.
Hoistable methods must be inside the top-level scope or an error is thrown.
The HTML reporter default output changes to .vitest.
Coverage include and exclude globs no longer match too eagerly.
JSON and JUnit reporter output files are written to .vitest by default.
Locators are represented as objects instead of strings.
Browser locator exact matching is enabled by default.
Vitest now requires Node.js 22 and Vite 6.4.
The sequential test and suite options are removed in favor of concurrent.
The orchestrator HTML request now requires sessionId.
The broken ./src/* package export has been removed.
The -t test-name separator changes to >.
Vitest now exits non-zero when teardown throws during close.
Snapshot assertions used with test.fails now fail the test.
String values in title $ variables no longer include quotes.
toHaveTextContent becomes strict; toMatchTextContent provides the alternative matcher.
Using the same snapshot file for toMatchFileSnapshot and toMatchSnapshot is now rejected.
@vitest/runner is inlined and is no longer published.
The webdriverio package is removed.
Security 1
Snapshot files are evaluated on the server to support no-unsafe-eval CSP.
Deprecations 2
Vitest warns when the deprecated deps.optimizer.web configuration is used.
The sequential test API and options are deprecated.
New APIs and options 29
The import.meta.hot stub now includes data.
Adds an option to cache dependencies instead of statically parsing them.
Adds an experimental option for configuring the UI theme.
The UI adds a focused trace view layout mode.
Benchmarks support pluggable providers.
The changed option is now allowed in configuration options.
TestModule diagnostics expose concurrencyId and workerId, with IDs becoming 1-based.
Default reporters are exposed through configDefaults.reporters.
context.mark enables custom command tracing.
createReport is added, along with the .vitest report directory convention.
fsModuleCache is promoted to a top-level option.
The GitHub Actions summary title can be customized.
Headless Chrome sessions can use GPU acceleration.
The HTML reporter supports single-file output.
A toggleable injectCjsGlobals option is available.
logger.formatError is added for formatting errors.
Custom environments can opt out of module graph prewarming.
Projects can now be nested.
-p becomes shorthand for --project.
page.mark supports a custom kind.
Spy types now support private methods.
The CLI gains a --repeats option.
browser.expect.toMatchScreenshot accepts screenshotDirectory.
Temporal can be mocked, including without enabling fake timers.
thresholds.autoUpdate receives the previous threshold as an argument.
ToMatchScreenshotResolvePath receives a project reference.
Fake timers now support the toNotFake option.
TypeScript build mode is supported.
vi.when() is added.
Performance 2
Using --changed on a large graph now uses less peak memory.
V8 coverage report generation is faster through bounded-memory merging and precompiled globs.
Behavior and default changes 38
Cancelling a test run now aborts all running tests.
The changed-test run reports how many tests were affected and the total count.
Changed-test detection now tracks project files and mocks.
fsModuleCache is enabled by default.
pretty-format now supports boxed symbols.
toHaveTextContent can now be used without arguments.
The trace attempts selector moved to the viewer header.
The blob reporter and --merge-reports default to .vitest/blob/.
Browser sessions open adaptively instead of allocating maxWorkers upfront.
clearCache is promoted out of experimental status.
Browser connectTimeout is now resolved from project configuration.
Duration breakdowns are reported as percentages.
FORCE_COLOR now takes precedence over agent detection.
Framework assets are now served as immutable resources.
Framework sourcemaps are no longer served during headless runs.
The GitHub Actions reporter summary header now displays test.name.
Editor panel inline errors now render ANSI color codes.
Inline projects extend the root configuration by default.
The maxWorkers setting is now propagated to projects.
Merge reports is supported for non-sharded multi-environment runs.
The Node compile cache is opt-in, and worker caches persist during teardown.
parseSpecifications is promoted out of experimental status.
Expects and matchers provide better promise support.
vm pools support require(esm).
Static reports no longer display the running count.
A top-level test with concurrent false now overrides global sequence.concurrent true.
An empty string is now treated as a valid snapshot.
The summary reporter now intercepts logger streams even when they are not process standard streams.
Tasks now inherit suite options.
Logs recorded during a test are exposed.
test.describe is now treated as a suite during static collection.
thresholds.perFile accepts an object.
toBeOneOf now accepts readonly arrays and sets.
Trace step-iframe split pane sizes are now persisted.
vi.mock() is now hoisted for vite-plus/test imports.
thenResolve now accepts an awaited value.
vitest list parses files statically by default.
happy-dom and jsdom window objects can be mutated.
Tooling 7
Mocks from finished test files are released.
Cache directories are tagged with CACHEDIR.TAG so tools can recognize them.
Browser failure screenshots are saved in attachmentsDir.
Suite interaction and layout in the explorer tree were improved.
loupe.inspect is replaced with pretty-format.
The UI now provides a report view at suite level.
Coverage switches to @vitest/istanbuljs packages.
Fixes and other changes 86
Late connections from closed browser sessions are dropped.
Vitest waits 30 seconds for the browser to close.
Browser plugins' buildStart hooks run when the server is created.
The changed-file filter now handles quoted file names correctly.
Reporter output uses the end reason 'failed' when a worker crashes.
Vite's default fs.deny setting is preserved when an API token file is present.
Global setup runs once when browser instances are used.
Hook cleanup functions now run when a later hook fails.
Synthetic pagehide events are ignored in browser tests.
skipIf sets skip and ignores undefined options.
allowExternal now includes uncovered files correctly in coverage.
Browser API options are applied even when no browser configuration is provided.
Browser command arguments preserve undefined values.
Coverage no longer incorrectly marks filenames containing brackets as uncovered.
Module mocks are wrapped correctly during in-source testing.
JUnit output strips ANSI sequences from all XML attributes.
Deep equality for Map and Set is corrected in some assertions.
vm execution now binds this to module.exports.
Edge cases in native loader mocking are fixed.
Node builtins are resolved correctly in client environments.
Project configurations now respect the configured root.
Setup mocks are awaited before the test file is imported.
Snapshot handling now accounts for line endings.
A zero truncation setting now preserves full dollar-prefixed string values.
Blob is supported when using jsdom 30.1.
Configuration for environments consumed by the browser is preserved.
The browser server waits to listen until tests start running.
Cache key generators are scoped to individual projects.
Imports of cached modules are revalidated.
expect.extend asymmetric matchers now receive the current equality testers.
Dependencies referenced from index.html are no longer optimized in VM mode.
Browser mode no longer prints an interceptor warning.
Browser mock path matching now checks path boundaries.
Page crashes during cancellation are ignored.
Unique pool IDs are preserved when groupOrder is set.
Each repeats run now isolates result.status from other runs.
The split-pane handle no longer overlaps the iframe in the UI.
Expected failures marked with test.fails are no longer retried.
Retried screenshot tests now use the correct reference image.
The agent reporter now respects the --silent command-line option.
The UI authentication cookie now persists beyond the current browser session.
Concurrent createReport calls are now handled correctly by reporters.
Async leak detection now ignores process.stdio handles.
Vitest now binds process correctly when the global process value has been overwritten.
Request now handles Blob bodies correctly when using jsdom 28 or newer.
Spying on Set.prototype.add no longer causes a stack overflow.
toMatchObject now works correctly with asymmetric matchers.
Automocking avoids creating recursive prototypes.
Clearing the cache now preserves the metadata file.
Browser mode avoids inserting double quotes in config.define values.
The doctor command now measures VM pools for custom environments.
deepMerge now handles prototypes correctly.
The UI now shows the correct explorer file summary count.
toNotFake now forces queueMicrotask and nextTick behavior.
UI suite collapse and expansion now works with file name search.
Obsolete snapshot keys are reported next to skipped tests.
Public type declarations are now self-contained.
ResolvedConfig no longer produces exactOptionalPropertyTypes errors.
Configurations using self-referencing extends now share the server.
Static collection preserves parse error details for better failure diagnosis.
toMatchAriaSnapshot now returns the correct value.
Vitest prevents false import resolution results.
Class mock prototype methods are preserved on instances.
CTRL+c now exits even when globalSetup runs blocked code.
describe.for now propagates chainable flags.
Browser mode now respects disableConsoleIntercept.
Queued mocks from doMock() are now applied in queue order.
Non-Error causes from environment setup now render instead of dropping the actual diagnostic.
The explorer virtual scroller is revealed correctly after resizing.
External module resolution now handles encoded URIs with the deps optimizer query.
for/each title placeholders support non-ASCII characters.
Directory globs in forceRerunTriggers are now applied against files.
The global concurrency limit now applies to test lifecycle operations.
importOriginal now works with the optimizer and query imports.
Non-serializable functions are stripped from inline diff configuration.
JUnit XML reports now include unhandled errors.
Vitest no longer crashes when processing a malformed inline source map.
Vitest falls back to compiling from source when a module's code cache is rejected.
Mixed stdout and stderr logs now receive correct timestamps.
Vitest no longer duplicates oxc.target when a custom array is provided.
Per-project sequence configuration is now handled correctly.
Test tags options now overwrite inherited suite options.
toHaveProperty now handles nullish values correctly.
The command no longer reports false success when the tsc process crashes.
Watch-run UI state now stays synchronized when files are removed.
Worker startup failures now fail gracefully, and Node 26 localStorage warnings are suppressed.
vitest 4336 changes
Breaking changes 32
Redirect mocks are restricted to paths permitted by the filesystem allowlist.
Removes JestExtendError.context from verbose error reporting.
setupFiles is no longer resolved from a parent directory.
Removes support for the Vite 8 beta, affecting projects relying on that prerelease.
Calling a suite function inside a test is now rejected.
collect is renamed to import and is no longer the supported name.
import replaces collect as the supported name.
prepare is removed.
getBuiltins no longer returns Node builtins unconditionally.
The ast export was removed.
The basic reporter was removed.
In-source tests run only when the containing file is itself a test file.
Deprecated coverage options were removed in favor of vitest/node exports.
coverage.exclude now keeps only string values.
Setting the test environment to browser is forbidden.
The deprecated environmentMatchGlobs option was removed.
ErrorWithDiff was removed in favor of TestError.
Vitest now uses ES2022 language features, which may affect runtime compatibility for projects running Vitest.
The deprecated getSourceMap API was removed.
minWorkers was removed and is automatically set to 0 outside watch mode.
The engines field no longer supports Node 18.
Node types were removed from the main entry point; import them from vitest/node instead.
Tests fail on CI when snapshots are obsolete.
The deprecated order parameter was removed from the test API.
The deprecated poolMatchGlobs option was removed.
Project configuration files are limited to names containing vitest.config or vite.config.
Browser mode now requires a provider factory instead of a provider string.
Calling useFakeTimers multiple times now overrides the existing fake timers.
UserConfig was removed; ViteUserConfig should be used instead.
Vitest no longer supports Vite 5.
Vitest uses module-runner instead of vite-node.
The deprecated workspace option was removed in favor of projects.
Security 3
Browser builtin commands now check filesystem access.
Updates flatted and removes version pinning to resolve CVE-related issues.
When Vitest UI server is listening, arbitrary file can be read and executed
Deprecations 8
Vitest now shows a warning when browser.isolate is used.
toBe* spy assertions are deprecated in favor of toHaveBeen* and toThrowError.
toHaveBeen* is the preferred replacement for deprecated toBe* spy assertions.
Vitest warns when vi.hoisted is declared outside the module top level.
Vitest warns when vi.mock is declared outside the module top level.
Several vitest/* entry points are now deprecated.
Vitest logs a deprecation warning when test.poolOptions is configured.
The browser-specific isolate option is deprecated in favor of the inherited isolate option.
New APIs and options 90
Istanbul coverage now supports the instrumenter option.
Experimental support for aria snapshots is added.
The JSON reporter gains a filterMeta option.
Adds an exact matching option for browser locators.
Adds support for custom snapshot matchers.
Exports the custom snapshot matcher helper from vitest.
Adds an experimental preParse configuration flag.
Adds bodyEncoding to TestAttachment.
Introduces the experimental.vcsProvider configuration option.
Exposes matchesTags to test whether the current filter matches tags.
Allows opening the browser in standalone mode without running tests.
Provides vi.advanceTimers to the preview provider.
A new agent reporter reduces AI agent token usage.
Adds the allowExec option to api.
Adds the allowWrite option to api.
aroundAll hooks are now available for wrapping all tests in a suite.
aroundEach hooks are now available for wrapping each test.
An assertion helper can hide internal stack traces from assertion output.
Chai-style assertions are now available in Vitest tests.
Coverage reports can now include only changed files.
createSpecification now accepts filters.
The UI now supports configuring details panel position and provides a button for it.
A CLI option detects asynchronous resource leaks.
webdriverio and preview now expose findElement and enable strict mode.
Coverage now supports ignore start/stop hints in source code.
Import duration reporting now supports print and fail thresholds.
Import duration reporting now supports a limit option.
Import duration reporting now supports a print option.
Playwright launchOptions can now be used together with connectOptions.
Matcher types are now publicly exposed for type-aware integrations.
Test options now support attaching meta information.
Mocks can now be configured to throw errors.
Mocks can now be configured to throw errors once.
An option now allows disabling the module runner.
The page/locator.mark API adds annotations to improve Playwright traces.
Playwright browser mode now supports persistent contexts.
prettyDOM now supports filtering nodes from browser assertion error output.
The UI now supports filtering and sorting projects.
Retry options have been enhanced.
The API now exposes runTestFiles as an alternative to runTestSpecifications.
Timer controls now expose setTickMode through the updated fake-timers integration.
Tests can now use tags for categorization and filtering.
A new test.extend syntax provides improved type inference.
Reported tasks now include toTestSpecification.
toTestSpecification can now receive test cases.
The --update flag now accepts new or all to control snapshot updates.
Snapshot configuration now supports update: "none".
Browser user-event interactions now include wheel events.
vi.mocked now supports deep partial typing.
worker.init now supports an onModuleRunner hook.
TRACEPARENT is supported for OpenTelemetry context propagation.
TRACESTATE is supported for OpenTelemetry context propagation.
Custom pools can use the exported setupEnvironment API.
Plugins can opt out of caching, and the internal root cache is fixed.
Exposes utils.configurePrettyDOM for configuring pretty DOM output in browser mode.
Adds an experimental file system cache to improve Vitest performance.
Provides the current task in MatchState for matcher implementations and integrations.
Adds experimental support for OpenTelemetry traces.
Adds an extensible API for working with test artifacts.
The selectOptions element parameter now accepts the Locator type in browser tests.
The jsdom environment now supports the AbortSignal API.
The mocker package adds an automocker entry.
An export for browser/utils was added.
BrowserProviderOption now exposes an options field.
CDP Session is re-exported directly from Playwright.
The vitest list command now supports the --changed flag.
Spying on classes is now supported.
Custom screenshot comparison algorithms are supported.
The disableCoverage method was added.
The enableCoverage method was added.
expect.assert now supports type narrowing.
Custom expect messages are supported for expect.extend matchers.
The module-runner package now supports getBuiltins.
The getGlobalTestNamePattern method was added.
The getSeed method was added.
github-options adds displayAnnotations.
The Playwright provider now supports iframe locators.
webdriverio now supports the --inspect option.
Locators now expose length, and toHaveLength accepts locators.
An onUnhandledError callback is available for handling unhandled errors.
TestModule now exposes relativeModuleId.
Matchers for schema validation were added.
Hooks now support type-safe extra context through TestAPI.
Browser mode adds toBeInViewport for checking whether an element is in the viewport.
The toBeNullable expect function checks whether a value is nullish.
Browser mode adds toMatchScreenshot for visual regression testing.
Browser mode adds the trackUnhandledErrors option.
The verbose reporter now prints tests in a list; tree was introduced as a separate reporter.
vi.mockObject now accepts a spy option.
The Vitest watcher is now exposed.
Performance 6
jsdom reuses abort signals when possible.
When enabled, the filesystem module cache reads from memory whenever possible.
Cached modules avoid an unnecessary fetchModule roundtrip.
Test files are now sorted by project by default, improving pool execution performance.
expect improves performance by optimizing input type checks.
With --no-isolate and --maxWorkers=1, test files are passed at once for improved performance.
Behavior and default changes 49
The agent reporter name is now an alias for the minimal reporter.
Web workers now support MessagePort objects referenced inside postMessage data.
The default snapshot maximum output length has increased.
Test-specification options are now writable.
The experimental assertion field is exposed publicly.
User server options are spread into the browser Vite server in the project.
The text reporter defaults to skipFull when an agent is detected.
Colors are disabled when an agent is detected.
Limits output for large objects.
beforeAll and afterAll fixtures now receive file context.
Async assertions can now be followed by catch and finally handlers.
beforeAll and afterAll fixtures now receive file context.
Cancelling a run now stops the current test immediately.
doMock() can now return a disposable for controlling mock lifetime.
Snapshot assertions now work with expect.soft.
Specification parsing now supports tests whose names start or end with test.
External modules now respect project resolve.conditions.
Vitest now logs the seed when only sequence.shuffle.tests is enabled.
The default SSR environment runner is now the Vitest server module runner.
webdriverio and preview now enable strict mode.
vitest list can statically collect tests without running files to collect them.
Watch mode now uses an agent check instead of only checking TTY.
Injected data-testid attributes are hidden in browser mode.
Asymmetric matcher diffs are more readable because container matchers are unwrapped.
UUID generation no longer relies on crypto.randomUUID, allowing operation in insecure environments.
WebdriverIO falls back to WebDriver Classic when needed.
Forceful CTRL+c exits terminate workers.
The GitHub reporter includes the project in its output.
Tasks now include full names, making task identity clearer in runner output and integrations.
postMessage can send ports to web workers.
Functions are now accepted as standard schemas.
fsModuleCachePath is inherited by default.
The browser mode UI now includes favicon icons.
toBeOneOf now supports Set values in expect assertions.
The --config option now allows a module as its configuration input.
coverage autoUpdate now supports percentage formatting.
When specified, config.browser.instances[].include overrides config.include.
Coverage now includes files selected by the --project filter.
The default exclude pattern was simplified.
defineConfig can now return a promise.
experimental_parseSpecifications is now exposed.
locator.element() now returns HTMLElement or SVGElement.
The spying implementation was rewritten to make module mocking more intuitive.
Synchronous not.toBeInTheDocument() is now supported.
The onConsoleLog callback now receives the logged entity.
Test files are distributed more evenly across shards.
test or describe calls without a function are assigned todo mode.
test.extend now uses the suite's timeout.
trackUnhandledErrors is disabled when the inspector is enabled.
Tooling 15
Static test discovery now recognizes the __vi_import_ prefix.
Adds @vitest/coverage-istanbul as an optional dependency.
Adds @vitest/coverage-v8 as an optional dependency.
CLI tab completions are now available through @bomb.sh/tab.
The UI explorer can now sort tests by duration.
Expectedly failed tests are tracked and displayed in the UI and CLI.
The GitHub Actions Reporter now includes a run summary.
The UI can now run an individual test or suite.
The UI can now filter for slow tests.
Failure screenshots are now stored using the artifacts API.
Browser mode supports OpenTelemetry, enabling telemetry instrumentation during browser tests.
Reporters print a breakdown of import durations.
The UI adds a tabbed screenshot-failure view with a comparison slider.
Playwright tracing is now supported.
The vitest init command now supports qwik.
Fixes and other changes 133
Manual and redirect mocks were hardened, improving mock behavior for developers using Vitest's mocker.
Browser sessions now wait for orchestrator readiness before resolving.
Browser preparation now waits for iframe tester readiness.
Test runs no longer hang when a worker crashes.
Orphaned Playwright routes are removed when the same module is mocked through multiple ids.
Concurrency is now limited per task branch as well as per leaf callbacks.
The HTML reporter now displays project color labels correctly.
Project negation now excludes browser instances.
Coverage reports now provide a descriptive error when the reports directory is removed during a test run.
Soft assertions now respect diff configuration options.
vi.defineHelper now works when called as an object method.
The message passed to expect is consistently used as the error message prefix.
Imports matching class property names are no longer hoisted.
Labeled terminal messages use a black foreground to improve contrast.
Fake timers now advance with the expect.poll interval.
Prevents runner types from leaking into expect types.
Fixes obsolete snapshot warnings for snapshot properties mismatches.
Fixes suite hooks throwing errors for unused auto test-scoped fixtures.
Prevents Vite types from leaking into the UI surface.
Corrects coverageConfigDefaults values and types.
Mock and unmock resolution is now sequential.
Fixes output-limit overcounting in pretty-format output.
Browser tests take a failure screenshot when a stable screenshot cannot be captured.
Preserves the coverage report when the HTML reporter overlaps.
Detects fixtures that return without calling use, preventing incomplete fixture execution from going unnoticed.
Properly re-evaluates actual modules of mocked external modules.
Fixes RegExp serialization for retry.condition.
Fixes the sinon-chai style assertion API.
Soft assertions continue after promise errors from .resolves or .rejects.
Stops treating extra properties on a test return value as tests.
Fixes a type regression affecting static class methods passed through vi.mocked().
bench.reporters no longer reports type errors when given file-name string paths.
Browser mode now handles screenshot artifacts and avoids duplicate failure screenshots.
external and noExternal are now handled during the configEnvironment hook.
userEvent actions now support ensureAwaited.
hideSkippedTests no longer hides test.todo.
Hooks now respect maxConcurrency.
Inline snapshots now work inside test.for/each.
Passing toMatchScreenshot tests no longer updates screenshots.
Artifact attachments are processed when generating the HTML reporter.
createRequire now uses meta.url.
addEventHandler now handles null options without failing.
File uploads now preserve the correct File instance in browser mode.
fileParallelism now works when configured on a browser-mode instance.
The HTML reporter detects gzip using magic numbers instead of the Content-Type header.
import.meta.env defines are fixed for inline browser projects.
Mock transformation now works correctly with classes.
process.env defines are fixed for inline browser projects.
Runner errors are improved when code imports outside of test context.
Reports now identify the test module when it fails to run.
Nested test.only selections are respected inside describe.only blocks.
Typecheck reports provide a better error message when tsc outputs help text.
Environment options are validated when a worker is reused.
Worker start failures are handled gracefully.
Console log string formatting works correctly when placeholders are included.
Fully dynamic imports can now be inlined.
The module graph UI works correctly with headless browser mode.
The browser mode import.meta.env definition is fixed.
Vitest no longer crashes when process.versions is stubbed.
Browser integrations can import recordArtifact from the vitest package.
Source maps for untested Istanbul files are corrected.
Browser mode testTimeout defaults back to 15 seconds.
Extended matchers preserve currentTestName.
External dependency behavior is corrected when using the dependency optimizer.
The Istanbul coverage provider no longer breaks source maps.
Uses optimizeDeps.rolldownOptions to address a deprecated warning and fix ssr.external: true.
Overridden methods are not mocked when the parent was automocked.
Runs toMatchScreenshot only once when used with expect.element.
MessagePort objects work with Worker.postMessage when clone is set to native.
Circular modules are invalidated correctly when rerunning with coverage enabled.
Non-UI browser mode no longer applies the reverted viewport scaling behavior.
VITEST_POOL_ID is initialized before environment setup.
VITEST_WORKER_ID is initialized before environment setup.
Vitest types no longer depend on types from Vite 7.1.
The browser entry no longer imports Node.js-dependent types.
Public types no longer import from @opentelemetry/api.
Stack traces are parsed correctly for the Bun runtime.
The UI uses execution time from the WebSocket reporter when the run finishes.
Browser dependency stack traces are handled correctly when external source maps are used.
The browser UI no longer scales the iframe when the UI is disabled.
The onCancel callback is removed when a worker is terminated.
Vitest no longer starts a new run while cancellation is in progress.
Reporters now report the correct test run duration when the run ends.
The UI now reports file, suite, and test durations correctly.
A cloned request in jsdom is now an actual Request instance.
Fork workers receive more time to start, improving reliability when launching worker processes.
Passes no argument to the Webdriver command when the .click interaction command receives no argument.
Restores the missed context.d.ts file.
Corrects the error message shown when expect.element() is not awaited.
Prevents forks from failing when Windows Defender is enabled.
Cleans up frame-ancestors from the CSP header in the coverage middleware.
Works around the noExternal merging bug on Vite 6.
Properly encodes Uint8Array bodies in annotations.
Copies static properties when a spy is initialized with vi.fn(), and fixes types for vi.spyOn(obj, class).
Fixes types for vi.spyOn(obj, class).
The CLI now parses --execArgv as an array.
With isolate disabled, Vitest creates one environment per worker instead of recreating it.
Browser mode now inherits the general isolate option.
Vitest avoids passing the --require argument when running in Deno.
The matcher now accepts Locator values as possible element types.
Typecheck reruns now work outside tsc.
The jsdom environment now supports URL.createObjectURL.
Additional keys are properly torn down in happy-dom.
Errors with different diffs are no longer merged when reported.
Importing a type from an external package no longer throws.
jsdom now passes Node.js FormData through to Request.
Browser mode now supports module tracking.
Browser setup files are re-evaluated on each test run.
Spying types are improved for more accurate type checking.
The same environment is reused when isolate and fileParallelism are false.
Virtual files are no longer filtered out before remapping to sources during coverage processing.
Pool error messages now use groupOrder instead of groupId.
Dependencies are externalized while respecting ssr.noExternal, fixing Svelte and Astro integrations.
Fixes an RPC listener leak when isolate is disabled.
Built-in modules can now be mocked without using the node: prefix.
The vi.mocked utility now accepts classes.
Publishes a missing context file required for WebdriverIO browser integration.
Worker standard input and output are captured by the logger.
The happy-dom environment supports fetch globals.
Browser in-source testing validation is more stable.
The init command uses the correct JSX or TSX extension.
Reporter options from config are preserved when CLI reporters override configured reporters.
The deprecation notice is no longer printed in node_modules.
Test environment variables are assigned before tests run so they stay synchronized with process.env.
Spies are reset correctly when both restoreMocks and mockReset are enabled in the configuration.
Spies now properly inherit the implementation's length property.
The communication channel is no longer torn down too soon when work is still running after a test.
BrowserCommand can be imported when no browser package is installed.
When expect.poll assertions fail, the assertion error is shown first.
Filename filters no longer run duplicate tests in workspaces.
import.meta.resolve now works on Vite 7.
The standalone mode is ignored when a CLI filename filter is used.
Test errors in Node.js context always have a stacks property.