Skip to content

Commit 3765067

Browse files
d-fischerpatak-dev
andauthoredMar 21, 2023
fix: escape replacements in clientInjections (#12486)
Co-authored-by: patak <matias.capeletto@gmail.com>
1 parent 0cb9171 commit 3765067

File tree

1 file changed

+64
-39
lines changed

1 file changed

+64
-39
lines changed
 

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

+64-39
Original file line numberDiff line numberDiff line change
@@ -13,54 +13,74 @@ const normalizedEnvEntry = normalizePath(ENV_ENTRY)
1313
* @server-only
1414
*/
1515
export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
16+
let injectConfigValues: (code: string) => string
17+
1618
return {
1719
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}`
2527

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
2735

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
3546

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+
}
4251

43-
let directTarget = hmrConfig?.host || resolvedServerHostname
44-
directTarget += `:${hmrConfig?.port || resolvedServerPort}`
45-
directTarget += devBase
52+
const serializedDefines = serializeDefine(config.define || {})
4653

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)
5165

66+
injectConfigValues = (code: string) => {
5267
return code
53-
.replace(`__MODE__`, JSON.stringify(config.mode))
54-
.replace(/__BASE__/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(/__BASE__/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)
6484
} else if (!options?.ssr && code.includes('process.env.NODE_ENV')) {
6585
// replace process.env.NODE_ENV instead of defining a global
6686
// for it to avoid shimming a `process` object during dev,
@@ -75,6 +95,11 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
7595
}
7696
}
7797

98+
function escapeReplacement(value: string | number | boolean | null) {
99+
const jsonValue = JSON.stringify(value)
100+
return () => jsonValue
101+
}
102+
78103
function serializeDefine(define: Record<string, any>): string {
79104
let res = `{`
80105
for (const key in define) {

0 commit comments

Comments
 (0)
Please sign in to comment.