From ec8b4206ac3650eb5e4b54fe795258d09a86e9e4 Mon Sep 17 00:00:00 2001 From: Senao <48955231+XiSenao@users.noreply.github.com> Date: Thu, 18 Jan 2024 20:23:00 +0800 Subject: [PATCH] fix: handle namespace import and dynamic import interop consistently (#15619) --- packages/vite/src/node/__tests__/plugins/import.spec.ts | 2 +- packages/vite/src/node/plugins/importAnalysis.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts index 679d5bdb3d0a38..764b1ab3d187b0 100644 --- a/packages/vite/src/node/__tests__/plugins/import.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts @@ -74,7 +74,7 @@ describe('transformCjsImport', () => { ), ).toBe( 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - 'const react = __vite__cjsImport0_react', + `const react = ((m) => m?.__esModule ? m : { ...typeof m === "object" && !Array.isArray(m) ? m : {}, default: m })(__vite__cjsImport0_react)`, ) }) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index a5e05542eb6ce9..cb2511c7d2ed21 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -847,6 +847,8 @@ export function createParseErrorInfo( showCodeFrame: !probablyBinary, } } +// prettier-ignore +const interopHelper = (m: any) => m?.__esModule ? m : { ...(typeof m === 'object' && !Array.isArray(m) ? m : {}), default: m } export function interopNamedImports( str: MagicString, @@ -870,7 +872,7 @@ export function interopNamedImports( str.overwrite( expStart, expEnd, - `import('${rewrittenUrl}').then(m => m.default && m.default.__esModule ? m.default : ({ ...m.default, default: m.default }))` + + `import('${rewrittenUrl}').then(m => (${interopHelper.toString()})(m.default))` + getLineBreaks(exp), { contentOnly: true }, ) @@ -1006,7 +1008,9 @@ export function transformCjsImport( const lines: string[] = [`import ${cjsModuleName} from "${url}"`] importNames.forEach(({ importedName, localName }) => { if (importedName === '*') { - lines.push(`const ${localName} = ${cjsModuleName}`) + lines.push( + `const ${localName} = (${interopHelper.toString()})(${cjsModuleName})`, + ) } else if (importedName === 'default') { lines.push( `const ${localName} = ${cjsModuleName}.__esModule ? ${cjsModuleName}.default : ${cjsModuleName}`,