diff --git a/crates/next-core/src/next_edge/context.rs b/crates/next-core/src/next_edge/context.rs
index 12342c26300a7..2b5c06ced3b0d 100644
--- a/crates/next-core/src/next_edge/context.rs
+++ b/crates/next-core/src/next_edge/context.rs
@@ -153,9 +153,9 @@ pub async fn get_edge_resolve_options_context(
custom_conditions.push(rcstr!("react-server"));
};
- if *next_config.enable_cache_components().await? {
- custom_conditions.push(rcstr!("next-js"));
- };
+ // Edge runtime is disabled for projects with Cache Components enabled except for Middleware
+ // but Middleware doesn't have all Next.js APIs so we omit the "next-js" condition for all edge
+ // entrypoints
let resolve_options_context = ResolveOptionsContext {
enable_node_modules: Some(project_path.root().owned().await?),
diff --git a/crates/next-core/src/next_server/context.rs b/crates/next-core/src/next_server/context.rs
index e1aef0c2c098b..02c455dfef2ce 100644
--- a/crates/next-core/src/next_server/context.rs
+++ b/crates/next-core/src/next_server/context.rs
@@ -214,7 +214,10 @@ pub async fn get_server_resolve_options_context(
custom_conditions.push(rcstr!("react-server"));
};
- if *next_config.enable_cache_components().await? {
+ if *next_config.enable_cache_components().await?
+ // Middleware shouldn't use the "next-js" condition because it doesn't have all Next.js APIs available
+ && !matches!(ty, ServerContextType::Middleware { .. } | ServerContextType::Instrumentation { .. })
+ {
custom_conditions.push(rcstr!("next-js"));
};
diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts
index ebd05ad02c99d..a2692d5123b93 100644
--- a/packages/next/src/build/webpack-config.ts
+++ b/packages/next/src/build/webpack-config.ts
@@ -687,7 +687,6 @@ export default async function getBaseWebpackConfig(
: distDir
const conditionNames = [
- ...(config.cacheComponents === true ? ['next-js'] : []),
...(isEdgeServer ? [edgeConditionName] : []),
// inherits Webpack's default conditions
'...',
@@ -1389,6 +1388,17 @@ export default async function getBaseWebpackConfig(
},
module: {
rules: [
+ {
+ issuerLayer: {
+ not: [WEBPACK_LAYERS.middleware, WEBPACK_LAYERS.instrument],
+ },
+ resolve: {
+ conditionNames: [
+ config.cacheComponents ? 'next-js' : '',
+ '...',
+ ].filter(Boolean) as string[],
+ },
+ },
// Alias server-only and client-only to proper exports based on bundling layers
{
issuerLayer: {
diff --git a/test/e2e/app-dir/next-condition/.gitignore b/test/e2e/app-dir/next-condition/fixtures/instrumentation/.gitignore
similarity index 100%
rename from test/e2e/app-dir/next-condition/.gitignore
rename to test/e2e/app-dir/next-condition/fixtures/instrumentation/.gitignore
diff --git a/test/e2e/app-dir/next-condition/app/layout.tsx b/test/e2e/app-dir/next-condition/fixtures/instrumentation/app/layout.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/layout.tsx
rename to test/e2e/app-dir/next-condition/fixtures/instrumentation/app/layout.tsx
diff --git a/test/e2e/app-dir/next-condition/fixtures/instrumentation/app/page.tsx b/test/e2e/app-dir/next-condition/fixtures/instrumentation/app/page.tsx
new file mode 100644
index 0000000000000..0bd21c5bac776
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/instrumentation/app/page.tsx
@@ -0,0 +1,3 @@
+export default function Page() {
+ return
Hello World
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/instrumentation/instrumentation.ts b/test/e2e/app-dir/next-condition/fixtures/instrumentation/instrumentation.ts
new file mode 100644
index 0000000000000..ac9e3181d1eb2
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/instrumentation/instrumentation.ts
@@ -0,0 +1,13 @@
+import CJSExportsDefault from 'my-cjs-package/exports'
+import ExternalCJSExportsDefault from 'my-external-cjs-package/exports'
+import ESMExportsDefault from 'my-esm-package/exports'
+import ExternalESMExportsDefault from 'my-external-esm-package/exports'
+
+export function register() {
+ console.log('==== REGISTER START ====')
+ console.log('CJSExportsDefault:', CJSExportsDefault)
+ console.log('ExternalCJSExportsDefault:', ExternalCJSExportsDefault)
+ console.log('ESMExportsDefault:', ESMExportsDefault)
+ console.log('ExternalESMExportsDefault:', ExternalESMExportsDefault)
+ console.log('==== REGISTER END ====')
+}
diff --git a/test/e2e/app-dir/next-condition/next.config.js b/test/e2e/app-dir/next-condition/fixtures/instrumentation/next.config.js
similarity index 100%
rename from test/e2e/app-dir/next-condition/next.config.js
rename to test/e2e/app-dir/next-condition/fixtures/instrumentation/next.config.js
diff --git a/test/e2e/app-dir/next-condition/fixtures/instrumentation/package.json b/test/e2e/app-dir/next-condition/fixtures/instrumentation/package.json
new file mode 100644
index 0000000000000..16de853ca62c5
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/instrumentation/package.json
@@ -0,0 +1,8 @@
+{
+ "dependencies": {
+ "my-cjs-package": "file:./sym-linked-packages/my-cjs-package",
+ "my-esm-package": "file:./sym-linked-packages/my-esm-package",
+ "my-external-cjs-package": "file:./sym-linked-packages/my-external-cjs-package",
+ "my-external-esm-package": "file:./sym-linked-packages/my-external-esm-package"
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/packages.d.ts b/test/e2e/app-dir/next-condition/fixtures/instrumentation/packages.d.ts
similarity index 100%
rename from test/e2e/app-dir/next-condition/packages.d.ts
rename to test/e2e/app-dir/next-condition/fixtures/instrumentation/packages.d.ts
diff --git a/test/e2e/app-dir/next-condition/fixtures/instrumentation/sym-linked-packages b/test/e2e/app-dir/next-condition/fixtures/instrumentation/sym-linked-packages
new file mode 120000
index 0000000000000..4b727bf688972
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/instrumentation/sym-linked-packages
@@ -0,0 +1 @@
+../../packages
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/.gitignore b/test/e2e/app-dir/next-condition/fixtures/middleware/.gitignore
new file mode 100644
index 0000000000000..b512c09d47662
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/app/layout.tsx b/test/e2e/app-dir/next-condition/fixtures/middleware/app/layout.tsx
new file mode 100644
index 0000000000000..745e32b8a8d23
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/app/layout.tsx
@@ -0,0 +1,9 @@
+export default function Root({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/app/page.tsx b/test/e2e/app-dir/next-condition/fixtures/middleware/app/page.tsx
new file mode 100644
index 0000000000000..0bd21c5bac776
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/app/page.tsx
@@ -0,0 +1,3 @@
+export default function Page() {
+ return Hello World
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/middleware.ts b/test/e2e/app-dir/next-condition/fixtures/middleware/middleware.ts
new file mode 100644
index 0000000000000..1324ee01fc147
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/middleware.ts
@@ -0,0 +1,15 @@
+import CJSExportsDefault from 'my-cjs-package/exports'
+import ExternalCJSExportsDefault from 'my-external-cjs-package/exports'
+import ESMExportsDefault from 'my-esm-package/exports'
+import ExternalESMExportsDefault from 'my-external-esm-package/exports'
+
+export default async function proxy(req: Request) {
+ if (!req.url.includes('/_next/')) {
+ console.log('==== MIDDLEWARE START ====')
+ console.log('CJSExportsDefault:', CJSExportsDefault)
+ console.log('ExternalCJSExportsDefault:', ExternalCJSExportsDefault)
+ console.log('ESMExportsDefault:', ESMExportsDefault)
+ console.log('ExternalESMExportsDefault:', ExternalESMExportsDefault)
+ console.log('==== MIDDLEWARE END ====')
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/next.config.js b/test/e2e/app-dir/next-condition/fixtures/middleware/next.config.js
new file mode 100644
index 0000000000000..63e32c68184d3
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/next.config.js
@@ -0,0 +1,12 @@
+/**
+ * @type {import('next').NextConfig}
+ */
+
+const nextConfig = {
+ serverExternalPackages: [
+ 'my-external-esm-package',
+ 'my-external-cjs-package',
+ ],
+}
+
+module.exports = nextConfig
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/package.json b/test/e2e/app-dir/next-condition/fixtures/middleware/package.json
new file mode 100644
index 0000000000000..16de853ca62c5
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/package.json
@@ -0,0 +1,8 @@
+{
+ "dependencies": {
+ "my-cjs-package": "file:./sym-linked-packages/my-cjs-package",
+ "my-esm-package": "file:./sym-linked-packages/my-esm-package",
+ "my-external-cjs-package": "file:./sym-linked-packages/my-external-cjs-package",
+ "my-external-esm-package": "file:./sym-linked-packages/my-external-esm-package"
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/packages.d.ts b/test/e2e/app-dir/next-condition/fixtures/middleware/packages.d.ts
new file mode 100644
index 0000000000000..bca310dbe9fee
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/packages.d.ts
@@ -0,0 +1,8 @@
+declare module 'my-cjs-package/exports'
+declare module 'my-cjs-package/imports'
+declare module 'my-esm-package/exports'
+declare module 'my-esm-package/imports'
+declare module 'my-external-cjs-package/exports'
+declare module 'my-external-cjs-package/imports'
+declare module 'my-external-esm-package/exports'
+declare module 'my-external-esm-package/imports'
diff --git a/test/e2e/app-dir/next-condition/fixtures/middleware/sym-linked-packages b/test/e2e/app-dir/next-condition/fixtures/middleware/sym-linked-packages
new file mode 120000
index 0000000000000..4b727bf688972
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/middleware/sym-linked-packages
@@ -0,0 +1 @@
+../../packages
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/.gitignore b/test/e2e/app-dir/next-condition/fixtures/proxy/.gitignore
new file mode 100644
index 0000000000000..b512c09d47662
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/app/layout.tsx b/test/e2e/app-dir/next-condition/fixtures/proxy/app/layout.tsx
new file mode 100644
index 0000000000000..745e32b8a8d23
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/app/layout.tsx
@@ -0,0 +1,9 @@
+export default function Root({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/app/page.tsx b/test/e2e/app-dir/next-condition/fixtures/proxy/app/page.tsx
new file mode 100644
index 0000000000000..0bd21c5bac776
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/app/page.tsx
@@ -0,0 +1,3 @@
+export default function Page() {
+ return Hello World
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/next.config.js b/test/e2e/app-dir/next-condition/fixtures/proxy/next.config.js
new file mode 100644
index 0000000000000..63e32c68184d3
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/next.config.js
@@ -0,0 +1,12 @@
+/**
+ * @type {import('next').NextConfig}
+ */
+
+const nextConfig = {
+ serverExternalPackages: [
+ 'my-external-esm-package',
+ 'my-external-cjs-package',
+ ],
+}
+
+module.exports = nextConfig
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/package.json b/test/e2e/app-dir/next-condition/fixtures/proxy/package.json
new file mode 100644
index 0000000000000..16de853ca62c5
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/package.json
@@ -0,0 +1,8 @@
+{
+ "dependencies": {
+ "my-cjs-package": "file:./sym-linked-packages/my-cjs-package",
+ "my-esm-package": "file:./sym-linked-packages/my-esm-package",
+ "my-external-cjs-package": "file:./sym-linked-packages/my-external-cjs-package",
+ "my-external-esm-package": "file:./sym-linked-packages/my-external-esm-package"
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/packages.d.ts b/test/e2e/app-dir/next-condition/fixtures/proxy/packages.d.ts
new file mode 100644
index 0000000000000..bca310dbe9fee
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/packages.d.ts
@@ -0,0 +1,8 @@
+declare module 'my-cjs-package/exports'
+declare module 'my-cjs-package/imports'
+declare module 'my-esm-package/exports'
+declare module 'my-esm-package/imports'
+declare module 'my-external-cjs-package/exports'
+declare module 'my-external-cjs-package/imports'
+declare module 'my-external-esm-package/exports'
+declare module 'my-external-esm-package/imports'
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/proxy.ts b/test/e2e/app-dir/next-condition/fixtures/proxy/proxy.ts
new file mode 100644
index 0000000000000..1324ee01fc147
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/proxy.ts
@@ -0,0 +1,15 @@
+import CJSExportsDefault from 'my-cjs-package/exports'
+import ExternalCJSExportsDefault from 'my-external-cjs-package/exports'
+import ESMExportsDefault from 'my-esm-package/exports'
+import ExternalESMExportsDefault from 'my-external-esm-package/exports'
+
+export default async function proxy(req: Request) {
+ if (!req.url.includes('/_next/')) {
+ console.log('==== MIDDLEWARE START ====')
+ console.log('CJSExportsDefault:', CJSExportsDefault)
+ console.log('ExternalCJSExportsDefault:', ExternalCJSExportsDefault)
+ console.log('ESMExportsDefault:', ESMExportsDefault)
+ console.log('ExternalESMExportsDefault:', ExternalESMExportsDefault)
+ console.log('==== MIDDLEWARE END ====')
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/proxy/sym-linked-packages b/test/e2e/app-dir/next-condition/fixtures/proxy/sym-linked-packages
new file mode 120000
index 0000000000000..4b727bf688972
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/proxy/sym-linked-packages
@@ -0,0 +1 @@
+../../packages
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/.gitignore b/test/e2e/app-dir/next-condition/fixtures/render/.gitignore
new file mode 100644
index 0000000000000..b512c09d47662
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/.gitignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/app/cjs/client.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/cjs/client.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/cjs/client.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/cjs/client.tsx
diff --git a/test/e2e/app-dir/next-condition/app/cjs/page.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/cjs/page.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/cjs/page.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/cjs/page.tsx
diff --git a/test/e2e/app-dir/next-condition/app/esm/client.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/esm/client.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/esm/client.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/esm/client.tsx
diff --git a/test/e2e/app-dir/next-condition/app/esm/page.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/esm/page.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/esm/page.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/esm/page.tsx
diff --git a/test/e2e/app-dir/next-condition/app/external-cjs/client.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/external-cjs/client.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/external-cjs/client.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/external-cjs/client.tsx
diff --git a/test/e2e/app-dir/next-condition/app/external-cjs/page.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/external-cjs/page.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/external-cjs/page.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/external-cjs/page.tsx
diff --git a/test/e2e/app-dir/next-condition/app/external-esm/client.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/external-esm/client.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/external-esm/client.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/external-esm/client.tsx
diff --git a/test/e2e/app-dir/next-condition/app/external-esm/page.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/external-esm/page.tsx
similarity index 100%
rename from test/e2e/app-dir/next-condition/app/external-esm/page.tsx
rename to test/e2e/app-dir/next-condition/fixtures/render/app/external-esm/page.tsx
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/app/layout.tsx b/test/e2e/app-dir/next-condition/fixtures/render/app/layout.tsx
new file mode 100644
index 0000000000000..745e32b8a8d23
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/app/layout.tsx
@@ -0,0 +1,9 @@
+export default function Root({ children }: { children: React.ReactNode }) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/next.config.js b/test/e2e/app-dir/next-condition/fixtures/render/next.config.js
new file mode 100644
index 0000000000000..63e32c68184d3
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/next.config.js
@@ -0,0 +1,12 @@
+/**
+ * @type {import('next').NextConfig}
+ */
+
+const nextConfig = {
+ serverExternalPackages: [
+ 'my-external-esm-package',
+ 'my-external-cjs-package',
+ ],
+}
+
+module.exports = nextConfig
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/package.json b/test/e2e/app-dir/next-condition/fixtures/render/package.json
new file mode 100644
index 0000000000000..16de853ca62c5
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/package.json
@@ -0,0 +1,8 @@
+{
+ "dependencies": {
+ "my-cjs-package": "file:./sym-linked-packages/my-cjs-package",
+ "my-esm-package": "file:./sym-linked-packages/my-esm-package",
+ "my-external-cjs-package": "file:./sym-linked-packages/my-external-cjs-package",
+ "my-external-esm-package": "file:./sym-linked-packages/my-external-esm-package"
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/packages.d.ts b/test/e2e/app-dir/next-condition/fixtures/render/packages.d.ts
new file mode 100644
index 0000000000000..bca310dbe9fee
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/packages.d.ts
@@ -0,0 +1,8 @@
+declare module 'my-cjs-package/exports'
+declare module 'my-cjs-package/imports'
+declare module 'my-esm-package/exports'
+declare module 'my-esm-package/imports'
+declare module 'my-external-cjs-package/exports'
+declare module 'my-external-cjs-package/imports'
+declare module 'my-external-esm-package/exports'
+declare module 'my-external-esm-package/imports'
diff --git a/test/e2e/app-dir/next-condition/fixtures/render/sym-linked-packages b/test/e2e/app-dir/next-condition/fixtures/render/sym-linked-packages
new file mode 120000
index 0000000000000..4b727bf688972
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/fixtures/render/sym-linked-packages
@@ -0,0 +1 @@
+../../packages
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/next-condition.test.ts b/test/e2e/app-dir/next-condition/next-condition.test.ts
index 75b94dbcb28d6..88d3e4df990fa 100644
--- a/test/e2e/app-dir/next-condition/next-condition.test.ts
+++ b/test/e2e/app-dir/next-condition/next-condition.test.ts
@@ -1,9 +1,14 @@
-import { nextTestSetup } from 'e2e-utils'
+import { FileRef, nextTestSetup } from 'e2e-utils'
-describe('`next-js` Condition', () => {
+describe('`next-js` Condition - Rendering', () => {
const { next, isTurbopack, skipped } = nextTestSetup({
- files: __dirname,
- dependencies: require('./package.json').dependencies,
+ files: __dirname + '/fixtures/render',
+ // copy shared packages over to the test folder. This will override the symlink that currently
+ // exists in the fixture with relative paths
+ overrideFiles: {
+ 'sym-linked-packages': new FileRef(__dirname + '/packages'),
+ },
+ dependencies: require('./fixtures/render/package.json').dependencies,
// Deploy tests are broken with `config.serverExternalPackages`
skipDeployment: true,
})
@@ -618,6 +623,136 @@ describe('`next-js` Condition', () => {
}
})
+describe('`next-js` Condition - middleware (legacy)', () => {
+ const { next, skipped } = nextTestSetup({
+ files: __dirname + '/fixtures/middleware',
+ // copy shared packages over to the test folder. This will override the symlink that currently
+ // exists in the fixture with relative paths
+ overrideFiles: {
+ 'sym-linked-packages': new FileRef(__dirname + '/packages'),
+ },
+ dependencies: require('./fixtures/middleware/package.json').dependencies,
+ // Deploy tests are broken with `config.serverExternalPackages`
+ skipDeployment: true,
+ })
+
+ if (skipped) {
+ return
+ }
+
+ // Recommended for tests that check HTML. Cheerio is a HTML parser that has a jQuery like API.
+ describe('With or Without Cache Components', () => {
+ it('should follow the next-js condition from a bundled commonjs package', async () => {
+ let cliIndex = next.cliOutput.length
+ const $ = await next.render$('/')
+
+ const middlewareOutput = formatMiddlewareOutput(
+ next.cliOutput.slice(cliIndex)
+ )
+ expect(middlewareOutput).toMatchInlineSnapshot(`
+ "CJSExportsDefault: {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export'
+ }
+ ExternalCJSExportsDefault: {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export'
+ }
+ ESMExportsDefault: EXPORTS DEFAULT SERVER - Default Export
+ ExternalESMExportsDefault: EXPORTS DEFAULT SERVER - Default Export"
+ `)
+
+ const text = formatHtmlText($('main').html())
+ expect(text).toMatchInlineSnapshot(`"Hello World"`)
+ })
+ })
+})
+
+describe('`next-js` Condition - proxy', () => {
+ const { next, skipped } = nextTestSetup({
+ files: __dirname + '/fixtures/proxy',
+ // copy shared packages over to the test folder. This will override the symlink that currently
+ // exists in the fixture with relative paths
+ overrideFiles: {
+ 'sym-linked-packages': new FileRef(__dirname + '/packages'),
+ },
+ dependencies: require('./fixtures/proxy/package.json').dependencies,
+ // Deploy tests are broken with `config.serverExternalPackages`
+ skipDeployment: true,
+ })
+
+ if (skipped) {
+ return
+ }
+
+ // Recommended for tests that check HTML. Cheerio is a HTML parser that has a jQuery like API.
+ describe('With or Without Cache Components', () => {
+ it('should follow the next-js condition from a bundled commonjs package', async () => {
+ let cliIndex = next.cliOutput.length
+ const $ = await next.render$('/')
+
+ const middlewareOutput = formatMiddlewareOutput(
+ next.cliOutput.slice(cliIndex)
+ )
+ expect(middlewareOutput).toMatchInlineSnapshot(`
+ "CJSExportsDefault: {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export'
+ }
+ ExternalCJSExportsDefault: {
+ default: 'EXPORTS DEFAULT CLIENT - Default Export',
+ named: 'EXPORTS DEFAULT CLIENT - Named Export'
+ }
+ ESMExportsDefault: EXPORTS DEFAULT SERVER - Default Export
+ ExternalESMExportsDefault: EXPORTS DEFAULT CLIENT - Default Export"
+ `)
+
+ const text = formatHtmlText($('main').html())
+ expect(text).toMatchInlineSnapshot(`"Hello World"`)
+ })
+ })
+})
+
+describe('`next-js` Condition - instrumentation', () => {
+ const { next, skipped } = nextTestSetup({
+ files: __dirname + '/fixtures/instrumentation',
+ // copy shared packages over to the test folder. This will override the symlink that currently
+ // exists in the fixture with relative paths
+ overrideFiles: {
+ 'sym-linked-packages': new FileRef(__dirname + '/packages'),
+ },
+ dependencies: require('./fixtures/instrumentation/package.json')
+ .dependencies,
+ // Deploy tests are broken with `config.serverExternalPackages`
+ skipDeployment: true,
+ })
+
+ if (skipped) {
+ return
+ }
+
+ // Recommended for tests that check HTML. Cheerio is a HTML parser that has a jQuery like API.
+ describe('With or Without Cache Components', () => {
+ it('should not follow the next-js condition inside instrumentation', async () => {
+ // We need a request to trigger the server start in start tests
+ await next.render$('/')
+ const registerOutput = formatRegisterOutput(next.cliOutput)
+ expect(registerOutput).toMatchInlineSnapshot(`
+ "CJSExportsDefault: {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export'
+ }
+ ExternalCJSExportsDefault: {
+ default: 'EXPORTS DEFAULT CLIENT - Default Export',
+ named: 'EXPORTS DEFAULT CLIENT - Named Export'
+ }
+ ESMExportsDefault: EXPORTS DEFAULT SERVER - Default Export
+ ExternalESMExportsDefault: EXPORTS DEFAULT CLIENT - Default Export"
+ `)
+ })
+ })
+})
+
/**
* produces more readable snapshots by stripping tags and auto formatting
*/
@@ -645,3 +780,19 @@ function formatHtmlText(html) {
.filter(Boolean)
.join('\n')
}
+
+function formatMiddlewareOutput(cliOutput) {
+ return (
+ cliOutput.match(
+ /==== MIDDLEWARE START ====(.*?)==== MIDDLEWARE END ====/s
+ )?.[1] ?? ''
+ ).trim()
+}
+
+function formatRegisterOutput(cliOutput) {
+ return (
+ cliOutput.match(
+ /==== REGISTER START ====(.*?)==== REGISTER END ====/s
+ )?.[1] ?? ''
+ ).trim()
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.modules.yaml b/test/e2e/app-dir/next-condition/node_modules/.modules.yaml
new file mode 100644
index 0000000000000..9b25ff979ae94
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.modules.yaml
@@ -0,0 +1,23 @@
+hoistPattern:
+ - '*'
+hoistedDependencies: {}
+included:
+ dependencies: true
+ devDependencies: true
+ optionalDependencies: true
+injectedDeps: {}
+layoutVersion: 5
+nodeLinker: isolated
+packageManager: pnpm@9.6.0
+pendingBuilds: []
+prunedAt: Thu, 23 Oct 2025 19:32:10 GMT
+publicHoistPattern:
+ - '*eslint*'
+ - '*prettier*'
+registries:
+ '@vercel-private': https://vercel-private-registry.vercel.sh/registry
+ default: https://registry.npmjs.org/
+skipped: []
+storeDir: /Users/joshstory/Library/pnpm/store/v3
+virtualStoreDir: .pnpm
+virtualStoreDirMaxLength: 120
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/lock.yaml b/test/e2e/app-dir/next-condition/node_modules/.pnpm/lock.yaml
new file mode 100644
index 0000000000000..bade8f8fad3ae
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/lock.yaml
@@ -0,0 +1,43 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+ .:
+ dependencies:
+ my-cjs-package:
+ specifier: file:./packages/my-cjs-package
+ version: file:packages/my-cjs-package
+ my-esm-package:
+ specifier: file:./packages/my-esm-package
+ version: file:packages/my-esm-package
+ my-external-cjs-package:
+ specifier: file:./packages/my-external-cjs-package
+ version: file:packages/my-external-cjs-package
+ my-external-esm-package:
+ specifier: file:./packages/my-external-esm-package
+ version: file:packages/my-external-esm-package
+
+packages:
+ my-cjs-package@file:packages/my-cjs-package:
+ resolution: { directory: packages/my-cjs-package, type: directory }
+
+ my-esm-package@file:packages/my-esm-package:
+ resolution: { directory: packages/my-esm-package, type: directory }
+
+ my-external-cjs-package@file:packages/my-external-cjs-package:
+ resolution: { directory: packages/my-external-cjs-package, type: directory }
+
+ my-external-esm-package@file:packages/my-external-esm-package:
+ resolution: { directory: packages/my-external-esm-package, type: directory }
+
+snapshots:
+ my-cjs-package@file:packages/my-cjs-package: {}
+
+ my-esm-package@file:packages/my-esm-package: {}
+
+ my-external-cjs-package@file:packages/my-external-cjs-package: {}
+
+ my-external-esm-package@file:packages/my-external-esm-package: {}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/package.json b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/package.json
new file mode 100644
index 0000000000000..59ae7f848094b
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "my-cjs-package",
+ "version": "0.0.0",
+ "type": "commonjs",
+ "files": [
+ "src"
+ ],
+ "exports": {
+ "./exports": {
+ "next-js": {
+ "react-server": "./src/exports.next.server.cjs",
+ "default": "./src/exports.next.default.cjs"
+ },
+ "default": {
+ "react-server": "./src/exports.default.server.cjs",
+ "default": "./src/exports.default.default.cjs"
+ }
+ },
+ "./imports": "./src/imports.cjs"
+ },
+ "imports": {
+ "#imports": {
+ "next-js": {
+ "react-server": "./src/imports/imports.next.server.cjs",
+ "default": "./src/imports/imports.next.default.cjs"
+ },
+ "default": {
+ "react-server": "./src/imports/imports.default.server.cjs",
+ "default": "./src/imports/imports.default.default.cjs"
+ }
+ }
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.default.cjs
new file mode 100644
index 0000000000000..45a58cd833801
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS DEFAULT CLIENT - Default Export',
+ named: 'EXPORTS DEFAULT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.server.cjs
new file mode 100644
index 0000000000000..2d6f59ebbb894
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.default.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.default.cjs
new file mode 100644
index 0000000000000..fc69523910f80
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS NEXT CLIENT - Default Export',
+ named: 'EXPORTS NEXT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.server.cjs
new file mode 100644
index 0000000000000..4ad43ae403c56
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/exports.next.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS NEXT SERVER - Default Export',
+ named: 'EXPORTS NEXT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports.cjs
new file mode 100644
index 0000000000000..191d7e5b51959
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports.cjs
@@ -0,0 +1,3 @@
+const Imports = require('#imports')
+
+module.exports = Imports
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.default.cjs
new file mode 100644
index 0000000000000..62f7ceed93014
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS DEFAULT CLIENT - Default Export',
+ named: 'IMPORTS DEFAULT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.server.cjs
new file mode 100644
index 0000000000000..4261b3410330b
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.default.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS DEFAULT SERVER - Default Export',
+ named: 'IMPORTS DEFAULT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.default.cjs
new file mode 100644
index 0000000000000..815998eff98c4
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS NEXT CLIENT - Default Export',
+ named: 'IMPORTS NEXT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.server.cjs
new file mode 100644
index 0000000000000..6c33abbb39478
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package/src/imports/imports.next.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS NEXT SERVER - Default Export',
+ named: 'IMPORTS NEXT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/package.json b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/package.json
new file mode 100644
index 0000000000000..20304f95451d7
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "my-esm-package",
+ "version": "0.0.0",
+ "type": "module",
+ "files": [
+ "src"
+ ],
+ "exports": {
+ "./exports": {
+ "next-js": {
+ "react-server": "./src/exports.next.server.mjs",
+ "default": "./src/exports.next.default.mjs"
+ },
+ "default": {
+ "react-server": "./src/exports.default.server.mjs",
+ "default": "./src/exports.default.default.mjs"
+ }
+ },
+ "./imports": "./src/imports.mjs"
+ },
+ "imports": {
+ "#imports": {
+ "next-js": {
+ "react-server": "./src/imports/imports.next.server.mjs",
+ "default": "./src/imports/imports.next.default.mjs"
+ },
+ "default": {
+ "react-server": "./src/imports/imports.default.server.mjs",
+ "default": "./src/imports/imports.default.default.mjs"
+ }
+ }
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.default.mjs
new file mode 100644
index 0000000000000..ec909bf9dc15a
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.default.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS DEFAULT CLIENT - Default Export'
+export const named = 'EXPORTS DEFAULT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.server.mjs
new file mode 100644
index 0000000000000..ad00e9c4e124d
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.default.server.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS DEFAULT SERVER - Default Export'
+export const named = 'EXPORTS DEFAULT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.default.mjs
new file mode 100644
index 0000000000000..34fc7f1538251
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.default.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS NEXT CLIENT - Default Export'
+export const named = 'EXPORTS NEXT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.server.mjs
new file mode 100644
index 0000000000000..ca015bd5f5e8b
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/exports.next.server.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS NEXT SERVER - Default Export'
+export const named = 'EXPORTS NEXT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports.mjs
new file mode 100644
index 0000000000000..e825df4e2a363
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports.mjs
@@ -0,0 +1,4 @@
+import Imports from '#imports'
+
+export * from '#imports'
+export default Imports
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.default.mjs
new file mode 100644
index 0000000000000..d0fa994de0f95
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.default.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS DEFAULT CLIENT - Default Export'
+export const named = 'IMPORTS DEFAULT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.server.mjs
new file mode 100644
index 0000000000000..76dc2fcb78270
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.default.server.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS DEFAULT SERVER - Default Export'
+export const named = 'IMPORTS DEFAULT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.default.mjs
new file mode 100644
index 0000000000000..6eded42f2bbc7
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.default.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS NEXT CLIENT - Default Export'
+export const named = 'IMPORTS NEXT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.server.mjs
new file mode 100644
index 0000000000000..1c90eea9ed645
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package/src/imports/imports.next.server.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS NEXT SERVER - Default Export'
+export const named = 'IMPORTS NEXT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/package.json b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/package.json
new file mode 100644
index 0000000000000..7d9c81a5e6b30
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "my-external-cjs-package",
+ "version": "0.0.0",
+ "type": "commonjs",
+ "files": [
+ "src"
+ ],
+ "exports": {
+ "./exports": {
+ "next-js": {
+ "react-server": "./src/exports.next.server.cjs",
+ "default": "./src/exports.next.default.cjs"
+ },
+ "default": {
+ "react-server": "./src/exports.default.server.cjs",
+ "default": "./src/exports.default.default.cjs"
+ }
+ },
+ "./imports": "./src/imports.cjs"
+ },
+ "imports": {
+ "#imports": {
+ "next-js": {
+ "react-server": "./src/imports/imports.next.server.cjs",
+ "default": "./src/imports/imports.next.default.cjs"
+ },
+ "default": {
+ "react-server": "./src/imports/imports.default.server.cjs",
+ "default": "./src/imports/imports.default.default.cjs"
+ }
+ }
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.default.cjs
new file mode 100644
index 0000000000000..45a58cd833801
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS DEFAULT CLIENT - Default Export',
+ named: 'EXPORTS DEFAULT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.server.cjs
new file mode 100644
index 0000000000000..2d6f59ebbb894
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.default.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS DEFAULT SERVER - Default Export',
+ named: 'EXPORTS DEFAULT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.default.cjs
new file mode 100644
index 0000000000000..fc69523910f80
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS NEXT CLIENT - Default Export',
+ named: 'EXPORTS NEXT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.server.cjs
new file mode 100644
index 0000000000000..4ad43ae403c56
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/exports.next.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'EXPORTS NEXT SERVER - Default Export',
+ named: 'EXPORTS NEXT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports.cjs
new file mode 100644
index 0000000000000..191d7e5b51959
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports.cjs
@@ -0,0 +1,3 @@
+const Imports = require('#imports')
+
+module.exports = Imports
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.default.cjs
new file mode 100644
index 0000000000000..62f7ceed93014
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS DEFAULT CLIENT - Default Export',
+ named: 'IMPORTS DEFAULT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.server.cjs
new file mode 100644
index 0000000000000..4261b3410330b
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.default.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS DEFAULT SERVER - Default Export',
+ named: 'IMPORTS DEFAULT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.default.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.default.cjs
new file mode 100644
index 0000000000000..815998eff98c4
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.default.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS NEXT CLIENT - Default Export',
+ named: 'IMPORTS NEXT CLIENT - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.server.cjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.server.cjs
new file mode 100644
index 0000000000000..6c33abbb39478
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package/src/imports/imports.next.server.cjs
@@ -0,0 +1,4 @@
+module.exports = {
+ default: 'IMPORTS NEXT SERVER - Default Export',
+ named: 'IMPORTS NEXT SERVER - Named Export',
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/package.json b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/package.json
new file mode 100644
index 0000000000000..f9c597fefb985
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "my-external-esm-package",
+ "version": "0.0.0",
+ "type": "module",
+ "files": [
+ "src"
+ ],
+ "exports": {
+ "./exports": {
+ "next-js": {
+ "react-server": "./src/exports.next.server.mjs",
+ "default": "./src/exports.next.default.mjs"
+ },
+ "default": {
+ "react-server": "./src/exports.default.server.mjs",
+ "default": "./src/exports.default.default.mjs"
+ }
+ },
+ "./imports": "./src/imports.mjs"
+ },
+ "imports": {
+ "#imports": {
+ "next-js": {
+ "react-server": "./src/imports/imports.next.server.mjs",
+ "default": "./src/imports/imports.next.default.mjs"
+ },
+ "default": {
+ "react-server": "./src/imports/imports.default.server.mjs",
+ "default": "./src/imports/imports.default.default.mjs"
+ }
+ }
+ }
+}
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.default.mjs
new file mode 100644
index 0000000000000..ec909bf9dc15a
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.default.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS DEFAULT CLIENT - Default Export'
+export const named = 'EXPORTS DEFAULT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.server.mjs
new file mode 100644
index 0000000000000..ad00e9c4e124d
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.default.server.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS DEFAULT SERVER - Default Export'
+export const named = 'EXPORTS DEFAULT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.default.mjs
new file mode 100644
index 0000000000000..34fc7f1538251
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.default.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS NEXT CLIENT - Default Export'
+export const named = 'EXPORTS NEXT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.server.mjs
new file mode 100644
index 0000000000000..ca015bd5f5e8b
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/exports.next.server.mjs
@@ -0,0 +1,2 @@
+export default 'EXPORTS NEXT SERVER - Default Export'
+export const named = 'EXPORTS NEXT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports.mjs
new file mode 100644
index 0000000000000..e825df4e2a363
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports.mjs
@@ -0,0 +1,4 @@
+import Imports from '#imports'
+
+export * from '#imports'
+export default Imports
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.default.mjs
new file mode 100644
index 0000000000000..d0fa994de0f95
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.default.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS DEFAULT CLIENT - Default Export'
+export const named = 'IMPORTS DEFAULT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.server.mjs
new file mode 100644
index 0000000000000..76dc2fcb78270
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.default.server.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS DEFAULT SERVER - Default Export'
+export const named = 'IMPORTS DEFAULT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.default.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.default.mjs
new file mode 100644
index 0000000000000..6eded42f2bbc7
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.default.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS NEXT CLIENT - Default Export'
+export const named = 'IMPORTS NEXT CLIENT - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.server.mjs b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.server.mjs
new file mode 100644
index 0000000000000..1c90eea9ed645
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package/src/imports/imports.next.server.mjs
@@ -0,0 +1,2 @@
+export default 'IMPORTS NEXT SERVER - Default Export'
+export const named = 'IMPORTS NEXT SERVER - Named Export'
diff --git a/test/e2e/app-dir/next-condition/node_modules/my-cjs-package b/test/e2e/app-dir/next-condition/node_modules/my-cjs-package
new file mode 120000
index 0000000000000..de2a86f67f056
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/my-cjs-package
@@ -0,0 +1 @@
+.pnpm/my-cjs-package@file+packages+my-cjs-package/node_modules/my-cjs-package
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/node_modules/my-esm-package b/test/e2e/app-dir/next-condition/node_modules/my-esm-package
new file mode 120000
index 0000000000000..47a792e747e85
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/my-esm-package
@@ -0,0 +1 @@
+.pnpm/my-esm-package@file+packages+my-esm-package/node_modules/my-esm-package
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/node_modules/my-external-cjs-package b/test/e2e/app-dir/next-condition/node_modules/my-external-cjs-package
new file mode 120000
index 0000000000000..625536cbcf77e
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/my-external-cjs-package
@@ -0,0 +1 @@
+.pnpm/my-external-cjs-package@file+packages+my-external-cjs-package/node_modules/my-external-cjs-package
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/node_modules/my-external-esm-package b/test/e2e/app-dir/next-condition/node_modules/my-external-esm-package
new file mode 120000
index 0000000000000..1845ad92bd16d
--- /dev/null
+++ b/test/e2e/app-dir/next-condition/node_modules/my-external-esm-package
@@ -0,0 +1 @@
+.pnpm/my-external-esm-package@file+packages+my-external-esm-package/node_modules/my-external-esm-package
\ No newline at end of file
diff --git a/test/e2e/app-dir/next-condition/package.json b/test/e2e/app-dir/next-condition/package.json
deleted file mode 100644
index 6f22894553f32..0000000000000
--- a/test/e2e/app-dir/next-condition/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "dependencies": {
- "my-cjs-package": "file:./packages/my-cjs-package",
- "my-esm-package": "file:./packages/my-esm-package",
- "my-external-cjs-package": "file:./packages/my-external-cjs-package",
- "my-external-esm-package": "file:./packages/my-external-esm-package"
- }
-}
diff --git a/test/lib/next-modes/base.ts b/test/lib/next-modes/base.ts
index a3e3690921e0b..c8de248b1eeae 100644
--- a/test/lib/next-modes/base.ts
+++ b/test/lib/next-modes/base.ts
@@ -156,6 +156,15 @@ export class NextInstance {
await fs.mkdir(path.dirname(outputFilename), { recursive: true })
await fs.writeFile(outputFilename, item)
} else {
+ try {
+ const existingStat = await fs.lstat(outputFilename)
+ if (existingStat.isFile() || existingStat.isSymbolicLink()) {
+ await fs.unlink(outputFilename)
+ }
+ } catch {
+ // file might not exist or can't be unliked. carry on
+ }
+
await fs.cp(item.fsPath, outputFilename, { recursive: true })
}
}