diff --git a/packages/vitest/src/node/plugins/conditions.ts b/packages/vitest/src/node/plugins/conditions.ts new file mode 100644 index 0000000000000..16fa95c7f3fad --- /dev/null +++ b/packages/vitest/src/node/plugins/conditions.ts @@ -0,0 +1,19 @@ +async function getDefaultConditions() { + type Vite6Options = typeof import('vite') & Partial<{ + defaultClientConditions?: string[] + defaultServerConditions?: string[] + }> + const vite: Vite6Options = await import('vite') + return { + defaultClientConditions: vite.defaultClientConditions ?? [], + defaultServerConditions: vite.defaultServerConditions ?? [], + } +} + +export async function getConditions() { + const defaults = await getDefaultConditions() + return { + clientConditions: ['browser', ...defaults.defaultClientConditions], + serverConditions: ['node', ...defaults.defaultServerConditions], + } +} diff --git a/packages/vitest/src/node/plugins/index.ts b/packages/vitest/src/node/plugins/index.ts index 66119740c7726..e9e2050c87bc4 100644 --- a/packages/vitest/src/node/plugins/index.ts +++ b/packages/vitest/src/node/plugins/index.ts @@ -12,6 +12,7 @@ import { generateScopedClassName } from '../../integrations/css/css-modules' import { resolveApiServerConfig } from '../config/resolveConfig' import { Vitest } from '../core' import { createViteLogger, silenceImportViteIgnoreWarning } from '../viteLogger' +import { getConditions } from './conditions' import { CoverageTransform } from './coverageTransform' import { CSSEnablerPlugin } from './cssEnabler' import { MocksPlugins } from './mocks' @@ -73,6 +74,8 @@ export async function VitestPlugin( open = testConfig.uiBase ?? '/__vitest__/' } + const { clientConditions, serverConditions } = await getConditions() + const config: ViteConfig = { root: viteConfig.test?.root || options.root, esbuild: @@ -90,7 +93,7 @@ export async function VitestPlugin( // setting this option can bypass that and fallback to cjs version mainFields: [], alias: testConfig.alias, - conditions: ['node'], + conditions: clientConditions, }, server: { ...testConfig.api, @@ -119,7 +122,7 @@ export async function VitestPlugin( // by default Vite resolves `module` field, which not always a native ESM module // setting this option can bypass that and fallback to cjs version mainFields: [], - conditions: ['node'], + conditions: serverConditions, }, }, }, diff --git a/packages/vitest/src/node/plugins/workspace.ts b/packages/vitest/src/node/plugins/workspace.ts index a3e91bdcf29e9..f95bb3138a0ab 100644 --- a/packages/vitest/src/node/plugins/workspace.ts +++ b/packages/vitest/src/node/plugins/workspace.ts @@ -7,6 +7,7 @@ import { basename, dirname, relative, resolve } from 'pathe' import { configDefaults } from '../../defaults' import { generateScopedClassName } from '../../integrations/css/css-modules' import { createViteLogger, silenceImportViteIgnoreWarning } from '../viteLogger' +import { getConditions } from './conditions' import { CoverageTransform } from './coverageTransform' import { CSSEnablerPlugin } from './cssEnabler' import { MocksPlugins } from './mocks' @@ -36,7 +37,7 @@ export function WorkspaceVitestPlugin( options() { this.meta.watchMode = false }, - config(viteConfig) { + async config(viteConfig) { const defines: Record = deleteDefineConfig(viteConfig) const testConfig = viteConfig.test || {} @@ -62,6 +63,8 @@ export function WorkspaceVitestPlugin( } } + const { clientConditions, serverConditions } = await getConditions() + const config: ViteConfig = { root, resolve: { @@ -69,7 +72,7 @@ export function WorkspaceVitestPlugin( // setting this option can bypass that and fallback to cjs version mainFields: [], alias: testConfig.alias, - conditions: ['node'], + conditions: clientConditions, }, esbuild: viteConfig.esbuild === false ? false @@ -104,7 +107,7 @@ export function WorkspaceVitestPlugin( // by default Vite resolves `module` field, which not always a native ESM module // setting this option can bypass that and fallback to cjs version mainFields: [], - conditions: ['node'], + conditions: serverConditions, }, }, },