Skip to content

Commit eca4b87

Browse files
authoredAug 15, 2023
fix(vitest): allow rewriting process.env.NODE_MODE when using web transform mode (#3957)
1 parent edb322f commit eca4b87

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed
 

‎packages/vitest/src/node/plugins/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { GlobalSetupPlugin } from './globalSetup'
1212
import { CSSEnablerPlugin } from './cssEnabler'
1313
import { CoverageTransform } from './coverageTransform'
1414
import { MocksPlugin } from './mocks'
15-
import { deleteDefineConfig, resolveOptimizerConfig } from './utils'
15+
import { deleteDefineConfig, hijackVitePluginInject, resolveOptimizerConfig } from './utils'
1616
import { VitestResolver } from './vitestResolver'
1717

1818
export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('test')): Promise<VitePlugin[]> {
@@ -158,6 +158,8 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
158158
ignored: ['**/*'],
159159
}
160160
}
161+
162+
hijackVitePluginInject(viteConfig)
161163
},
162164
async configureServer(server) {
163165
if (options.watch && process.env.VITE_TEST_WATCHER_DEBUG) {

‎packages/vitest/src/node/plugins/utils.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { builtinModules } from 'node:module'
22
import { version as viteVersion } from 'vite'
3-
import type { DepOptimizationOptions, UserConfig as ViteConfig } from 'vite'
3+
import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite'
44
import type { DepsOptimizationOptions, InlineConfig } from '../../types'
55

66
export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) {
@@ -73,3 +73,14 @@ export function deleteDefineConfig(viteConfig: ViteConfig) {
7373
}
7474
return defines
7575
}
76+
77+
export function hijackVitePluginInject(viteConfig: ResolvedConfig) {
78+
// disable replacing `process.env.NODE_ENV` with static string
79+
const processEnvPlugin = viteConfig.plugins.find(p => p.name === 'vite:client-inject')
80+
if (processEnvPlugin) {
81+
const originalTransform = processEnvPlugin.transform as any
82+
processEnvPlugin.transform = function transform(code, id, options) {
83+
return originalTransform.call(this, code, id, { ...options, ssr: true })
84+
}
85+
}
86+
}

‎packages/vitest/src/node/plugins/workspace.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { CSSEnablerPlugin } from './cssEnabler'
1010
import { SsrReplacerPlugin } from './ssrReplacer'
1111
import { GlobalSetupPlugin } from './globalSetup'
1212
import { MocksPlugin } from './mocks'
13-
import { deleteDefineConfig, resolveOptimizerConfig } from './utils'
13+
import { deleteDefineConfig, hijackVitePluginInject, resolveOptimizerConfig } from './utils'
1414
import { VitestResolver } from './vitestResolver'
1515

1616
interface WorkspaceOptions extends UserWorkspaceConfig {
@@ -100,6 +100,9 @@ export function WorkspaceVitestPlugin(project: WorkspaceProject, options: Worksp
100100

101101
return config
102102
},
103+
configResolved(viteConfig) {
104+
hijackVitePluginInject(viteConfig)
105+
},
103106
async configureServer(server) {
104107
try {
105108
const options = deepMerge(

‎test/core/test/env-jsdom.test.ts

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// @vitest-environment jsdom
2+
3+
import { afterAll, expect, test } from 'vitest'
4+
import { getAuthToken } from '../src/env'
5+
6+
const NODE_ENV = process.env.NODE_ENV
7+
8+
afterAll(() => {
9+
process.env.NODE_ENV = NODE_ENV
10+
})
11+
12+
test('reassigning NODE_ENV', () => {
13+
expect(process.env.NODE_ENV).toBeDefined()
14+
process.env.NODE_ENV = 'development'
15+
expect(process.env.NODE_ENV).toBe('development')
16+
})
17+
18+
test('reads envs from .env file', () => {
19+
expect(import.meta.env.VITE_TEST_ENV).toBe('local')
20+
})
21+
22+
test('can reassign env locally', () => {
23+
import.meta.env.VITEST_ENV = 'TEST'
24+
expect(import.meta.env.VITEST_ENV).toBe('TEST')
25+
})
26+
27+
test('can reassign env everywhere', () => {
28+
import.meta.env.AUTH_TOKEN = '123'
29+
expect(getAuthToken()).toBe('123')
30+
process.env.AUTH_TOKEN = '321'
31+
expect(getAuthToken()).toBe('321')
32+
})
33+
34+
test('can see env in "define"', () => {
35+
expect(import.meta.env.TEST_NAME).toBe('hello world')
36+
expect(process.env.TEST_NAME).toBe('hello world')
37+
})
38+
39+
test('has worker env', () => {
40+
expect(process.env.VITEST_WORKER_ID).toBeDefined()
41+
expect(process.env.VITEST_POOL_ID).toBeDefined()
42+
})
43+
44+
test('custom env', () => {
45+
expect(process.env.CUSTOM_ENV).toBe('foo')
46+
expect(import.meta.env.CUSTOM_ENV).toBe('foo')
47+
})
48+
49+
test('ignores import.meta.env in string literals', () => {
50+
expect('import.meta.env').toBe('import' + '.meta.env')
51+
})

0 commit comments

Comments
 (0)
Please sign in to comment.