diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts index 7d11b8975fa1..6887cd2865b1 100644 --- a/packages/next/build/index.ts +++ b/packages/next/build/index.ts @@ -868,11 +868,6 @@ export default async function build( ) const manifestPath = path.join(distDir, SERVER_DIRECTORY, PAGES_MANIFEST) - const appManifestPath = path.join( - distDir, - SERVER_DIRECTORY, - APP_PATHS_MANIFEST - ) const requiredServerFiles = nextBuildSpan .traceChild('generate-required-server-files') @@ -912,7 +907,8 @@ export default async function build( ), ] : []), - path.relative(distDir, appManifestPath), + path.join(SERVER_DIRECTORY, APP_PATHS_MANIFEST), + APP_BUILD_MANIFEST, path.join(SERVER_DIRECTORY, FLIGHT_MANIFEST + '.js'), path.join(SERVER_DIRECTORY, FLIGHT_MANIFEST + '.json'), path.join( diff --git a/packages/next/build/utils.ts b/packages/next/build/utils.ts index ea5c9b929d14..eb9670a638c6 100644 --- a/packages/next/build/utils.ts +++ b/packages/next/build/utils.ts @@ -1669,7 +1669,33 @@ export async function copyTracedFiles( } } + for (const page of Object.values(middlewareManifest.functions)) { + for (const file of page.files) { + const originalPath = path.join(distDir, file) + const fileOutputPath = path.join( + outputPath, + path.relative(tracingRoot, distDir), + file + ) + await fs.mkdir(path.dirname(fileOutputPath), { recursive: true }) + await fs.copyFile(originalPath, fileOutputPath) + } + for (const file of [...(page.wasm ?? []), ...(page.assets ?? [])]) { + const originalPath = path.join(distDir, file.filePath) + const fileOutputPath = path.join( + outputPath, + path.relative(tracingRoot, distDir), + file.filePath + ) + await fs.mkdir(path.dirname(fileOutputPath), { recursive: true }) + await fs.copyFile(originalPath, fileOutputPath) + } + } + for (const page of pageKeys) { + if (middlewareManifest.functions.hasOwnProperty(page)) { + continue + } const pageFile = path.join( distDir, 'server', @@ -1683,6 +1709,9 @@ export async function copyTracedFiles( } if (appPageKeys) { for (const page of appPageKeys) { + if (middlewareManifest.functions.hasOwnProperty(page)) { + continue + } const pageFile = path.join(distDir, 'server', 'app', `${page}`, 'page.js') const pageTraceFile = `${pageFile}.nft.json` await handleTraceFiles(pageTraceFile).catch((err) => { @@ -1760,6 +1789,7 @@ server.listen(currentPort, (err) => { })` ) } + export function isReservedPage(page: string) { return RESERVED_PAGE.test(page) } diff --git a/test/e2e/og-api/index.test.ts b/test/e2e/og-api/index.test.ts index 9da3b614cef0..038728e4d829 100644 --- a/test/e2e/og-api/index.test.ts +++ b/test/e2e/og-api/index.test.ts @@ -1,6 +1,7 @@ import { createNext, FileRef } from 'e2e-utils' import { NextInstance } from 'test/lib/next-modes/base' import { fetchViaHTTP, renderViaHTTP } from 'next-test-utils' +import fs from 'fs-extra' import { join } from 'path' describe('og-api', () => { @@ -27,4 +28,21 @@ describe('og-api', () => { const body = await res.blob() expect(body.size).toBeGreaterThan(0) }) + + if ((global as any).isNextStart) { + it('should copy files correctly', async () => { + expect(next.cliOutput).not.toContain('Failed to copy traced files') + + expect( + await fs.pathExists( + join(next.testDir, '.next/standalone/.next/server/pages/api/og.js') + ) + ).toBe(true) + expect( + await fs.pathExists( + join(next.testDir, '.next/standalone/.next/server/edge-chunks') + ) + ).toBe(true) + }) + } })