Skip to content

Commit 883089c

Browse files
authoredJul 24, 2023
fix(html): support import.meta.env define replacement without quotes (#13425)
1 parent 4848e41 commit 883089c

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed
 

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -963,11 +963,21 @@ export function htmlEnvHook(config: ResolvedConfig): IndexHtmlTransformHook {
963963
const pattern = /%(\S+?)%/g
964964
const envPrefix = resolveEnvPrefix({ envPrefix: config.envPrefix })
965965
const env: Record<string, any> = { ...config.env }
966+
966967
// account for user env defines
967968
for (const key in config.define) {
968969
if (key.startsWith(`import.meta.env.`)) {
969970
const val = config.define[key]
970-
env[key.slice(16)] = typeof val === 'string' ? val : JSON.stringify(val)
971+
if (typeof val === 'string') {
972+
try {
973+
const parsed = JSON.parse(val)
974+
env[key.slice(16)] = typeof parsed === 'string' ? parsed : val
975+
} catch {
976+
env[key.slice(16)] = val
977+
}
978+
} else {
979+
env[key.slice(16)] = JSON.stringify(val)
980+
}
971981
}
972982
}
973983
return (html, ctx) => {

‎playground/html/__tests__/html.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,14 @@ describe('env', () => {
294294
test('env works', async () => {
295295
expect(await page.textContent('.env')).toBe('bar')
296296
expect(await page.textContent('.env-define')).toBe('5173')
297+
expect(await page.textContent('.env-define-string')).toBe('string')
298+
expect(await page.textContent('.env-define-object-string')).toBe(
299+
'{ "foo": "bar" }',
300+
)
301+
expect(await page.textContent('.env-define-template-literal')).toBe(
302+
'`template literal`', // only double quotes will be unquoted
303+
)
304+
expect(await page.textContent('.env-define-null-string')).toBe('null')
297305
expect(await page.textContent('.env-bar')).toBeTruthy()
298306
expect(await page.textContent('.env-prod')).toBe(isBuild + '')
299307
expect(await page.textContent('.env-dev')).toBe(isServe + '')

‎playground/html/env.html

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<p class="env">%VITE_FOO%</p>
22
<p class="env-define">%VITE_NUMBER%</p>
3+
<p class="env-define-string">%VITE_STRING%</p>
4+
<p class="env-define-object-string">%VITE_OBJECT_STRING%</p>
5+
<p class="env-define-template-literal">%VITE_TEMPLATE_LITERAL%</p>
6+
<p class="env-define-null-string">%VITE_NULL_STRING%</p>
37
<p class="env-%VITE_FOO%">class name should be env-bar</p>
48
<p class="env-prod">%PROD%</p>
59
<p class="env-dev">%DEV%</p>

‎playground/html/vite.config.js

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ export default defineConfig({
3636

3737
define: {
3838
'import.meta.env.VITE_NUMBER': 5173,
39+
'import.meta.env.VITE_STRING': JSON.stringify('string'),
40+
'import.meta.env.VITE_OBJECT_STRING': '{ "foo": "bar" }',
41+
'import.meta.env.VITE_TEMPLATE_LITERAL': '`template literal`',
42+
'import.meta.env.VITE_NULL_STRING': 'null',
3943
},
4044

4145
plugins: [

0 commit comments

Comments
 (0)
Please sign in to comment.