Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(vitest): allow rewriting process.env.NODE_MODE when using web transform mode #3957

Merged
merged 1 commit into from Aug 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/vitest/src/node/plugins/index.ts
Expand Up @@ -12,7 +12,7 @@ import { GlobalSetupPlugin } from './globalSetup'
import { CSSEnablerPlugin } from './cssEnabler'
import { CoverageTransform } from './coverageTransform'
import { MocksPlugin } from './mocks'
import { deleteDefineConfig, resolveOptimizerConfig } from './utils'
import { deleteDefineConfig, hijackVitePluginInject, resolveOptimizerConfig } from './utils'
import { VitestResolver } from './vitestResolver'

export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('test')): Promise<VitePlugin[]> {
Expand Down Expand Up @@ -158,6 +158,8 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
ignored: ['**/*'],
}
}

hijackVitePluginInject(viteConfig)
},
async configureServer(server) {
if (options.watch && process.env.VITE_TEST_WATCHER_DEBUG) {
Expand Down
13 changes: 12 additions & 1 deletion 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, UserConfig as ViteConfig } from 'vite'
import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite'
import type { DepsOptimizationOptions, InlineConfig } from '../../types'

export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) {
Expand Down Expand Up @@ -73,3 +73,14 @@ export function deleteDefineConfig(viteConfig: ViteConfig) {
}
return defines
}

export function hijackVitePluginInject(viteConfig: ResolvedConfig) {
// disable replacing `process.env.NODE_ENV` with static string
const processEnvPlugin = viteConfig.plugins.find(p => p.name === 'vite:client-inject')
if (processEnvPlugin) {
const originalTransform = processEnvPlugin.transform as any
processEnvPlugin.transform = function transform(code, id, options) {
return originalTransform.call(this, code, id, { ...options, ssr: true })
}
}
}
5 changes: 4 additions & 1 deletion packages/vitest/src/node/plugins/workspace.ts
Expand Up @@ -10,7 +10,7 @@ import { CSSEnablerPlugin } from './cssEnabler'
import { SsrReplacerPlugin } from './ssrReplacer'
import { GlobalSetupPlugin } from './globalSetup'
import { MocksPlugin } from './mocks'
import { deleteDefineConfig, resolveOptimizerConfig } from './utils'
import { deleteDefineConfig, hijackVitePluginInject, resolveOptimizerConfig } from './utils'
import { VitestResolver } from './vitestResolver'

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

return config
},
configResolved(viteConfig) {
hijackVitePluginInject(viteConfig)
},
async configureServer(server) {
try {
const options = deepMerge(
Expand Down
51 changes: 51 additions & 0 deletions test/core/test/env-jsdom.test.ts
@@ -0,0 +1,51 @@
// @vitest-environment jsdom

import { afterAll, expect, test } from 'vitest'
import { getAuthToken } from '../src/env'

const NODE_ENV = process.env.NODE_ENV

afterAll(() => {
process.env.NODE_ENV = NODE_ENV
})

test('reassigning NODE_ENV', () => {
expect(process.env.NODE_ENV).toBeDefined()
process.env.NODE_ENV = 'development'
expect(process.env.NODE_ENV).toBe('development')
})

test('reads envs from .env file', () => {
expect(import.meta.env.VITE_TEST_ENV).toBe('local')
})

test('can reassign env locally', () => {
import.meta.env.VITEST_ENV = 'TEST'
expect(import.meta.env.VITEST_ENV).toBe('TEST')
})

test('can reassign env everywhere', () => {
import.meta.env.AUTH_TOKEN = '123'
expect(getAuthToken()).toBe('123')
process.env.AUTH_TOKEN = '321'
expect(getAuthToken()).toBe('321')
})

test('can see env in "define"', () => {
expect(import.meta.env.TEST_NAME).toBe('hello world')
expect(process.env.TEST_NAME).toBe('hello world')
})

test('has worker env', () => {
expect(process.env.VITEST_WORKER_ID).toBeDefined()
expect(process.env.VITEST_POOL_ID).toBeDefined()
})

test('custom env', () => {
expect(process.env.CUSTOM_ENV).toBe('foo')
expect(import.meta.env.CUSTOM_ENV).toBe('foo')
})

test('ignores import.meta.env in string literals', () => {
expect('import.meta.env').toBe('import' + '.meta.env')
})