diff --git a/packages/next/server.js b/packages/next/server.js index 1fe002aa1333b..c6bc19107c8b9 100644 --- a/packages/next/server.js +++ b/packages/next/server.js @@ -9,11 +9,8 @@ const serverExports = { .userAgentFromString, userAgent: require('next/dist/server/web/spec-extension/user-agent') .userAgent, -} - -if (typeof URLPattern !== 'undefined') { - // eslint-disable-next-line no-undef - serverExports.URLPattern = URLPattern + URLPattern: require('next/dist/server/web/spec-extension/url-pattern') + .URLPattern, } // https://nodejs.org/api/esm.html#commonjs-namespaces diff --git a/packages/next/src/build/create-compiler-aliases.ts b/packages/next/src/build/create-compiler-aliases.ts index 6687056067525..76df721da6d40 100644 --- a/packages/next/src/build/create-compiler-aliases.ts +++ b/packages/next/src/build/create-compiler-aliases.ts @@ -205,6 +205,7 @@ export function createNextApiEsmAliases() { navigation: 'next/dist/api/navigation', headers: 'next/dist/api/headers', og: 'next/dist/api/og', + server: 'next/dist/api/server', // pages api document: 'next/dist/api/document', app: 'next/dist/api/app', diff --git a/packages/next/src/server/config.ts b/packages/next/src/server/config.ts index 4b5ce4096eb38..f4c897083f5cd 100644 --- a/packages/next/src/server/config.ts +++ b/packages/next/src/server/config.ts @@ -831,9 +831,6 @@ function assignDefaults( lodash: { transform: 'lodash/{{member}}', }, - 'next/server': { - transform: 'next/dist/server/web/exports/{{ kebabCase member }}', - }, } const userProvidedOptimizePackageImports = diff --git a/packages/next/src/server/web/exports/image-response.ts b/packages/next/src/server/web/exports/image-response.ts deleted file mode 100644 index 8fa2cf73ce930..0000000000000 --- a/packages/next/src/server/web/exports/image-response.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { ImageResponse as default } from '../spec-extension/image-response' diff --git a/packages/next/src/server/web/exports/index.ts b/packages/next/src/server/web/exports/index.ts index d461efb78dc12..1bc0d6a821b9b 100644 --- a/packages/next/src/server/web/exports/index.ts +++ b/packages/next/src/server/web/exports/index.ts @@ -1,8 +1,7 @@ // Alias index file of next/server for edge runtime for tree-shaking purpose -export { default as ImageResponse } from './image-response' -export { default as NextRequest } from './next-request' -export { default as NextResponse } from './next-response' -export { default as userAgent } from './user-agent' -export { default as userAgentFromString } from './user-agent-from-string' -export { default as URLPattern } from './url-pattern' +export { ImageResponse } from '../spec-extension/image-response' +export { NextRequest } from '../spec-extension/request' +export { NextResponse } from '../spec-extension/response' +export { userAgent, userAgentFromString } from '../spec-extension/user-agent' +export { URLPattern } from '../spec-extension/url-pattern' diff --git a/packages/next/src/server/web/exports/next-request.ts b/packages/next/src/server/web/exports/next-request.ts deleted file mode 100644 index 324220066bd16..0000000000000 --- a/packages/next/src/server/web/exports/next-request.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { NextRequest as default } from '../spec-extension/request' diff --git a/packages/next/src/server/web/exports/next-response.ts b/packages/next/src/server/web/exports/next-response.ts deleted file mode 100644 index ca105ef946c2f..0000000000000 --- a/packages/next/src/server/web/exports/next-response.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { NextResponse as default } from '../spec-extension/response' diff --git a/packages/next/src/server/web/exports/revalidate-path.ts b/packages/next/src/server/web/exports/revalidate-path.ts deleted file mode 100644 index 66d69a335792d..0000000000000 --- a/packages/next/src/server/web/exports/revalidate-path.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { revalidatePath as default } from '../spec-extension/revalidate-path' diff --git a/packages/next/src/server/web/exports/revalidate-tag.ts b/packages/next/src/server/web/exports/revalidate-tag.ts deleted file mode 100644 index f6cdfffe8b527..0000000000000 --- a/packages/next/src/server/web/exports/revalidate-tag.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { revalidateTag as default } from '../spec-extension/revalidate-tag' diff --git a/packages/next/src/server/web/exports/unstable-cache.ts b/packages/next/src/server/web/exports/unstable-cache.ts deleted file mode 100644 index 966a8d4268ab4..0000000000000 --- a/packages/next/src/server/web/exports/unstable-cache.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { unstable_cache as default } from '../spec-extension/unstable-cache' diff --git a/packages/next/src/server/web/exports/unstable-no-store.ts b/packages/next/src/server/web/exports/unstable-no-store.ts deleted file mode 100644 index 14f55fa722c26..0000000000000 --- a/packages/next/src/server/web/exports/unstable-no-store.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { unstable_noStore as default } from '../spec-extension/unstable-no-store' diff --git a/packages/next/src/server/web/exports/user-agent-from-string.ts b/packages/next/src/server/web/exports/user-agent-from-string.ts deleted file mode 100644 index 0421b70a39182..0000000000000 --- a/packages/next/src/server/web/exports/user-agent-from-string.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { userAgentFromString as default } from '../spec-extension/user-agent' diff --git a/packages/next/src/server/web/exports/user-agent.ts b/packages/next/src/server/web/exports/user-agent.ts deleted file mode 100644 index 1e13654731179..0000000000000 --- a/packages/next/src/server/web/exports/user-agent.ts +++ /dev/null @@ -1,2 +0,0 @@ -// This file is for modularized imports for next/server to get fully-treeshaking. -export { userAgent as default } from '../spec-extension/user-agent' diff --git a/packages/next/src/server/web/exports/url-pattern.ts b/packages/next/src/server/web/spec-extension/url-pattern.ts similarity index 78% rename from packages/next/src/server/web/exports/url-pattern.ts rename to packages/next/src/server/web/spec-extension/url-pattern.ts index a634a4b78bb6b..7715bc0d87b58 100644 --- a/packages/next/src/server/web/exports/url-pattern.ts +++ b/packages/next/src/server/web/spec-extension/url-pattern.ts @@ -2,4 +2,4 @@ const GlobalURLPattern = // @ts-expect-error: URLPattern is not available in Node.js typeof URLPattern === 'undefined' ? undefined : URLPattern -export default GlobalURLPattern +export { GlobalURLPattern as URLPattern } diff --git a/test/e2e/app-dir/app-external/app-external.test.ts b/test/e2e/app-dir/app-external/app-external.test.ts index 11fd19a14af56..c131083e6b372 100644 --- a/test/e2e/app-dir/app-external/app-external.test.ts +++ b/test/e2e/app-dir/app-external/app-external.test.ts @@ -264,11 +264,13 @@ createNextDescribe( }) it('should have proper tree-shaking for known modules in CJS', async () => { - const html = await next.render('/test-middleware') - expect(html).toContain('it works') + const html = await next.render('/cjs/server') + expect(html).toContain('resolve response') - const middlewareBundle = await next.readFile('.next/server/middleware.js') - expect(middlewareBundle).not.toContain('image-response') + const outputFile = await next.readFile( + '.next/server/app/cjs/server/page.js' + ) + expect(outputFile).not.toContain('image-response') }) it('should use the same async storages if imported directly', async () => { @@ -301,5 +303,14 @@ createNextDescribe( }, /success/) }) }) + + describe('app route', () => { + it('should resolve next/server api from external esm package', async () => { + const res = await next.fetch('/app-routes') + const text = await res.text() + expect(res.status).toBe(200) + expect(text).toBe('get route') + }) + }) } ) diff --git a/test/e2e/app-dir/app-external/app/app-routes/route.js b/test/e2e/app-dir/app-external/app/app-routes/route.js new file mode 100644 index 0000000000000..fb7fc8f084607 --- /dev/null +++ b/test/e2e/app-dir/app-external/app/app-routes/route.js @@ -0,0 +1,6 @@ +import { serverApi } from 'server-api-esm' + +export function GET(req) { + serverApi(req) + return new Response('get route') +} diff --git a/test/e2e/app-dir/app-external/app/cjs/server/page.js b/test/e2e/app-dir/app-external/app/cjs/server/page.js new file mode 100644 index 0000000000000..f8fba4761b8ca --- /dev/null +++ b/test/e2e/app-dir/app-external/app/cjs/server/page.js @@ -0,0 +1,7 @@ +import { createResponse } from 'next-server-cjs-lib' + +export default async function Page() { + const response = createResponse('resolve response') + const text = await response.text() + return

{text}

+} diff --git a/test/e2e/app-dir/app-external/middleware.js b/test/e2e/app-dir/app-external/middleware.js index e333cde8a9e7c..61a7183fac735 100644 --- a/test/e2e/app-dir/app-external/middleware.js +++ b/test/e2e/app-dir/app-external/middleware.js @@ -1,10 +1,5 @@ -import { createResponse } from 'next-server-cjs-lib' import { respond } from 'compat-next-server-module' export async function middleware(request) { - if (request.nextUrl.pathname === '/test-middleware') { - return createResponse('it works') - } - return await respond() } diff --git a/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/index.js b/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/index.js new file mode 100644 index 0000000000000..10703ead2386c --- /dev/null +++ b/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/index.js @@ -0,0 +1,5 @@ +import { NextRequest } from 'next/server' + +export function serverApi(req) { + return new NextRequest(req) +} diff --git a/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/package.json b/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/package.json new file mode 100644 index 0000000000000..a7e8af0d477ee --- /dev/null +++ b/test/e2e/app-dir/app-external/node_modules_bak/server-api-esm/package.json @@ -0,0 +1,5 @@ +{ + "name": "server-api-module", + "type": "module", + "exports": "./index.js" +}