@@ -13,54 +13,74 @@ const normalizedEnvEntry = normalizePath(ENV_ENTRY)
13
13
* @server -only
14
14
*/
15
15
export function clientInjectionsPlugin ( config : ResolvedConfig ) : Plugin {
16
+ let injectConfigValues : ( code : string ) => string
17
+
16
18
return {
17
19
name : 'vite:client-inject' ,
18
- async transform ( code , id , options ) {
19
- if ( id === normalizedClientEntry || id === normalizedEnvEntry ) {
20
- const resolvedServerHostname = (
21
- await resolveHostname ( config . server . host )
22
- ) . name
23
- const resolvedServerPort = config . server . port !
24
- const devBase = config . base
20
+ async buildStart ( ) {
21
+ const resolvedServerHostname = ( await resolveHostname ( config . server . host ) )
22
+ . name
23
+ const resolvedServerPort = config . server . port !
24
+ const devBase = config . base
25
+
26
+ const serverHost = ` ${ resolvedServerHostname } : ${ resolvedServerPort } ${ devBase } `
25
27
26
- const serverHost = `${ resolvedServerHostname } :${ resolvedServerPort } ${ devBase } `
28
+ let hmrConfig = config . server . hmr
29
+ hmrConfig = isObject ( hmrConfig ) ? hmrConfig : undefined
30
+ const host = hmrConfig ?. host || null
31
+ const protocol = hmrConfig ?. protocol || null
32
+ const timeout = hmrConfig ?. timeout || 30000
33
+ const overlay = hmrConfig ?. overlay !== false
34
+ const isHmrServerSpecified = ! ! hmrConfig ?. server
27
35
28
- let hmrConfig = config . server . hmr
29
- hmrConfig = isObject ( hmrConfig ) ? hmrConfig : undefined
30
- const host = hmrConfig ?. host || null
31
- const protocol = hmrConfig ?. protocol || null
32
- const timeout = hmrConfig ?. timeout || 30000
33
- const overlay = hmrConfig ?. overlay !== false
34
- const isHmrServerSpecified = ! ! hmrConfig ?. server
36
+ // hmr.clientPort -> hmr.port
37
+ // -> (24678 if middleware mode and HMR server is not specified) -> new URL(import.meta.url).port
38
+ let port = hmrConfig ?. clientPort || hmrConfig ?. port || null
39
+ if ( config . server . middlewareMode && ! isHmrServerSpecified ) {
40
+ port ||= 24678
41
+ }
42
+
43
+ let directTarget = hmrConfig ?. host || resolvedServerHostname
44
+ directTarget += `:${ hmrConfig ?. port || resolvedServerPort } `
45
+ directTarget += devBase
35
46
36
- // hmr.clientPort -> hmr.port
37
- // -> (24678 if middleware mode and HMR server is not specified) -> new URL(import.meta.url).port
38
- let port = hmrConfig ?. clientPort || hmrConfig ?. port || null
39
- if ( config . server . middlewareMode && ! isHmrServerSpecified ) {
40
- port ||= 24678
41
- }
47
+ let hmrBase = devBase
48
+ if ( hmrConfig ?. path ) {
49
+ hmrBase = path . posix . join ( hmrBase , hmrConfig . path )
50
+ }
42
51
43
- let directTarget = hmrConfig ?. host || resolvedServerHostname
44
- directTarget += `:${ hmrConfig ?. port || resolvedServerPort } `
45
- directTarget += devBase
52
+ const serializedDefines = serializeDefine ( config . define || { } )
46
53
47
- let hmrBase = devBase
48
- if ( hmrConfig ?. path ) {
49
- hmrBase = path . posix . join ( hmrBase , hmrConfig . path )
50
- }
54
+ const modeReplacement = escapeReplacement ( config . mode )
55
+ const baseReplacement = escapeReplacement ( devBase )
56
+ const definesReplacement = ( ) => serializedDefines
57
+ const serverHostReplacement = escapeReplacement ( serverHost )
58
+ const hmrProtocolReplacement = escapeReplacement ( protocol )
59
+ const hmrHostnameReplacement = escapeReplacement ( host )
60
+ const hmrPortReplacement = escapeReplacement ( port )
61
+ const hmrDirectTargetReplacement = escapeReplacement ( directTarget )
62
+ const hmrBaseReplacement = escapeReplacement ( hmrBase )
63
+ const hmrTimeoutReplacement = escapeReplacement ( timeout )
64
+ const hmrEnableOverlayReplacement = escapeReplacement ( overlay )
51
65
66
+ injectConfigValues = ( code : string ) => {
52
67
return code
53
- . replace ( `__MODE__` , JSON . stringify ( config . mode ) )
54
- . replace ( / _ _ B A S E _ _ / g, JSON . stringify ( devBase ) )
55
- . replace ( `__DEFINES__` , serializeDefine ( config . define || { } ) )
56
- . replace ( `__SERVER_HOST__` , JSON . stringify ( serverHost ) )
57
- . replace ( `__HMR_PROTOCOL__` , JSON . stringify ( protocol ) )
58
- . replace ( `__HMR_HOSTNAME__` , JSON . stringify ( host ) )
59
- . replace ( `__HMR_PORT__` , JSON . stringify ( port ) )
60
- . replace ( `__HMR_DIRECT_TARGET__` , JSON . stringify ( directTarget ) )
61
- . replace ( `__HMR_BASE__` , JSON . stringify ( hmrBase ) )
62
- . replace ( `__HMR_TIMEOUT__` , JSON . stringify ( timeout ) )
63
- . replace ( `__HMR_ENABLE_OVERLAY__` , JSON . stringify ( overlay ) )
68
+ . replace ( `__MODE__` , modeReplacement )
69
+ . replace ( / _ _ B A S E _ _ / g, baseReplacement )
70
+ . replace ( `__DEFINES__` , definesReplacement )
71
+ . replace ( `__SERVER_HOST__` , serverHostReplacement )
72
+ . replace ( `__HMR_PROTOCOL__` , hmrProtocolReplacement )
73
+ . replace ( `__HMR_HOSTNAME__` , hmrHostnameReplacement )
74
+ . replace ( `__HMR_PORT__` , hmrPortReplacement )
75
+ . replace ( `__HMR_DIRECT_TARGET__` , hmrDirectTargetReplacement )
76
+ . replace ( `__HMR_BASE__` , hmrBaseReplacement )
77
+ . replace ( `__HMR_TIMEOUT__` , hmrTimeoutReplacement )
78
+ . replace ( `__HMR_ENABLE_OVERLAY__` , hmrEnableOverlayReplacement )
79
+ }
80
+ } ,
81
+ transform ( code , id , options ) {
82
+ if ( id === normalizedClientEntry || id === normalizedEnvEntry ) {
83
+ return injectConfigValues ( code )
64
84
} else if ( ! options ?. ssr && code . includes ( 'process.env.NODE_ENV' ) ) {
65
85
// replace process.env.NODE_ENV instead of defining a global
66
86
// for it to avoid shimming a `process` object during dev,
@@ -75,6 +95,11 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
75
95
}
76
96
}
77
97
98
+ function escapeReplacement ( value : string | number | boolean | null ) {
99
+ const jsonValue = JSON . stringify ( value )
100
+ return ( ) => jsonValue
101
+ }
102
+
78
103
function serializeDefine ( define : Record < string , any > ) : string {
79
104
let res = `{`
80
105
for ( const key in define ) {
0 commit comments