From 3c7604d998e6ffa449560bc9d16efb8a06ca9672 Mon Sep 17 00:00:00 2001 From: thebanjomatic Date: Wed, 11 Dec 2024 13:04:28 -0700 Subject: [PATCH] fix(vite6): re-apply default conditions if using vite 6 or later Vite 6 no longer applies default conditions when you override resolve.conditions. This PR adds them back conditionally based on the vite version. Fixes #7070 --- .vscode/settings.json | 3 ++- .../vitest/src/node/plugins/conditions.ts | 19 +++++++++++++++++++ packages/vitest/src/node/plugins/index.ts | 7 +++++-- packages/vitest/src/node/plugins/workspace.ts | 9 ++++++--- 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 packages/vitest/src/node/plugins/conditions.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 8da1bd8263a0e..f7ee9a14c200a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -45,5 +45,6 @@ "json", "jsonc", "yaml" - ] + ], + "testing.automaticallyOpenTestResults": "neverOpen" } 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, }, }, },