diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts
index 2cc7341cad837..9b1a0bbf76509 100644
--- a/packages/next/src/build/webpack-config.ts
+++ b/packages/next/src/build/webpack-config.ts
@@ -903,13 +903,13 @@ export default async function getBaseWebpackConfig(
const mainFieldsPerCompiler: Record = {
[COMPILER_NAMES.server]: ['main', 'module'],
[COMPILER_NAMES.client]: ['browser', 'module', 'main'],
- [COMPILER_NAMES.edgeServer]: ['browser', 'module', 'main'],
+ [COMPILER_NAMES.edgeServer]: ['edge-light', 'browser', 'module', 'main'],
}
const reactDir = path.dirname(require.resolve('react/package.json'))
const reactDomDir = path.dirname(require.resolve('react-dom/package.json'))
- const resolveConfig = {
+ const resolveConfig: webpack.Configuration['resolve'] = {
// Disable .mjs for node_modules bundling
extensions: isNodeServer
? ['.js', '.mjs', '.tsx', '.ts', '.jsx', '.json', '.wasm']
@@ -1022,6 +1022,7 @@ export default async function getBaseWebpackConfig(
}
: undefined),
mainFields: mainFieldsPerCompiler[compilerType],
+ ...(isEdgeServer && { conditionNames: ['edge-light', 'import', 'node'] }),
plugins: [],
}
@@ -1723,7 +1724,13 @@ export default async function getBaseWebpackConfig(
return true
},
resolve: {
- conditionNames: ['react-server', 'node', 'import', 'require'],
+ conditionNames: [
+ 'react-server',
+ ...(!isEdgeServer ? [] : ['edge-light']),
+ 'node',
+ 'import',
+ 'require',
+ ],
alias: {
// If missing the alias override here, the default alias will be used which aliases
// react to the direct file path, not the package name. In that case the condition
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/app-dir/page.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/app-dir/page.js
new file mode 100644
index 0000000000000..e3987339c6b12
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/app-dir/page.js
@@ -0,0 +1,12 @@
+import edgeLightPackage from 'my-edge-light-package'
+import edgeLightPackageExports from 'my-edge-light-package-exports'
+
+export const runtime = 'edge'
+
+export default function AppDirPage() {
+ return (
+
+ {JSON.stringify({ edgeLightPackage, edgeLightPackageExports }, null, 2)}
+
+ )
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/layout.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/layout.js
new file mode 100644
index 0000000000000..6d7e1ed585862
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/app/layout.js
@@ -0,0 +1,8 @@
+export default function RootLayout({ children }) {
+ return (
+
+
+
{children}
+
+ )
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts
new file mode 100644
index 0000000000000..b611fcc722147
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts
@@ -0,0 +1,49 @@
+import { createNextDescribe } from 'e2e-utils'
+
+createNextDescribe(
+ 'edge-runtime uses edge-light import specifier for packages',
+ {
+ files: __dirname,
+ packageJson: {
+ scripts: {
+ setup: 'cp -r ./node_modules_bak/* ./node_modules',
+ build: 'yarn setup && next build',
+ dev: 'yarn setup && next dev',
+ start: 'next start',
+ },
+ },
+ installCommand: 'yarn',
+ startCommand: (global as any).isNextDev ? 'yarn dev' : 'yarn start',
+ buildCommand: 'yarn build',
+ skipDeployment: true,
+ },
+ ({ next }) => {
+ // In case you need to test the response object
+ it('pages/api endpoints import the correct module', async () => {
+ const res = await next.fetch('/api/edge')
+ const html = await res.json()
+ expect(html).toEqual({
+ edgeLightPackage: 'edge-light',
+ edgeLightPackageExports: 'edge-light',
+ })
+ })
+
+ it('pages import the correct module', async () => {
+ const $ = await next.render$('/')
+ const text = JSON.parse($('pre#result').text())
+ expect(text).toEqual({
+ edgeLightPackage: 'edge-light',
+ edgeLightPackageExports: 'edge-light',
+ })
+ })
+
+ it('app-dir imports the correct module', async () => {
+ const $ = await next.render$('/app-dir')
+ const text = JSON.parse($('pre#result').text())
+ expect(text).toEqual({
+ edgeLightPackage: 'edge-light',
+ edgeLightPackageExports: 'edge-light',
+ })
+ })
+ }
+)
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/next.config.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/next.config.js
new file mode 100644
index 0000000000000..cfa3ac3d7aa94
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/next.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ experimental: {
+ appDir: true,
+ },
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/edge-light.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/edge-light.js
new file mode 100644
index 0000000000000..0cc6ebe9ad550
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/edge-light.js
@@ -0,0 +1 @@
+export default 'edge-light'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/import.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/import.js
new file mode 100644
index 0000000000000..b4dd8a6c96d5f
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/import.js
@@ -0,0 +1 @@
+export default 'import'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/package.json b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/package.json
new file mode 100644
index 0000000000000..2efc88f080b74
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "my-edge-light-package-exports",
+ "main": "./require.js",
+ "exports": {
+ "edge-light": "./edge-light.js",
+ "require": "./require.js",
+ "import": "./import.js"
+ }
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/require.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/require.js
new file mode 100644
index 0000000000000..67b9a8353c0b1
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package-exports/require.js
@@ -0,0 +1 @@
+module.exports = 'require'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/edge-light.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/edge-light.js
new file mode 100644
index 0000000000000..0cc6ebe9ad550
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/edge-light.js
@@ -0,0 +1 @@
+export default 'edge-light'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/import.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/import.js
new file mode 100644
index 0000000000000..b4dd8a6c96d5f
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/import.js
@@ -0,0 +1 @@
+export default 'import'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/package.json b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/package.json
new file mode 100644
index 0000000000000..766d89b595ffc
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "my-edge-light-package",
+ "main": "./require.js",
+ "module": "./import.js",
+ "edge-light": "./edge-light.js"
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/require.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/require.js
new file mode 100644
index 0000000000000..67b9a8353c0b1
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules/my-edge-light-package/require.js
@@ -0,0 +1 @@
+module.exports = 'require'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/edge-light.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/edge-light.js
new file mode 100644
index 0000000000000..0cc6ebe9ad550
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/edge-light.js
@@ -0,0 +1 @@
+export default 'edge-light'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/import.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/import.js
new file mode 100644
index 0000000000000..b4dd8a6c96d5f
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/import.js
@@ -0,0 +1 @@
+export default 'import'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/package.json b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/package.json
new file mode 100644
index 0000000000000..2efc88f080b74
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "my-edge-light-package-exports",
+ "main": "./require.js",
+ "exports": {
+ "edge-light": "./edge-light.js",
+ "require": "./require.js",
+ "import": "./import.js"
+ }
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/require.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/require.js
new file mode 100644
index 0000000000000..67b9a8353c0b1
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package-exports/require.js
@@ -0,0 +1 @@
+module.exports = 'require'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/edge-light.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/edge-light.js
new file mode 100644
index 0000000000000..0cc6ebe9ad550
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/edge-light.js
@@ -0,0 +1 @@
+export default 'edge-light'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/import.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/import.js
new file mode 100644
index 0000000000000..b4dd8a6c96d5f
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/import.js
@@ -0,0 +1 @@
+export default 'import'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/package.json b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/package.json
new file mode 100644
index 0000000000000..766d89b595ffc
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "my-edge-light-package",
+ "main": "./require.js",
+ "module": "./import.js",
+ "edge-light": "./edge-light.js"
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/require.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/require.js
new file mode 100644
index 0000000000000..67b9a8353c0b1
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/node_modules_bak/my-edge-light-package/require.js
@@ -0,0 +1 @@
+module.exports = 'require'
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/api/edge.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/api/edge.js
new file mode 100644
index 0000000000000..531d4a9d46ee1
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/api/edge.js
@@ -0,0 +1,12 @@
+import edgeLightPackage from 'my-edge-light-package'
+import edgeLightPackageExports from 'my-edge-light-package-exports'
+import { NextResponse } from 'next/server'
+
+export const config = { runtime: 'edge' }
+
+export default function MyEdgeFunction() {
+ return NextResponse.json({
+ edgeLightPackage,
+ edgeLightPackageExports,
+ })
+}
diff --git a/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/index.js b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/index.js
new file mode 100644
index 0000000000000..81d7434c2fd6a
--- /dev/null
+++ b/test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/pages/index.js
@@ -0,0 +1,12 @@
+import edgeLightPackage from 'my-edge-light-package'
+import edgeLightPackageExports from 'my-edge-light-package-exports'
+
+export const config = { runtime: 'experimental-edge' }
+
+export default function Index() {
+ return (
+
+ {JSON.stringify({ edgeLightPackage, edgeLightPackageExports }, null, 2)}
+
+ )
+}