From cb16e1fc306762c057f4048fec1290a1824b6b2e Mon Sep 17 00:00:00 2001 From: Hassad Date: Fri, 20 Mar 2026 00:57:20 +0100 Subject: [PATCH] fix(mocker): lazily import createFilter from vite to respect optional peer dep Replace the static `import { createFilter } from 'vite'` with a dynamic import inside the buildStart hook so that importing `@vitest/mocker/node` no longer fails when vite is not installed. Fixes #9915. --- packages/mocker/src/node/hoistMocksPlugin.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/mocker/src/node/hoistMocksPlugin.ts b/packages/mocker/src/node/hoistMocksPlugin.ts index de29eb1f8d0f..cc582ae9b405 100644 --- a/packages/mocker/src/node/hoistMocksPlugin.ts +++ b/packages/mocker/src/node/hoistMocksPlugin.ts @@ -1,7 +1,6 @@ import type { SourceMap } from 'magic-string' import type { Plugin, Rollup } from 'vite' import type { HoistMocksOptions } from './hoistMocks' -import { createFilter } from 'vite' import { cleanUrl } from '../utils' import { hoistMocks } from './hoistMocks' @@ -15,7 +14,7 @@ export interface HoistMocksPluginOptions extends Omit boolean) | undefined = options.filter const { hoistableMockMethodNames = ['mock', 'unmock'], @@ -37,8 +36,14 @@ export function hoistMocksPlugin(options: HoistMocksPluginOptions = {}): Plugin return { name: 'vitest:mocks', enforce: 'post', + async buildStart() { + if (!filter) { + const { createFilter } = await import('vite') + filter = createFilter(options.include, options.exclude) + } + }, transform(code, id) { - if (!filter(id)) { + if (filter && !filter(id)) { return } const s = hoistMocks(code, id, this.parse, {