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)}
+    
+ ) +}