diff --git a/packages/vitest/src/runtime/workers/utils.ts b/packages/vitest/src/runtime/workers/utils.ts index 6d619b5b90eb..9ffbf2b4983d 100644 --- a/packages/vitest/src/runtime/workers/utils.ts +++ b/packages/vitest/src/runtime/workers/utils.ts @@ -41,5 +41,16 @@ export function unwrapSerializableConfig(config: ResolvedConfig) { config.testNamePattern = parseRegexp(testNamePattern.slice(REGEXP_WRAP_PREFIX.length)) } + if (config.defines && Array.isArray(config.defines.keys) && config.defines.original) { + const { keys, original } = config.defines + const defines: ResolvedConfig['defines'] = {} + + // Apply all keys from the original. Entries which had undefined value are missing from original now + for (const key of keys) + defines[key] = original[key] + + config.defines = defines + } + return config } diff --git a/packages/vitest/src/utils/config-helpers.ts b/packages/vitest/src/utils/config-helpers.ts index e92435e12d79..c86b0c2f51a3 100644 --- a/packages/vitest/src/utils/config-helpers.ts +++ b/packages/vitest/src/utils/config-helpers.ts @@ -22,13 +22,19 @@ export function getOutputFile(config: PotentialConfig | undefined, reporter: Bui */ export function wrapSerializableConfig(config: ResolvedConfig) { let testNamePattern = config.testNamePattern + let defines = config.defines // v8 serialize does not support regex if (testNamePattern && typeof testNamePattern !== 'string') testNamePattern = `${REGEXP_WRAP_PREFIX}${testNamePattern.toString()}` as unknown as RegExp + // v8 serialize drops properties with undefined value + if (defines) + defines = { keys: Object.keys(defines), original: defines } + return { ...config, testNamePattern, + defines, } as ResolvedConfig } diff --git a/test/core/test/define-ssr.test.ts b/test/core/test/define-ssr.test.ts index 4cbe9bb6b140..3dcb75129b81 100644 --- a/test/core/test/define-ssr.test.ts +++ b/test/core/test/define-ssr.test.ts @@ -3,6 +3,10 @@ import { afterAll, expect, test } from 'vitest' declare let __DEFINE__: string declare let __JSON__: any declare let __MODE__: string +declare let __UNDEFINED__: undefined +declare let __NULL__: null +declare let __ZERO__: 0 +declare let __FALSE__: false declare let SOME: { VARIABLE: string SOME: { @@ -64,3 +68,10 @@ test('dotted defines are processed by Vite, but cannot be reassigned', () => { SOME.VARIABLE = 'new variable' expect(SOME.VARIABLE).not.toBe('new variable') }) + +test('falsy defines are passed', () => { + expect(__UNDEFINED__).toBe(undefined) + expect(__NULL__).toBe(null) + expect(__ZERO__).toBe(0) + expect(__FALSE__).toBe(false) +}) diff --git a/test/core/test/define-web.test.ts b/test/core/test/define-web.test.ts index 3af47b384850..94ef951c93d3 100644 --- a/test/core/test/define-web.test.ts +++ b/test/core/test/define-web.test.ts @@ -5,6 +5,10 @@ import { afterAll, expect, test } from 'vitest' declare let __DEFINE__: string declare let __JSON__: any declare let __MODE__: string +declare let __UNDEFINED__: undefined +declare let __NULL__: null +declare let __ZERO__: 0 +declare let __FALSE__: false declare let SOME: { VARIABLE: string SOME: { @@ -61,3 +65,10 @@ test('dotted defines can be reassigned', () => { SOME.VARIABLE = 'new variable' expect(SOME.VARIABLE).toBe('new variable') }) + +test('falsy defines are passed', () => { + expect(__UNDEFINED__).toBe(undefined) + expect(__NULL__).toBe(null) + expect(__ZERO__).toBe(0) + expect(__FALSE__).toBe(false) +}) diff --git a/test/core/vite.config.ts b/test/core/vite.config.ts index a951fb84eff6..ff8ff6b20be2 100644 --- a/test/core/vite.config.ts +++ b/test/core/vite.config.ts @@ -32,6 +32,10 @@ export default defineConfig({ '__MODE__': 'process.env.MODE', 'SOME.VARIABLE': '"variable"', 'SOME.SOME.VARIABLE': '"nested variable"', + '__UNDEFINED__': undefined, + '__NULL__': null, + '__ZERO__': 0, + '__FALSE__': false, }, resolve: { alias: [