From 29afc3c5a89d1ac7f6a0f080559074f56a33da7b Mon Sep 17 00:00:00 2001
From: FinalAshen <819712530@qq.com>
Date: Tue, 16 Apr 2024 17:43:07 +0800
Subject: [PATCH 1/4] fix: default imported interop is synchronized with rollup
---
packages/vite/src/node/__tests__/plugins/import.spec.ts | 8 ++++----
packages/vite/src/node/plugins/importAnalysis.ts | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts
index fb9ae3b132325c..7a6197ec285338 100644
--- a/packages/vite/src/node/__tests__/plugins/import.spec.ts
+++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts
@@ -44,7 +44,7 @@ describe('transformCjsImport', () => {
),
).toBe(
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
- 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react',
+ 'const React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react',
)
expect(
@@ -58,7 +58,7 @@ describe('transformCjsImport', () => {
),
).toBe(
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
- 'const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react',
+ 'const React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react',
)
})
@@ -154,7 +154,7 @@ describe('transformCjsImport', () => {
),
).toBe(
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
- 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
+ 'const __vite__cjsExportDefault_0 = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
'export default __vite__cjsExportDefault_0',
)
@@ -169,7 +169,7 @@ describe('transformCjsImport', () => {
),
).toBe(
'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' +
- 'const __vite__cjsExport_React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
+ 'const __vite__cjsExport_React = __vite__cjsImport0_react.__esModule && Object.prototype.hasOwnProperty.call(__vite__cjsImport0_react, "default") ? __vite__cjsImport0_react.default : __vite__cjsImport0_react; ' +
'export { __vite__cjsExport_React as React }',
)
diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts
index a4c1b9fd38a033..77516e131e66c6 100644
--- a/packages/vite/src/node/plugins/importAnalysis.ts
+++ b/packages/vite/src/node/plugins/importAnalysis.ts
@@ -1010,7 +1010,7 @@ export function transformCjsImport(
)
} else if (importedName === 'default') {
lines.push(
- `const ${localName} = ${cjsModuleName}.__esModule ? ${cjsModuleName}.default : ${cjsModuleName}`,
+ `const ${localName} = ${cjsModuleName}.__esModule && Object.prototype.hasOwnProperty.call(${cjsModuleName}, "default") ? ${cjsModuleName}.default : ${cjsModuleName}`,
)
} else {
lines.push(`const ${localName} = ${cjsModuleName}["${importedName}"]`)
From 88c5039a25ff3e25b431ae83cdaf12497545460f Mon Sep 17 00:00:00 2001
From: FinalAshen <819712530@qq.com>
Date: Thu, 18 Apr 2024 13:54:09 +0800
Subject: [PATCH 2/4] chore: add default import to cjs module with esmodule tag
---
playground/optimize-deps/cjs.js | 5 +++--
.../optimize-deps/dep-cjs-with-es-module/index.js | 4 ++++
.../optimize-deps/dep-cjs-with-es-module/package.json | 5 +++++
playground/optimize-deps/index.html | 2 ++
playground/optimize-deps/package.json | 1 +
playground/optimize-deps/vite.config.js | 1 +
pnpm-lock.yaml | 10 ++++++++++
7 files changed, 26 insertions(+), 2 deletions(-)
create mode 100644 playground/optimize-deps/dep-cjs-with-es-module/index.js
create mode 100644 playground/optimize-deps/dep-cjs-with-es-module/package.json
diff --git a/playground/optimize-deps/cjs.js b/playground/optimize-deps/cjs.js
index ba3e0aa783e69c..ee46b971feef01 100644
--- a/playground/optimize-deps/cjs.js
+++ b/playground/optimize-deps/cjs.js
@@ -5,8 +5,7 @@ import React, { useState } from 'react'
import ReactDOM from 'react-dom/client'
import { Socket } from 'phoenix'
import clip from 'clipboard'
-
-// Test exporting a name that was already imported
+import m from '@vitejs/test-dep-cjs-with-es-module'
export { useState } from 'react'
export { useState as anotherNameForUseState } from 'react'
export { default as React } from 'react'
@@ -19,6 +18,8 @@ if (typeof Socket === 'function') {
text('.cjs-phoenix', 'ok')
}
+text('.cjs-with-es-module', m.info)
+
function App() {
const [count, setCount] = useState(0)
diff --git a/playground/optimize-deps/dep-cjs-with-es-module/index.js b/playground/optimize-deps/dep-cjs-with-es-module/index.js
new file mode 100644
index 00000000000000..4b006a74d82270
--- /dev/null
+++ b/playground/optimize-deps/dep-cjs-with-es-module/index.js
@@ -0,0 +1,4 @@
+module.exports = {
+ __esModule: true,
+ info: 'ok',
+}
diff --git a/playground/optimize-deps/dep-cjs-with-es-module/package.json b/playground/optimize-deps/dep-cjs-with-es-module/package.json
new file mode 100644
index 00000000000000..92c9aecb49513b
--- /dev/null
+++ b/playground/optimize-deps/dep-cjs-with-es-module/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "@vitejs/test-dep-cjs-with-es-module",
+ "version": "1.0.0",
+ "main": "index.js"
+}
diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html
index 9b992b7dd4892a..d969f0b72e4085 100644
--- a/playground/optimize-deps/index.html
+++ b/playground/optimize-deps/index.html
@@ -6,6 +6,8 @@
CommonJS w/ named imports (phoenix)
fail
CommonJS w/ default export (clipboard)
fail
+CommonJS w/ default export (dep-cjs-with-es-module)
+fail
diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json
index e5f8d8a22dfcef..adfe81194a9ced 100644
--- a/playground/optimize-deps/package.json
+++ b/playground/optimize-deps/package.json
@@ -36,6 +36,7 @@
"@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule",
"@vitejs/test-dep-non-optimized": "file:./dep-non-optimized",
"@vitejs/test-added-in-entries": "file:./added-in-entries",
+ "@vitejs/test-dep-cjs-with-es-module": "file:./dep-cjs-with-es-module",
"lodash-es": "^4.17.21",
"@vitejs/test-nested-exclude": "file:./nested-exclude",
"phoenix": "^1.7.11",
diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js
index a2c2fdf3c6d5e7..c8f6ee103b801e 100644
--- a/playground/optimize-deps/vite.config.js
+++ b/playground/optimize-deps/vite.config.js
@@ -22,6 +22,7 @@ export default defineConfig({
'@vitejs/test-dep-optimize-exports-with-glob/**/*',
'@vitejs/test-dep-optimize-exports-with-root-glob/**/*.js',
'@vitejs/test-dep-optimize-with-glob/**/*.js',
+ '@vitejs/test-dep-cjs-with-es-module',
],
exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'],
esbuildOptions: {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 603da0897e4f80..57c33046da9e5f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -906,6 +906,9 @@ importers:
'@vitejs/test-dep-cjs-with-assets':
specifier: file:./dep-cjs-with-assets
version: file:playground/optimize-deps/dep-cjs-with-assets
+ '@vitejs/test-dep-cjs-with-es-module':
+ specifier: file:./dep-cjs-with-es-module
+ version: file:playground/optimize-deps/dep-cjs-with-es-module
'@vitejs/test-dep-css-require':
specifier: file:./dep-css-require
version: file:playground/optimize-deps/dep-css-require
@@ -1027,6 +1030,8 @@ importers:
playground/optimize-deps/dep-cjs-with-assets: {}
+ playground/optimize-deps/dep-cjs-with-es-module: {}
+
playground/optimize-deps/dep-css-require: {}
playground/optimize-deps/dep-esbuild-plugin-transform: {}
@@ -10572,6 +10577,11 @@ packages:
name: '@vitejs/test-dep-cjs-with-assets'
dev: false
+ file:playground/optimize-deps/dep-cjs-with-es-module:
+ resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module, type: directory}
+ name: '@vitejs/test-dep-cjs-with-es-module'
+ dev: false
+
file:playground/optimize-deps/dep-css-require:
resolution: {directory: playground/optimize-deps/dep-css-require, type: directory}
name: '@vitejs/test-dep-css-require'
From 25908a55ce2b81bf939792a04a8c3853f885dea0 Mon Sep 17 00:00:00 2001
From: FinalAshen <819712530@qq.com>
Date: Thu, 18 Apr 2024 13:58:45 +0800
Subject: [PATCH 3/4] fix: add namespace import and dynamic import scenarios
---
packages/vite/src/node/plugins/importAnalysis.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts
index 77516e131e66c6..99b630823ae84c 100644
--- a/packages/vite/src/node/plugins/importAnalysis.ts
+++ b/packages/vite/src/node/plugins/importAnalysis.ts
@@ -845,7 +845,7 @@ export function createParseErrorInfo(
}
}
// prettier-ignore
-const interopHelper = (m: any) => m?.__esModule ? m : { ...(typeof m === 'object' && !Array.isArray(m) || typeof m === 'function' ? m : {}), default: m }
+const interopHelper = (m: any) => m?.__esModule && Object.prototype.hasOwnProperty.call(m, 'default') ? m : { ...(typeof m === 'object' && !Array.isArray(m) || typeof m === 'function' ? m : {}), default: m }
export function interopNamedImports(
str: MagicString,
From aeaf129312c94b2d87f3f06c0dbcc5a140111527 Mon Sep 17 00:00:00 2001
From: FinalAshen <819712530@qq.com>
Date: Thu, 18 Apr 2024 14:19:01 +0800
Subject: [PATCH 4/4] chore: add dynamic import test
---
.../vite/src/node/__tests__/plugins/import.spec.ts | 2 +-
playground/optimize-deps/cjs-dynamic.js | 9 +++++++++
playground/optimize-deps/cjs.js | 5 +++--
.../index.js | 0
.../dep-cjs-with-es-module-flag/package.json | 5 +++++
.../dep-cjs-with-es-module/package.json | 5 -----
playground/optimize-deps/index.html | 6 ++++--
playground/optimize-deps/package.json | 2 +-
playground/optimize-deps/vite.config.js | 2 +-
pnpm-lock.yaml | 14 +++++++-------
10 files changed, 31 insertions(+), 19 deletions(-)
rename playground/optimize-deps/{dep-cjs-with-es-module => dep-cjs-with-es-module-flag}/index.js (100%)
create mode 100644 playground/optimize-deps/dep-cjs-with-es-module-flag/package.json
delete mode 100644 playground/optimize-deps/dep-cjs-with-es-module/package.json
diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts
index 7a6197ec285338..38349ad2f59274 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 = ((m) => m?.__esModule ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`,
+ `const react = ((m) => m?.__esModule && Object.prototype.hasOwnProperty.call(m, "default") ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`,
)
})
diff --git a/playground/optimize-deps/cjs-dynamic.js b/playground/optimize-deps/cjs-dynamic.js
index b75e4c2d0ba118..aa2585cc1b3647 100644
--- a/playground/optimize-deps/cjs-dynamic.js
+++ b/playground/optimize-deps/cjs-dynamic.js
@@ -28,6 +28,15 @@
text('.cjs-dynamic-dep-cjs-compiled-from-cjs', 'ok')
}
+ const cjsWithEsModuleTag = await import(
+ '@vitejs/test-dep-cjs-with-es-module-flag'
+ )
+ console.log('cjsWithEsModuleTag', cjsWithEsModuleTag)
+ text(
+ '.cjs-dynamic-dep-cjs-with-es-module-flag',
+ cjsWithEsModuleTag.default.info,
+ )
+
function App() {
const [count, setCount] = useState(0)
diff --git a/playground/optimize-deps/cjs.js b/playground/optimize-deps/cjs.js
index ee46b971feef01..5d24ac52affe6e 100644
--- a/playground/optimize-deps/cjs.js
+++ b/playground/optimize-deps/cjs.js
@@ -5,7 +5,8 @@ import React, { useState } from 'react'
import ReactDOM from 'react-dom/client'
import { Socket } from 'phoenix'
import clip from 'clipboard'
-import m from '@vitejs/test-dep-cjs-with-es-module'
+import m from '@vitejs/test-dep-cjs-with-es-module-flag'
+// Test exporting a name that was already imported
export { useState } from 'react'
export { useState as anotherNameForUseState } from 'react'
export { default as React } from 'react'
@@ -18,7 +19,7 @@ if (typeof Socket === 'function') {
text('.cjs-phoenix', 'ok')
}
-text('.cjs-with-es-module', m.info)
+text('.cjs-with-es-module-flag', m.info)
function App() {
const [count, setCount] = useState(0)
diff --git a/playground/optimize-deps/dep-cjs-with-es-module/index.js b/playground/optimize-deps/dep-cjs-with-es-module-flag/index.js
similarity index 100%
rename from playground/optimize-deps/dep-cjs-with-es-module/index.js
rename to playground/optimize-deps/dep-cjs-with-es-module-flag/index.js
diff --git a/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json b/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json
new file mode 100644
index 00000000000000..d17358e7152afe
--- /dev/null
+++ b/playground/optimize-deps/dep-cjs-with-es-module-flag/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "@vitejs/test-dep-cjs-with-es-module-flag",
+ "version": "1.0.0",
+ "main": "index.js"
+}
diff --git a/playground/optimize-deps/dep-cjs-with-es-module/package.json b/playground/optimize-deps/dep-cjs-with-es-module/package.json
deleted file mode 100644
index 92c9aecb49513b..00000000000000
--- a/playground/optimize-deps/dep-cjs-with-es-module/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "@vitejs/test-dep-cjs-with-es-module",
- "version": "1.0.0",
- "main": "index.js"
-}
diff --git a/playground/optimize-deps/index.html b/playground/optimize-deps/index.html
index d969f0b72e4085..01bf85354694fc 100644
--- a/playground/optimize-deps/index.html
+++ b/playground/optimize-deps/index.html
@@ -6,8 +6,8 @@ CommonJS w/ named imports (phoenix)
fail
CommonJS w/ default export (clipboard)
fail
-CommonJS w/ default export (dep-cjs-with-es-module)
-fail
+CommonJS w/ default export (dep-cjs-with-es-module-flag)
+fail
@@ -21,6 +21,8 @@ CommonJS dynamic import default (dep-cjs-compiled-from-esm)
CommonJS dynamic import default (dep-cjs-compiled-from-cjs)
+CommonJS dynamic import default (dep-cjs-with-es-module-flag)
+
diff --git a/playground/optimize-deps/package.json b/playground/optimize-deps/package.json
index adfe81194a9ced..967e7bd8ecb93d 100644
--- a/playground/optimize-deps/package.json
+++ b/playground/optimize-deps/package.json
@@ -36,7 +36,7 @@
"@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule",
"@vitejs/test-dep-non-optimized": "file:./dep-non-optimized",
"@vitejs/test-added-in-entries": "file:./added-in-entries",
- "@vitejs/test-dep-cjs-with-es-module": "file:./dep-cjs-with-es-module",
+ "@vitejs/test-dep-cjs-with-es-module-flag": "file:./dep-cjs-with-es-module-flag",
"lodash-es": "^4.17.21",
"@vitejs/test-nested-exclude": "file:./nested-exclude",
"phoenix": "^1.7.11",
diff --git a/playground/optimize-deps/vite.config.js b/playground/optimize-deps/vite.config.js
index c8f6ee103b801e..c717db43324e32 100644
--- a/playground/optimize-deps/vite.config.js
+++ b/playground/optimize-deps/vite.config.js
@@ -22,7 +22,7 @@ export default defineConfig({
'@vitejs/test-dep-optimize-exports-with-glob/**/*',
'@vitejs/test-dep-optimize-exports-with-root-glob/**/*.js',
'@vitejs/test-dep-optimize-with-glob/**/*.js',
- '@vitejs/test-dep-cjs-with-es-module',
+ '@vitejs/test-dep-cjs-with-es-module-flag',
],
exclude: ['@vitejs/test-nested-exclude', '@vitejs/test-dep-non-optimized'],
esbuildOptions: {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 57c33046da9e5f..d90ce26caca168 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -906,9 +906,9 @@ importers:
'@vitejs/test-dep-cjs-with-assets':
specifier: file:./dep-cjs-with-assets
version: file:playground/optimize-deps/dep-cjs-with-assets
- '@vitejs/test-dep-cjs-with-es-module':
- specifier: file:./dep-cjs-with-es-module
- version: file:playground/optimize-deps/dep-cjs-with-es-module
+ '@vitejs/test-dep-cjs-with-es-module-flag':
+ specifier: file:./dep-cjs-with-es-module-flag
+ version: file:playground/optimize-deps/dep-cjs-with-es-module-flag
'@vitejs/test-dep-css-require':
specifier: file:./dep-css-require
version: file:playground/optimize-deps/dep-css-require
@@ -1030,7 +1030,7 @@ importers:
playground/optimize-deps/dep-cjs-with-assets: {}
- playground/optimize-deps/dep-cjs-with-es-module: {}
+ playground/optimize-deps/dep-cjs-with-es-module-flag: {}
playground/optimize-deps/dep-css-require: {}
@@ -10577,9 +10577,9 @@ packages:
name: '@vitejs/test-dep-cjs-with-assets'
dev: false
- file:playground/optimize-deps/dep-cjs-with-es-module:
- resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module, type: directory}
- name: '@vitejs/test-dep-cjs-with-es-module'
+ file:playground/optimize-deps/dep-cjs-with-es-module-flag:
+ resolution: {directory: playground/optimize-deps/dep-cjs-with-es-module-flag, type: directory}
+ name: '@vitejs/test-dep-cjs-with-es-module-flag'
dev: false
file:playground/optimize-deps/dep-css-require: