From a18acf0ee5e768c92e3bee0fe9a5b9ed64c8f5fb Mon Sep 17 00:00:00 2001 From: ydcjeff <32727188+ydcjeff@users.noreply.github.com> Date: Fri, 10 Dec 2021 13:27:08 +0630 Subject: [PATCH 1/3] fix(defineOption): only allow string values --- packages/playground/alias/vite.config.js | 4 ++-- packages/playground/define/__tests__/define.spec.ts | 4 ++-- packages/playground/define/vite.config.js | 8 ++++---- packages/playground/resolve/vite.config.js | 2 +- packages/plugin-vue-jsx/index.js | 4 ++-- packages/plugin-vue/src/index.ts | 4 ++-- packages/vite/src/node/config.ts | 2 +- packages/vite/src/node/optimizer/index.ts | 3 +-- packages/vite/src/node/plugins/clientInjections.ts | 4 +--- packages/vite/src/node/plugins/define.ts | 5 ++++- packages/vite/src/node/plugins/importAnalysis.ts | 4 +--- 11 files changed, 21 insertions(+), 23 deletions(-) diff --git a/packages/playground/alias/vite.config.js b/packages/playground/alias/vite.config.js index 34ed93051964d0..81253d0e24526d 100644 --- a/packages/playground/alias/vite.config.js +++ b/packages/playground/alias/vite.config.js @@ -24,7 +24,7 @@ module.exports = { minify: false }, define: { - __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: true + __VUE_OPTIONS_API__: JSON.stringify(true), + __VUE_PROD_DEVTOOLS__: JSON.stringify(true) } } diff --git a/packages/playground/define/__tests__/define.spec.ts b/packages/playground/define/__tests__/define.spec.ts index f5eb78ea4e2766..9dd833aae47a76 100644 --- a/packages/playground/define/__tests__/define.spec.ts +++ b/packages/playground/define/__tests__/define.spec.ts @@ -6,13 +6,13 @@ test('string', async () => { expect(await page.textContent('.number')).toBe(String(defines.__NUMBER__)) expect(await page.textContent('.boolean')).toBe(String(defines.__BOOLEAN__)) expect(await page.textContent('.object')).toBe( - JSON.stringify(defines.__OBJ__, null, 2) + JSON.stringify(JSON.parse(defines.__OBJ__), null, 2) ) expect(await page.textContent('.env-var')).toBe( JSON.parse(defines['process.env.SOMEVAR']) ) expect(await page.textContent('.process-as-property')).toBe( - defines.__OBJ__.process.env.SOMEVAR + JSON.parse(defines.__OBJ__).process.env.SOMEVAR ) expect(await page.textContent('.spread-object')).toBe( JSON.stringify({ SOMEVAR: defines['process.env.SOMEVAR'] }) diff --git a/packages/playground/define/vite.config.js b/packages/playground/define/vite.config.js index 422f1c4daa9628..70153e32fd70ab 100644 --- a/packages/playground/define/vite.config.js +++ b/packages/playground/define/vite.config.js @@ -2,9 +2,9 @@ module.exports = { define: { __EXP__: '1 + 1', __STRING__: '"hello"', - __NUMBER__: 123, - __BOOLEAN__: true, - __OBJ__: { + __NUMBER__: JSON.stringify(123), + __BOOLEAN__: JSON.stringify(true), + __OBJ__: JSON.stringify({ foo: 1, bar: { baz: 2 @@ -14,7 +14,7 @@ module.exports = { SOMEVAR: '"PROCESS MAY BE PROPERTY"' } } - }, + }), 'process.env.SOMEVAR': '"SOMEVAR"' } } diff --git a/packages/playground/resolve/vite.config.js b/packages/playground/resolve/vite.config.js index be1b75e431383a..e83df9e88a2e8b 100644 --- a/packages/playground/resolve/vite.config.js +++ b/packages/playground/resolve/vite.config.js @@ -11,7 +11,7 @@ module.exports = { conditions: ['custom'] }, define: { - VITE_CONFIG_DEP_TEST: a + VITE_CONFIG_DEP_TEST: JSON.stringify(a) }, plugins: [ { diff --git a/packages/plugin-vue-jsx/index.js b/packages/plugin-vue-jsx/index.js index 56c50fe2ff5e6d..8d7a0ca4cfc891 100644 --- a/packages/plugin-vue-jsx/index.js +++ b/packages/plugin-vue-jsx/index.js @@ -61,8 +61,8 @@ function vueJsxPlugin(options = {}) { include: /\.ts$/ }, define: { - __VUE_OPTIONS_API__: optionsApi != null ? optionsApi : true, - __VUE_PROD_DEVTOOLS__: devTools != null ? devTools : false + __VUE_OPTIONS_API__: JSON.stringify(optionsApi) || 'true', + __VUE_PROD_DEVTOOLS__: JSON.stringify(devTools) || 'false' } } }, diff --git a/packages/plugin-vue/src/index.ts b/packages/plugin-vue/src/index.ts index 51ac057232aef0..6c8a01a8ac7e39 100644 --- a/packages/plugin-vue/src/index.ts +++ b/packages/plugin-vue/src/index.ts @@ -121,8 +121,8 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin { config(config) { return { define: { - __VUE_OPTIONS_API__: config.define?.__VUE_OPTIONS_API__ ?? true, - __VUE_PROD_DEVTOOLS__: config.define?.__VUE_PROD_DEVTOOLS__ ?? false + __VUE_OPTIONS_API__: JSON.stringify(config.define?.__VUE_OPTIONS_API__) || 'true', + __VUE_PROD_DEVTOOLS__: JSON.stringify(config.define?.__VUE_PROD_DEVTOOLS__) || 'false' }, ssr: { external: ['vue', '@vue/server-renderer'] diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 8ae523c4e7715e..7b080fd363a395 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -112,7 +112,7 @@ export interface UserConfig { * Define global variable replacements. * Entries will be defined on `window` during dev and replaced during build. */ - define?: Record + define?: Record /** * Array of vite plugins to use. */ diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 6b09c265ffef16..13f9bbc7db5149 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -283,8 +283,7 @@ export async function optimizeDeps( 'process.env.NODE_ENV': JSON.stringify(config.mode) } for (const key in config.define) { - const value = config.define[key] - define[key] = typeof value === 'string' ? value : JSON.stringify(value) + define[key] = config.define[key] } const start = performance.now() diff --git a/packages/vite/src/node/plugins/clientInjections.ts b/packages/vite/src/node/plugins/clientInjections.ts index f752596d5de078..ba3efcbccf3c88 100644 --- a/packages/vite/src/node/plugins/clientInjections.ts +++ b/packages/vite/src/node/plugins/clientInjections.ts @@ -64,9 +64,7 @@ function serializeDefine(define: Record): string { let res = `{` for (const key in define) { const val = define[key] - res += `${JSON.stringify(key)}: ${ - typeof val === 'string' ? `(${val})` : JSON.stringify(val) - }, ` + res += `${JSON.stringify(key)}: ${`(${val})`}, ` } return res + `}` } diff --git a/packages/vite/src/node/plugins/define.ts b/packages/vite/src/node/plugins/define.ts index e520a88890e293..5ae714982db73d 100644 --- a/packages/vite/src/node/plugins/define.ts +++ b/packages/vite/src/node/plugins/define.ts @@ -20,7 +20,10 @@ export function definePlugin(config: ResolvedConfig): Plugin { const userDefine: Record = {} for (const key in config.define) { const val = config.define[key] - userDefine[key] = typeof val === 'string' ? val : JSON.stringify(val) + if (typeof val !== 'string') { + throw new TypeError('values of define option should be string') + } + userDefine[key] = val } // during dev, import.meta properties are handled by importAnalysis plugin diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 13bb8967279af1..971ee58dd7ff8e 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -480,9 +480,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { for (const key in config.define) { if (key.startsWith(`import.meta.env.`)) { const val = config.define[key] - env += `${key} = ${ - typeof val === 'string' ? val : JSON.stringify(val) - };` + env += `${key} = ${val};` } } str().prepend(env) From d256db91be69a5f0ed80ac5eb7fe6304fb5fb2a2 Mon Sep 17 00:00:00 2001 From: ydcjeff <32727188+ydcjeff@users.noreply.github.com> Date: Fri, 10 Dec 2021 14:58:57 +0630 Subject: [PATCH 2/3] test: string value define in legacy plugin --- packages/plugin-legacy/index.js | 2 +- packages/vite/src/node/optimizer/index.ts | 3 ++- packages/vite/src/node/plugins/clientInjections.ts | 4 +++- packages/vite/src/node/plugins/importAnalysis.ts | 4 +++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/plugin-legacy/index.js b/packages/plugin-legacy/index.js index 2267cd9cf82b42..d2a47d8ca590e0 100644 --- a/packages/plugin-legacy/index.js +++ b/packages/plugin-legacy/index.js @@ -476,7 +476,7 @@ function viteLegacyPlugin(options = {}) { define: { 'import.meta.env.LEGACY': env.command === 'serve' || config.build.ssr - ? false + ? JSON.stringify(false) : legacyEnvVarMarker } } diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 13f9bbc7db5149..6b09c265ffef16 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -283,7 +283,8 @@ export async function optimizeDeps( 'process.env.NODE_ENV': JSON.stringify(config.mode) } for (const key in config.define) { - define[key] = config.define[key] + const value = config.define[key] + define[key] = typeof value === 'string' ? value : JSON.stringify(value) } const start = performance.now() diff --git a/packages/vite/src/node/plugins/clientInjections.ts b/packages/vite/src/node/plugins/clientInjections.ts index ba3efcbccf3c88..f752596d5de078 100644 --- a/packages/vite/src/node/plugins/clientInjections.ts +++ b/packages/vite/src/node/plugins/clientInjections.ts @@ -64,7 +64,9 @@ function serializeDefine(define: Record): string { let res = `{` for (const key in define) { const val = define[key] - res += `${JSON.stringify(key)}: ${`(${val})`}, ` + res += `${JSON.stringify(key)}: ${ + typeof val === 'string' ? `(${val})` : JSON.stringify(val) + }, ` } return res + `}` } diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 971ee58dd7ff8e..13bb8967279af1 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -480,7 +480,9 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { for (const key in config.define) { if (key.startsWith(`import.meta.env.`)) { const val = config.define[key] - env += `${key} = ${val};` + env += `${key} = ${ + typeof val === 'string' ? val : JSON.stringify(val) + };` } } str().prepend(env) From 4bb52160e4a17bd16a371c5f496cb31fed4028e9 Mon Sep 17 00:00:00 2001 From: ydcjeff <32727188+ydcjeff@users.noreply.github.com> Date: Sun, 12 Dec 2021 15:57:23 +0630 Subject: [PATCH 3/3] chore: format --- packages/plugin-vue/src/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/plugin-vue/src/index.ts b/packages/plugin-vue/src/index.ts index 6c8a01a8ac7e39..6d61188a210146 100644 --- a/packages/plugin-vue/src/index.ts +++ b/packages/plugin-vue/src/index.ts @@ -121,8 +121,10 @@ export default function vuePlugin(rawOptions: Options = {}): Plugin { config(config) { return { define: { - __VUE_OPTIONS_API__: JSON.stringify(config.define?.__VUE_OPTIONS_API__) || 'true', - __VUE_PROD_DEVTOOLS__: JSON.stringify(config.define?.__VUE_PROD_DEVTOOLS__) || 'false' + __VUE_OPTIONS_API__: + JSON.stringify(config.define?.__VUE_OPTIONS_API__) || 'true', + __VUE_PROD_DEVTOOLS__: + JSON.stringify(config.define?.__VUE_PROD_DEVTOOLS__) || 'false' }, ssr: { external: ['vue', '@vue/server-renderer']