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