diff --git a/packages/next/lib/constants.ts b/packages/next/lib/constants.ts index 77b438810519..7cada56353c4 100644 --- a/packages/next/lib/constants.ts +++ b/packages/next/lib/constants.ts @@ -1,4 +1,7 @@ -import { join } from 'path' +import path from '../shared/lib/isomorphic/path' + +const { join } = path + export const NEXT_PROJECT_ROOT = join(__dirname, '..', '..') export const NEXT_PROJECT_ROOT_DIST = join(NEXT_PROJECT_ROOT, 'dist') export const NEXT_PROJECT_ROOT_NODE_MODULES = join( diff --git a/packages/next/server/incremental-cache.ts b/packages/next/server/incremental-cache.ts index 7b4b1a8ad6e9..8b949e8105b0 100644 --- a/packages/next/server/incremental-cache.ts +++ b/packages/next/server/incremental-cache.ts @@ -1,7 +1,7 @@ import type { CacheFs } from '../shared/lib/utils' import LRUCache from 'next/dist/compiled/lru-cache' -import path from 'path' +import path from '../shared/lib/isomorphic/path' import { PrerenderManifest } from '../build' import { normalizePagePath } from './normalize-page-path' import { IncrementalCacheValue, IncrementalCacheEntry } from './response-cache' diff --git a/packages/next/server/normalize-page-path.ts b/packages/next/server/normalize-page-path.ts index f9996331e3be..adaf748feff0 100644 --- a/packages/next/server/normalize-page-path.ts +++ b/packages/next/server/normalize-page-path.ts @@ -1,6 +1,8 @@ -import { posix } from 'path' +import path from '../shared/lib/isomorphic/path' import { isDynamicRoute } from '../shared/lib/router/utils' +const { posix } = path + export { normalizePathSep, denormalizePagePath } from './denormalize-page-path' export function normalizePagePath(page: string): string { diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index dc1ddc3611c7..824dc200b1ee 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -1,4 +1,5 @@ import type { IncomingMessage, ServerResponse } from 'http' +import type { ParsedUrlQuery } from 'querystring' import type { NextRouter } from '../shared/lib/router/router' import type { HtmlProps } from '../shared/lib/html-context' import type { DomainLocale } from './config' @@ -20,7 +21,6 @@ import type { GetServerSideProps, GetStaticProps, PreviewData } from '../types' import type { UnwrapPromise } from '../lib/coalesced-function' import React from 'react' -import { ParsedUrlQuery, stringify as stringifyQuery } from 'querystring' import { createFromReadableStream } from 'next/dist/compiled/react-server-dom-webpack' import { renderToReadableStream } from 'next/dist/compiled/react-server-dom-webpack/writer.browser.server' import { StyleRegistry, createStyleRegistry } from 'styled-jsx' @@ -79,6 +79,7 @@ import { ImageConfigContext } from '../shared/lib/image-config-context' import { FlushEffectsContext } from '../shared/lib/flush-effects' import { interopDefault } from '../lib/interop-default' import stripAnsi from 'next/dist/compiled/strip-ansi' +import { urlQueryToSearchParams } from '../shared/lib/router/utils/querystring' let optimizeAmp: typeof import('./optimize-amp').default let getFontDefinitionFromManifest: typeof import('./font-utils').getFontDefinitionFromManifest @@ -518,7 +519,7 @@ export async function renderToHTML( if (isServerComponent) { serverComponentsInlinedTransformStream = new TransformStream() - const search = stringifyQuery(query) + const search = urlQueryToSearchParams(query).toString() Component = createServerComponentRenderer(AppMod, ComponentMod, { cachePrefix: pathname + (search ? `?${search}` : ''), inlinedTransformStream: serverComponentsInlinedTransformStream, diff --git a/packages/next/server/web-server.ts b/packages/next/server/web-server.ts index ef55c528109e..d70a49191ef3 100644 --- a/packages/next/server/web-server.ts +++ b/packages/next/server/web-server.ts @@ -5,8 +5,9 @@ import type { NextParsedUrlQuery } from './request-meta' import type { Params } from './router' import type { PayloadOptions } from './send-payload' import type { LoadComponentsReturnType } from './load-components' +import type { Options } from './base-server' -import BaseServer, { Options } from './base-server' +import BaseServer from './base-server' import { renderToHTML } from './render' import { byteLength, generateETag } from './api-utils/web' @@ -20,9 +21,11 @@ export default class NextWebServer extends BaseServer { constructor(options: Options & { webServerConfig: WebServerConfig }) { super(options) + this.webServerConfig = options.webServerConfig Object.assign(this.renderOpts, options.webServerConfig.extendRenderOpts) } + protected generateRewrites() { // @TODO: assuming minimal mode right now return { diff --git a/packages/next/shared/lib/isomorphic/path.ts b/packages/next/shared/lib/isomorphic/path.ts new file mode 100644 index 000000000000..b074412ddefb --- /dev/null +++ b/packages/next/shared/lib/isomorphic/path.ts @@ -0,0 +1,5 @@ +const path = process.browser + ? require('next/dist/compiled/path-browserify') + : require('path') + +export default path diff --git a/packages/next/shared/lib/router/utils/querystring.ts b/packages/next/shared/lib/router/utils/querystring.ts index f86d7a3c257e..3b9fa9f2068e 100644 --- a/packages/next/shared/lib/router/utils/querystring.ts +++ b/packages/next/shared/lib/router/utils/querystring.ts @@ -1,4 +1,4 @@ -import { ParsedUrlQuery } from 'querystring' +import type { ParsedUrlQuery } from 'querystring' export function searchParamsToUrlQuery( searchParams: URLSearchParams diff --git a/packages/next/types/misc.d.ts b/packages/next/types/misc.d.ts index 9d68b3d69d37..2a4807c84a80 100644 --- a/packages/next/types/misc.d.ts +++ b/packages/next/types/misc.d.ts @@ -340,6 +340,11 @@ declare module 'next/dist/compiled/process' { export = m } +declare module 'next/dist/compiled/path-browserify' { + import m from 'path' + export = m +} + declare module 'pnp-webpack-plugin' { import webpack from 'webpack4' diff --git a/test/integration/react-18/app/pages/index.js b/test/integration/react-18/app/pages/index.js index beef70aff7f4..205e6b099767 100644 --- a/test/integration/react-18/app/pages/index.js +++ b/test/integration/react-18/app/pages/index.js @@ -19,3 +19,7 @@ export default function Index() { ) } + +export const config = { + // runtime: 'edge' +} diff --git a/test/integration/react-18/test/index.test.js b/test/integration/react-18/test/index.test.js index 43e2287ac11b..e035b081fdf9 100644 --- a/test/integration/react-18/test/index.test.js +++ b/test/integration/react-18/test/index.test.js @@ -21,6 +21,7 @@ import webdriver from 'next-webdriver' const appDir = join(__dirname, '../app') const nextConfig = new File(join(appDir, 'next.config.js')) const invalidPage = new File(join(appDir, 'pages/invalid.js')) +const indexPage = new File(join(appDir, 'pages/index.js')) describe('Basics', () => { runTests('default setting with react 18', basics) @@ -67,12 +68,14 @@ function runTestsAgainstRuntime(runtime) { invalidPage.write(`export const value = 1`) } nextConfig.replace("// runtime: 'edge'", `runtime: '${runtime}'`) + indexPage.replace("// runtime: 'edge'", `runtime: '${runtime}'`) }, afterAll: (env) => { if (env === 'dev') { invalidPage.delete() } nextConfig.restore() + indexPage.restore() }, } )