From 779f779f8fadae87d15ae6bbe76dbe94be56009e Mon Sep 17 00:00:00 2001 From: yuzheng14 <422450117@qq.com> Date: Wed, 10 Jul 2024 10:25:15 +0800 Subject: [PATCH 1/6] fix(build): handle invalid JSON in import.meta.env --- .../src/node/__tests__/plugins/define.spec.ts | 14 +++++++++++++ packages/vite/src/node/plugins/define.ts | 5 +++-- playground/define/__tests__/define.spec.ts | 13 ++++++++++++ playground/define/index.html | 21 +++++++++++++++++++ playground/define/vite.config.js | 1 + 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/define.spec.ts b/packages/vite/src/node/__tests__/plugins/define.spec.ts index 8876a9d7ecc3e2..8969b3ef038ff3 100644 --- a/packages/vite/src/node/__tests__/plugins/define.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/define.spec.ts @@ -72,4 +72,18 @@ describe('definePlugin', () => { 'const foo = import.meta.env.UNKNOWN;\n', ) }) + + test('replace import.meta.env when it is a invalid json', async () => { + const transform = await createDefinePluginTransform({ + 'import.meta.env.LEGACY': '__VITE_IS_LEGACY__', + }) + + expect( + await transform( + 'const isLegacy = import.meta.env.LEGACY;\nimport.meta.env.UNDEFINED && console.log(import.meta.env.UNDEFINED);', + ), + ).toBe( + 'var define_import_meta_env_default = {"BASE_URL": "/", "MODE": "development", "DEV": true, "PROD": false, "SSR": false, "LEGACY": __VITE_IS_LEGACY__};\nconst isLegacy = __VITE_IS_LEGACY__;\ndefine_import_meta_env_default.UNDEFINED && console.log(define_import_meta_env_default.UNDEFINED);\n', + ) + }) }) diff --git a/packages/vite/src/node/plugins/define.ts b/packages/vite/src/node/plugins/define.ts index 786a1038505c00..d3085c38cbc8b1 100644 --- a/packages/vite/src/node/plugins/define.ts +++ b/packages/vite/src/node/plugins/define.ts @@ -142,8 +142,9 @@ export async function replaceDefine( const replacementMarkers: Record = {} const env = define['import.meta.env'] if (env && !canJsonParse(env)) { - const marker = `_${getHash(env, env.length - 2)}_` - replacementMarkers[marker] = env + const marker = `{ "_${getHash(env, env.length - 2)}_": "" }` + // result generated by esbuild will not have the quotes around the keys + replacementMarkers[marker.replace('"', '').replace('"', '')] = env define = { ...define, 'import.meta.env': marker } } diff --git a/playground/define/__tests__/define.spec.ts b/playground/define/__tests__/define.spec.ts index ec1801c7876ca4..574839137c4c7a 100644 --- a/playground/define/__tests__/define.spec.ts +++ b/playground/define/__tests__/define.spec.ts @@ -92,3 +92,16 @@ test('replaces constants in template literal expressions', async () => { ), ).toBe('dev') }) + +test('replace constants on import.meta.env when it is a invalid json', async () => { + expect( + await page.textContent( + '.replace-undefined-constants-on-import-meta-env .import-meta-env-UNDEFINED', + ), + ).toBe('undefined') + expect( + await page.textContent( + '.replace-undefined-constants-on-import-meta-env .import-meta-env-LEGACY', + ), + ).toBe('true') +}) diff --git a/playground/define/index.html b/playground/define/index.html index 2c2898771e5d4e..747859da29cf94 100644 --- a/playground/define/index.html +++ b/playground/define/index.html @@ -60,6 +60,18 @@

Define replaces constants in template literal expressions

import.meta.hot

+

Define undefined constants on import.meta.env when it's a invalid json

+
+

+ import.meta.env.UNDEFINED +

+

import.meta.env.LEGACY

+
+ +