From 2dee775c75b43636c8b2686eded191578a92139a Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Wed, 16 Aug 2023 23:08:11 +0200 Subject: [PATCH 01/20] wip --- packages/next/src/build/webpack-config.ts | 8 ++--- packages/next/src/cli/next-dev.ts | 1 + packages/next/src/server/lib/router-server.ts | 34 ++++++++++--------- .../server/lib/router-utils/resolve-routes.ts | 4 +-- .../src/server/lib/router-utils/setup-dev.ts | 5 +-- .../next/src/server/lib/server-ipc/index.ts | 5 +-- packages/next/src/server/lib/start-server.ts | 1 + packages/next/src/server/render.tsx | 11 ++++-- 8 files changed, 40 insertions(+), 29 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index a0d3868cc7283..0d7b6376ec199 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1,4 +1,4 @@ -import React from 'react' +// import React from 'react' import ReactRefreshWebpackPlugin from 'next/dist/compiled/@next/react-refresh-utils/dist/ReactRefreshWebpackPlugin' import chalk from 'next/dist/compiled/chalk' import crypto from 'crypto' @@ -86,9 +86,9 @@ const NEXT_PROJECT_ROOT_DIST_CLIENT = path.join( const isWebpackServerLayer = (layer: string | null) => Boolean(layer && WEBPACK_LAYERS.GROUP.server.includes(layer)) -if (parseInt(React.version) < 18) { - throw new Error('Next.js requires react >= 18.2.0 to be installed.') -} +// if (parseInt(React.version) < 18) { +// throw new Error('Next.js requires react >= 18.2.0 to be installed.') +// } const babelIncludeRegexes: RegExp[] = [ /next[\\/]dist[\\/](esm[\\/])?shared[\\/]lib/, diff --git a/packages/next/src/cli/next-dev.ts b/packages/next/src/cli/next-dev.ts index a103669429053..d47a771335e74 100644 --- a/packages/next/src/cli/next-dev.ts +++ b/packages/next/src/cli/next-dev.ts @@ -130,6 +130,7 @@ async function createRouterWorker(): Promise<{ : {}), WATCHPACK_WATCHER_LIMIT: '20', EXPERIMENTAL_TURBOPACK: process.env.EXPERIMENTAL_TURBOPACK, + __NEXT_PRIVATE_PREBUNDLED_REACT: 'next', }, }, exposedMethods: ['startServer'], diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index e3b0987cbd001..63ab611357a2b 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -38,15 +38,14 @@ import { signalFromNodeResponse } from '../web/spec-extension/adapters/next-requ const debug = setupDebug('next:router-server:main') -export type RenderWorker = InstanceType< - typeof import('next/dist/compiled/jest-worker').Worker -> & { - initialize: typeof import('./render-server').initialize - deleteCache: typeof import('./render-server').deleteCache - deleteAppClientCache: typeof import('./render-server').deleteAppClientCache - clearModuleContext: typeof import('./render-server').clearModuleContext - propagateServerField: typeof import('./render-server').propagateServerField -} +export type RenderWorker = Pick< + typeof import('./render-server'), + | 'initialize' + | 'deleteCache' + | 'clearModuleContext' + | 'deleteAppClientCache' + | 'propagateServerField' +> const nextDeleteCacheCallbacks: Array<(filePaths: string[]) => Promise> = [] @@ -199,14 +198,17 @@ export async function initialize(opts: { } as any) if (!!config.experimental.appDir) { - renderWorkers.app = await createWorker( - ipcPort, - ipcValidationKey, - opts.isNodeDebugging, - 'app', - config - ) + process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT = ipcPort + '' + process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY = ipcValidationKey + process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = config.experimental + .serverActions + ? 'experimental' + : 'next' + + renderWorkers.app = + require('./render-server') as typeof import('./render-server') } + renderWorkers.pages = await createWorker( ipcPort, ipcValidationKey, diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index d24cfd8dbee2d..5542da43ba545 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -2,10 +2,10 @@ import type { TLSSocket } from 'tls' import type { FsOutput } from './filesystem' import type { IncomingMessage } from 'http' import type { NextConfigComplete } from '../../config-shared' +import type { RenderWorker, initialize } from '../router-server' import url from 'url' import { Redirect } from '../../../../types' -import { RenderWorker } from '../router-server' import setupDebug from 'next/dist/compiled/debug' import { getCloneableBody } from '../../body-streams' import { filterReqHeaders, ipcForbiddenHeaders } from '../server-ipc/utils' @@ -46,7 +46,7 @@ export function getResolveRoutes( ReturnType >, config: NextConfigComplete, - opts: Parameters[0], + opts: Parameters[0], renderWorkers: { app?: RenderWorker pages?: RenderWorker diff --git a/packages/next/src/server/lib/router-utils/setup-dev.ts b/packages/next/src/server/lib/router-utils/setup-dev.ts index 31ddd45443626..fa7861c176ec8 100644 --- a/packages/next/src/server/lib/router-utils/setup-dev.ts +++ b/packages/next/src/server/lib/router-utils/setup-dev.ts @@ -5,6 +5,7 @@ import type { TurbopackResult, WrittenEndpoint, } from '../../../build/swc' +import type { RenderWorker } from '../router-server' import fs from 'fs' import url from 'url' @@ -133,8 +134,8 @@ async function startWatcher(opts: SetupOpts) { ) const renderWorkers: { - app?: import('../router-server').RenderWorker - pages?: import('../router-server').RenderWorker + app?: RenderWorker + pages?: RenderWorker } = {} async function propagateToWorkers(field: PropagateToWorkersField, args: any) { diff --git a/packages/next/src/server/lib/server-ipc/index.ts b/packages/next/src/server/lib/server-ipc/index.ts index 23860bd2555ed..67e3c7d9bcae8 100644 --- a/packages/next/src/server/lib/server-ipc/index.ts +++ b/packages/next/src/server/lib/server-ipc/index.ts @@ -1,5 +1,6 @@ import type NextServer from '../../next-server' import type { NextConfigComplete } from '../../config-shared' +import type { RenderWorker } from '../router-server' import { getNodeOptionsWithoutInspect } from '../utils' import { errorToJSON } from '../../render' @@ -7,7 +8,6 @@ import crypto from 'crypto' import isError from '../../../lib/is-error' import { genRenderExecArgv } from '../worker-utils' import { deserializeErr } from './request-utils' -import { RenderWorker } from '../router-server' // we can't use process.send as jest-worker relies on // it already and can cause unexpected message errors @@ -134,7 +134,8 @@ export const createWorker = async ( 'clearModuleContext', 'propagateServerField', ], - }) as any as RenderWorker + }) as any as RenderWorker & + InstanceType worker.getStderr().pipe(process.stderr) worker.getStdout().pipe(process.stdout) diff --git a/packages/next/src/server/lib/start-server.ts b/packages/next/src/server/lib/start-server.ts index 2bc3aa28b66e6..d15b68a7b0115 100644 --- a/packages/next/src/server/lib/start-server.ts +++ b/packages/next/src/server/lib/start-server.ts @@ -1,4 +1,5 @@ import '../node-polyfill-fetch' +import '../require-hook' import type { IncomingMessage, ServerResponse } from 'http' diff --git a/packages/next/src/server/render.tsx b/packages/next/src/server/render.tsx index b67ec1d8ab9f7..f15c722f34a71 100644 --- a/packages/next/src/server/render.tsx +++ b/packages/next/src/server/render.tsx @@ -31,7 +31,6 @@ import type { ClientReferenceManifest } from '../build/webpack/plugins/flight-ma import type { NextFontManifest } from '../build/webpack/plugins/next-font-manifest-plugin' import React from 'react' -import ReactDOMServer from 'react-dom/server.browser' import { StyleRegistry, createStyleRegistry } from 'styled-jsx' import { GSP_NO_RETURNED_VALUE, @@ -115,8 +114,14 @@ function noRouter() { throw new Error(message) } +function getReactDOMServer() { + // Instead of a top-level import, we need to require() here to ensure that + // the global require hook is applied. + return require('react-dom/server.browser') as typeof import('react-dom/server.browser') +} + async function renderToString(element: React.ReactElement) { - const renderStream = await ReactDOMServer.renderToReadableStream(element) + const renderStream = await getReactDOMServer().renderToReadableStream(element) await renderStream.allReady return streamToString(renderStream) } @@ -1274,7 +1279,7 @@ export async function renderToHTMLImpl( ) => { const content = renderContent(EnhancedApp, EnhancedComponent) return await renderToInitialStream({ - ReactDOMServer, + ReactDOMServer: getReactDOMServer(), element: content, }) } From af46b2da8e7cc06e5349574e2e89f58943b8afc3 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Wed, 16 Aug 2023 23:36:07 +0200 Subject: [PATCH 02/20] fix --- packages/next/src/cli/next-dev.ts | 8 +++++--- packages/next/src/server/lib/router-server.ts | 2 +- .../next/src/server/lib/router-utils/resolve-routes.ts | 2 +- packages/next/src/server/lib/server-ipc/index.ts | 9 ++------- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/next/src/cli/next-dev.ts b/packages/next/src/cli/next-dev.ts index d47a771335e74..338ec50c5fdb4 100644 --- a/packages/next/src/cli/next-dev.ts +++ b/packages/next/src/cli/next-dev.ts @@ -108,7 +108,7 @@ function watchConfigFiles( type StartServerWorker = Worker & Pick -async function createRouterWorker(): Promise<{ +async function createRouterWorker(config: NextConfigComplete): Promise<{ worker: StartServerWorker cleanup: () => Promise }> { @@ -130,7 +130,9 @@ async function createRouterWorker(): Promise<{ : {}), WATCHPACK_WATCHER_LIMIT: '20', EXPERIMENTAL_TURBOPACK: process.env.EXPERIMENTAL_TURBOPACK, - __NEXT_PRIVATE_PREBUNDLED_REACT: 'next', + __NEXT_PRIVATE_PREBUNDLED_REACT: !!config.experimental.serverActions + ? 'experimental' + : 'next', }, }, exposedMethods: ['startServer'], @@ -373,7 +375,7 @@ const nextDev: CliCommand = async (argv) => { } else { const runDevServer = async (reboot: boolean) => { try { - const workerInit = await createRouterWorker() + const workerInit = await createRouterWorker(config) await workerInit.worker.startServer(devServerOptions) await preflight(reboot) return { diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 63ab611357a2b..900833774d05f 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -276,7 +276,7 @@ export async function initialize(opts: { const cleanup = () => { debug('router-server process cleanup') for (const curWorker of [ - ...((renderWorkers.app as any)?._workerPool?._workers || []), + // ...((renderWorkers.app as any)?._workerPool?._workers || []), ...((renderWorkers.pages as any)?._workerPool?._workers || []), ] as { _child?: import('child_process').ChildProcess diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 5542da43ba545..457b6b1d1a54c 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -425,7 +425,7 @@ export function getResolveRoutes( .catch(() => false))) ) { const workerResult = await ( - renderWorkers.app || renderWorkers.pages + renderWorkers.pages || renderWorkers.app )?.initialize(renderWorkerOpts) if (!workerResult) { diff --git a/packages/next/src/server/lib/server-ipc/index.ts b/packages/next/src/server/lib/server-ipc/index.ts index 67e3c7d9bcae8..aa97c04eebeb5 100644 --- a/packages/next/src/server/lib/server-ipc/index.ts +++ b/packages/next/src/server/lib/server-ipc/index.ts @@ -114,13 +114,8 @@ export const createWorker = async ( __NEXT_PRIVATE_STANDALONE_CONFIG: process.env.__NEXT_PRIVATE_STANDALONE_CONFIG, NODE_ENV: process.env.NODE_ENV, - ...(type === 'app' - ? { - __NEXT_PRIVATE_PREBUNDLED_REACT: useServerActions - ? 'experimental' - : 'next', - } - : {}), + __NEXT_PRIVATE_PREBUNDLED_REACT: + type === 'app' ? (useServerActions ? 'experimental' : 'next') : '', ...(process.env.NEXT_CPU_PROF ? { __NEXT_PRIVATE_CPU_PROFILE: `CPU.${type}-renderer` } : {}), From eb37004c9daaaeb735f1436eb701c3f46d58a3a1 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Wed, 16 Aug 2023 23:52:52 +0200 Subject: [PATCH 03/20] fix tests --- packages/next/src/build/webpack-config.ts | 8 ++++---- packages/next/src/cli/next-dev.ts | 4 ++-- packages/next/src/server/lib/render-server.ts | 6 ++++-- packages/next/src/server/lib/router-server.ts | 1 - .../src/server/lib/router-utils/resolve-routes.ts | 6 +++--- packages/next/src/server/render.tsx | 11 +++-------- test/development/basic/node-builtins.test.ts | 2 -- 7 files changed, 16 insertions(+), 22 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 0d7b6376ec199..a0d3868cc7283 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1,4 +1,4 @@ -// import React from 'react' +import React from 'react' import ReactRefreshWebpackPlugin from 'next/dist/compiled/@next/react-refresh-utils/dist/ReactRefreshWebpackPlugin' import chalk from 'next/dist/compiled/chalk' import crypto from 'crypto' @@ -86,9 +86,9 @@ const NEXT_PROJECT_ROOT_DIST_CLIENT = path.join( const isWebpackServerLayer = (layer: string | null) => Boolean(layer && WEBPACK_LAYERS.GROUP.server.includes(layer)) -// if (parseInt(React.version) < 18) { -// throw new Error('Next.js requires react >= 18.2.0 to be installed.') -// } +if (parseInt(React.version) < 18) { + throw new Error('Next.js requires react >= 18.2.0 to be installed.') +} const babelIncludeRegexes: RegExp[] = [ /next[\\/]dist[\\/](esm[\\/])?shared[\\/]lib/, diff --git a/packages/next/src/cli/next-dev.ts b/packages/next/src/cli/next-dev.ts index 338ec50c5fdb4..1885529cb2e15 100644 --- a/packages/next/src/cli/next-dev.ts +++ b/packages/next/src/cli/next-dev.ts @@ -108,7 +108,7 @@ function watchConfigFiles( type StartServerWorker = Worker & Pick -async function createRouterWorker(config: NextConfigComplete): Promise<{ +async function createRouterWorker(fullConfig: NextConfigComplete): Promise<{ worker: StartServerWorker cleanup: () => Promise }> { @@ -130,7 +130,7 @@ async function createRouterWorker(config: NextConfigComplete): Promise<{ : {}), WATCHPACK_WATCHER_LIMIT: '20', EXPERIMENTAL_TURBOPACK: process.env.EXPERIMENTAL_TURBOPACK, - __NEXT_PRIVATE_PREBUNDLED_REACT: !!config.experimental.serverActions + __NEXT_PRIVATE_PREBUNDLED_REACT: !!fullConfig.experimental.serverActions ? 'experimental' : 'next', }, diff --git a/packages/next/src/server/lib/render-server.ts b/packages/next/src/server/lib/render-server.ts index 5e572c25145e7..9c2eee1fd2086 100644 --- a/packages/next/src/server/lib/render-server.ts +++ b/packages/next/src/server/lib/render-server.ts @@ -80,8 +80,10 @@ export async function initialize(opts: { return result } - const type = process.env.__NEXT_PRIVATE_RENDER_WORKER! - process.title = 'next-render-worker-' + type + const type = process.env.__NEXT_PRIVATE_RENDER_WORKER + if (type) { + process.title = 'next-render-worker-' + type + } let requestHandler: RequestHandler let upgradeHandler: any diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 900833774d05f..41fab87285e70 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -276,7 +276,6 @@ export async function initialize(opts: { const cleanup = () => { debug('router-server process cleanup') for (const curWorker of [ - // ...((renderWorkers.app as any)?._workerPool?._workers || []), ...((renderWorkers.pages as any)?._workerPool?._workers || []), ] as { _child?: import('child_process').ChildProcess diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 457b6b1d1a54c..7877df2470d53 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,9 +424,9 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - const workerResult = await ( - renderWorkers.pages || renderWorkers.app - )?.initialize(renderWorkerOpts) + const workerResult = await renderWorkers.pages?.initialize( + renderWorkerOpts + ) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) diff --git a/packages/next/src/server/render.tsx b/packages/next/src/server/render.tsx index f15c722f34a71..b67ec1d8ab9f7 100644 --- a/packages/next/src/server/render.tsx +++ b/packages/next/src/server/render.tsx @@ -31,6 +31,7 @@ import type { ClientReferenceManifest } from '../build/webpack/plugins/flight-ma import type { NextFontManifest } from '../build/webpack/plugins/next-font-manifest-plugin' import React from 'react' +import ReactDOMServer from 'react-dom/server.browser' import { StyleRegistry, createStyleRegistry } from 'styled-jsx' import { GSP_NO_RETURNED_VALUE, @@ -114,14 +115,8 @@ function noRouter() { throw new Error(message) } -function getReactDOMServer() { - // Instead of a top-level import, we need to require() here to ensure that - // the global require hook is applied. - return require('react-dom/server.browser') as typeof import('react-dom/server.browser') -} - async function renderToString(element: React.ReactElement) { - const renderStream = await getReactDOMServer().renderToReadableStream(element) + const renderStream = await ReactDOMServer.renderToReadableStream(element) await renderStream.allReady return streamToString(renderStream) } @@ -1279,7 +1274,7 @@ export async function renderToHTMLImpl( ) => { const content = renderContent(EnhancedApp, EnhancedComponent) return await renderToInitialStream({ - ReactDOMServer: getReactDOMServer(), + ReactDOMServer, element: content, }) } diff --git a/test/development/basic/node-builtins.test.ts b/test/development/basic/node-builtins.test.ts index 168549f091688..27797f6c564d0 100644 --- a/test/development/basic/node-builtins.test.ts +++ b/test/development/basic/node-builtins.test.ts @@ -138,7 +138,6 @@ createNextDescribe( expect(parsedData.https).toBe(true) expect(parsedData.os).toBe('\n') expect(parsedData.path).toBe('/hello/world/test.txt') - expect(parsedData.process).toInclude('next-render-worker-app') expect(parsedData.querystring).toBe('a=b') expect(parsedData.stringDecoder).toBe(true) expect(parsedData.sys).toBe(true) @@ -164,7 +163,6 @@ createNextDescribe( expect(parsedData.https).toBe(true) expect(parsedData.os).toBe('\n') expect(parsedData.path).toBe('/hello/world/test.txt') - expect(parsedData.process).toInclude('next-render-worker-app') expect(parsedData.querystring).toBe('a=b') expect(parsedData.stringDecoder).toBe(true) expect(parsedData.sys).toBe(true) From d89855f2dbf792b42b4f77b77ae60d0d624de075 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 15:53:10 +0200 Subject: [PATCH 04/20] fix env var --- packages/next/src/server/base-server.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index 1d0c81318453c..c5c56cec65495 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -1045,7 +1045,6 @@ export default abstract class Server { const useInvokePath = !useMatchedPathHeader && process.env.NEXT_RUNTIME !== 'edge' && - process.env.__NEXT_PRIVATE_RENDER_WORKER && invokePath if (useInvokePath) { @@ -1136,7 +1135,6 @@ export default abstract class Server { if ( process.env.NEXT_RUNTIME !== 'edge' && - process.env.__NEXT_PRIVATE_RENDER_WORKER && req.headers['x-middleware-invoke'] ) { const nextDataResult = await this.normalizeNextData(req, res, parsedUrl) From 07acdf5c5ca471eaaa96ecbc4646d622378e1869 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 16:07:17 +0200 Subject: [PATCH 05/20] fix --- packages/next/src/server/lib/router-utils/resolve-routes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 7877df2470d53..5542da43ba545 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,9 +424,9 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - const workerResult = await renderWorkers.pages?.initialize( - renderWorkerOpts - ) + const workerResult = await ( + renderWorkers.app || renderWorkers.pages + )?.initialize(renderWorkerOpts) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) From 5d227210d6474ca19060f7924c7a162de3fff464 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 20:08:51 +0200 Subject: [PATCH 06/20] test --- packages/next/src/server/dev/next-dev-server.ts | 10 ++++++++-- packages/next/src/server/lib/router-server.ts | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/next/src/server/dev/next-dev-server.ts b/packages/next/src/server/dev/next-dev-server.ts index ee5a1b419ca90..7869fee3dde4f 100644 --- a/packages/next/src/server/dev/next-dev-server.ts +++ b/packages/next/src/server/dev/next-dev-server.ts @@ -735,8 +735,14 @@ export default class DevServer extends Server { fetchHostname: this.fetchHostname, method: 'ensurePage', args: [opts], - ipcPort: process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT, - ipcKey: process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY, + ipcPort: + // @ts-ignore + globalThis.__NEXT_PRIVATE_ROUTER_IPC_PORT || + process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT, + ipcKey: + // @ts-ignore + globalThis.__NEXT_PRIVATE_ROUTER_IPC_KEY || + process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY, }) return } diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 41fab87285e70..4e8a407e0e79a 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -198,6 +198,11 @@ export async function initialize(opts: { } as any) if (!!config.experimental.appDir) { + // @ts-ignore + globalThis.__NEXT_PRIVATE_ROUTER_IPC_PORT = ipcPort + '' + // @ts-ignore + globalThis.__NEXT_PRIVATE_ROUTER_IPC_KEY = ipcValidationKey + process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT = ipcPort + '' process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY = ipcValidationKey process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = config.experimental From 5b54fd1c53f14a4580cbdb578f00f96a5bd12a16 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 20:12:51 +0200 Subject: [PATCH 07/20] revert --- packages/next-env/index.ts | 8 ++++++-- packages/next/src/server/dev/next-dev-server.ts | 10 ++-------- packages/next/src/server/lib/router-server.ts | 5 ----- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/next-env/index.ts b/packages/next-env/index.ts index ef5b4dcdd6beb..ccf0d3d87896b 100644 --- a/packages/next-env/index.ts +++ b/packages/next-env/index.ts @@ -26,8 +26,12 @@ type Log = { function replaceProcessEnv(sourceEnv: Env) { Object.keys(process.env).forEach((key) => { - if (sourceEnv[key] === undefined || sourceEnv[key] === '') { - delete process.env[key] + // Allow mutating internal Next.js env variables after the server has initiated. + // This is necessary for dynamic things like the IPC server port. + if (!key.startsWith('__NEXT_PRIVATE')) { + if (sourceEnv[key] === undefined || sourceEnv[key] === '') { + delete process.env[key] + } } }) diff --git a/packages/next/src/server/dev/next-dev-server.ts b/packages/next/src/server/dev/next-dev-server.ts index 7869fee3dde4f..ee5a1b419ca90 100644 --- a/packages/next/src/server/dev/next-dev-server.ts +++ b/packages/next/src/server/dev/next-dev-server.ts @@ -735,14 +735,8 @@ export default class DevServer extends Server { fetchHostname: this.fetchHostname, method: 'ensurePage', args: [opts], - ipcPort: - // @ts-ignore - globalThis.__NEXT_PRIVATE_ROUTER_IPC_PORT || - process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT, - ipcKey: - // @ts-ignore - globalThis.__NEXT_PRIVATE_ROUTER_IPC_KEY || - process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY, + ipcPort: process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT, + ipcKey: process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY, }) return } diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 4e8a407e0e79a..41fab87285e70 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -198,11 +198,6 @@ export async function initialize(opts: { } as any) if (!!config.experimental.appDir) { - // @ts-ignore - globalThis.__NEXT_PRIVATE_ROUTER_IPC_PORT = ipcPort + '' - // @ts-ignore - globalThis.__NEXT_PRIVATE_ROUTER_IPC_KEY = ipcValidationKey - process.env.__NEXT_PRIVATE_ROUTER_IPC_PORT = ipcPort + '' process.env.__NEXT_PRIVATE_ROUTER_IPC_KEY = ipcValidationKey process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = config.experimental From 3228da0b2a8944fc29ff064d9ac33f0f2defcaa5 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 20:39:49 +0200 Subject: [PATCH 08/20] change middleware worker --- .../next/src/server/lib/router-utils/resolve-routes.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 5542da43ba545..483ef7da3c467 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,9 +424,11 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - const workerResult = await ( - renderWorkers.app || renderWorkers.pages - )?.initialize(renderWorkerOpts) + // Always prefer to run the middleware in the pages render worker + // instead of the main router worker. + const workerResult = await renderWorkers.pages?.initialize( + renderWorkerOpts + ) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) From 9bb0fa751acf6ca6cacf25c4beccdd93c040f729 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 21:21:38 +0200 Subject: [PATCH 09/20] fix clean up --- .../server/lib/router-utils/resolve-routes.ts | 8 +++----- packages/next/src/server/lib/start-server.ts | 12 ++++++++++-- packages/next/src/server/next-server.ts | 16 +++++++--------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 483ef7da3c467..5542da43ba545 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,11 +424,9 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - // Always prefer to run the middleware in the pages render worker - // instead of the main router worker. - const workerResult = await renderWorkers.pages?.initialize( - renderWorkerOpts - ) + const workerResult = await ( + renderWorkers.app || renderWorkers.pages + )?.initialize(renderWorkerOpts) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) diff --git a/packages/next/src/server/lib/start-server.ts b/packages/next/src/server/lib/start-server.ts index d15b68a7b0115..1c90cff50c463 100644 --- a/packages/next/src/server/lib/start-server.ts +++ b/packages/next/src/server/lib/start-server.ts @@ -195,11 +195,19 @@ export async function startServer({ server.close() process.exit(0) } + const exception = (err: Error) => { + // If it's the render worker, we keep the process alive + if (process.env.__NEXT_PRIVATE_RENDER_WORKER) { + console.error(err) + } else { + cleanup() + } + } process.on('exit', cleanup) process.on('SIGINT', cleanup) process.on('SIGTERM', cleanup) - process.on('uncaughtException', cleanup) - process.on('unhandledRejection', cleanup) + process.on('uncaughtException', exception) + process.on('unhandledRejection', exception) const initResult = await getRequestHandlers({ dir, diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 53a692021b0a4..64d2f233edfd9 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -491,15 +491,6 @@ export default class NextNodeServer extends BaseServer { ) } - private streamResponseChunk(res: ServerResponse, chunk: any) { - res.write(chunk) - // When streaming is enabled, we need to explicitly - // flush the response to avoid it being buffered. - if ('flush' in res) { - ;(res as any).flush() - } - } - protected async imageOptimizer( req: NodeNextRequest, res: NodeNextResponse, @@ -1035,6 +1026,13 @@ export default class NextNodeServer extends BaseServer { } } catch (_) {} + if (this.isRenderWorker) { + console.error(err) + return { + finished: true, + } + } + throw err } } From 049ab0ad2ae695a3dcd9eecc0d25a011c62eacdc Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 21:30:17 +0200 Subject: [PATCH 10/20] fix error logging --- packages/next/src/server/lib/router-server.ts | 11 +++++++++-- packages/next/src/server/lib/start-server.ts | 8 ++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 41fab87285e70..925985f292711 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -273,6 +273,13 @@ export async function initialize(opts: { } } + const logError = async ( + type: 'uncaughtException' | 'unhandledRejection', + err: Error | undefined + ) => { + await devInstance?.logErrorWithOriginalStack(err, type) + } + const cleanup = () => { debug('router-server process cleanup') for (const curWorker of [ @@ -290,8 +297,8 @@ export async function initialize(opts: { process.on('exit', cleanup) process.on('SIGINT', cleanup) process.on('SIGTERM', cleanup) - process.on('uncaughtException', cleanup) - process.on('unhandledRejection', cleanup) + process.on('uncaughtException', logError.bind(null, 'uncaughtException')) + process.on('unhandledRejection', logError.bind(null, 'unhandledRejection')) const resolveRoutes = getResolveRoutes( fsChecker, diff --git a/packages/next/src/server/lib/start-server.ts b/packages/next/src/server/lib/start-server.ts index 1c90cff50c463..00664a825929d 100644 --- a/packages/next/src/server/lib/start-server.ts +++ b/packages/next/src/server/lib/start-server.ts @@ -196,12 +196,8 @@ export async function startServer({ process.exit(0) } const exception = (err: Error) => { - // If it's the render worker, we keep the process alive - if (process.env.__NEXT_PRIVATE_RENDER_WORKER) { - console.error(err) - } else { - cleanup() - } + // This is the render worker, we keep the process alive + console.error(err) } process.on('exit', cleanup) process.on('SIGINT', cleanup) From 022da5638a5de17c02b9ff05bcbf0d6e88be14bc Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 17 Aug 2023 22:59:44 +0200 Subject: [PATCH 11/20] test --- packages/next/src/server/lib/router-utils/resolve-routes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 5542da43ba545..7877df2470d53 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,9 +424,9 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - const workerResult = await ( - renderWorkers.app || renderWorkers.pages - )?.initialize(renderWorkerOpts) + const workerResult = await renderWorkers.pages?.initialize( + renderWorkerOpts + ) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) From 7a618c1eec893cfad5951394c45c88904191937a Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Fri, 18 Aug 2023 01:25:51 +0200 Subject: [PATCH 12/20] update --- packages/next/src/build/utils.ts | 10 ++++++---- .../next/src/server/lib/router-utils/resolve-routes.ts | 6 +++--- packages/next/src/server/next-server.ts | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/next/src/build/utils.ts b/packages/next/src/build/utils.ts index b0c62248223b8..bb22774b21c68 100644 --- a/packages/next/src/build/utils.ts +++ b/packages/next/src/build/utils.ts @@ -1930,14 +1930,12 @@ export async function copyTracedFiles( serverOutputPath, `${ moduleType - ? `import http from 'http' -import path from 'path' + ? `import path from 'path' import { fileURLToPath } from 'url' const __dirname = fileURLToPath(new URL('.', import.meta.url)) import { startServer } from 'next/dist/server/lib/start-server.js' ` : ` -const http = require('http') const path = require('path') const { startServer } = require('next/dist/server/lib/start-server')` } @@ -1956,13 +1954,17 @@ if (!process.env.NEXT_MANUAL_SIG_HANDLE) { const currentPort = parseInt(process.env.PORT, 10) || 3000 const hostname = process.env.HOSTNAME || 'localhost' -let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10); + +let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10) const nextConfig = ${JSON.stringify({ ...serverConfig, distDir: `./${path.relative(dir, distDir)}`, })} process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig) +process.env.__NEXT_PRIVATE_PREBUNDLED_REACT = nextConfig.experimental && nextConfig.experimental.serverActions + ? 'experimental' + : 'next' if ( Number.isNaN(keepAliveTimeout) || diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts index 7877df2470d53..5542da43ba545 100644 --- a/packages/next/src/server/lib/router-utils/resolve-routes.ts +++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts @@ -424,9 +424,9 @@ export function getResolveRoutes( .then(() => true) .catch(() => false))) ) { - const workerResult = await renderWorkers.pages?.initialize( - renderWorkerOpts - ) + const workerResult = await ( + renderWorkers.app || renderWorkers.pages + )?.initialize(renderWorkerOpts) if (!workerResult) { throw new Error(`Failed to initialize render worker "middleware"`) diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 64d2f233edfd9..7ab5467eb7cce 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -1024,9 +1024,9 @@ export default class NextNodeServer extends BaseServer { return { finished: true, } - } catch (_) {} + } catch {} - if (this.isRenderWorker) { + if (this.isRenderWorker && !this.minimalMode) { console.error(err) return { finished: true, From 10355778f461bb6f81cb5c750785d90470ad1256 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Fri, 18 Aug 2023 01:49:05 +0200 Subject: [PATCH 13/20] revert --- packages/next/src/server/next-server.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 7ab5467eb7cce..7c628f5953a90 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -1026,12 +1026,12 @@ export default class NextNodeServer extends BaseServer { } } catch {} - if (this.isRenderWorker && !this.minimalMode) { - console.error(err) - return { - finished: true, - } - } + // if (this.isRenderWorker && !this.minimalMode) { + // console.error(err) + // return { + // finished: true, + // } + // } throw err } From d355ea111213dffbda39d0e9b9fc4c4c1d107a3b Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Fri, 18 Aug 2023 01:58:11 +0200 Subject: [PATCH 14/20] clean up --- packages/next/src/server/next-server.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts index 7c628f5953a90..90a19cc1bb25e 100644 --- a/packages/next/src/server/next-server.ts +++ b/packages/next/src/server/next-server.ts @@ -1026,13 +1026,6 @@ export default class NextNodeServer extends BaseServer { } } catch {} - // if (this.isRenderWorker && !this.minimalMode) { - // console.error(err) - // return { - // finished: true, - // } - // } - throw err } } From 6c7350b746fc8dc12c13182030593daf00c4eda8 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 21 Aug 2023 17:24:08 +0200 Subject: [PATCH 15/20] test --- run-tests.js | 1 + 1 file changed, 1 insertion(+) diff --git a/run-tests.js b/run-tests.js index 2a43fc5a820e7..91ea1b77d6300 100644 --- a/run-tests.js +++ b/run-tests.js @@ -351,6 +351,7 @@ ${ENDGROUP}`) { stdio: ['ignore', 'pipe', 'pipe'], env: { + __NEXT_TEST_MODE: 'true', ...process.env, IS_RETRY: isRetry ? 'true' : undefined, RECORD_REPLAY: shouldRecordTestWithReplay, From 0c738b3d3c7cbf061d458f48c127782aa6301501 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 21 Aug 2023 17:34:13 +0200 Subject: [PATCH 16/20] test --- packages/next/src/server/lib/router-utils/setup-dev.ts | 1 - run-tests.js | 3 +-- test/integration/disable-js/test/index.test.js | 4 ++++ test/integration/future/test/index.test.js | 4 ++++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/setup-dev.ts b/packages/next/src/server/lib/router-utils/setup-dev.ts index 0928b625d97f4..a87ae086c4507 100644 --- a/packages/next/src/server/lib/router-utils/setup-dev.ts +++ b/packages/next/src/server/lib/router-utils/setup-dev.ts @@ -5,7 +5,6 @@ import type { TurbopackResult, WrittenEndpoint, } from '../../../build/swc' -import type { RenderWorker } from '../router-server' import fs from 'fs' import url from 'url' diff --git a/run-tests.js b/run-tests.js index 91ea1b77d6300..3c10dd9803114 100644 --- a/run-tests.js +++ b/run-tests.js @@ -342,7 +342,7 @@ ${ENDGROUP}`) '--runInBand', '--forceExit', '--verbose', - '--silent', + '--debug', ...(isTestJob ? ['--json', `--outputFile=${test}${RESULTS_EXT}`] : []), @@ -351,7 +351,6 @@ ${ENDGROUP}`) { stdio: ['ignore', 'pipe', 'pipe'], env: { - __NEXT_TEST_MODE: 'true', ...process.env, IS_RETRY: isRetry ? 'true' : undefined, RECORD_REPLAY: shouldRecordTestWithReplay, diff --git a/test/integration/disable-js/test/index.test.js b/test/integration/disable-js/test/index.test.js index 98cdb734ab646..e24783b0af030 100644 --- a/test/integration/disable-js/test/index.test.js +++ b/test/integration/disable-js/test/index.test.js @@ -20,6 +20,10 @@ let app const context = {} +// force require usage instead of dynamic import in jest +// x-ref: https://github.com/nodejs/node/issues/35889 +process.env.__NEXT_TEST_MODE = 'jest' + describe('disabled runtime JS', () => { describe('production mode', () => { beforeAll(async () => { diff --git a/test/integration/future/test/index.test.js b/test/integration/future/test/index.test.js index 805b1d20efff6..f44712978d3ad 100644 --- a/test/integration/future/test/index.test.js +++ b/test/integration/future/test/index.test.js @@ -14,6 +14,10 @@ let appDir = join(__dirname, '../') let server let appPort +// force require usage instead of dynamic import in jest +// x-ref: https://github.com/nodejs/node/issues/35889 +process.env.__NEXT_TEST_MODE = 'jest' + describe('excludeDefaultMomentLocales', () => { beforeAll(async () => { await nextBuild(appDir) From 9eed63b8adcb7c3cf901a0d76a73351120dcf0b4 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 21 Aug 2023 17:48:26 +0200 Subject: [PATCH 17/20] test --- test/lib/next-test-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lib/next-test-utils.ts b/test/lib/next-test-utils.ts index 7da56c88138d6..8b6d65ed4d00d 100644 --- a/test/lib/next-test-utils.ts +++ b/test/lib/next-test-utils.ts @@ -208,7 +208,7 @@ export function runNextCommand( const env = { ...process.env, NODE_ENV: undefined, - __NEXT_TEST_MODE: 'true', + __NEXT_TEST_MODE: 'jest', ...options.env, } From db54848fac3f49f8354d6f9868f5673ef96b6a9f Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 21 Aug 2023 18:18:04 +0200 Subject: [PATCH 18/20] revert --- run-tests.js | 2 +- test/integration/disable-js/test/index.test.js | 4 ---- test/integration/future/test/index.test.js | 4 ---- test/lib/next-test-utils.ts | 2 +- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/run-tests.js b/run-tests.js index 3c10dd9803114..2a43fc5a820e7 100644 --- a/run-tests.js +++ b/run-tests.js @@ -342,7 +342,7 @@ ${ENDGROUP}`) '--runInBand', '--forceExit', '--verbose', - '--debug', + '--silent', ...(isTestJob ? ['--json', `--outputFile=${test}${RESULTS_EXT}`] : []), diff --git a/test/integration/disable-js/test/index.test.js b/test/integration/disable-js/test/index.test.js index e24783b0af030..98cdb734ab646 100644 --- a/test/integration/disable-js/test/index.test.js +++ b/test/integration/disable-js/test/index.test.js @@ -20,10 +20,6 @@ let app const context = {} -// force require usage instead of dynamic import in jest -// x-ref: https://github.com/nodejs/node/issues/35889 -process.env.__NEXT_TEST_MODE = 'jest' - describe('disabled runtime JS', () => { describe('production mode', () => { beforeAll(async () => { diff --git a/test/integration/future/test/index.test.js b/test/integration/future/test/index.test.js index f44712978d3ad..805b1d20efff6 100644 --- a/test/integration/future/test/index.test.js +++ b/test/integration/future/test/index.test.js @@ -14,10 +14,6 @@ let appDir = join(__dirname, '../') let server let appPort -// force require usage instead of dynamic import in jest -// x-ref: https://github.com/nodejs/node/issues/35889 -process.env.__NEXT_TEST_MODE = 'jest' - describe('excludeDefaultMomentLocales', () => { beforeAll(async () => { await nextBuild(appDir) diff --git a/test/lib/next-test-utils.ts b/test/lib/next-test-utils.ts index 3577ec4c68184..4c723d6bde913 100644 --- a/test/lib/next-test-utils.ts +++ b/test/lib/next-test-utils.ts @@ -208,7 +208,7 @@ export function runNextCommand( const env = { ...process.env, NODE_ENV: undefined, - __NEXT_TEST_MODE: 'jest', + __NEXT_TEST_MODE: 'true', ...options.env, } From 81daaedb62aac70cfa9925e2913bde9e7377c4ee Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Tue, 22 Aug 2023 14:11:12 +0200 Subject: [PATCH 19/20] fix test --- test/integration/disable-js/test/index.test.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/test/integration/disable-js/test/index.test.js b/test/integration/disable-js/test/index.test.js index 98cdb734ab646..336230e50bfaf 100644 --- a/test/integration/disable-js/test/index.test.js +++ b/test/integration/disable-js/test/index.test.js @@ -3,19 +3,16 @@ import { join } from 'path' import cheerio from 'cheerio' import { - nextServer, nextBuild, - startApp, - stopApp, renderViaHTTP, findPort, launchApp, killApp, + nextStart, } from 'next-test-utils' const appDir = join(__dirname, '../') let appPort -let server let app const context = {} @@ -23,17 +20,14 @@ const context = {} describe('disabled runtime JS', () => { describe('production mode', () => { beforeAll(async () => { + appPort = await findPort() + await nextBuild(appDir) - app = nextServer({ - dir: join(__dirname, '../'), - dev: false, - quiet: true, - }) + app = await nextStart(appDir, appPort) - server = await startApp(app) - context.appPort = appPort = server.address().port + context.appPort = appPort }) - afterAll(() => stopApp(server)) + afterAll(() => killApp(app)) it('should render the page', async () => { const html = await renderViaHTTP(appPort, '/') From 50e47679f7a4b6613be7b6e6904df42e9438731b Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Tue, 22 Aug 2023 14:17:40 +0200 Subject: [PATCH 20/20] migrate all tests --- test/integration/future/test/index.test.js | 20 +++++++------------ .../production-build-dir/test/index.test.js | 18 ++++++----------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/test/integration/future/test/index.test.js b/test/integration/future/test/index.test.js index 805b1d20efff6..9258cdba2abd1 100644 --- a/test/integration/future/test/index.test.js +++ b/test/integration/future/test/index.test.js @@ -4,30 +4,24 @@ import webdriver from 'next-webdriver' import { join } from 'path' import { nextBuild, - nextServer, - startApp, - stopApp, + nextStart, + killApp, + findPort, renderViaHTTP, } from 'next-test-utils' let appDir = join(__dirname, '../') -let server let appPort +let app describe('excludeDefaultMomentLocales', () => { beforeAll(async () => { + appPort = await findPort() await nextBuild(appDir) - const app = nextServer({ - dir: appDir, - dev: false, - quiet: true, - }) - server = await startApp(app) - appPort = server.address().port - // wait for it to start up: + app = await nextStart(appDir, appPort) await renderViaHTTP(appPort, '/') }) - afterAll(() => stopApp(server)) + afterAll(() => killApp(app)) it('should load momentjs', async () => { const browser = await webdriver(appPort, '/') diff --git a/test/integration/production-build-dir/test/index.test.js b/test/integration/production-build-dir/test/index.test.js index 9e08798bb502a..d017a3974287c 100644 --- a/test/integration/production-build-dir/test/index.test.js +++ b/test/integration/production-build-dir/test/index.test.js @@ -2,10 +2,10 @@ import { join } from 'path' import { - nextServer, runNextCommand, - startApp, - stopApp, + nextStart, + killApp, + findPort, renderViaHTTP, } from 'next-test-utils' @@ -19,19 +19,13 @@ describe('Production Custom Build Directory', () => { }) expect(result.stderr).toBe('') - const app = nextServer({ - dir: join(__dirname, '../build'), - dev: false, - quiet: true, - }) - - const server = await startApp(app) - const appPort = server.address().port + const appPort = await findPort() + const app = await nextStart(join(__dirname, '../build'), appPort) const html = await renderViaHTTP(appPort, '/') expect(html).toMatch(/Hello World/) - await stopApp(server) + await killApp(app) }) }) })