diff --git a/packages/vitest/src/node/plugins/index.ts b/packages/vitest/src/node/plugins/index.ts index a43dab037c6f..f5d17675a420 100644 --- a/packages/vitest/src/node/plugins/index.ts +++ b/packages/vitest/src/node/plugins/index.ts @@ -12,7 +12,7 @@ import { GlobalSetupPlugin } from './globalSetup' import { CSSEnablerPlugin } from './cssEnabler' import { CoverageTransform } from './coverageTransform' import { MocksPlugin } from './mocks' -import { resolveOptimizerConfig } from './utils' +import { deleteDefineConfig, resolveOptimizerConfig } from './utils' import { VitestResolver } from './vitestResolver' export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('test')): Promise { @@ -50,43 +50,11 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t ) testConfig.api = resolveApiServerConfig(testConfig) - if (viteConfig.define) { - delete viteConfig.define['import.meta.vitest'] - delete viteConfig.define['process.env'] - } - // store defines for globalThis to make them // reassignable when running in worker in src/runtime/setup.ts - const defines: Record = {} - - for (const key in viteConfig.define) { - const val = viteConfig.define[key] - let replacement: any - try { - replacement = typeof val === 'string' ? JSON.parse(val) : val - } - catch { - // probably means it contains reference to some variable, - // like this: "__VAR__": "process.env.VAR" - continue - } - if (key.startsWith('import.meta.env.')) { - const envKey = key.slice('import.meta.env.'.length) - process.env[envKey] = replacement - delete viteConfig.define[key] - } - else if (key.startsWith('process.env.')) { - const envKey = key.slice('process.env.'.length) - process.env[envKey] = replacement - delete viteConfig.define[key] - } - else if (!key.includes('.')) { - defines[key] = replacement - delete viteConfig.define[key] - } - } + const defines: Record = deleteDefineConfig(viteConfig) - (options as ResolvedConfig).defines = defines + ;(options as ResolvedConfig).defines = defines let open: string | boolean | undefined diff --git a/packages/vitest/src/node/plugins/utils.ts b/packages/vitest/src/node/plugins/utils.ts index 9d1e93f86abe..16a390b7b348 100644 --- a/packages/vitest/src/node/plugins/utils.ts +++ b/packages/vitest/src/node/plugins/utils.ts @@ -1,6 +1,6 @@ import { builtinModules } from 'node:module' import { version as viteVersion } from 'vite' -import type { DepOptimizationOptions } from 'vite' +import type { DepOptimizationOptions, UserConfig as ViteConfig } from 'vite' import type { DepsOptimizationOptions, InlineConfig } from '../../types' export function resolveOptimizerConfig(testOptionc: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) { @@ -32,3 +32,40 @@ export function resolveOptimizerConfig(testOptionc: DepsOptimizationOptions | un } return newConfig } + +export function deleteDefineConfig(viteConfig: ViteConfig) { + const defines: Record = {} + if (viteConfig.define) { + delete viteConfig.define['import.meta.vitest'] + delete viteConfig.define['process.env'] + delete viteConfig.define.process + delete viteConfig.define.global + } + for (const key in viteConfig.define) { + const val = viteConfig.define[key] + let replacement: any + try { + replacement = typeof val === 'string' ? JSON.parse(val) : val + } + catch { + // probably means it contains reference to some variable, + // like this: "__VAR__": "process.env.VAR" + continue + } + if (key.startsWith('import.meta.env.')) { + const envKey = key.slice('import.meta.env.'.length) + process.env[envKey] = replacement + delete viteConfig.define[key] + } + else if (key.startsWith('process.env.')) { + const envKey = key.slice('process.env.'.length) + process.env[envKey] = replacement + delete viteConfig.define[key] + } + else if (!key.includes('.')) { + defines[key] = replacement + delete viteConfig.define[key] + } + } + return defines +} diff --git a/packages/vitest/src/node/plugins/workspace.ts b/packages/vitest/src/node/plugins/workspace.ts index f9fd4dda3da7..69340e681afe 100644 --- a/packages/vitest/src/node/plugins/workspace.ts +++ b/packages/vitest/src/node/plugins/workspace.ts @@ -10,7 +10,7 @@ import { CSSEnablerPlugin } from './cssEnabler' import { EnvReplacerPlugin } from './envReplacer' import { GlobalSetupPlugin } from './globalSetup' import { MocksPlugin } from './mocks' -import { resolveOptimizerConfig } from './utils' +import { deleteDefineConfig, resolveOptimizerConfig } from './utils' import { VitestResolver } from './vitestResolver' interface WorkspaceOptions extends UserWorkspaceConfig { @@ -26,37 +26,8 @@ export function WorkspaceVitestPlugin(project: WorkspaceProject, options: Worksp options() { this.meta.watchMode = false }, - // TODO: refactor so we don't have the same code here and in plugins/index.ts config(viteConfig) { - if (viteConfig.define) { - delete viteConfig.define['import.meta.vitest'] - delete viteConfig.define['process.env'] - } - - const env: Record = {} - - for (const key in viteConfig.define) { - const val = viteConfig.define[key] - let replacement: any - try { - replacement = typeof val === 'string' ? JSON.parse(val) : val - } - catch { - // probably means it contains reference to some variable, - // like this: "__VAR__": "process.env.VAR" - continue - } - if (key.startsWith('import.meta.env.')) { - const envKey = key.slice('import.meta.env.'.length) - env[envKey] = replacement - delete viteConfig.define[key] - } - else if (key.startsWith('process.env.')) { - const envKey = key.slice('process.env.'.length) - env[envKey] = replacement - delete viteConfig.define[key] - } - } + const env: Record = deleteDefineConfig(viteConfig) const testConfig = viteConfig.test || {} diff --git a/test/core/test/define.test.ts b/test/core/test/define.test.ts index 21f8f869606e..6b286a29420e 100644 --- a/test/core/test/define.test.ts +++ b/test/core/test/define.test.ts @@ -27,6 +27,11 @@ afterAll(() => { process.env.MODE = MODE }) +test('automatically remove process and global', () => { + expect(Object.keys(process).length > 1).toBe(true) + expect(Object.keys(global).length > 1).toBe(true) +}) + test('process.env.HELLO_PROCESS is defined on "defined" but exists on process.env', () => { expect('HELLO_PROCESS' in process.env).toBe(true) expect(process.env.HELLO_PROCESS).toBe('hello process') diff --git a/test/core/vitest.config.ts b/test/core/vitest.config.ts index b869e9d40aea..d2252dd7b2dc 100644 --- a/test/core/vitest.config.ts +++ b/test/core/vitest.config.ts @@ -19,6 +19,8 @@ export default defineConfig({ }, ], define: { + 'process': {}, + 'global': {}, 'import.meta.env.TEST_NAME': '"hello world"', 'process.env.HELLO_PROCESS': '"hello process"', // can reassign