Skip to content

Commit 052799e

Browse files
authored
fix: define in environment config was not working (#18515)
1 parent 5da78a6 commit 052799e

File tree

6 files changed

+42
-23
lines changed

6 files changed

+42
-23
lines changed

packages/vite/src/node/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,7 @@ function resolveEnvironmentOptions(
637637
const consumer =
638638
options.consumer ?? (isClientEnvironment ? 'client' : 'server')
639639
return {
640+
define: options.define,
640641
resolve,
641642
consumer,
642643
webCompatible: options.webCompatible ?? consumer === 'client',

packages/vite/src/node/plugins/clientInjections.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Plugin } from '../plugin'
33
import type { ResolvedConfig } from '../config'
44
import { CLIENT_ENTRY, ENV_ENTRY } from '../constants'
55
import { isObject, normalizePath, resolveHostname } from '../utils'
6+
import { usePerEnvironmentState } from '../environment'
67
import { replaceDefine, serializeDefine } from './define'
78

89
// ids in transform are normalized to unix style
@@ -16,6 +17,19 @@ const normalizedEnvEntry = normalizePath(ENV_ENTRY)
1617
export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
1718
let injectConfigValues: (code: string) => string
1819

20+
const getDefineReplacer = usePerEnvironmentState((environment) => {
21+
const userDefine: Record<string, any> = {}
22+
for (const key in environment.config.define) {
23+
// import.meta.env.* is handled in `importAnalysis` plugin
24+
if (!key.startsWith('import.meta.env.')) {
25+
userDefine[key] = environment.config.define[key]
26+
}
27+
}
28+
const serializedDefines = serializeDefine(userDefine)
29+
const definesReplacement = () => serializedDefines
30+
return (code: string) => code.replace(`__DEFINES__`, definesReplacement)
31+
})
32+
1933
return {
2034
name: 'vite:client-inject',
2135
async buildStart() {
@@ -51,18 +65,8 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
5165
hmrBase = path.posix.join(hmrBase, hmrConfig.path)
5266
}
5367

54-
const userDefine: Record<string, any> = {}
55-
for (const key in config.define) {
56-
// import.meta.env.* is handled in `importAnalysis` plugin
57-
if (!key.startsWith('import.meta.env.')) {
58-
userDefine[key] = config.define[key]
59-
}
60-
}
61-
const serializedDefines = serializeDefine(userDefine)
62-
6368
const modeReplacement = escapeReplacement(config.mode)
6469
const baseReplacement = escapeReplacement(devBase)
65-
const definesReplacement = () => serializedDefines
6670
const serverHostReplacement = escapeReplacement(serverHost)
6771
const hmrProtocolReplacement = escapeReplacement(protocol)
6872
const hmrHostnameReplacement = escapeReplacement(host)
@@ -77,7 +81,6 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
7781
return code
7882
.replace(`__MODE__`, modeReplacement)
7983
.replace(/__BASE__/g, baseReplacement)
80-
.replace(`__DEFINES__`, definesReplacement)
8184
.replace(`__SERVER_HOST__`, serverHostReplacement)
8285
.replace(`__HMR_PROTOCOL__`, hmrProtocolReplacement)
8386
.replace(`__HMR_HOSTNAME__`, hmrHostnameReplacement)
@@ -93,13 +96,14 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
9396
// TODO: Remove options?.ssr, Vitest currently hijacks this plugin
9497
const ssr = options?.ssr ?? this.environment.config.consumer === 'server'
9598
if (id === normalizedClientEntry || id === normalizedEnvEntry) {
96-
return injectConfigValues(code)
99+
const defineReplacer = getDefineReplacer(this)
100+
return defineReplacer(injectConfigValues(code))
97101
} else if (!ssr && code.includes('process.env.NODE_ENV')) {
98102
// replace process.env.NODE_ENV instead of defining a global
99103
// for it to avoid shimming a `process` object during dev,
100104
// avoiding inconsistencies between dev and build
101105
const nodeEnv =
102-
config.define?.['process.env.NODE_ENV'] ||
106+
this.environment.config.define?.['process.env.NODE_ENV'] ||
103107
JSON.stringify(process.env.NODE_ENV || config.mode)
104108
return await replaceDefine(this.environment, code, id, {
105109
'process.env.NODE_ENV': nodeEnv,

packages/vite/src/node/plugins/define.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,18 @@ export function definePlugin(config: ResolvedConfig): Plugin {
4646
importMetaFallbackKeys['import.meta.env'] = `undefined`
4747
}
4848

49-
const userDefine: Record<string, string> = {}
50-
const userDefineEnv: Record<string, any> = {}
51-
for (const key in config.define) {
52-
userDefine[key] = handleDefineValue(config.define[key])
53-
54-
// make sure `import.meta.env` object has user define properties
55-
if (isBuild && key.startsWith('import.meta.env.')) {
56-
userDefineEnv[key.slice(16)] = config.define[key]
49+
function generatePattern(environment: Environment) {
50+
const userDefine: Record<string, string> = {}
51+
const userDefineEnv: Record<string, any> = {}
52+
for (const key in environment.config.define) {
53+
userDefine[key] = handleDefineValue(environment.config.define[key])
54+
55+
// make sure `import.meta.env` object has user define properties
56+
if (isBuild && key.startsWith('import.meta.env.')) {
57+
userDefineEnv[key.slice(16)] = environment.config.define[key]
58+
}
5759
}
58-
}
5960

60-
function generatePattern(environment: Environment) {
6161
const replaceProcessEnv = environment.config.webCompatible
6262

6363
const define: Record<string, string> = {

playground/define/__tests__/define.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import viteConfig from '../vite.config'
33
import { page } from '~utils'
44

55
const defines = viteConfig.define
6+
const envDefines = viteConfig.environments.client.define
67

78
test('string', async () => {
89
expect(await page.textContent('.exp')).toBe(
@@ -48,6 +49,9 @@ test('string', async () => {
4849
expect(await page.textContent('.define-in-dep')).toBe(
4950
defines.__STRINGIFIED_OBJ__,
5051
)
52+
expect(await page.textContent('.define-in-environment')).toBe(
53+
envDefines.__DEFINE_IN_ENVIRONMENT__,
54+
)
5155
})
5256

5357
test('ignores constants in string literals', async () => {

playground/define/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ <h1>Define</h1>
2121
<p>define variable in html: <code class="exp-define">__EXP__</code></p>
2222
<p>import json: <code class="import-json"></code></p>
2323
<p>define in dep: <code class="define-in-dep"></code></p>
24+
<p>define in environment: <code class="define-in-environment"></code></p>
2425

2526
<h2>Define ignores string literals</h2>
2627
<section class="ignores-string-literals">
@@ -114,6 +115,8 @@ <h2>Define undefined constants on import.meta.env when it's a invalid json</h2>
114115
import { defined } from '@vitejs/test-commonjs-dep'
115116
text('.define-in-dep', JSON.stringify(defined))
116117

118+
text('.define-in-environment', JSON.stringify(__DEFINE_IN_ENVIRONMENT__))
119+
117120
text('.ignores-string-literals .process-env-dot', 'process.env.')
118121
text(
119122
'.ignores-string-literals .global-process-env-dot',

playground/define/vite.config.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,11 @@ export default defineConfig({
3131
__STRINGIFIED_OBJ__: JSON.stringify({ foo: true }),
3232
'import.meta.env.SOME_IDENTIFIER': '__VITE_SOME_IDENTIFIER__',
3333
},
34+
environments: {
35+
client: {
36+
define: {
37+
__DEFINE_IN_ENVIRONMENT__: '"defined only in client"',
38+
},
39+
},
40+
},
3441
})

0 commit comments

Comments
 (0)